@inkeep/agents-api 0.0.0-dev-20260202155313 → 0.0.0-dev-20260203024837

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 (57) hide show
  1. package/dist/.well-known/workflow/v1/manifest.debug.json +16 -16
  2. package/dist/.well-known/workflow/v1/step.cjs +57298 -56998
  3. package/dist/createApp.js +3 -3
  4. package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
  5. package/dist/domains/evals/routes/index.d.ts +2 -2
  6. package/dist/domains/evals/workflow/routes.d.ts +2 -2
  7. package/dist/domains/manage/index.js +6 -0
  8. package/dist/domains/manage/routes/conversations.d.ts +2 -2
  9. package/dist/domains/manage/routes/evals/evaluationResults.d.ts +2 -2
  10. package/dist/domains/manage/routes/github.d.ts +16 -0
  11. package/dist/domains/manage/routes/github.js +511 -0
  12. package/dist/domains/manage/routes/index.d.ts +2 -2
  13. package/dist/domains/manage/routes/mcp.d.ts +2 -2
  14. package/dist/domains/manage/routes/mcpToolGithubAccess.d.ts +9 -0
  15. package/dist/domains/manage/routes/mcpToolGithubAccess.js +205 -0
  16. package/dist/domains/manage/routes/projectGithubAccess.d.ts +9 -0
  17. package/dist/domains/manage/routes/projectGithubAccess.js +167 -0
  18. package/dist/domains/manage/routes/signoz.d.ts +2 -2
  19. package/dist/domains/manage/routes/tools.js +4 -2
  20. package/dist/domains/mcp/routes/mcp.d.ts +2 -2
  21. package/dist/domains/run/agents/Agent.js +7 -1
  22. package/dist/domains/run/constants/execution-limits/defaults.d.ts +1 -1
  23. package/dist/domains/run/constants/execution-limits/defaults.js +1 -1
  24. package/dist/domains/run/constants/execution-limits/index.d.ts +1 -1
  25. package/dist/domains/run/context/ContextResolver.js +1 -1
  26. package/dist/domains/run/services/AgentSession.js +5 -1
  27. package/dist/domains/run/services/BaseCompressor.js +1 -1
  28. package/dist/domains/run/types/executionContext.js +3 -1
  29. package/dist/env.d.ts +12 -0
  30. package/dist/env.js +37 -31
  31. package/dist/factory.d.ts +18 -18
  32. package/dist/index.d.ts +18 -18
  33. package/dist/middleware/evalsAuth.d.ts +2 -2
  34. package/dist/middleware/manageAuth.d.ts +2 -2
  35. package/dist/middleware/projectAccess.d.ts +2 -2
  36. package/dist/middleware/projectConfig.d.ts +3 -3
  37. package/dist/middleware/requirePermission.d.ts +2 -2
  38. package/dist/middleware/runAuth.d.ts +4 -4
  39. package/dist/middleware/sessionAuth.d.ts +3 -3
  40. package/dist/middleware/tenantAccess.d.ts +2 -2
  41. package/dist/middleware/tracing.d.ts +3 -3
  42. package/dist/openapi.d.ts +1 -0
  43. package/dist/openapi.js +1 -0
  44. package/dist/types/runExecutionContext.js +3 -1
  45. package/package.json +5 -4
  46. package/dist/domains/github/config.d.ts +0 -14
  47. package/dist/domains/github/config.js +0 -47
  48. package/dist/domains/github/index.d.ts +0 -12
  49. package/dist/domains/github/index.js +0 -18
  50. package/dist/domains/github/installation.d.ts +0 -34
  51. package/dist/domains/github/installation.js +0 -172
  52. package/dist/domains/github/jwks.d.ts +0 -20
  53. package/dist/domains/github/jwks.js +0 -85
  54. package/dist/domains/github/oidcToken.d.ts +0 -22
  55. package/dist/domains/github/oidcToken.js +0 -140
  56. package/dist/domains/github/routes/tokenExchange.d.ts +0 -7
  57. package/dist/domains/github/routes/tokenExchange.js +0 -130
