@inkeep/agents-work-apps 0.0.0-dev-20260204182014 → 0.0.0-dev-20260204185956

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 (72) hide show
  1. package/dist/db/index.d.ts +1 -2
  2. package/dist/db/index.js +1 -2
  3. package/dist/db/runDbClient.d.ts +2 -2
  4. package/dist/env.d.ts +0 -22
  5. package/dist/env.js +1 -12
  6. package/dist/github/index.d.ts +3 -3
  7. package/dist/github/mcp/index.d.ts +2 -2
  8. package/dist/github/mcp/schemas.d.ts +1 -1
  9. package/dist/github/routes/setup.d.ts +2 -2
  10. package/dist/github/routes/tokenExchange.d.ts +2 -2
  11. package/dist/github/routes/webhooks.d.ts +2 -2
  12. package/package.json +2 -10
  13. package/dist/db/manageDbClient.d.ts +0 -7
  14. package/dist/db/manageDbClient.js +0 -16
  15. package/dist/slack/index.d.ts +0 -19
  16. package/dist/slack/index.js +0 -29
  17. package/dist/slack/middleware/permissions.d.ts +0 -16
  18. package/dist/slack/middleware/permissions.js +0 -49
  19. package/dist/slack/routes/events.d.ts +0 -10
  20. package/dist/slack/routes/events.js +0 -319
  21. package/dist/slack/routes/index.d.ts +0 -11
  22. package/dist/slack/routes/index.js +0 -64
  23. package/dist/slack/routes/internal.d.ts +0 -10
  24. package/dist/slack/routes/internal.js +0 -107
  25. package/dist/slack/routes/oauth.d.ts +0 -12
  26. package/dist/slack/routes/oauth.js +0 -218
  27. package/dist/slack/routes/resources.d.ts +0 -10
  28. package/dist/slack/routes/resources.js +0 -163
  29. package/dist/slack/routes/users.d.ts +0 -15
  30. package/dist/slack/routes/users.js +0 -430
  31. package/dist/slack/routes/workspaces.d.ts +0 -10
  32. package/dist/slack/routes/workspaces.js +0 -828
  33. package/dist/slack/routes.d.ts +0 -7
  34. package/dist/slack/routes.js +0 -12
  35. package/dist/slack/services/agent-resolution.d.ts +0 -49
  36. package/dist/slack/services/agent-resolution.js +0 -135
  37. package/dist/slack/services/api-client.d.ts +0 -161
  38. package/dist/slack/services/api-client.js +0 -248
  39. package/dist/slack/services/auth/index.d.ts +0 -61
  40. package/dist/slack/services/auth/index.js +0 -164
  41. package/dist/slack/services/blocks/index.d.ts +0 -60
  42. package/dist/slack/services/blocks/index.js +0 -143
  43. package/dist/slack/services/client.d.ts +0 -78
  44. package/dist/slack/services/client.js +0 -152
  45. package/dist/slack/services/commands/index.d.ts +0 -15
  46. package/dist/slack/services/commands/index.js +0 -556
  47. package/dist/slack/services/events/app-mention.d.ts +0 -41
  48. package/dist/slack/services/events/app-mention.js +0 -212
  49. package/dist/slack/services/events/block-actions.d.ts +0 -47
  50. package/dist/slack/services/events/block-actions.js +0 -287
  51. package/dist/slack/services/events/index.d.ts +0 -6
  52. package/dist/slack/services/events/index.js +0 -7
  53. package/dist/slack/services/events/modal-submission.d.ts +0 -12
  54. package/dist/slack/services/events/modal-submission.js +0 -279
  55. package/dist/slack/services/events/streaming.d.ts +0 -27
  56. package/dist/slack/services/events/streaming.js +0 -285
  57. package/dist/slack/services/events/utils.d.ts +0 -129
  58. package/dist/slack/services/events/utils.js +0 -315
  59. package/dist/slack/services/index.d.ts +0 -18
  60. package/dist/slack/services/index.js +0 -18
  61. package/dist/slack/services/modals.d.ts +0 -67
  62. package/dist/slack/services/modals.js +0 -203
  63. package/dist/slack/services/nango.d.ts +0 -82
  64. package/dist/slack/services/nango.js +0 -326
  65. package/dist/slack/services/security.d.ts +0 -35
  66. package/dist/slack/services/security.js +0 -65
  67. package/dist/slack/services/types.d.ts +0 -26
  68. package/dist/slack/services/types.js +0 -1
  69. package/dist/slack/services/workspace-tokens.d.ts +0 -37
  70. package/dist/slack/services/workspace-tokens.js +0 -39
  71. package/dist/slack/types.d.ts +0 -10
  72. package/dist/slack/types.js +0 -1
