@agent-relay/slack-primitive 6.0.12

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 (47) hide show
  1. package/dist/actions/post-message.d.ts +9 -0
  2. package/dist/actions/post-message.d.ts.map +1 -0
  3. package/dist/actions/post-message.js +48 -0
  4. package/dist/actions/post-message.js.map +1 -0
  5. package/dist/actions/resolve-channel.d.ts +9 -0
  6. package/dist/actions/resolve-channel.d.ts.map +1 -0
  7. package/dist/actions/resolve-channel.js +29 -0
  8. package/dist/actions/resolve-channel.js.map +1 -0
  9. package/dist/actions/resolve-user.d.ts +13 -0
  10. package/dist/actions/resolve-user.d.ts.map +1 -0
  11. package/dist/actions/resolve-user.js +93 -0
  12. package/dist/actions/resolve-user.js.map +1 -0
  13. package/dist/adapter.d.ts +23 -0
  14. package/dist/adapter.d.ts.map +1 -0
  15. package/dist/adapter.js +194 -0
  16. package/dist/adapter.js.map +1 -0
  17. package/dist/client.d.ts +62 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +91 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/cloud-relay-runtime.d.ts +32 -0
  22. package/dist/cloud-relay-runtime.d.ts.map +1 -0
  23. package/dist/cloud-relay-runtime.js +156 -0
  24. package/dist/cloud-relay-runtime.js.map +1 -0
  25. package/dist/index.d.ts +11 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +11 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/local-runtime.d.ts +17 -0
  30. package/dist/local-runtime.d.ts.map +1 -0
  31. package/dist/local-runtime.js +28 -0
  32. package/dist/local-runtime.js.map +1 -0
  33. package/dist/noop-runtime.d.ts +22 -0
  34. package/dist/noop-runtime.d.ts.map +1 -0
  35. package/dist/noop-runtime.js +70 -0
  36. package/dist/noop-runtime.js.map +1 -0
  37. package/dist/types.d.ts +202 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +27 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/workflow-step.d.ts +80 -0
  42. package/dist/workflow-step.d.ts.map +1 -0
  43. package/dist/workflow-step.js +355 -0
  44. package/dist/workflow-step.js.map +1 -0
  45. package/examples/README.md +40 -0
  46. package/examples/notify-on-pr.ts +93 -0
  47. package/package.json +50 -0
