@inkeep/agents-work-apps 0.50.1 → 0.50.4

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 (64) hide show
  1. package/dist/_virtual/rolldown_runtime.js +32 -0
  2. package/dist/env.d.ts +4 -2
  3. package/dist/env.js +2 -1
  4. package/dist/github/mcp/index.d.ts +2 -2
  5. package/dist/github/routes/setup.d.ts +2 -2
  6. package/dist/github/routes/tokenExchange.d.ts +2 -2
  7. package/dist/github/routes/webhooks.d.ts +2 -2
  8. package/dist/node_modules/.pnpm/@slack_logger@4.0.0/node_modules/@slack/logger/dist/index.js +89 -0
  9. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/package.js +85 -0
  10. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/SlackWebSocket.js +223 -0
  11. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/SocketModeClient.js +367 -0
  12. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/UnrecoverableSocketModeStartError.js +20 -0
  13. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/errors.js +71 -0
  14. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/index.js +44 -0
  15. package/dist/node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/logger.js +32 -0
  16. package/dist/node_modules/.pnpm/eventemitter3@5.0.1/node_modules/eventemitter3/index.js +241 -0
  17. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/index.js +23 -0
  18. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/buffer-util.js +107 -0
  19. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/constants.js +29 -0
  20. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/event-target.js +226 -0
  21. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/extension.js +150 -0
  22. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/limiter.js +57 -0
  23. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/permessage-deflate.js +342 -0
  24. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js +457 -0
  25. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/sender.js +505 -0
  26. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/stream.js +123 -0
  27. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/subprotocol.js +46 -0
  28. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/validation.js +203 -0
  29. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket-server.js +385 -0
  30. package/dist/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js +985 -0
  31. package/dist/slack/dispatcher.d.ts +16 -0
  32. package/dist/slack/dispatcher.js +335 -0
  33. package/dist/slack/i18n/strings.d.ts +5 -5
  34. package/dist/slack/i18n/strings.js +9 -9
  35. package/dist/slack/index.d.ts +3 -1
  36. package/dist/slack/index.js +4 -2
  37. package/dist/slack/middleware/permissions.js +120 -107
  38. package/dist/slack/routes/events.js +10 -328
  39. package/dist/slack/routes/oauth.js +6 -3
  40. package/dist/slack/routes/users.js +12 -6
  41. package/dist/slack/routes/workspaces.js +39 -39
  42. package/dist/slack/services/agent-resolution.d.ts +1 -0
  43. package/dist/slack/services/agent-resolution.js +8 -4
  44. package/dist/slack/services/blocks/index.js +7 -11
  45. package/dist/slack/services/commands/index.js +15 -7
  46. package/dist/slack/services/dev-config.d.ts +23 -0
  47. package/dist/slack/services/dev-config.js +91 -0
  48. package/dist/slack/services/events/app-mention.js +25 -21
  49. package/dist/slack/services/events/index.d.ts +2 -2
  50. package/dist/slack/services/events/index.js +2 -2
  51. package/dist/slack/services/events/modal-submission.js +18 -10
  52. package/dist/slack/services/events/streaming.js +7 -5
  53. package/dist/slack/services/events/utils.d.ts +2 -1
  54. package/dist/slack/services/events/utils.js +16 -9
  55. package/dist/slack/services/index.d.ts +2 -2
  56. package/dist/slack/services/index.js +3 -3
  57. package/dist/slack/services/modals.js +4 -4
  58. package/dist/slack/services/nango.d.ts +3 -0
  59. package/dist/slack/services/nango.js +84 -2
  60. package/dist/slack/socket-mode.d.ts +4 -0
  61. package/dist/slack/socket-mode.js +130 -0
  62. package/dist/slack/tracer.d.ts +2 -0
  63. package/dist/slack/tracer.js +3 -1
  64. package/package.json +3 -2