@@ -1,218 +0,0 @@
1
- import { env } from "../../env.js";
2
- import { getLogger } from "../../logger.js";
3
- import runDbClient_default from "../../db/runDbClient.js";
4
- import { computeWorkspaceConnectionId, storeWorkspaceInstallation } from "../services/nango.js";
5
- import { getSlackClient, getSlackTeamInfo, getSlackUserInfo } from "../services/client.js";
6
- import { getBotTokenForTeam, setBotTokenForTeam } from "../services/workspace-tokens.js";
7
- import "../services/index.js";
8
- import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
9
- import { createWorkAppSlackWorkspace } from "@inkeep/agents-core";
10
-
11
- //#region src/slack/routes/oauth.ts
12
- /**
13
- * Slack OAuth Routes
14
- *
15
- * Endpoints for Slack workspace installation via OAuth:
16
- * - GET /install - Redirect to Slack OAuth page
17
- * - GET /oauth_redirect - Handle OAuth callback
18
- */
19
- const logger = getLogger("slack-oauth");
20
- const app = new OpenAPIHono();
21
- app.openapi(createRoute({
22
- method: "get",
23
- path: "/install",
24
- summary: "Install Slack App",
25
- description: "Redirects to Slack OAuth page for workspace installation",
26
- operationId: "slack-install",
27
- tags: [
28
- "Work Apps",
29
- "Slack",
30
- "OAuth"
31
- ],
32
- responses: { 302: { description: "Redirect to Slack OAuth" } }
33
- }), (c) => {
34
- const clientId = env.SLACK_CLIENT_ID;
35
- const redirectUri = `${env.SLACK_APP_URL}/work-apps/slack/oauth_redirect`;
36
- const botScopes = [
37
- "app_mentions:read",
38
- "channels:history",
39
- "channels:read",
40
- "chat:write",
41
- "chat:write.public",
42
- "commands",
43
- "groups:history",
44
- "groups:read",
45
- "im:history",
46
- "im:read",
47
- "im:write",
48
- "team:read",
49
- "users:read",
50
- "users:read.email"
51
- ].join(",");
52
- const slackAuthUrl = new URL("https://slack.com/oauth/v2/authorize");
53
- slackAuthUrl.searchParams.set("client_id", clientId || "");
54
- slackAuthUrl.searchParams.set("scope", botScopes);
55
- slackAuthUrl.searchParams.set("redirect_uri", redirectUri);
56
- logger.info({ redirectUri }, "Redirecting to Slack OAuth");
57
- return c.redirect(slackAuthUrl.toString());
58
- });
59
- app.openapi(createRoute({
60
- method: "get",
61
- path: "/oauth_redirect",
62
- summary: "Slack OAuth Callback",
63
- description: "Handles the OAuth callback from Slack after workspace installation",
64
- operationId: "slack-oauth-redirect",
65
- tags: [
66
- "Work Apps",
67
- "Slack",
68
- "OAuth"
69
- ],
70
- request: { query: z.object({
71
- code: z.string().optional(),
72
- error: z.string().optional()
73
- }) },
74
- responses: { 302: { description: "Redirect to dashboard with workspace data" } }
75
- }), async (c) => {
76
- const { code, error } = c.req.valid("query");
77
- const dashboardUrl = `${env.INKEEP_AGENTS_MANAGE_UI_URL || "http://localhost:3000"}/default/work-apps/slack`;
78
- if (error) {
79
- logger.error({ error }, "Slack OAuth error");
80
- return c.redirect(`${dashboardUrl}?error=${encodeURIComponent(error)}`);
81
- }
82
- if (!code) {
83
- logger.error({}, "No code provided in OAuth callback");
84
- return c.redirect(`${dashboardUrl}?error=no_code`);
85
- }
86
- try {
87
- const tokenData = await (await fetch("https://slack.com/api/oauth.v2.access", {
88
- method: "POST",
89
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
90
- body: new URLSearchParams({
91
- client_id: env.SLACK_CLIENT_ID || "",
92
- client_secret: env.SLACK_CLIENT_SECRET || "",
93
- code,
94
- redirect_uri: `${env.SLACK_APP_URL}/work-apps/slack/oauth_redirect`
95
- })
96
- })).json();
97
- if (!tokenData.ok) {
98
- logger.error({ error: tokenData.error }, "Slack token exchange failed");
99
- return c.redirect(`${dashboardUrl}?error=${encodeURIComponent(tokenData.error || "token_exchange_failed")}`);
100
- }
101
- const client = getSlackClient(tokenData.access_token);
102
- const teamInfo = await getSlackTeamInfo(client);
103
- logger.debug({ teamInfo }, "Retrieved Slack team info");
104
- const installerUserId = tokenData.authed_user?.id;
105
- let installerUserName;
106
- if (installerUserId) try {
107
- const userInfo = await getSlackUserInfo(client, installerUserId);
108
- installerUserName = userInfo?.realName || userInfo?.name;
109
- } catch {
110
- logger.warn({ installerUserId }, "Could not fetch installer user info");
111
- }
112
- const workspaceData = {
113
- ok: true,
114
- teamId: tokenData.team?.id,
115
- teamName: tokenData.team?.name,
116
- teamDomain: teamInfo?.domain,
117
- workspaceUrl: teamInfo?.url,
118
- workspaceIconUrl: teamInfo?.icon,
119
- enterpriseId: tokenData.enterprise?.id,
120
- enterpriseName: tokenData.enterprise?.name,
121
- isEnterpriseInstall: tokenData.is_enterprise_install || false,
122
- botUserId: tokenData.bot_user_id,
123
- botToken: tokenData.access_token,
124
- botScopes: tokenData.scope,
125
- installerUserId,
126
- installerUserName,
127
- appId: tokenData.app_id,
128
- installedAt: (/* @__PURE__ */ new Date()).toISOString()
129
- };
130
- if (workspaceData.teamId && workspaceData.botToken) {
131
- const tenantId = "default";
132
- const nangoResult = await storeWorkspaceInstallation({
133
- teamId: workspaceData.teamId,
134
- teamName: workspaceData.teamName,
135
- teamDomain: workspaceData.teamDomain,
136
- workspaceUrl: workspaceData.workspaceUrl,
137
- workspaceIconUrl: workspaceData.workspaceIconUrl,
138
- enterpriseId: workspaceData.enterpriseId,
139
- enterpriseName: workspaceData.enterpriseName,
140
- botUserId: workspaceData.botUserId,
141
- botToken: workspaceData.botToken,
142
- botScopes: workspaceData.botScopes,
143
- installerUserId: workspaceData.installerUserId,
144
- installerUserName: workspaceData.installerUserName,
145
- isEnterpriseInstall: workspaceData.isEnterpriseInstall,
146
- appId: workspaceData.appId,
147
- tenantId,
148
- installationSource: "dashboard"
149
- });
150
- if (nangoResult.success && nangoResult.connectionId) {
151
- logger.info({
152
- teamId: workspaceData.teamId,
153
- connectionId: nangoResult.connectionId
154
- }, "Stored workspace installation in Nango");
155
- try {
156
- await createWorkAppSlackWorkspace(runDbClient_default)({
157
- tenantId,
158
- slackTeamId: workspaceData.teamId,
159
- slackEnterpriseId: workspaceData.enterpriseId,
160
- slackAppId: workspaceData.appId,
161
- slackTeamName: workspaceData.teamName,
162
- nangoConnectionId: nangoResult.connectionId,
163
- status: "active"
164
- });
165
- logger.info({
166
- teamId: workspaceData.teamId,
167
- tenantId
168
- }, "Persisted workspace installation to database");
169
- } catch (dbError) {
170
- const dbErrorMessage = dbError instanceof Error ? dbError.message : String(dbError);
171
- if (dbErrorMessage.includes("duplicate key") || dbErrorMessage.includes("unique constraint")) logger.info({
172
- teamId: workspaceData.teamId,
173
- tenantId
174
- }, "Workspace already exists in database");
175
- else logger.error({
176
- error: dbErrorMessage,
177
- teamId: workspaceData.teamId
178
- }, "Failed to persist workspace to database");
179
- }
180
- } else logger.warn({ teamId: workspaceData.teamId }, "Failed to store in Nango, falling back to memory");
181
- setBotTokenForTeam(workspaceData.teamId, {
182
- botToken: workspaceData.botToken,
183
- teamName: workspaceData.teamName || "",
184
- installedAt: workspaceData.installedAt
185
- });
186
- }
187
- logger.info({
188
- teamId: workspaceData.teamId,
189
- teamName: workspaceData.teamName
190
- }, "Slack workspace installation successful");
191
- const safeWorkspaceData = {
192
- ok: workspaceData.ok,
193
- teamId: workspaceData.teamId,
194
- teamName: workspaceData.teamName,
195
- teamDomain: workspaceData.teamDomain,
196
- enterpriseId: workspaceData.enterpriseId,
197
- enterpriseName: workspaceData.enterpriseName,
198
- isEnterpriseInstall: workspaceData.isEnterpriseInstall,
199
- botUserId: workspaceData.botUserId,
200
- botScopes: workspaceData.botScopes,
201
- installerUserId: workspaceData.installerUserId,
202
- installedAt: workspaceData.installedAt,
203
- connectionId: workspaceData.teamId ? computeWorkspaceConnectionId({
204
- teamId: workspaceData.teamId,
205
- enterpriseId: workspaceData.enterpriseId
206
- }) : void 0
207
- };
208
- const encodedData = encodeURIComponent(JSON.stringify(safeWorkspaceData));
209
- return c.redirect(`${dashboardUrl}?success=true&workspace=${encodedData}`);
210
- } catch (err) {
211
- logger.error({ error: err }, "Slack OAuth callback error");
212
- return c.redirect(`${dashboardUrl}?error=callback_error`);
213
- }
214
- });
215
- var oauth_default = app;
216
-
217
- //#endregion
218
- export { oauth_default as default, getBotTokenForTeam, setBotTokenForTeam };
@@ -1,10 +0,0 @@
1
- import { WorkAppsVariables } from "../types.js";
2
- import { OpenAPIHono } from "@hono/zod-openapi";
3
-
4
- //#region src/slack/routes/resources.d.ts
5
-
6
- declare const app: OpenAPIHono<{
7
- Variables: WorkAppsVariables;
8
- }, {}, "/">;
9
- //#endregion
10
- export { app as default };
@@ -1,163 +0,0 @@
1
- import { getLogger } from "../../logger.js";
2
- import manageDbClient_default from "../../db/manageDbClient.js";
3
- import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
4
- import { listAgents, listProjectsPaginated } from "@inkeep/agents-core";
5
-
6
- //#region src/slack/routes/resources.ts
7
- /**
8
- * Slack Resources Routes
9
- *
10
- * Endpoints for listing projects and agents:
11
- * - GET /projects - List projects for tenant
12
- * - GET /projects/:projectId/agents - List agents in project
13
- * - GET /agents - List all agents (flat view)
14
- */
15
- const logger = getLogger("slack-resources");
16
- const app = new OpenAPIHono();
17
- const ProjectSchema = z.object({
18
- id: z.string(),
19
- name: z.string().nullable(),
20
- description: z.string().nullable().optional()
21
- });
22
- const AgentSchema = z.object({
23
- id: z.string(),
24
- name: z.string().nullable(),
25
- projectId: z.string(),
26
- projectName: z.string().nullable().optional()
27
- });
28
- app.openapi(createRoute({
29
- method: "get",
30
- path: "/projects",
31
- summary: "List Projects",
32
- description: "List all projects for the tenant",
33
- operationId: "slack-list-projects",
34
- tags: [
35
- "Work Apps",
36
- "Slack",
37
- "Resources"
38
- ],
39
- request: { query: z.object({
40
- tenantId: z.string().optional().default("default"),
41
- limit: z.coerce.number().optional().default(100)
42
- }) },
43
- responses: { 200: {
44
- description: "List of projects",
45
- content: { "application/json": { schema: z.object({ projects: z.array(ProjectSchema) }) } }
46
- } }
47
- }), async (c) => {
48
- const { tenantId, limit } = c.req.valid("query");
49
- try {
50
- const result = await listProjectsPaginated(manageDbClient_default)({
51
- tenantId,
52
- pagination: { limit }
53
- });
54
- return c.json({ projects: result.data.map((p) => ({
55
- id: p.id,
56
- name: p.name,
57
- description: p.description
58
- })) });
59
- } catch (error) {
60
- logger.error({
61
- error,
62
- tenantId
63
- }, "Failed to list projects");
64
- return c.json({ projects: [] });
65
- }
66
- });
67
- app.openapi(createRoute({
68
- method: "get",
69
- path: "/projects/:projectId/agents",
70
- summary: "List Agents in Project",
71
- description: "List all agents within a specific project",
72
- operationId: "slack-list-project-agents",
73
- tags: [
74
- "Work Apps",
75
- "Slack",
76
- "Resources"
77
- ],
78
- request: {
79
- params: z.object({ projectId: z.string() }),
80
- query: z.object({ tenantId: z.string().optional().default("default") })
81
- },
82
- responses: { 200: {
83
- description: "List of agents",
84
- content: { "application/json": { schema: z.object({ agents: z.array(AgentSchema) }) } }
85
- } }
86
- }), async (c) => {
87
- const { projectId } = c.req.valid("param");
88
- const { tenantId } = c.req.valid("query");
89
- try {
90
- const agents = await listAgents(manageDbClient_default)({ scopes: {
91
- tenantId,
92
- projectId
93
- } });
94
- return c.json({ agents: agents.map((a) => ({
95
- id: a.id,
96
- name: a.name,
97
- projectId,
98
- projectName: void 0
99
- })) });
100
- } catch (error) {
101
- logger.error({
102
- error,
103
- tenantId,
104
- projectId
105
- }, "Failed to list agents");
106
- return c.json({ agents: [] });
107
- }
108
- });
109
- app.openapi(createRoute({
110
- method: "get",
111
- path: "/agents",
112
- summary: "List All Agents",
113
- description: "List all agents across all projects (flat view)",
114
- operationId: "slack-list-all-agents",
115
- tags: [
116
- "Work Apps",
117
- "Slack",
118
- "Resources"
119
- ],
120
- request: { query: z.object({ tenantId: z.string().optional().default("default") }) },
121
- responses: { 200: {
122
- description: "List of agents",
123
- content: { "application/json": { schema: z.object({ agents: z.array(AgentSchema) }) } }
124
- } }
125
- }), async (c) => {
126
- const { tenantId } = c.req.valid("query");
127
- try {
128
- const projectsResult = await listProjectsPaginated(manageDbClient_default)({
129
- tenantId,
130
- pagination: { limit: 100 }
131
- });
132
- const allAgents = (await Promise.all((projectsResult.data || []).map(async (project) => {
133
- try {
134
- return (await listAgents(manageDbClient_default)({ scopes: {
135
- tenantId,
136
- projectId: project.id
137
- } })).map((agent) => ({
138
- id: agent.id,
139
- name: agent.name,
140
- projectId: project.id,
141
- projectName: project.name
142
- }));
143
- } catch (error) {
144
- logger.warn({
145
- projectId: project.id,
146
- error
147
- }, "Failed to fetch agents for project");
148
- return [];
149
- }
150
- }))).flat();
151
- return c.json({ agents: allAgents });
152
- } catch (error) {
153
- logger.error({
154
- error,
155
- tenantId
156
- }, "Failed to list agents");
157
- return c.json({ agents: [] });
158
- }
159
- });
160
- var resources_default = app;
161
-
162
- //#endregion
163
- export { resources_default as default };
@@ -1,15 +0,0 @@
1
- import { WorkAppsVariables } from "../types.js";
2
- import { OpenAPIHono } from "@hono/zod-openapi";
3
-
4
- //#region src/slack/routes/users.d.ts
5
-
6
- declare const app: OpenAPIHono<{
7
- Variables: WorkAppsVariables;
8
- }, {}, "/">;
9
- declare const pendingSessionTokens: Map<string, {
10
- token: string;
11
- expiresAt: string;
12
- createdAt: number;
13
- }>;
14
- //#endregion
15
- export { app as default, pendingSessionTokens };