@@ -0,0 +1,205 @@
1
+ import { getLogger as getLogger$1 } from "../../../logger.js";
2
+ import runDbClient_default from "../../../data/db/runDbClient.js";
3
+ import { requireProjectPermission } from "../../../middleware/projectAccess.js";
4
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
5
+ import { TenantProjectParamsSchema, WorkAppGitHubAccessModeSchema, WorkAppGitHubAccessSetRequestSchema, WorkAppGitHubAccessSetResponseSchema, WorkAppGitHubRepositorySelectSchema, commonGetErrorResponses, commonUpdateErrorResponses, createApiError, getMcpToolAccessMode, getMcpToolRepositoryAccessWithDetails, getToolById, setMcpToolAccessMode, setMcpToolRepositoryAccess, validateRepositoryOwnership } from "@inkeep/agents-core";
6
+
7
+ //#region src/domains/manage/routes/mcpToolGithubAccess.ts
8
+ const logger = getLogger$1("mcp-tool-github-access");
9
+ const app = new OpenAPIHono();
10
+ const TenantProjectToolParamsSchema = TenantProjectParamsSchema.extend({ toolId: z.string().min(1).describe("The tool ID") });
11
+ const McpToolGitHubAccessModeSchema = WorkAppGitHubAccessModeSchema.describe("Access mode: \"all\" means the MCP tool has access to all project repositories, \"selected\" means the tool is scoped to specific repositories");
12
+ const SetGitHubAccessRequestSchema = WorkAppGitHubAccessSetRequestSchema.extend({ mode: McpToolGitHubAccessModeSchema });
13
+ const GetGitHubAccessResponseSchema = z.object({
14
+ mode: McpToolGitHubAccessModeSchema,
15
+ repositories: z.array(WorkAppGitHubRepositorySelectSchema.extend({ installationAccountLogin: z.string().describe("The GitHub account login for the installation") })).describe("List of repositories the MCP tool has access to (only populated when mode=\"selected\")")
16
+ });
17
+ const SetGitHubAccessResponseSchema = WorkAppGitHubAccessSetResponseSchema.extend({
18
+ mode: McpToolGitHubAccessModeSchema,
19
+ repositoryCount: z.number().describe("Number of repositories the MCP tool now has access to (0 when mode=\"all\")")
20
+ });
21
+ async function validateGitHubWorkappTool(db, tenantId, projectId, toolId) {
22
+ const tool = await getToolById(db)({
23
+ scopes: {
24
+ tenantId,
25
+ projectId
26
+ },
27
+ toolId
28
+ });
29
+ if (!tool) throw createApiError({
30
+ code: "not_found",
31
+ message: `Tool not found: ${toolId}`
32
+ });
33
+ if (!tool.isWorkApp) throw createApiError({
34
+ code: "bad_request",
35
+ message: "GitHub access can only be configured for workapp MCP tools"
36
+ });
37
+ if (!tool.config.mcp.server.url?.includes("/github")) throw createApiError({
38
+ code: "bad_request",
39
+ message: "GitHub access can only be configured for GitHub MCP tools"
40
+ });
41
+ }
42
+ app.use("/", requireProjectPermission("edit"));
43
+ app.openapi(createRoute({
44
+ method: "get",
45
+ path: "/",
46
+ summary: "Get MCP tool GitHub repository access",
47
+ operationId: "get-mcp-tool-github-access",
48
+ tags: ["Tools"],
49
+ description: "Returns the current GitHub repository access configuration for an MCP tool. If mode is \"all\", the tool has access to all repositories the project can access. If mode is \"selected\", the tool is scoped to specific repositories. ",
50
+ request: { params: TenantProjectToolParamsSchema },
51
+ responses: {
52
+ 200: {
53
+ description: "GitHub access configuration retrieved successfully",
54
+ content: { "application/json": { schema: GetGitHubAccessResponseSchema } }
55
+ },
56
+ ...commonGetErrorResponses
57
+ }
58
+ }), async (c) => {
59
+ const { tenantId, projectId, toolId } = c.req.valid("param");
60
+ const db = c.get("db");
61
+ logger.info({
62
+ tenantId,
63
+ projectId,
64
+ toolId
65
+ }, "Getting MCP tool GitHub access configuration");
66
+ await validateGitHubWorkappTool(db, tenantId, projectId, toolId);
67
+ if (await getMcpToolAccessMode(runDbClient_default)(toolId) === "all") {
68
+ logger.info({
69
+ tenantId,
70
+ projectId,
71
+ toolId
72
+ }, "MCP tool has access to all project repositories (mode=all)");
73
+ return c.json({
74
+ mode: "all",
75
+ repositories: []
76
+ }, 200);
77
+ }
78
+ const repositoriesWithDetails = await getMcpToolRepositoryAccessWithDetails(runDbClient_default)(toolId);
79
+ logger.info({
80
+ tenantId,
81
+ projectId,
82
+ toolId,
83
+ repositoryCount: repositoriesWithDetails.length
84
+ }, "Got MCP tool GitHub access configuration (mode=selected)");
85
+ return c.json({
86
+ mode: "selected",
87
+ repositories: repositoriesWithDetails.map((repo) => ({
88
+ id: repo.id,
89
+ installationDbId: repo.installationDbId,
90
+ repositoryId: repo.repositoryId,
91
+ repositoryName: repo.repositoryName,
92
+ repositoryFullName: repo.repositoryFullName,
93
+ private: repo.private,
94
+ createdAt: repo.createdAt,
95
+ updatedAt: repo.updatedAt,
96
+ installationAccountLogin: repo.installationAccountLogin
97
+ }))
98
+ }, 200);
99
+ });
100
+ app.openapi(createRoute({
101
+ method: "put",
102
+ path: "/",
103
+ summary: "Set MCP tool GitHub repository access",
104
+ operationId: "set-mcp-tool-github-access",
105
+ tags: ["Tools"],
106
+ description: "Configures which GitHub repositories an MCP tool can access. When mode is \"all\", the tool has access to all repositories the project can access. When mode is \"selected\", the tool is scoped to specific repositories (repositoryIds required). This replaces any existing access configuration. This endpoint only works for GitHub workapp MCP tools (isWorkApp=true and URL contains /github).",
107
+ request: {
108
+ params: TenantProjectToolParamsSchema,
109
+ body: { content: { "application/json": { schema: SetGitHubAccessRequestSchema } } }
110
+ },
111
+ responses: {
112
+ 200: {
113
+ description: "GitHub access configuration updated successfully",
114
+ content: { "application/json": { schema: SetGitHubAccessResponseSchema } }
115
+ },
116
+ ...commonUpdateErrorResponses
117
+ }
118
+ }), async (c) => {
119
+ const { tenantId, projectId, toolId } = c.req.valid("param");
120
+ const { mode, repositoryIds } = c.req.valid("json");
121
+ const db = c.get("db");
122
+ logger.info({
123
+ tenantId,
124
+ projectId,
125
+ toolId,
126
+ mode
127
+ }, "Setting MCP tool GitHub access configuration");
128
+ await validateGitHubWorkappTool(db, tenantId, projectId, toolId);
129
+ if (mode === "selected") {
130
+ if (!repositoryIds || repositoryIds.length === 0) {
131
+ logger.warn({
132
+ tenantId,
133
+ projectId,
134
+ toolId
135
+ }, "repositoryIds required when mode is selected");
136
+ throw createApiError({
137
+ code: "bad_request",
138
+ message: "repositoryIds is required when mode is \"selected\""
139
+ });
140
+ }
141
+ const invalidRepoIds = await validateRepositoryOwnership(runDbClient_default)({
142
+ tenantId,
143
+ repositoryIds
144
+ });
145
+ if (invalidRepoIds.length > 0) {
146
+ logger.warn({
147
+ tenantId,
148
+ projectId,
149
+ toolId,
150
+ invalidRepoIds
151
+ }, "Some repository IDs do not belong to tenant installations");
152
+ throw createApiError({
153
+ code: "bad_request",
154
+ message: `Invalid repository IDs: ${invalidRepoIds.join(", ")}. Repositories must belong to GitHub installations owned by this tenant.`
155
+ });
156
+ }
157
+ await setMcpToolAccessMode(runDbClient_default)({
158
+ toolId,
159
+ tenantId,
160
+ projectId,
161
+ mode: "selected"
162
+ });
163
+ await setMcpToolRepositoryAccess(runDbClient_default)({
164
+ toolId,
165
+ tenantId,
166
+ projectId,
167
+ repositoryIds
168
+ });
169
+ logger.info({
170
+ tenantId,
171
+ projectId,
172
+ toolId,
173
+ repositoryCount: repositoryIds.length
174
+ }, "MCP tool GitHub access set to selected repositories");
175
+ return c.json({
176
+ mode: "selected",
177
+ repositoryCount: repositoryIds.length
178
+ }, 200);
179
+ }
180
+ await setMcpToolAccessMode(runDbClient_default)({
181
+ toolId,
182
+ tenantId,
183
+ projectId,
184
+ mode: "all"
185
+ });
186
+ await setMcpToolRepositoryAccess(runDbClient_default)({
187
+ toolId,
188
+ tenantId,
189
+ projectId,
190
+ repositoryIds: []
191
+ });
192
+ logger.info({
193
+ tenantId,
194
+ projectId,
195
+ toolId
196
+ }, "MCP tool GitHub access set to all project repositories");
197
+ return c.json({
198
+ mode: "all",
199
+ repositoryCount: 0
200
+ }, 200);
201
+ });
202
+ var mcpToolGithubAccess_default = app;
203
+
204
+ //#endregion
205
+ export { mcpToolGithubAccess_default as default };
@@ -0,0 +1,9 @@
1
+ import { ManageAppVariables } from "../../../types/app.js";
2
+ import { OpenAPIHono } from "@hono/zod-openapi";
3
+
4
+ //#region src/domains/manage/routes/projectGithubAccess.d.ts
5
+ declare const app: OpenAPIHono<{
6
+ Variables: ManageAppVariables;
7
+ }, {}, "/">;
8
+ //#endregion
9
+ export { app as default };
@@ -0,0 +1,167 @@
1
+ import { getLogger as getLogger$1 } from "../../../logger.js";
2
+ import runDbClient_default from "../../../data/db/runDbClient.js";
3
+ import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
4
+ import { TenantProjectParamsSchema, WorkAppGitHubAccessGetResponseSchema, WorkAppGitHubAccessModeSchema, WorkAppGitHubAccessSetRequestSchema, WorkAppGitHubAccessSetResponseSchema, commonGetErrorResponses, commonUpdateErrorResponses, createApiError, getProjectAccessMode, getProjectRepositoryAccessWithDetails, setProjectAccessMode, setProjectRepositoryAccess, validateRepositoryOwnership } from "@inkeep/agents-core";
5
+
6
+ //#region src/domains/manage/routes/projectGithubAccess.ts
7
+ const logger = getLogger$1("project-github-access");
8
+ const app = new OpenAPIHono();
9
+ const ProjectGitHubAccessModeSchema = WorkAppGitHubAccessModeSchema.describe("Access mode: \"all\" means project has access to all tenant repositories, \"selected\" means project is scoped to specific repositories");
10
+ const SetGitHubAccessRequestSchema = WorkAppGitHubAccessSetRequestSchema.extend({ mode: ProjectGitHubAccessModeSchema });
11
+ const GetGitHubAccessResponseSchema = WorkAppGitHubAccessGetResponseSchema.extend({ mode: ProjectGitHubAccessModeSchema }).describe("GitHub access configuration for a project");
12
+ const SetGitHubAccessResponseSchema = WorkAppGitHubAccessSetResponseSchema.extend({
13
+ mode: ProjectGitHubAccessModeSchema,
14
+ repositoryCount: z.number().describe("Number of repositories the project now has access to (0 when mode=\"all\")")
15
+ });
16
+ app.openapi(createRoute({
17
+ method: "get",
18
+ path: "/",
19
+ summary: "Get project GitHub repository access",
20
+ operationId: "get-project-github-access",
21
+ tags: ["Projects"],
22
+ description: "Returns the current GitHub repository access configuration for a project. If mode is \"all\", the project has access to all repositories from tenant GitHub installations. If mode is \"selected\", the project is scoped to specific repositories.",
23
+ request: { params: TenantProjectParamsSchema },
24
+ responses: {
25
+ 200: {
26
+ description: "GitHub access configuration retrieved successfully",
27
+ content: { "application/json": { schema: GetGitHubAccessResponseSchema } }
28
+ },
29
+ ...commonGetErrorResponses
30
+ }
31
+ }), async (c) => {
32
+ const { tenantId, projectId } = c.req.valid("param");
33
+ logger.info({
34
+ tenantId,
35
+ projectId
36
+ }, "Getting project GitHub access configuration");
37
+ if (await getProjectAccessMode(runDbClient_default)({
38
+ tenantId,
39
+ projectId
40
+ }) === "all") {
41
+ logger.info({
42
+ tenantId,
43
+ projectId
44
+ }, "Project has access to all repositories (mode=all)");
45
+ return c.json({
46
+ mode: "all",
47
+ repositories: []
48
+ }, 200);
49
+ }
50
+ const repositoriesWithDetails = await getProjectRepositoryAccessWithDetails(runDbClient_default)({
51
+ tenantId,
52
+ projectId
53
+ });
54
+ logger.info({
55
+ tenantId,
56
+ projectId,
57
+ repositoryCount: repositoriesWithDetails.length
58
+ }, "Got project GitHub access configuration (mode=selected)");
59
+ return c.json({
60
+ mode: "selected",
61
+ repositories: repositoriesWithDetails.map((repo) => ({
62
+ id: repo.id,
63
+ installationDbId: repo.installationDbId,
64
+ repositoryId: repo.repositoryId,
65
+ repositoryName: repo.repositoryName,
66
+ repositoryFullName: repo.repositoryFullName,
67
+ private: repo.private,
68
+ createdAt: repo.createdAt,
69
+ updatedAt: repo.updatedAt
70
+ }))
71
+ }, 200);
72
+ });
73
+ app.openapi(createRoute({
74
+ method: "put",
75
+ path: "/",
76
+ summary: "Set project GitHub repository access",
77
+ operationId: "set-project-github-access",
78
+ tags: ["Projects"],
79
+ description: "Configures which GitHub repositories a project can access. When mode is \"all\", the project has access to all repositories from tenant GitHub installations. When mode is \"selected\", the project is scoped to specific repositories (repositoryIds required). This replaces any existing access configuration.",
80
+ request: {
81
+ params: TenantProjectParamsSchema,
82
+ body: { content: { "application/json": { schema: SetGitHubAccessRequestSchema } } }
83
+ },
84
+ responses: {
85
+ 200: {
86
+ description: "GitHub access configuration updated successfully",
87
+ content: { "application/json": { schema: SetGitHubAccessResponseSchema } }
88
+ },
89
+ ...commonUpdateErrorResponses
90
+ }
91
+ }), async (c) => {
92
+ const { tenantId, projectId } = c.req.valid("param");
93
+ const { mode, repositoryIds } = c.req.valid("json");
94
+ logger.info({
95
+ tenantId,
96
+ projectId,
97
+ mode
98
+ }, "Setting project GitHub access configuration");
99
+ if (mode === "selected") {
100
+ if (!repositoryIds || repositoryIds.length === 0) {
101
+ logger.warn({
102
+ tenantId,
103
+ projectId
104
+ }, "repositoryIds required when mode is selected");
105
+ throw createApiError({
106
+ code: "bad_request",
107
+ message: "repositoryIds is required when mode is \"selected\""
108
+ });
109
+ }
110
+ const invalidRepoIds = await validateRepositoryOwnership(runDbClient_default)({
111
+ tenantId,
112
+ repositoryIds
113
+ });
114
+ if (invalidRepoIds.length > 0) {
115
+ logger.warn({
116
+ tenantId,
117
+ projectId,
118
+ invalidRepoIds
119
+ }, "Some repository IDs do not belong to tenant installations");
120
+ throw createApiError({
121
+ code: "bad_request",
122
+ message: `Invalid repository IDs: ${invalidRepoIds.join(", ")}. Repositories must belong to GitHub installations owned by this tenant.`
123
+ });
124
+ }
125
+ await setProjectAccessMode(runDbClient_default)({
126
+ tenantId,
127
+ projectId,
128
+ mode: "selected"
129
+ });
130
+ await setProjectRepositoryAccess(runDbClient_default)({
131
+ tenantId,
132
+ projectId,
133
+ repositoryIds
134
+ });
135
+ logger.info({
136
+ tenantId,
137
+ projectId,
138
+ repositoryCount: repositoryIds.length
139
+ }, "Project GitHub access set to selected repositories");
140
+ return c.json({
141
+ mode: "selected",
142
+ repositoryCount: repositoryIds.length
143
+ }, 200);
144
+ }
145
+ await setProjectAccessMode(runDbClient_default)({
146
+ tenantId,
147
+ projectId,
148
+ mode: "all"
149
+ });
150
+ await setProjectRepositoryAccess(runDbClient_default)({
151
+ tenantId,
152
+ projectId,
153
+ repositoryIds: []
154
+ });
155
+ logger.info({
156
+ tenantId,
157
+ projectId
158
+ }, "Project GitHub access set to all repositories");
159
+ return c.json({
160
+ mode: "all",
161
+ repositoryCount: 0
162
+ }, 200);
163
+ });
164
+ var projectGithubAccess_default = app;
165
+
166
+ //#endregion
167
+ export { projectGithubAccess_default as default };
@@ -1,10 +1,10 @@
1
1
  import { ManageAppVariables } from "../../../types/app.js";