@@ -0,0 +1,130 @@
1
+ import { __toESM } from "../_virtual/rolldown_runtime.js";
2
+ import { getLogger } from "../logger.js";
3
+ import { handleCommand } from "./services/commands/index.js";
4
+ import { SLACK_SPAN_KEYS, SLACK_SPAN_NAMES, tracer } from "./tracer.js";
5
+ import "./services/index.js";
6
+ import { dispatchSlackEvent } from "./dispatcher.js";
7
+ import { flushTraces } from "@inkeep/agents-core";
8
+ import { SpanStatusCode } from "@opentelemetry/api";
9
+
10
+ //#region src/slack/socket-mode.ts
11
+ const logger = getLogger("slack-socket-mode");
12
+ const GLOBAL_KEY = "__inkeep_slack_socket_mode_client__";
13
+ async function startSocketMode(appToken) {
14
+ if (globalThis[GLOBAL_KEY]) {
15
+ logger.info({}, "Socket Mode client already running (HMR reload detected), skipping");
16
+ return;
17
+ }
18
+ const { SocketModeClient } = await import("../node_modules/.pnpm/@slack_socket-mode@2.0.5/node_modules/@slack/socket-mode/dist/src/index.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
19
+ const client = new SocketModeClient({ appToken });
20
+ setupSocketModeListeners(client);
21
+ await client.start();
22
+ globalThis[GLOBAL_KEY] = client;
23
+ logger.info({}, "Slack Socket Mode client started");
24
+ }
25
+ function registerBackgroundWork(work) {
26
+ work.catch((err) => {
27
+ logger.error({ error: err }, "Background work failed in Socket Mode");
28
+ });
29
+ }
30
+ function setupSocketModeListeners(client) {
31
+ client.on("error", (...args) => {
32
+ logger.error({ error: args[0] }, "Socket Mode client error");
33
+ });
34
+ client.on("disconnected", () => {
35
+ logger.warn({}, "Socket Mode client disconnected");
36
+ });
37
+ client.on("reconnecting", () => {
38
+ logger.info({}, "Socket Mode client reconnecting...");
39
+ });
40
+ client.on("slack_event", async (...args) => {
41
+ const { ack, body, type } = args[0];
42
+ if (type !== "events_api") return;
43
+ await ack();
44
+ await tracer.startActiveSpan(SLACK_SPAN_NAMES.WEBHOOK, async (span) => {
45
+ try {
46
+ const eventType = body.event?.type ? "event_callback" : body.type || "";
47
+ span.setAttribute(SLACK_SPAN_KEYS.EVENT_TYPE, eventType);
48
+ span.updateName(`${SLACK_SPAN_NAMES.WEBHOOK} ${eventType}`);
49
+ await dispatchSlackEvent(eventType, body, { registerBackgroundWork }, span);
50
+ } catch (error) {
51
+ span.setAttribute(SLACK_SPAN_KEYS.OUTCOME, "error");
52
+ span.setStatus({
53
+ code: SpanStatusCode.ERROR,
54
+ message: String(error)
55
+ });
56
+ if (error instanceof Error) span.recordException(error);
57
+ logger.error({ error }, "Error handling Socket Mode event");
58
+ } finally {
59
+ span.end();
60
+ await flushTraces();
61
+ }
62
+ });
63
+ });
64
+ client.on("interactive", async (...args) => {
65
+ const { ack, body } = args[0];
66
+ const eventType = body.type || "";
67
+ await ack((await tracer.startActiveSpan(`${SLACK_SPAN_NAMES.WEBHOOK} ${eventType}`, async (span) => {
68
+ try {
69
+ span.setAttribute(SLACK_SPAN_KEYS.EVENT_TYPE, eventType);
70
+ return await dispatchSlackEvent(eventType, body, { registerBackgroundWork }, span);
71
+ } catch (error) {
72
+ span.setAttribute(SLACK_SPAN_KEYS.OUTCOME, "error");
73
+ span.setStatus({
74
+ code: SpanStatusCode.ERROR,
75
+ message: String(error)
76
+ });
77
+ if (error instanceof Error) span.recordException(error);
78
+ logger.error({ error }, "Error handling Socket Mode interactive event");
79
+ return { outcome: "error" };
80
+ } finally {
81
+ span.end();
82
+ }
83
+ })).response);
84
+ await flushTraces();
85
+ });
86
+ client.on("slash_commands", async (...args) => {
87
+ const { ack, body } = args[0];
88
+ await ack();
89
+ await tracer.startActiveSpan(`${SLACK_SPAN_NAMES.WEBHOOK} slash_command`, async (span) => {
90
+ try {
91
+ span.setAttribute(SLACK_SPAN_KEYS.EVENT_TYPE, "slash_command");
92
+ if (body.command) span.setAttribute("slack.command", body.command);
93
+ if (body.team_id) span.setAttribute(SLACK_SPAN_KEYS.TEAM_ID, body.team_id);
94
+ const commandPayload = {
95
+ command: body.command || "",
96
+ text: body.text || "",
97
+ userId: body.user_id || "",
98
+ userName: body.user_name || "",
99
+ teamId: body.team_id || "",
100
+ teamDomain: body.team_domain || "",
101
+ enterpriseId: body.enterprise_id,
102
+ channelId: body.channel_id || "",
103
+ channelName: body.channel_name || "",
104
+ responseUrl: body.response_url || "",
105
+ triggerId: body.trigger_id || ""
106
+ };
107
+ const response = await handleCommand(commandPayload);
108
+ if (Object.keys(response).length > 0 && commandPayload.responseUrl) await fetch(commandPayload.responseUrl, {
109
+ method: "POST",
110
+ headers: { "Content-Type": "application/json" },
111
+ body: JSON.stringify(response)
112
+ });
113
+ } catch (error) {
114
+ span.setAttribute(SLACK_SPAN_KEYS.OUTCOME, "error");
115
+ span.setStatus({
116
+ code: SpanStatusCode.ERROR,
117
+ message: String(error)
118
+ });
119
+ if (error instanceof Error) span.recordException(error);
120
+ logger.error({ error }, "Error handling Socket Mode slash command");
121
+ } finally {
122
+ span.end();
123
+ await flushTraces();
124
+ }
125
+ });
126
+ });
127
+ }
128
+
129
+ //#endregion
130
+ export { startSocketMode };
@@ -36,6 +36,8 @@ declare const SLACK_SPAN_KEYS: {
36
36
  readonly IS_IN_THREAD: "slack.is_in_thread";
37
37
  readonly STREAM_FINALIZATION_FAILED: "slack.stream_finalization_failed";
38
38
  readonly CONTENT_ALREADY_DELIVERED: "slack.content_already_delivered";
39
+ readonly AUTHORIZED: "slack.authorized";
40
+ readonly AUTH_SOURCE: "slack.auth_source";
39
41
  };
40
42
  type SlackOutcome = 'handled' | 'ignored_bot_message' | 'ignored_unknown_event' | 'ignored_no_action_match' | 'ignored_slack_retry' | 'url_verification' | 'validation_error' | 'signature_invalid' | 'error';
41
43
  //#endregion
@@ -34,7 +34,9 @@ const SLACK_SPAN_KEYS = {
34
34
  HAS_QUERY: "slack.has_query",
35
35
  IS_IN_THREAD: "slack.is_in_thread",
36
36
  STREAM_FINALIZATION_FAILED: "slack.stream_finalization_failed",
37
- CONTENT_ALREADY_DELIVERED: "slack.content_already_delivered"
37
+ CONTENT_ALREADY_DELIVERED: "slack.content_already_delivered",
38
+ AUTHORIZED: "slack.authorized",
39
+ AUTH_SOURCE: "slack.auth_source"
38
40
  };
39
41
 
40
42
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inkeep/agents-work-apps",
3
- "version": "0.50.1",
3
+ "version": "0.50.4",
4
4
  "description": "First party integrations for Inkeep Agents",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -33,13 +33,14 @@
33
33
  "jose": "^6.1.0",
34
34
  "minimatch": "^10.1.1",
35
35
  "slack-block-builder": "^2.8.0",
36
- "@inkeep/agents-core": "0.50.1"
36
+ "@inkeep/agents-core": "0.50.4"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@hono/zod-openapi": "^1.1.5",
40
40
  "zod": "^4.3.6"
41
41
  },
42
42
  "devDependencies": {
43
+ "@slack/socket-mode": "^2.0.5",
43
44
  "@types/node": "^20.11.24",
44
45
  "typescript": "^5.9.2",
45
46
  "vitest": "^3.2.4"