@@ -0,0 +1,9 @@
1
+ import type { PostMessageOutput, PostMessageParams, SlackWebApiLike } from '../types.js';
2
+ /**
3
+ * Resolve Slack references and post a message.
4
+ * @param slack - Slack Web API client.
5
+ * @param params - Message parameters.
6
+ * @returns Posted message metadata and soft mention-resolution warnings.
7
+ */
8
+ export declare function postMessage(slack: SlackWebApiLike, params: PostMessageParams): Promise<PostMessageOutput>;
9
+ //# sourceMappingURL=post-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-message.d.ts","sourceRoot":"","sources":["../../src/actions/post-message.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAIjB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAyC5B"}
@@ -0,0 +1,48 @@
1
+ import { resolveChannel } from './resolve-channel.js';
2
+ import { resolveUser } from './resolve-user.js';
3
+ /**
4
+ * Resolve Slack references and post a message.
5
+ * @param slack - Slack Web API client.
6
+ * @param params - Message parameters.
7
+ * @returns Posted message metadata and soft mention-resolution warnings.
8
+ */
9
+ export async function postMessage(slack, params) {
10
+ const channelInput = params.channel ?? process.env.SLACK_DEFAULT_CHANNEL;
11
+ if (!channelInput) {
12
+ throw new Error('Slack postMessage channel is missing; provide channel or set SLACK_DEFAULT_CHANNEL.');
13
+ }
14
+ const channel = await resolveChannel(slack, channelInput);
15
+ const userCache = new Map();
16
+ const resolvedMentions = [];
17
+ const warnings = [];
18
+ for (const mention of params.mentions ?? []) {
19
+ try {
20
+ resolvedMentions.push(await resolveUser(slack, mention, { cache: userCache }));
21
+ }
22
+ catch (error) {
23
+ warnings.push({
24
+ type: 'mention_unresolved',
25
+ input: mention,
26
+ message: error instanceof Error ? error.message : String(error),
27
+ });
28
+ }
29
+ }
30
+ const mentionPrefix = resolvedMentions.map((mention) => `<@${mention.userId}>`).join(' ');
31
+ const text = mentionPrefix ? `${mentionPrefix} ${params.text}` : params.text;
32
+ const response = await slack.chat.postMessage({
33
+ channel: channel.id,
34
+ text,
35
+ thread_ts: params.threadTs,
36
+ unfurl_links: params.unfurl,
37
+ unfurl_media: params.unfurl,
38
+ });
39
+ return {
40
+ channel: response.channel ?? channel.id,
41
+ ts: response.ts ?? '',
42
+ text: response.message?.text ?? text,
43
+ resolvedMentions,
44
+ unresolvedMentions: warnings.map((warning) => warning.input),
45
+ warnings,
46
+ };
47
+ }
48
+ //# sourceMappingURL=post-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-message.js","sourceRoot":"","sources":["../../src/actions/post-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAsB,EACtB,MAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACzE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IACpD,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5C,OAAO,EAAE,OAAO,CAAC,EAAE;QACnB,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,YAAY,EAAE,MAAM,CAAC,MAAM;KAC5B,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE;QACvC,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE;QACrB,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI;QACpC,gBAAgB;QAChB,kBAAkB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5D,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type SlackChannelSummary, type SlackWebApiLike } from '../types.js';
2
+ /**
3
+ * Resolve a Slack channel reference to a channel object.
4
+ * @param slack - Slack Web API client.
5
+ * @param channel - Raw channel id or #channel-name reference.
6
+ * @returns Resolved Slack channel summary.
7
+ */
8
+ export declare function resolveChannel(slack: SlackWebApiLike, channel: string): Promise<SlackChannelSummary>;
9
+ //# sourceMappingURL=resolve-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-channel.d.ts","sourceRoot":"","sources":["../../src/actions/resolve-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAIjG;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAwB9B"}
@@ -0,0 +1,29 @@
1
+ import { SlackPostBackError } from '../types.js';
2
+ const CHANNEL_ID_PATTERN = /^[CGD][A-Z0-9]{2,}$/;
3
+ /**
4
+ * Resolve a Slack channel reference to a channel object.
5
+ * @param slack - Slack Web API client.
6
+ * @param channel - Raw channel id or #channel-name reference.
7
+ * @returns Resolved Slack channel summary.
8
+ */
9
+ export async function resolveChannel(slack, channel) {
10
+ if (CHANNEL_ID_PATTERN.test(channel)) {
11
+ return { id: channel };
12
+ }
13
+ const name = channel.startsWith('#') ? channel.slice(1) : channel;
14
+ let cursor;
15
+ do {
16
+ const response = await slack.conversations.list({
17
+ cursor,
18
+ limit: 200,
19
+ types: 'public_channel,private_channel',
20
+ });
21
+ const match = response.channels?.find((candidate) => candidate.name === name);
22
+ if (match?.id) {
23
+ return match;
24
+ }
25
+ cursor = response.response_metadata?.next_cursor || undefined;
26
+ } while (cursor);
27
+ throw new SlackPostBackError('channel_not_found', `Slack channel not found: ${channel}`);
28
+ }
29
+ //# sourceMappingURL=resolve-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-channel.js","sourceRoot":"","sources":["../../src/actions/resolve-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkD,MAAM,aAAa,CAAC;AAEjG,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAsB,EACtB,OAAe;IAEf,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,IAAI,MAA0B,CAAC;IAE/B,GAAG,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;YAC9C,MAAM;YACN,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC9E,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,QAAQ,CAAC,iBAAiB,EAAE,WAAW,IAAI,SAAS,CAAC;IAChE,CAAC,QAAQ,MAAM,EAAE;IAEjB,MAAM,IAAI,kBAAkB,CAAC,mBAAmB,EAAE,4BAA4B,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { SlackResolvedMention, SlackUserSummary, SlackWebApiLike } from '../types.js';
2
+ export interface ResolveUserOptions {
3
+ cache?: Map<string, SlackUserSummary>;
4
+ }
5
+ /**
6
+ * Resolve a Slack user mention to a user id.
7
+ * @param slack - Slack Web API client.
8
+ * @param mention - Raw user id, @email@example.com, or @handle reference.
9
+ * @param options - Optional user cache.
10
+ * @returns Resolved mention record.
11
+ */
12
+ export declare function resolveUser(slack: SlackWebApiLike, mention: string, options?: ResolveUserOptions): Promise<SlackResolvedMention>;
13
+ //# sourceMappingURL=resolve-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-user.d.ts","sourceRoot":"","sources":["../../src/actions/resolve-user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3F,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACvC;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CA8B/B"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Resolve a Slack user mention to a user id.
3
+ * @param slack - Slack Web API client.
4
+ * @param mention - Raw user id, @email@example.com, or @handle reference.
5
+ * @param options - Optional user cache.
6
+ * @returns Resolved mention record.
7
+ */
8
+ export async function resolveUser(slack, mention, options = {}) {
9
+ const normalized = mention.startsWith('@') ? mention.slice(1) : mention;
10
+ if (isSlackUserId(normalized)) {
11
+ return { input: mention, userId: normalized };
12
+ }
13
+ if (isEmailCandidate(normalized)) {
14
+ const response = await slack.users.lookupByEmail({ email: normalized });
15
+ const userId = response.user?.id;
16
+ if (!userId) {
17
+ throw new Error(`Slack user not found for email: ${mention}`);
18
+ }
19
+ if (response.user) {
20
+ rememberUser(options.cache, response.user);
21
+ }
22
+ return { input: mention, userId };
23
+ }
24
+ const cache = options.cache ?? new Map();
25
+ let cached = cache.get(normalized.toLowerCase());
26
+ if (!cached) {
27
+ await populateUserCache(slack, cache);
28
+ cached = cache.get(normalized.toLowerCase());
29
+ }
30
+ if (cached?.id) {
31
+ return { input: mention, userId: cached.id };
32
+ }
33
+ throw new Error(`Slack user not found for handle: ${mention}`);
34
+ }
35
+ function isSlackUserId(value) {
36
+ if (value.length < 3)
37
+ return false;
38
+ if (value[0] !== 'U' && value[0] !== 'W')
39
+ return false;
40
+ for (let i = 1; i < value.length; i += 1) {
41
+ const code = value.charCodeAt(i);
42
+ const isDigit = code >= 48 && code <= 57;
43
+ const isUppercase = code >= 65 && code <= 90;
44
+ if (!isDigit && !isUppercase)
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ function isEmailCandidate(value) {
50
+ const at = value.indexOf('@');
51
+ if (at <= 0 || at !== value.lastIndexOf('@') || at === value.length - 1)
52
+ return false;
53
+ const domain = value.slice(at + 1);
54
+ const dot = domain.indexOf('.');
55
+ return dot > 0 && dot < domain.length - 1 && !hasAsciiWhitespace(value);
56
+ }
57
+ function hasAsciiWhitespace(value) {
58
+ for (let i = 0; i < value.length; i += 1) {
59
+ const code = value.charCodeAt(i);
60
+ if (code === 9 || code === 10 || code === 11 || code === 12 || code === 13 || code === 32) {
61
+ return true;
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ async function populateUserCache(slack, cache) {
67
+ let cursor;
68
+ do {
69
+ const response = await slack.users.list({ cursor, limit: 200 });
70
+ for (const user of response.members ?? []) {
71
+ rememberUser(cache, user);
72
+ }
73
+ cursor = response.response_metadata?.next_cursor || undefined;
74
+ } while (cursor);
75
+ }
76
+ function rememberUser(cache, user) {
77
+ if (!cache)
78
+ return;
79
+ for (const key of userKeys(user)) {
80
+ cache.set(key.toLowerCase(), user);
81
+ }
82
+ }
83
+ function userKeys(user) {
84
+ return [
85
+ user.id,
86
+ user.name,
87
+ user.realName,
88
+ user.profile?.email,
89
+ user.profile?.displayName,
90
+ user.profile?.realName,
91
+ ].filter((value) => Boolean(value));
92
+ }
93
+ //# sourceMappingURL=resolve-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-user.js","sourceRoot":"","sources":["../../src/actions/resolve-user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { SlackAction, SlackClientInterface, type PostMessageOutput, type PostMessageParams, type RequiredSlackRuntimeConfig, type ResolveChannelParams, type ResolveUserParams, type SlackActionName, type SlackActionOutputMap, type SlackActionParamsMap, type SlackActionResult, type SlackChannelSummary, type SlackResolvedMention, type SlackRuntime, type SlackRuntimeAvailability, type SlackRuntimeConfig, type SlackRuntimeDetectionResult, type SlackWebApiLike } from './types.js';
2
+ export declare function normalizeSlackRuntimeConfig(config?: SlackRuntimeConfig): RequiredSlackRuntimeConfig;
3
+ export declare abstract class BaseSlackAdapter extends SlackClientInterface {
4
+ protected readonly slack: SlackWebApiLike;
5
+ constructor(config: RequiredSlackRuntimeConfig, slack: SlackWebApiLike);
6
+ isAuthenticated(): Promise<boolean>;
7
+ executeAction<Name extends SlackAction>(action: Name, params: SlackActionParamsMap[Name]): Promise<SlackActionResult<SlackActionOutputMap[Name]>>;
8
+ executeAction<TOutput = unknown>(action: SlackAction | SlackActionName, params?: unknown): Promise<SlackActionResult<TOutput>>;
9
+ postMessage(params: PostMessageParams): Promise<PostMessageOutput>;
10
+ resolveUser(params: ResolveUserParams): Promise<SlackResolvedMention>;
11
+ resolveChannel(params: ResolveChannelParams): Promise<SlackChannelSummary>;
12
+ private dispatchAction;
13
+ }
14
+ export declare class SlackAdapterFactory {
15
+ static create(config?: SlackRuntimeConfig): Promise<SlackClientInterface>;
16
+ static detect(config?: SlackRuntimeConfig): Promise<SlackRuntimeDetectionResult>;
17
+ static detectRuntime(config?: SlackRuntimeConfig): Promise<SlackRuntime>;
18
+ static testRuntime(runtime: SlackRuntime, config?: SlackRuntimeConfig): Promise<SlackRuntimeAvailability>;
19
+ }
20
+ export declare const SlackClientFactory: typeof SlackAdapterFactory;
21
+ export declare function detectSlackRuntime(config?: SlackRuntimeConfig): Promise<SlackRuntimeDetectionResult>;
22
+ export declare function createSlackAdapter(config?: SlackRuntimeConfig): Promise<SlackClientInterface>;
23
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAEhC,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,kBAAuB,GAAG,0BAA0B,CAkBvG;AAQD,8BAAsB,gBAAiB,SAAQ,oBAAoB;IAG/D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,eAAe;gBADzC,MAAM,EAAE,0BAA0B,EACf,KAAK,EAAE,eAAe;IAKrC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAYzC,aAAa,CAAC,IAAI,SAAS,WAAW,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,aAAa,CAAC,OAAO,GAAG,OAAO,EAC7B,MAAM,EAAE,WAAW,GAAG,eAAe,EACrC,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IA+BhC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOlE,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIrE,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAIlE,cAAc;CAY7B;AAED,qBAAa,mBAAmB;WACjB,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;WAmBtE,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,2BAA2B,CAAC;WAwB7E,aAAa,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAIlF,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,wBAAwB,CAAC;CAkCrC;AAED,eAAO,MAAM,kBAAkB,4BAAsB,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAExG;AAED,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEjG"}
@@ -0,0 +1,194 @@
1
+ import { postMessage as postMessageAction } from './actions/post-message.js';
2
+ import { resolveChannel as resolveChannelAction } from './actions/resolve-channel.js';
3
+ import { resolveUser as resolveUserAction } from './actions/resolve-user.js';
4
+ import { SlackAction, SlackClientInterface, } from './types.js';
5
+ const DEFAULT_TIMEOUT = 30_000;
6
+ export function normalizeSlackRuntimeConfig(config = {}) {
7
+ const env = config.env ?? process.env;
8
+ const token = nonEmpty(config.token) ?? nonEmpty(env.SLACK_BOT_TOKEN) ?? '';
9
+ const cloudApiToken = nonEmpty(config.cloudApiToken) ?? nonEmpty(env.CLOUD_API_TOKEN) ?? '';
10
+ const cloudApiUrl = nonEmpty(config.cloudApiUrl) ?? nonEmpty(env.CLOUD_API_URL) ?? '';
11
+ return {
12
+ ...config,
13
+ runtime: config.runtime && config.runtime !== 'auto'
14
+ ? config.runtime
15
+ : selectRuntime({ token, cloudApiToken, cloudApiUrl }),
16
+ env,
17
+ token,
18
+ cloudApiToken,
19
+ cloudApiUrl,
20
+ timeout: config.timeout ?? DEFAULT_TIMEOUT,
21
+ };
22
+ }
23
+ function selectRuntime(input) {
24
+ if (input.cloudApiToken && input.cloudApiUrl)
25
+ return 'cloud-relay';
26
+ if (input.token)
27
+ return 'local';
28
+ return 'noop';
29
+ }
30
+ export class BaseSlackAdapter extends SlackClientInterface {
31
+ slack;
32
+ constructor(config, slack) {
33
+ super(config);
34
+ this.slack = slack;
35
+ }
36
+ async isAuthenticated() {
37
+ if (!this.slack.auth) {
38
+ return Boolean(this.config.token);
39
+ }
40
+ try {
41
+ const response = await this.slack.auth.test();
42
+ return response.ok !== false;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ async executeAction(action, params) {
49
+ const startedAt = Date.now();
50
+ try {
51
+ const data = (await this.dispatchAction(action, params));
52
+ return {
53
+ success: true,
54
+ output: stringifyOutput(data),
55
+ data,
56
+ metadata: {
57
+ runtime: this.getRuntime(),
58
+ executionTime: Date.now() - startedAt,
59
+ },
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ success: false,
65
+ output: '',
66
+ error: error instanceof Error ? error.message : String(error),
67
+ metadata: {
68
+ runtime: this.getRuntime(),
69
+ executionTime: Date.now() - startedAt,
70
+ },
71
+ };
72
+ }
73
+ }
74
+ async postMessage(params) {
75
+ return postMessageAction(this.slack, {
76
+ ...params,
77
+ channel: params.channel ?? this.config.env.SLACK_DEFAULT_CHANNEL,
78
+ });
79
+ }
80
+ async resolveUser(params) {
81
+ return resolveUserAction(this.slack, params.mention);
82
+ }
83
+ async resolveChannel(params) {
84
+ return resolveChannelAction(this.slack, params.channel);
85
+ }
86
+ async dispatchAction(action, params) {
87
+ switch (action) {
88
+ case SlackAction.PostMessage:
89
+ return this.postMessage(params);
90
+ case SlackAction.ResolveUser:
91
+ return this.resolveUser(params);
92
+ case SlackAction.ResolveChannel:
93
+ return this.resolveChannel(params);
94
+ default:
95
+ throw new Error(`Unsupported Slack action: ${String(action)}`);
96
+ }
97
+ }
98
+ }
99
+ export class SlackAdapterFactory {
100
+ static async create(config = {}) {
101
+ const normalized = normalizeSlackRuntimeConfig(config);
102
+ switch (normalized.runtime) {
103
+ case 'cloud-relay': {
104
+ const { SlackCloudRelayClient } = await import('./cloud-relay-runtime.js');
105
+ return new SlackCloudRelayClient(normalized);
106
+ }
107
+ case 'noop': {
108
+ const { SlackNoopClient } = await import('./noop-runtime.js');
109
+ return new SlackNoopClient(normalized);
110
+ }
111
+ case 'local':
112
+ default: {
113
+ const { SlackWebApiClient } = await import('./local-runtime.js');
114
+ return new SlackWebApiClient(normalized);
115
+ }
116
+ }
117
+ }
118
+ static async detect(config = {}) {
119
+ const normalized = normalizeSlackRuntimeConfig(config);
120
+ const local = await this.testRuntime('local', normalized);
121
+ const cloudRelay = await this.testRuntime('cloud-relay', normalized);
122
+ const noop = await this.testRuntime('noop', normalized);
123
+ const requested = config.runtime ?? 'auto';
124
+ const selected = normalized.runtime;
125
+ const summary = selected === 'cloud-relay' ? cloudRelay : selected === 'noop' ? noop : local;
126
+ return {
127
+ runtime: selected,
128
+ requestedRuntime: requested,
129
+ source: normalized.token || normalized.cloudApiToken || normalized.cloudApiUrl ? 'config' : 'environment',
130
+ available: summary.available,
131
+ reason: summary.reason,
132
+ checkedAt: new Date().toISOString(),
133
+ local,
134
+ cloudRelay,
135
+ noop,
136
+ };
137
+ }
138
+ static async detectRuntime(config = {}) {
139
+ return normalizeSlackRuntimeConfig(config).runtime;
140
+ }
141
+ static testRuntime(runtime, config = {}) {
142
+ const normalized = normalizeSlackRuntimeConfig(config);
143
+ switch (runtime) {
144
+ case 'cloud-relay': {
145
+ const ready = Boolean(normalized.cloudApiToken && normalized.cloudApiUrl);
146
+ return Promise.resolve({
147
+ runtime,
148
+ available: ready,
149
+ authenticated: ready,
150
+ reason: ready
151
+ ? 'CLOUD_API_TOKEN and CLOUD_API_URL are configured.'
152
+ : 'CLOUD_API_TOKEN or CLOUD_API_URL is not configured.',
153
+ });
154
+ }
155
+ case 'noop': {
156
+ return Promise.resolve({
157
+ runtime,
158
+ available: true,
159
+ authenticated: false,
160
+ reason: 'noop runtime is always available.',
161
+ });
162
+ }
163
+ case 'local':
164
+ default: {
165
+ const ready = Boolean(normalized.token);
166
+ return Promise.resolve({
167
+ runtime,
168
+ available: ready,
169
+ authenticated: ready,
170
+ reason: ready ? 'SLACK_BOT_TOKEN is configured.' : 'SLACK_BOT_TOKEN is not configured.',
171
+ });
172
+ }
173
+ }
174
+ }
175
+ }
176
+ export const SlackClientFactory = SlackAdapterFactory;
177
+ export function detectSlackRuntime(config = {}) {
178
+ return SlackAdapterFactory.detect(config);
179
+ }
180
+ export function createSlackAdapter(config = {}) {
181
+ return SlackAdapterFactory.create(config);
182
+ }
183
+ function nonEmpty(value) {
184
+ const trimmed = value?.trim();
185
+ return trimmed ? trimmed : undefined;
186
+ }
187
+ function stringifyOutput(value) {
188
+ if (typeof value === 'string')
189
+ return value;
190
+ if (typeof value === 'undefined')
191
+ return '';
192
+ return JSON.stringify(value);
193
+ }
194
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { PostMessageOutput, PostMessageParams, ResolveChannelParams, ResolveUserParams, SlackAction, SlackActionName, SlackActionOutputMap, SlackActionParamsMap, SlackActionResult, SlackChannelSummary, SlackClientInterface, SlackResolvedMention, SlackRuntime, SlackRuntimeConfig, SlackRuntimeDetectionResult } from './types.js';
2
+ /**
3
+ * High-level Slack primitive client.
4
+ */
5
+ export declare class SlackClient {
6
+ private readonly adapterPromise;
7
+ constructor(config?: SlackRuntimeConfig);
8
+ /**
9
+ * Create a Slack client and eagerly resolve the local runtime.
10
+ * @param config - Slack runtime configuration.
11
+ * @returns Configured Slack client.
12
+ */
13
+ static create(config?: SlackRuntimeConfig): Promise<SlackClient>;
14
+ /**
15
+ * Inspect local runtime availability without creating a client.
16
+ * @param config - Slack runtime configuration.
17
+ * @returns Runtime detection details.
18
+ */
19
+ static detect(config?: SlackRuntimeConfig): Promise<SlackRuntimeDetectionResult>;
20
+ /**
21
+ * Detect the runtime that will be selected. Phase A always returns local.
22
+ * @param config - Slack runtime configuration.
23
+ * @returns Selected Slack runtime.
24
+ */
25
+ static detectRuntime(config?: SlackRuntimeConfig): Promise<SlackRuntime>;
26
+ /**
27
+ * Return the selected low-level adapter.
28
+ * @returns Slack adapter.
29
+ */
30
+ getAdapter(): Promise<SlackClientInterface>;
31
+ /**
32
+ * Return the selected runtime.
33
+ * @returns Slack runtime.
34
+ */
35
+ getRuntime(): Promise<SlackRuntime>;
36
+ /**
37
+ * Check whether the selected runtime is authenticated.
38
+ * @returns True when Slack auth succeeds.
39
+ */
40
+ isAuthenticated(): Promise<boolean>;
41
+ executeAction<Name extends SlackAction>(action: Name, params: SlackActionParamsMap[Name]): Promise<SlackActionResult<SlackActionOutputMap[Name]>>;
42
+ executeAction<TOutput = unknown>(action: SlackAction | SlackActionName, params?: unknown): Promise<SlackActionResult<TOutput>>;
43
+ /**
44
+ * Post a Slack message.
45
+ * @param params - Message parameters.
46
+ * @returns Posted message output.
47
+ */
48
+ postMessage(params: PostMessageParams): Promise<PostMessageOutput>;
49
+ /**
50
+ * Resolve a Slack user mention.
51
+ * @param params - User resolution parameters.
52
+ * @returns Resolved mention.
53
+ */
54
+ resolveUser(params: ResolveUserParams): Promise<SlackResolvedMention>;
55
+ /**
56
+ * Resolve a Slack channel reference.
57
+ * @param params - Channel resolution parameters.
58
+ * @returns Resolved channel.
59
+ */
60
+ resolveChannel(params: ResolveChannelParams): Promise<SlackChannelSummary>;
61
+ }
62
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;gBAEnD,MAAM,GAAE,kBAAuB;IAI3C;;;;OAIG;WACU,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAM1E;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAIpF;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAI5E;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI3C;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAIzC;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzC,aAAa,CAAC,IAAI,SAAS,WAAW,EACpC,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,GACjC,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,aAAa,CAAC,OAAO,GAAG,OAAO,EAC7B,MAAM,EAAE,WAAW,GAAG,eAAe,EACrC,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IActC;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIxE;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAI3E;;;;OAIG;IACG,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAGjF"}
package/dist/client.js ADDED
@@ -0,0 +1,91 @@
1
+ import { SlackAdapterFactory } from './adapter.js';
2
+ /**
3
+ * High-level Slack primitive client.
4
+ */
5
+ export class SlackClient {
6
+ adapterPromise;
7
+ constructor(config = {}) {
8
+ this.adapterPromise = SlackAdapterFactory.create(config);
9
+ }
10
+ /**
11
+ * Create a Slack client and eagerly resolve the local runtime.
12
+ * @param config - Slack runtime configuration.
13
+ * @returns Configured Slack client.
14
+ */
15
+ static async create(config = {}) {
16
+ const client = new SlackClient(config);
17
+ await client.getAdapter();
18
+ return client;
19
+ }
20
+ /**
21
+ * Inspect local runtime availability without creating a client.
22
+ * @param config - Slack runtime configuration.
23
+ * @returns Runtime detection details.
24
+ */
25
+ static detect(config = {}) {
26
+ return SlackAdapterFactory.detect(config);
27
+ }
28
+ /**
29
+ * Detect the runtime that will be selected. Phase A always returns local.
30
+ * @param config - Slack runtime configuration.
31
+ * @returns Selected Slack runtime.
32
+ */
33
+ static detectRuntime(config = {}) {
34
+ return SlackAdapterFactory.detectRuntime(config);
35
+ }
36
+ /**
37
+ * Return the selected low-level adapter.
38
+ * @returns Slack adapter.
39
+ */
40
+ getAdapter() {
41
+ return this.adapterPromise;
42
+ }
43
+ /**
44
+ * Return the selected runtime.
45
+ * @returns Slack runtime.
46
+ */
47
+ async getRuntime() {
48
+ return (await this.getAdapter()).getRuntime();
49
+ }
50
+ /**
51
+ * Check whether the selected runtime is authenticated.
52
+ * @returns True when Slack auth succeeds.
53
+ */
54
+ async isAuthenticated() {
55
+ return (await this.getAdapter()).isAuthenticated();
56
+ }
57
+ /**
58
+ * Execute any registered Slack primitive action by action name.
59
+ * @param action - Slack action name.
60
+ * @param params - Action parameters.
61
+ * @returns Action result.
62
+ */
63
+ async executeAction(action, params) {
64
+ return (await this.getAdapter()).executeAction(action, params);
65
+ }
66
+ /**
67
+ * Post a Slack message.
68
+ * @param params - Message parameters.
69
+ * @returns Posted message output.
70
+ */
71
+ async postMessage(params) {
72
+ return (await this.getAdapter()).postMessage(params);
73
+ }
74
+ /**
75
+ * Resolve a Slack user mention.
76
+ * @param params - User resolution parameters.
77
+ * @returns Resolved mention.
78
+ */
79
+ async resolveUser(params) {
80
+ return (await this.getAdapter()).resolveUser(params);
81
+ }
82
+ /**
83
+ * Resolve a Slack channel reference.
84
+ * @param params - Channel resolution parameters.
85
+ * @returns Resolved channel.
86
+ */
87
+ async resolveChannel(params) {
88
+ return (await this.getAdapter()).resolveChannel(params);
89
+ }
90
+ }
91
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAmBnD;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,cAAc,CAAgC;IAE/D,YAAY,SAA6B,EAAE;QACzC,IAAI,CAAC,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAA6B,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,SAA6B,EAAE;QAC3C,OAAO,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,SAA6B,EAAE;QAClD,OAAO,mBAAmB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IAChD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;IACrD,CAAC;IAUD;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CACjB,MAAqC,EACrC,MAAgB;QAEhB,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,MAA4B;QAC/C,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;CACF"}