2
2
  import { Hono } from "hono";
3
- import * as hono_types11 from "hono/types";
3
+ import * as hono_types7 from "hono/types";
4
4
 
5
5
  //#region src/domains/manage/routes/signoz.d.ts
6
6
  declare const app: Hono<{
7
7
  Variables: ManageAppVariables;
8
- }, hono_types11.BlankSchema, "/">;
8
+ }, hono_types7.BlankSchema, "/">;
9
9
  //#endregion
10
10
  export { app as default };
@@ -161,7 +161,8 @@ app.openapi(createRoute({
161
161
  credentialReferenceId: body.credentialReferenceId,
162
162
  credentialScope: body.credentialScope,
163
163
  imageUrl: body.imageUrl,
164
- headers: body.headers
164
+ headers: body.headers,
165
+ isWorkApp: body.isWorkApp
165
166
  });
166
167
  return c.json({ data: await dbResultToMcpTool(tool, db, credentialStores, void 0, userId) }, 201);
167
168
  });
@@ -204,7 +205,8 @@ app.openapi(createRoute({
204
205
  credentialReferenceId: body.credentialReferenceId,
205
206
  credentialScope: body.credentialScope,
206
207
  imageUrl: body.imageUrl,
207
- headers: body.headers
208
+ headers: body.headers,
209
+ isWorkApp: body.isWorkApp
208
210
  }
209
211
  });
210
212
  if (!updatedTool) throw createApiError({
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
- import * as hono_types16 from "hono/types";
2
+ import * as hono_types8 from "hono/types";
3
3
 
4
4
  //#region src/domains/mcp/routes/mcp.d.ts
5
- declare const app: Hono<hono_types16.BlankEnv, hono_types16.BlankSchema, "/">;
5
+ declare const app: Hono<hono_types8.BlankEnv, hono_types8.BlankSchema, "/">;
6
6
  //#endregion
7
7
  export { app as default };
@@ -1,4 +1,5 @@
1
1
  import { getLogger as getLogger$1 } from "../../../logger.js";
2
+ import { env } from "../../../env.js";
2
3
  import manageDbPool_default from "../../../data/db/manageDbPool.js";
3
4
  import runDbClient_default from "../../../data/db/runDbClient.js";
4
5
  import { AGENT_EXECUTION_MAX_GENERATION_STEPS, FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT, FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS, LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS } from "../constants/execution-limits/index.js";
@@ -26,7 +27,7 @@ import { SystemPromptBuilder } from "./SystemPromptBuilder.js";
26
27
  import { Phase1Config, V1_BREAKDOWN_SCHEMA } from "./versions/v1/Phase1Config.js";
27
28
  import { Phase2Config } from "./versions/v1/Phase2Config.js";
28
29
  import { z } from "@hono/zod-openapi";
29
- import { CredentialStuffer, JsonTransformer, MCPServerType, MCPTransportType, McpClient, ModelFactory, TemplateEngine, buildComposioMCPUrl, createMessage, generateId, getFunctionToolsForSubAgent, getLedgerArtifacts, listTaskIdsByContextId, parseEmbeddedJson, withRef } from "@inkeep/agents-core";
30
+ import { CredentialStuffer, JsonTransformer, MCPServerType, MCPTransportType, McpClient, ModelFactory, TemplateEngine, buildComposioMCPUrl, createMessage, generateId, getFunctionToolsForSubAgent, getLedgerArtifacts, isGithubWorkAppTool, listTaskIdsByContextId, parseEmbeddedJson, withRef } from "@inkeep/agents-core";
30
31
  import { Output, generateText, streamText, tool } from "ai";
31
32
  import { SpanStatusCode, trace } from "@opentelemetry/api";
32
33
 
@@ -681,6 +682,11 @@ var Agent = class {
681
682
  headers: agentToolRelationHeaders
682
683
  };
683
684
  }
685
+ if (isGithubWorkAppTool(tool$1)) serverConfig.headers = {
686
+ ...serverConfig.headers,
687
+ "x-inkeep-tool-id": tool$1.id,
688
+ Authorization: `Bearer ${env.GITHUB_MCP_API_KEY}`
689
+ };
684
690
  if (serverConfig.url) serverConfig.url = buildComposioMCPUrl(serverConfig.url.toString(), this.config.tenantId, this.config.projectId, isUserScoped ? "user" : "project", userId);
685
691
  if (this.config.forwardedHeaders && Object.keys(this.config.forwardedHeaders).length > 0) serverConfig.headers = {
686
692
  ...serverConfig.headers,
@@ -5,7 +5,7 @@
5
5
  */
6
6
  declare const executionLimitsDefaults: {
7
7
  readonly AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS: 3;
8
- readonly AGENT_EXECUTION_MAX_GENERATION_STEPS: 5;
8
+ readonly AGENT_EXECUTION_MAX_GENERATION_STEPS: 50;
9
9
  readonly LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING: 270000;
10
10
  readonly LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING: 90000;
11
11
  readonly LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS: 90000;
@@ -5,7 +5,7 @@
5
5
  */
6
6
  const executionLimitsDefaults = {
7
7
  AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS: 3,
8
- AGENT_EXECUTION_MAX_GENERATION_STEPS: 5,
8
+ AGENT_EXECUTION_MAX_GENERATION_STEPS: 50,
9
9
  LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING: 27e4,
10
10
  LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING: 9e4,
11
11
  LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS: 9e4,
@@ -1,6 +1,6 @@
1
1
  import { executionLimitsDefaults } from "./defaults.js";
2
2
 
3
3
  //#region src/domains/run/constants/execution-limits/index.d.ts
4
- declare const AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS: 3, AGENT_EXECUTION_MAX_GENERATION_STEPS: 5, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING: 270000, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING: 90000, LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS: 90000, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS: 600000, FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT: 30000, FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT: 4, FUNCTION_TOOL_SANDBOX_POOL_TTL_MS: 300000, FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT: 50, FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES: 1048576, FUNCTION_TOOL_SANDBOX_QUEUE_WAIT_TIMEOUT_MS: 30000, FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS: 60000, MCP_TOOL_REQUEST_TIMEOUT_MS_DEFAULT: 60000, DELEGATION_TOOL_BACKOFF_INITIAL_INTERVAL_MS: 100, DELEGATION_TOOL_BACKOFF_MAX_INTERVAL_MS: 10000, DELEGATION_TOOL_BACKOFF_EXPONENT: 2, DELEGATION_TOOL_BACKOFF_MAX_ELAPSED_TIME_MS: 20000, A2A_BACKOFF_INITIAL_INTERVAL_MS: 500, A2A_BACKOFF_MAX_INTERVAL_MS: 60000, A2A_BACKOFF_EXPONENT: 1.5, A2A_BACKOFF_MAX_ELAPSED_TIME_MS: 30000, ARTIFACT_GENERATION_MAX_RETRIES: 3, ARTIFACT_SESSION_MAX_PENDING: 100, ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES: 3, ARTIFACT_GENERATION_BACKOFF_INITIAL_MS: 1000, ARTIFACT_GENERATION_BACKOFF_MAX_MS: 10000, SESSION_TOOL_RESULT_CACHE_TIMEOUT_MS: 300000, SESSION_CLEANUP_INTERVAL_MS: 60000, STATUS_UPDATE_DEFAULT_NUM_EVENTS: 1, STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS: 2, STREAM_PARSER_MAX_SNAPSHOT_SIZE: 100, STREAM_PARSER_MAX_STREAMED_SIZE: 1000, STREAM_PARSER_MAX_COLLECTED_PARTS: 10000, STREAM_BUFFER_MAX_SIZE_BYTES: 5242880, STREAM_TEXT_GAP_THRESHOLD_MS: 2000, STREAM_MAX_LIFETIME_MS: 600000, CONVERSATION_HISTORY_DEFAULT_LIMIT: 50, CONVERSATION_ARTIFACTS_LIMIT: 12, COMPRESSION_HARD_LIMIT: 120000, COMPRESSION_SAFETY_BUFFER: 20000, COMPRESSION_ENABLED: true;
4
+ declare const AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS: 3, AGENT_EXECUTION_MAX_GENERATION_STEPS: 50, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING: 270000, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING: 90000, LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS: 90000, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS: 600000, FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT: 30000, FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT: 4, FUNCTION_TOOL_SANDBOX_POOL_TTL_MS: 300000, FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT: 50, FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES: 1048576, FUNCTION_TOOL_SANDBOX_QUEUE_WAIT_TIMEOUT_MS: 30000, FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS: 60000, MCP_TOOL_REQUEST_TIMEOUT_MS_DEFAULT: 60000, DELEGATION_TOOL_BACKOFF_INITIAL_INTERVAL_MS: 100, DELEGATION_TOOL_BACKOFF_MAX_INTERVAL_MS: 10000, DELEGATION_TOOL_BACKOFF_EXPONENT: 2, DELEGATION_TOOL_BACKOFF_MAX_ELAPSED_TIME_MS: 20000, A2A_BACKOFF_INITIAL_INTERVAL_MS: 500, A2A_BACKOFF_MAX_INTERVAL_MS: 60000, A2A_BACKOFF_EXPONENT: 1.5, A2A_BACKOFF_MAX_ELAPSED_TIME_MS: 30000, ARTIFACT_GENERATION_MAX_RETRIES: 3, ARTIFACT_SESSION_MAX_PENDING: 100, ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES: 3, ARTIFACT_GENERATION_BACKOFF_INITIAL_MS: 1000, ARTIFACT_GENERATION_BACKOFF_MAX_MS: 10000, SESSION_TOOL_RESULT_CACHE_TIMEOUT_MS: 300000, SESSION_CLEANUP_INTERVAL_MS: 60000, STATUS_UPDATE_DEFAULT_NUM_EVENTS: 1, STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS: 2, STREAM_PARSER_MAX_SNAPSHOT_SIZE: 100, STREAM_PARSER_MAX_STREAMED_SIZE: 1000, STREAM_PARSER_MAX_COLLECTED_PARTS: 10000, STREAM_BUFFER_MAX_SIZE_BYTES: 5242880, STREAM_TEXT_GAP_THRESHOLD_MS: 2000, STREAM_MAX_LIFETIME_MS: 600000, CONVERSATION_HISTORY_DEFAULT_LIMIT: 50, CONVERSATION_ARTIFACTS_LIMIT: 12, COMPRESSION_HARD_LIMIT: 120000, COMPRESSION_SAFETY_BUFFER: 20000, COMPRESSION_ENABLED: true;
5
5
  //#endregion
6
6
  export { A2A_BACKOFF_EXPONENT, A2A_BACKOFF_INITIAL_INTERVAL_MS, A2A_BACKOFF_MAX_ELAPSED_TIME_MS, A2A_BACKOFF_MAX_INTERVAL_MS, AGENT_EXECUTION_MAX_CONSECUTIVE_ERRORS, AGENT_EXECUTION_MAX_GENERATION_STEPS, ARTIFACT_GENERATION_BACKOFF_INITIAL_MS, ARTIFACT_GENERATION_BACKOFF_MAX_MS, ARTIFACT_GENERATION_MAX_RETRIES, ARTIFACT_SESSION_MAX_PENDING, ARTIFACT_SESSION_MAX_PREVIOUS_SUMMARIES, COMPRESSION_ENABLED, COMPRESSION_HARD_LIMIT, COMPRESSION_SAFETY_BUFFER, CONVERSATION_ARTIFACTS_LIMIT, CONVERSATION_HISTORY_DEFAULT_LIMIT, DELEGATION_TOOL_BACKOFF_EXPONENT, DELEGATION_TOOL_BACKOFF_INITIAL_INTERVAL_MS, DELEGATION_TOOL_BACKOFF_MAX_ELAPSED_TIME_MS, DELEGATION_TOOL_BACKOFF_MAX_INTERVAL_MS, FUNCTION_TOOL_EXECUTION_TIMEOUT_MS_DEFAULT, FUNCTION_TOOL_SANDBOX_CLEANUP_INTERVAL_MS, FUNCTION_TOOL_SANDBOX_MAX_OUTPUT_SIZE_BYTES, FUNCTION_TOOL_SANDBOX_MAX_USE_COUNT, FUNCTION_TOOL_SANDBOX_POOL_TTL_MS, FUNCTION_TOOL_SANDBOX_QUEUE_WAIT_TIMEOUT_MS, FUNCTION_TOOL_SANDBOX_VCPUS_DEFAULT, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_NON_STREAMING, LLM_GENERATION_FIRST_CALL_TIMEOUT_MS_STREAMING, LLM_GENERATION_MAX_ALLOWED_TIMEOUT_MS, LLM_GENERATION_SUBSEQUENT_CALL_TIMEOUT_MS, MCP_TOOL_REQUEST_TIMEOUT_MS_DEFAULT, SESSION_CLEANUP_INTERVAL_MS, SESSION_TOOL_RESULT_CACHE_TIMEOUT_MS, STATUS_UPDATE_DEFAULT_INTERVAL_SECONDS, STATUS_UPDATE_DEFAULT_NUM_EVENTS, STREAM_BUFFER_MAX_SIZE_BYTES, STREAM_MAX_LIFETIME_MS, STREAM_PARSER_MAX_COLLECTED_PARTS, STREAM_PARSER_MAX_SNAPSHOT_SIZE, STREAM_PARSER_MAX_STREAMED_SIZE, STREAM_TEXT_GAP_THRESHOLD_MS, executionLimitsDefaults };
@@ -1,8 +1,8 @@
1
1
  import { ContextCache } from "./contextCache.js";
2
2
  import { ContextFetcher, MissingRequiredVariableError } from "./ContextFetcher.js";
3
3
  import { getLogger, getTracer, setSpanWithError } from "@inkeep/agents-core";
4
- import crypto from "node:crypto";
5
4
  import { SpanStatusCode } from "@opentelemetry/api";
5
+ import crypto from "node:crypto";
6
6
 
7
7
  //#region src/domains/run/context/ContextResolver.ts
8
8
  const logger = getLogger("context-resolver");
@@ -1129,7 +1129,11 @@ var AgentSessionManager = class {
1129
1129
  recordEvent(sessionId, eventType, subAgentId, data) {
1130
1130
  const session = this.sessions.get(sessionId);
1131
1131
  if (!session) {
1132
- logger.warn({ sessionId }, "Attempted to record event in non-existent session");
1132
+ logger.warn({
1133
+ sessionId,
1134
+ eventType,
1135
+ subAgentId
1136
+ }, "Attempted to record event in non-existent session (likely session already ended)");
1133
1137
  return;
1134
1138
  }
1135
1139
  session.recordEvent(eventType, subAgentId, data);
@@ -5,8 +5,8 @@ import { getCompressionConfigForModel } from "../utils/model-context-utils.js";
5
5
  import { tracer } from "../utils/tracer.js";
6
6
  import { agentSessionManager } from "./AgentSession.js";
7
7
  import { getLedgerArtifacts } from "@inkeep/agents-core";
8
- import { randomUUID } from "node:crypto";
9
8
  import { SpanStatusCode } from "@opentelemetry/api";
9
+ import { randomUUID } from "node:crypto";
10
10
 
11
11
  //#region src/domains/run/services/BaseCompressor.ts
12
12
  const logger = getLogger$1("BaseCompressor");
@@ -1,3 +1,5 @@
1
+ import { env } from "../../../env.js";
2
+
1
3
  //#region src/domains/run/types/executionContext.ts
2
4
  /**
3
5
  * Extract userId from execution context metadata (when available)
@@ -16,7 +18,7 @@ function createBaseExecutionContext(params) {
16
18
  tenantId: params.tenantId,
17
19
  projectId: params.projectId,
18
20
  agentId: params.agentId,
19
- baseUrl: params.baseUrl || process.env.API_URL || "http://localhost:3003",
21
+ baseUrl: params.baseUrl || env.INKEEP_AGENTS_API_URL,
20
22
  apiKeyId: params.apiKeyId,
21
23
  subAgentId: params.subAgentId,
22
24
  ref: params.ref,
package/dist/env.d.ts CHANGED
@@ -44,6 +44,12 @@ declare const envSchema: z.ZodObject<{
44
44
  ANTHROPIC_API_KEY: z.ZodString;
45
45
  OPENAI_API_KEY: z.ZodOptional<z.ZodString>;
46
46
  GOOGLE_GENERATIVE_AI_API_KEY: z.ZodOptional<z.ZodString>;
47
+ GITHUB_APP_ID: z.ZodOptional<z.ZodString>;
48
+ GITHUB_APP_PRIVATE_KEY: z.ZodOptional<z.ZodString>;
49
+ GITHUB_WEBHOOK_SECRET: z.ZodOptional<z.ZodString>;
50
+ GITHUB_STATE_SIGNING_SECRET: z.ZodOptional<z.ZodString>;
51
+ GITHUB_APP_NAME: z.ZodOptional<z.ZodString>;
52
+ GITHUB_MCP_API_KEY: z.ZodOptional<z.ZodString>;
47
53
  WORKFLOW_TARGET_WORLD: z.ZodOptional<z.ZodString>;
48
54
  WORKFLOW_POSTGRES_URL: z.ZodOptional<z.ZodString>;
49
55
  WORKFLOW_POSTGRES_JOB_PREFIX: z.ZodOptional<z.ZodString>;
@@ -77,6 +83,12 @@ declare const env: {
77
83
  PUBLIC_SIGNOZ_URL?: string | undefined;
78
84
  OPENAI_API_KEY?: string | undefined;
79
85
  GOOGLE_GENERATIVE_AI_API_KEY?: string | undefined;
86
+ GITHUB_APP_ID?: string | undefined;
87
+ GITHUB_APP_PRIVATE_KEY?: string | undefined;
88
+ GITHUB_WEBHOOK_SECRET?: string | undefined;
89
+ GITHUB_STATE_SIGNING_SECRET?: string | undefined;
90
+ GITHUB_APP_NAME?: string | undefined;
91
+ GITHUB_MCP_API_KEY?: string | undefined;
80
92
  WORKFLOW_TARGET_WORLD?: string | undefined;
81
93
  WORKFLOW_POSTGRES_URL?: string | undefined;
82
94
  WORKFLOW_POSTGRES_JOB_PREFIX?: string | undefined;
package/dist/env.js CHANGED
@@ -8,48 +8,54 @@ const envSchema = z.object({
8
8
  "development",
9
9
  "production",
10
10
  "test"
11
- ]).default("development"),
11
+ ]).default("development").describe("Node.js environment mode"),
12
12
  ENVIRONMENT: z.enum([
13
13
  "development",
14
14
  "production",
15
15
  "pentest",
16
16
  "test"
17
- ]).default("development"),
17
+ ]).default("development").describe("Application environment mode"),
18
18
  LOG_LEVEL: z.enum([
19
19
  "trace",
20
20
  "debug",
21
21
  "info",
22
22
  "warn",
23
23
  "error"
24
- ]).default("info"),
25
- INKEEP_AGENTS_MANAGE_DATABASE_URL: z.string(),
26
- INKEEP_AGENTS_RUN_DATABASE_URL: z.string(),
27
- INKEEP_AGENTS_MANAGE_UI_URL: z.string().optional(),
28
- INKEEP_AGENTS_API_URL: z.string().optional().default("http://localhost:3002"),
29
- BETTER_AUTH_SECRET: z.string().optional(),
30
- INKEEP_AGENTS_MANAGE_UI_USERNAME: z.string().optional().refine((val) => !val || /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val), { message: "Invalid email address" }),
31
- INKEEP_AGENTS_MANAGE_UI_PASSWORD: z.string().optional().refine((val) => !val || val.length >= 8, { message: "Password must be at least 8 characters" }),
32
- INKEEP_AGENTS_API_BYPASS_SECRET: z.string().optional(),
33
- INKEEP_AGENTS_MANAGE_API_BYPASS_SECRET: z.string().optional(),
34
- INKEEP_AGENTS_RUN_API_BYPASS_SECRET: z.string().optional(),
35
- INKEEP_AGENTS_EVAL_API_BYPASS_SECRET: z.string().optional(),
36
- INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY: z.string().optional(),
37
- INKEEP_AGENTS_TEMP_JWT_PRIVATE_KEY: z.string().optional(),
38
- NANGO_SERVER_URL: z.string().optional().default("https://api.nango.dev"),
39
- NANGO_SECRET_KEY: z.string().optional(),
40
- OTEL_BSP_SCHEDULE_DELAY: z.coerce.number().optional().default(500),
41
- OTEL_BSP_MAX_EXPORT_BATCH_SIZE: z.coerce.number().optional().default(64),
42
- TENANT_ID: z.string().optional().default("default"),
43
- SIGNOZ_URL: z.string().optional(),
44
- SIGNOZ_API_KEY: z.string().optional(),
45
- PUBLIC_SIGNOZ_URL: z.string().optional(),
46
- ANTHROPIC_API_KEY: z.string(),
47
- OPENAI_API_KEY: z.string().optional(),
48
- GOOGLE_GENERATIVE_AI_API_KEY: z.string().optional(),
49
- WORKFLOW_TARGET_WORLD: z.string().optional(),
50
- WORKFLOW_POSTGRES_URL: z.string().optional(),
51
- WORKFLOW_POSTGRES_JOB_PREFIX: z.string().optional(),
52
- WORKFLOW_POSTGRES_WORKER_CONCURRENCY: z.string().optional()
24
+ ]).default("info").describe("Logging verbosity level"),
25
+ INKEEP_AGENTS_MANAGE_DATABASE_URL: z.string().describe("PostgreSQL connection URL for the management database (Doltgres with Git version control)"),
26
+ INKEEP_AGENTS_RUN_DATABASE_URL: z.string().describe("PostgreSQL connection URL for the runtime database (Doltgres with Git version control)"),
27
+ INKEEP_AGENTS_MANAGE_UI_URL: z.string().optional().describe("URL where the management UI is hosted"),
28
+ INKEEP_AGENTS_API_URL: z.string().optional().default("http://localhost:3002").describe("URL where the agents management API is running"),
29
+ BETTER_AUTH_SECRET: z.string().optional().describe("Secret key for Better Auth session encryption (change in production)"),
30
+ INKEEP_AGENTS_MANAGE_UI_USERNAME: z.string().optional().refine((val) => !val || /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val), { message: "Invalid email address" }).describe("Admin email address for management UI login"),
31
+ INKEEP_AGENTS_MANAGE_UI_PASSWORD: z.string().optional().refine((val) => !val || val.length >= 8, { message: "Password must be at least 8 characters" }).describe("Admin password for management UI login (min 8 characters)"),
32
+ INKEEP_AGENTS_API_BYPASS_SECRET: z.string().optional().describe("API bypass secret for local development and testing (skips auth)"),
33
+ INKEEP_AGENTS_MANAGE_API_BYPASS_SECRET: z.string().optional().describe("Management API bypass secret for local development and testing (skips auth)"),
34
+ INKEEP_AGENTS_RUN_API_BYPASS_SECRET: z.string().optional().describe("Run API bypass secret for local development and testing (skips auth)"),
35
+ INKEEP_AGENTS_EVAL_API_BYPASS_SECRET: z.string().optional().describe("Eval API bypass secret for local development and testing (skips auth)"),
36
+ INKEEP_AGENTS_TEMP_JWT_PUBLIC_KEY: z.string().optional().describe("Temporary JWT public key for Playground (generate with scripts/generate-jwt-keys.sh)"),
37
+ INKEEP_AGENTS_TEMP_JWT_PRIVATE_KEY: z.string().optional().describe("Temporary JWT private key for Playground (generate with scripts/generate-jwt-keys.sh)"),
38
+ NANGO_SERVER_URL: z.string().optional().default("https://api.nango.dev").describe("Nango server URL for OAuth integrations"),
39
+ NANGO_SECRET_KEY: z.string().optional().describe("Nango secret key for OAuth integrations"),
40
+ OTEL_BSP_SCHEDULE_DELAY: z.coerce.number().optional().default(500).describe("OpenTelemetry batch span processor schedule delay in milliseconds"),
41
+ OTEL_BSP_MAX_EXPORT_BATCH_SIZE: z.coerce.number().optional().default(64).describe("OpenTelemetry batch span processor max export batch size"),
42
+ TENANT_ID: z.string().optional().default("default").describe("Default tenant ID for development"),
43
+ SIGNOZ_URL: z.string().optional().describe("SigNoz server URL for observability"),
44
+ SIGNOZ_API_KEY: z.string().optional().describe("SigNoz API key for authentication"),
45
+ PUBLIC_SIGNOZ_URL: z.string().optional().describe("Public SigNoz URL accessible from the browser"),
46
+ ANTHROPIC_API_KEY: z.string().describe("Anthropic API key for Claude models (required for agent execution). Get from https://console.anthropic.com/"),
47
+ OPENAI_API_KEY: z.string().optional().describe("OpenAI API key for GPT models. Get from https://platform.openai.com/"),
48
+ GOOGLE_GENERATIVE_AI_API_KEY: z.string().optional().describe("Google Generative AI API key for Gemini models"),
49
+ GITHUB_APP_ID: z.string().optional(),
50
+ GITHUB_APP_PRIVATE_KEY: z.string().optional(),
51
+ GITHUB_WEBHOOK_SECRET: z.string().optional(),
52
+ GITHUB_STATE_SIGNING_SECRET: z.string().min(32, "GITHUB_STATE_SIGNING_SECRET must be at least 32 characters").optional(),
53
+ GITHUB_APP_NAME: z.string().optional(),
54
+ GITHUB_MCP_API_KEY: z.string().optional().describe("API key for the GitHub MCP"),
55
+ WORKFLOW_TARGET_WORLD: z.string().optional().describe("Target world for workflow execution"),
56
+ WORKFLOW_POSTGRES_URL: z.string().optional().describe("PostgreSQL connection URL for workflow job queue"),
57
+ WORKFLOW_POSTGRES_JOB_PREFIX: z.string().optional().describe("Prefix for workflow job names in the queue"),
58
+ WORKFLOW_POSTGRES_WORKER_CONCURRENCY: z.string().optional().describe("Number of concurrent workflow workers")
53
59
  });
54
60
  const parseEnv = () => {
55
61
  try {