@inkeep/agents-core 0.58.14 → 0.58.16

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 (75) hide show
  1. package/dist/auth/auth-schema.d.ts +85 -85
  2. package/dist/auth/auth-validation-schemas.d.ts +135 -135
  3. package/dist/auth/auth.js +17 -45
  4. package/dist/data-access/index.d.ts +5 -2
  5. package/dist/data-access/index.js +5 -2
  6. package/dist/data-access/manage/agentFull.js +28 -12
  7. package/dist/data-access/manage/agents.d.ts +35 -34
  8. package/dist/data-access/manage/agents.js +33 -33
  9. package/dist/data-access/manage/artifactComponents.d.ts +12 -12
  10. package/dist/data-access/manage/artifactComponents.js +14 -13
  11. package/dist/data-access/manage/audit-queries.js +6 -5
  12. package/dist/data-access/manage/contextConfigs.d.ts +12 -12
  13. package/dist/data-access/manage/contextConfigs.js +7 -6
  14. package/dist/data-access/manage/credentialReferences.js +12 -11
  15. package/dist/data-access/manage/dataComponents.d.ts +6 -6
  16. package/dist/data-access/manage/dataComponents.js +13 -11
  17. package/dist/data-access/manage/evalConfig.js +42 -41
  18. package/dist/data-access/manage/externalAgents.js +8 -7
  19. package/dist/data-access/manage/functionTools.d.ts +17 -21
  20. package/dist/data-access/manage/functionTools.js +27 -65
  21. package/dist/data-access/manage/functions.js +7 -10
  22. package/dist/data-access/manage/projects.js +37 -36
  23. package/dist/data-access/manage/scheduledTriggers.js +10 -6
  24. package/dist/data-access/manage/scheduledWorkflows.js +3 -2
  25. package/dist/data-access/manage/scope-helpers.d.ts +2 -1
  26. package/dist/data-access/manage/scope-helpers.js +2 -1
  27. package/dist/data-access/manage/skills.d.ts +14 -14
  28. package/dist/data-access/manage/skills.js +14 -9
  29. package/dist/data-access/manage/subAgentExternalAgentRelations.d.ts +24 -24
  30. package/dist/data-access/manage/subAgentRelations.d.ts +28 -28
  31. package/dist/data-access/manage/subAgentRelations.js +28 -26
  32. package/dist/data-access/manage/subAgentTeamAgentRelations.d.ts +24 -24
  33. package/dist/data-access/manage/subAgentTeamAgentRelations.js +16 -16
  34. package/dist/data-access/manage/subAgents.d.ts +18 -18
  35. package/dist/data-access/manage/subAgents.js +8 -7
  36. package/dist/data-access/manage/tools.d.ts +24 -24
  37. package/dist/data-access/manage/tools.js +8 -6
  38. package/dist/data-access/manage/triggers.js +12 -8
  39. package/dist/data-access/runtime/apiKeys.d.ts +20 -20
  40. package/dist/data-access/runtime/apiKeys.js +16 -12
  41. package/dist/data-access/runtime/apps.d.ts +10 -10
  42. package/dist/data-access/runtime/apps.js +8 -7
  43. package/dist/data-access/runtime/audit-queries.js +7 -7
  44. package/dist/data-access/runtime/auth.d.ts +18 -0
  45. package/dist/data-access/runtime/auth.js +35 -0
  46. package/dist/data-access/runtime/cascade-delete.js +29 -24
  47. package/dist/data-access/runtime/contextCache.d.ts +1 -0
  48. package/dist/data-access/runtime/contextCache.js +9 -8
  49. package/dist/data-access/runtime/conversations.d.ts +27 -27
  50. package/dist/data-access/runtime/conversations.js +8 -12
  51. package/dist/data-access/runtime/evalRuns.js +23 -22
  52. package/dist/data-access/runtime/github-work-app-installations.js +32 -21
  53. package/dist/data-access/runtime/ledgerArtifacts.js +9 -24
  54. package/dist/data-access/runtime/messages.d.ts +24 -19
  55. package/dist/data-access/runtime/messages.js +15 -9
  56. package/dist/data-access/runtime/projects.js +6 -5
  57. package/dist/data-access/runtime/scheduledTriggerInvocations.js +16 -26
  58. package/dist/data-access/runtime/slack-work-app-mcp.js +6 -5
  59. package/dist/data-access/runtime/tasks.d.ts +10 -6
  60. package/dist/data-access/runtime/tasks.js +4 -5
  61. package/dist/data-access/runtime/triggerInvocations.js +4 -8
  62. package/dist/data-access/runtime/workAppSlack.js +21 -14
  63. package/dist/db/manage/manage-schema.d.ts +357 -357
  64. package/dist/db/runtime/runtime-schema.d.ts +300 -300
  65. package/dist/index.d.ts +7 -3
  66. package/dist/index.js +8 -2
  67. package/dist/retry/index.d.ts +3 -0
  68. package/dist/retry/index.js +4 -0
  69. package/dist/retry/retryable-errors.d.ts +10 -0
  70. package/dist/retry/retryable-errors.js +72 -0
  71. package/dist/retry/withRetry.d.ts +15 -0
  72. package/dist/retry/withRetry.js +37 -0
  73. package/dist/validation/dolt-schemas.d.ts +1 -1
  74. package/dist/validation/schemas.d.ts +1704 -1704
  75. package/package.json +1 -1
@@ -11,25 +11,25 @@ declare const getMessageById: (db: AgentsRunDatabaseClient) => (params: {
11
11
  messageId: string;
12
12
  }) => Promise<{
13
13
  id: string;
14
+ tenantId: string;
15
+ projectId: string;
14
16
  createdAt: string;
15
17
  updatedAt: string;
16
18
  metadata: MessageMetadata | null;
19
+ content: MessageContent;
17
20
  role: string;
21
+ conversationId: string;
18
22
  fromSubAgentId: string | null;
19
23
  toSubAgentId: string | null;
20
24
  fromExternalAgentId: string | null;
21
25
  toExternalAgentId: string | null;
22
- taskId: string | null;
23
- a2aTaskId: string | null;
24
- projectId: string;
25
- tenantId: string;
26
- content: MessageContent;
27
- conversationId: string;
28
26
  fromTeamAgentId: string | null;
29
27
  toTeamAgentId: string | null;
30
28
  visibility: string;
31
29
  messageType: string;
30
+ taskId: string | null;
32
31
  parentMessageId: string | null;
32
+ a2aTaskId: string | null;
33
33
  a2aSessionId: string | null;
34
34
  } | undefined>;
35
35
  declare const listMessages: (db: AgentsRunDatabaseClient) => (params: {
@@ -142,25 +142,25 @@ declare const getVisibleMessages: (db: AgentsRunDatabaseClient) => (params: {
142
142
  }[]>;
143
143
  declare const createMessage: (db: AgentsRunDatabaseClient) => (params: MessageInsert) => Promise<{
144
144
  id: string;
145
+ tenantId: string;
146
+ projectId: string;
145
147
  createdAt: string;
146
148
  updatedAt: string;
147
149
  metadata: MessageMetadata | null;
150
+ content: MessageContent;
148
151
  role: string;
152
+ conversationId: string;
149
153
  fromSubAgentId: string | null;
150
154
  toSubAgentId: string | null;
151
155
  fromExternalAgentId: string | null;
152
156
  toExternalAgentId: string | null;
153
- taskId: string | null;
154
- a2aTaskId: string | null;
155
- projectId: string;
156
- tenantId: string;
157
- content: MessageContent;
158
- conversationId: string;
159
157
  fromTeamAgentId: string | null;
160
158
  toTeamAgentId: string | null;
161
159
  visibility: string;
162
160
  messageType: string;
161
+ taskId: string | null;
163
162
  parentMessageId: string | null;
163
+ a2aTaskId: string | null;
164
164
  a2aSessionId: string | null;
165
165
  }>;
166
166
  declare const updateMessage: (db: AgentsRunDatabaseClient) => (params: {
@@ -195,30 +195,35 @@ declare const deleteMessage: (db: AgentsRunDatabaseClient) => (params: {
195
195
  messageId: string;
196
196
  }) => Promise<{
197
197
  id: string;
198
+ tenantId: string;
199
+ projectId: string;
198
200
  createdAt: string;
199
201
  updatedAt: string;
200
202
  metadata: MessageMetadata | null;
203
+ content: MessageContent;
201
204
  role: string;
205
+ conversationId: string;
202
206
  fromSubAgentId: string | null;
203
207
  toSubAgentId: string | null;
204
208
  fromExternalAgentId: string | null;
205
209
  toExternalAgentId: string | null;
206
- taskId: string | null;
207
- a2aTaskId: string | null;
208
- projectId: string;
209
- tenantId: string;
210
- content: MessageContent;
211
- conversationId: string;
212
210
  fromTeamAgentId: string | null;
213
211
  toTeamAgentId: string | null;
214
212
  visibility: string;
215
213
  messageType: string;
214
+ taskId: string | null;
216
215
  parentMessageId: string | null;
216
+ a2aTaskId: string | null;
217
217
  a2aSessionId: string | null;
218
218
  }>;
219
219
  declare const countMessagesByConversation: (db: AgentsRunDatabaseClient) => (params: {
220
220
  scopes: ProjectScopeConfig;
221
221
  conversationId: string;
222
222
  }) => Promise<number>;
223
+ declare const countVisibleMessages: (db: AgentsRunDatabaseClient) => (params: {
224
+ scopes: ProjectScopeConfig;
225
+ conversationId: string;
226
+ visibility?: MessageVisibility[];
227
+ }) => Promise<number>;
223
228
  //#endregion
224
- export { countMessagesByConversation, createMessage, deleteMessage, getMessageById, getMessagesByConversation, getMessagesByTask, getVisibleMessages, listMessages, updateMessage };
229
+ export { countMessagesByConversation, countVisibleMessages, createMessage, deleteMessage, getMessageById, getMessagesByConversation, getMessagesByTask, getVisibleMessages, listMessages, updateMessage };
@@ -1,34 +1,35 @@
1
1
  import { messages } from "../../db/runtime/runtime-schema.js";
2
+ import { projectScopedWhere } from "../manage/scope-helpers.js";
2
3
  import { and, asc, count, desc, eq, inArray } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/messages.ts
5
6
  const getMessageById = (db) => async (params) => {
6
- return db.query.messages.findFirst({ where: and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.id, params.messageId)) });
7
+ return db.query.messages.findFirst({ where: and(projectScopedWhere(messages, params.scopes), eq(messages.id, params.messageId)) });
7
8
  };
8
9
  const listMessages = (db) => async (params) => {
9
10
  const page = params.pagination?.page || 1;
10
11
  const limit = Math.min(params.pagination?.limit || 10, 100);
11
12
  const offset = (page - 1) * limit;
12
- return await db.select().from(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId))).limit(limit).offset(offset).orderBy(desc(messages.createdAt));
13
+ return await db.select().from(messages).where(projectScopedWhere(messages, params.scopes)).limit(limit).offset(offset).orderBy(desc(messages.createdAt));
13
14
  };
14
15
  const getMessagesByConversation = (db) => async (params) => {
15
16
  const page = params.pagination?.page || 1;
16
17
  const limit = Math.min(params.pagination?.limit || 10, 100);
17
18
  const offset = (page - 1) * limit;
18
- return await db.select().from(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.conversationId, params.conversationId))).limit(limit).offset(offset).orderBy(desc(messages.createdAt));
19
+ return await db.select().from(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.conversationId, params.conversationId))).limit(limit).offset(offset).orderBy(desc(messages.createdAt));
19
20
  };
20
21
  const getMessagesByTask = (db) => async (params) => {
21
22
  const page = params.pagination?.page || 1;
22
23
  const limit = Math.min(params.pagination?.limit || 10, 100);
23
24
  const offset = (page - 1) * limit;
24
- return await db.select().from(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.taskId, params.taskId))).limit(limit).offset(offset).orderBy(asc(messages.createdAt));
25
+ return await db.select().from(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.taskId, params.taskId))).limit(limit).offset(offset).orderBy(asc(messages.createdAt));
25
26
  };
26
27
  const getVisibleMessages = (db) => async (params) => {
27
28
  const page = params.pagination?.page || 1;
28
29
  const limit = Math.min(params.pagination?.limit || 10, 100);
29
30
  const offset = (page - 1) * limit;
30
31
  const visibilityFilter = params.visibility || ["user-facing"];
31
- return await db.select().from(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.conversationId, params.conversationId), inArray(messages.visibility, visibilityFilter))).limit(limit).offset(offset).orderBy(asc(messages.createdAt));
32
+ return await db.select().from(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.conversationId, params.conversationId), inArray(messages.visibility, visibilityFilter))).limit(limit).offset(offset).orderBy(asc(messages.createdAt));
32
33
  };
33
34
  const createMessage = (db) => async (params) => {
34
35
  const now = (/* @__PURE__ */ new Date()).toISOString();
@@ -44,17 +45,22 @@ const updateMessage = (db) => async (params) => {
44
45
  const [updated] = await db.update(messages).set({
45
46
  ...params.data,
46
47
  updatedAt: now
47
- }).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.id, params.messageId))).returning();
48
+ }).where(and(projectScopedWhere(messages, params.scopes), eq(messages.id, params.messageId))).returning();
48
49
  return updated;
49
50
  };
50
51
  const deleteMessage = (db) => async (params) => {
51
- const [deleted] = await db.delete(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.id, params.messageId))).returning();
52
+ const [deleted] = await db.delete(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.id, params.messageId))).returning();
52
53
  return deleted;
53
54
  };
54
55
  const countMessagesByConversation = (db) => async (params) => {
55
- const total = (await db.select({ count: count() }).from(messages).where(and(eq(messages.tenantId, params.scopes.tenantId), eq(messages.projectId, params.scopes.projectId), eq(messages.conversationId, params.conversationId))))[0]?.count || 0;
56
+ const total = (await db.select({ count: count() }).from(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.conversationId, params.conversationId))))[0]?.count || 0;
57
+ return typeof total === "string" ? Number.parseInt(total, 10) : total;
58
+ };
59
+ const countVisibleMessages = (db) => async (params) => {
60
+ const visibilityFilter = params.visibility || ["user-facing"];
61
+ const total = (await db.select({ count: count() }).from(messages).where(and(projectScopedWhere(messages, params.scopes), eq(messages.conversationId, params.conversationId), inArray(messages.visibility, visibilityFilter))))[0]?.count || 0;
56
62
  return typeof total === "string" ? Number.parseInt(total, 10) : total;
57
63
  };
58
64
 
59
65
  //#endregion
60
- export { countMessagesByConversation, createMessage, deleteMessage, getMessageById, getMessagesByConversation, getMessagesByTask, getVisibleMessages, listMessages, updateMessage };
66
+ export { countMessagesByConversation, countVisibleMessages, createMessage, deleteMessage, getMessageById, getMessagesByConversation, getMessagesByTask, getVisibleMessages, listMessages, updateMessage };
@@ -1,4 +1,5 @@
1
1
  import { projectMetadata } from "../../db/runtime/runtime-schema.js";
2
+ import { tenantScopedWhere } from "../manage/scope-helpers.js";
2
3
  import { and, count, desc, eq, inArray } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/projects.ts
@@ -6,14 +7,14 @@ import { and, count, desc, eq, inArray } from "drizzle-orm";
6
7
  * Get a project from the runtime DB by ID
7
8
  */
8
9
  const getProjectMetadata = (db) => async (params) => {
9
- return await db.query.projectMetadata.findFirst({ where: and(eq(projectMetadata.tenantId, params.tenantId), eq(projectMetadata.id, params.projectId)) }) ?? null;
10
+ return await db.query.projectMetadata.findFirst({ where: and(tenantScopedWhere(projectMetadata, { tenantId: params.tenantId }), eq(projectMetadata.id, params.projectId)) }) ?? null;
10
11
  };
11
12
  /**
12
13
  * List all runtimeProjects for a tenant from the runtime DB
13
14
  */
14
15
  const listProjectsMetadata = (db) => async (params) => {
15
16
  return await db.query.projectMetadata.findMany({
16
- where: eq(projectMetadata.tenantId, params.tenantId),
17
+ where: tenantScopedWhere(projectMetadata, { tenantId: params.tenantId }),
17
18
  orderBy: [desc(projectMetadata.createdAt)]
18
19
  });
19
20
  };
@@ -25,7 +26,7 @@ const listProjectsMetadataPaginated = (db) => async (params) => {
25
26
  const page = params.pagination?.page || 1;
26
27
  const limit = Math.min(params.pagination?.limit || 10, 100);
27
28
  const offset = (page - 1) * limit;
28
- const conditions = [eq(projectMetadata.tenantId, params.tenantId)];
29
+ const conditions = [tenantScopedWhere(projectMetadata, { tenantId: params.tenantId })];
29
30
  if (params.projectIds !== void 0) {
30
31
  if (params.projectIds.length === 0) return {
31
32
  data: [],
@@ -70,7 +71,7 @@ const createProjectMetadata = (db) => async (params) => {
70
71
  * Delete a project from the runtime DB
71
72
  */
72
73
  const deleteProjectMetadata = (db) => async (params) => {
73
- return (await db.delete(projectMetadata).where(and(eq(projectMetadata.tenantId, params.tenantId), eq(projectMetadata.id, params.projectId))).returning()).length > 0;
74
+ return (await db.delete(projectMetadata).where(and(tenantScopedWhere(projectMetadata, { tenantId: params.tenantId }), eq(projectMetadata.id, params.projectId))).returning()).length > 0;
74
75
  };
75
76
  /**
76
77
  * Check if a project exists in the runtime DB
@@ -82,7 +83,7 @@ const projectsMetadataExists = (db) => async (params) => {
82
83
  * Count runtimeProjects for a tenant
83
84
  */
84
85
  const countProjectsInRuntime = (db) => async (params) => {
85
- const total = (await db.select({ count: count() }).from(projectMetadata).where(eq(projectMetadata.tenantId, params.tenantId)))[0]?.count || 0;
86
+ const total = (await db.select({ count: count() }).from(projectMetadata).where(tenantScopedWhere(projectMetadata, { tenantId: params.tenantId })))[0]?.count || 0;
86
87
  return typeof total === "string" ? Number.parseInt(total, 10) : total;
87
88
  };
88
89
 
@@ -1,4 +1,5 @@
1
1
  import { scheduledTriggerInvocations } from "../../db/runtime/runtime-schema.js";
2
+ import { agentScopedWhere, projectScopedWhere } from "../manage/scope-helpers.js";
2
3
  import { and, asc, count, desc, eq, gte, inArray, lte, ne, sql } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/scheduledTriggerInvocations.ts
@@ -6,7 +7,7 @@ import { and, asc, count, desc, eq, gte, inArray, lte, ne, sql } from "drizzle-o
6
7
  * Get a scheduled trigger invocation by ID (agent-scoped)
7
8
  */
8
9
  const getScheduledTriggerInvocationById = (db) => async (params) => {
9
- return await db.query.scheduledTriggerInvocations.findFirst({ where: and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId)) });
10
+ return await db.query.scheduledTriggerInvocations.findFirst({ where: and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId)) });
10
11
  };
11
12
  /**
12
13
  * Get a scheduled trigger invocation by idempotency key
@@ -22,12 +23,7 @@ const listScheduledTriggerInvocationsPaginated = (db) => async (params) => {
22
23
  const page = params.pagination?.page || 1;
23
24
  const limit = Math.min(params.pagination?.limit || 10, 100);
24
25
  const offset = (page - 1) * limit;
25
- const conditions = [
26
- eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId),
27
- eq(scheduledTriggerInvocations.projectId, params.scopes.projectId),
28
- eq(scheduledTriggerInvocations.agentId, params.scopes.agentId),
29
- eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId)
30
- ];
26
+ const conditions = [agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId)];
31
27
  if (params.filters?.status) conditions.push(eq(scheduledTriggerInvocations.status, params.filters.status));
32
28
  if (params.filters?.from) conditions.push(gte(scheduledTriggerInvocations.scheduledFor, params.filters.from));
33
29
  if (params.filters?.to) conditions.push(lte(scheduledTriggerInvocations.scheduledFor, params.filters.to));
@@ -50,14 +46,14 @@ const listScheduledTriggerInvocationsPaginated = (db) => async (params) => {
50
46
  */
51
47
  const listPendingScheduledTriggerInvocations = (db) => async (params) => {
52
48
  const maxLimit = Math.min(params.limit || 10, 100);
53
- return await db.select().from(scheduledTriggerInvocations).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.status, "pending"))).orderBy(asc(scheduledTriggerInvocations.scheduledFor)).limit(maxLimit);
49
+ return await db.select().from(scheduledTriggerInvocations).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.status, "pending"))).orderBy(asc(scheduledTriggerInvocations.scheduledFor)).limit(maxLimit);
54
50
  };
55
51
  /**
56
52
  * Delete all pending invocations for a trigger
57
53
  * Used when cron expression changes or trigger is disabled
58
54
  */
59
55
  const deletePendingInvocationsForTrigger = (db) => async (params) => {
60
- return (await db.delete(scheduledTriggerInvocations).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.status, "pending"))).returning()).length;
56
+ return (await db.delete(scheduledTriggerInvocations).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.status, "pending"))).returning()).length;
61
57
  };
62
58
  /**
63
59
  * Create a new scheduled trigger invocation (agent-scoped)
@@ -69,7 +65,7 @@ const createScheduledTriggerInvocation = (db) => async (params) => {
69
65
  * Update scheduled trigger invocation status (agent-scoped)
70
66
  */
71
67
  const updateScheduledTriggerInvocationStatus = (db) => async (params) => {
72
- return (await db.update(scheduledTriggerInvocations).set(params.data).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
68
+ return (await db.update(scheduledTriggerInvocations).set(params.data).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
73
69
  };
74
70
  /**
75
71
  * Mark invocation as running
@@ -79,7 +75,7 @@ const markScheduledTriggerInvocationRunning = (db) => async (params) => {
79
75
  return (await db.update(scheduledTriggerInvocations).set({
80
76
  status: "running",
81
77
  startedAt: sql`COALESCE(${scheduledTriggerInvocations.startedAt}, ${now})`
82
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
78
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
83
79
  };
84
80
  /**
85
81
  * Mark invocation as completed
@@ -89,7 +85,7 @@ const markScheduledTriggerInvocationCompleted = (db) => async (params) => {
89
85
  return (await db.update(scheduledTriggerInvocations).set({
90
86
  status: "completed",
91
87
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
92
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId), ne(scheduledTriggerInvocations.status, "cancelled"))).returning())[0];
88
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId), ne(scheduledTriggerInvocations.status, "cancelled"))).returning())[0];
93
89
  };
94
90
  /**
95
91
  * Mark invocation as failed
@@ -99,14 +95,14 @@ const markScheduledTriggerInvocationFailed = (db) => async (params) => {
99
95
  return (await db.update(scheduledTriggerInvocations).set({
100
96
  status: "failed",
101
97
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
102
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId), ne(scheduledTriggerInvocations.status, "cancelled"))).returning())[0];
98
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId), ne(scheduledTriggerInvocations.status, "cancelled"))).returning())[0];
103
99
  };
104
100
  /**
105
101
  * Add a conversation ID to the invocation's conversationIds array
106
102
  * Used to track all conversations created during retries
107
103
  */
108
104
  const addConversationIdToInvocation = (db) => async (params) => {
109
- return (await db.update(scheduledTriggerInvocations).set({ conversationIds: sql`${scheduledTriggerInvocations.conversationIds} || ${JSON.stringify([params.conversationId])}::jsonb` }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
105
+ return (await db.update(scheduledTriggerInvocations).set({ conversationIds: sql`${scheduledTriggerInvocations.conversationIds} || ${JSON.stringify([params.conversationId])}::jsonb` }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
110
106
  };
111
107
  /**
112
108
  * Mark invocation as cancelled
@@ -115,7 +111,7 @@ const markScheduledTriggerInvocationCancelled = (db) => async (params) => {
115
111
  return (await db.update(scheduledTriggerInvocations).set({
116
112
  status: "cancelled",
117
113
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
118
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
114
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), eq(scheduledTriggerInvocations.id, params.invocationId))).returning())[0];
119
115
  };
120
116
  /**
121
117
  * Cancel all pending invocations for a trigger
@@ -125,7 +121,7 @@ const cancelPendingInvocationsForTrigger = (db) => async (params) => {
125
121
  return (await db.update(scheduledTriggerInvocations).set({
126
122
  status: "cancelled",
127
123
  completedAt: (/* @__PURE__ */ new Date()).toISOString()
128
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), inArray(scheduledTriggerInvocations.status, ["pending", "running"]))).returning()).length;
124
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), inArray(scheduledTriggerInvocations.status, ["pending", "running"]))).returning()).length;
129
125
  };
130
126
  /**
131
127
  * Cancel only PAST pending invocations for a trigger (scheduledFor <= now)
@@ -136,7 +132,7 @@ const cancelPastPendingInvocationsForTrigger = (db) => async (params) => {
136
132
  return (await db.update(scheduledTriggerInvocations).set({
137
133
  status: "cancelled",
138
134
  completedAt: now
139
- }).where(and(eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId), eq(scheduledTriggerInvocations.agentId, params.scopes.agentId), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), inArray(scheduledTriggerInvocations.status, ["pending", "running"]), lte(scheduledTriggerInvocations.scheduledFor, now))).returning()).length;
135
+ }).where(and(agentScopedWhere(scheduledTriggerInvocations, params.scopes), eq(scheduledTriggerInvocations.scheduledTriggerId, params.scheduledTriggerId), inArray(scheduledTriggerInvocations.status, ["pending", "running"]), lte(scheduledTriggerInvocations.scheduledFor, now))).returning()).length;
140
136
  };
141
137
  /**
142
138
  * Get run info for multiple scheduled triggers in a single query
@@ -144,14 +140,13 @@ const cancelPastPendingInvocationsForTrigger = (db) => async (params) => {
144
140
  */
145
141
  const getScheduledTriggerRunInfoBatch = (db) => async (params) => {
146
142
  if (params.triggerIds.length === 0) return /* @__PURE__ */ new Map();
147
- const { tenantId, projectId } = params.scopes;
148
143
  const allInvocations = await db.select({
149
144
  scheduledTriggerId: scheduledTriggerInvocations.scheduledTriggerId,
150
145
  status: scheduledTriggerInvocations.status,
151
146
  scheduledFor: scheduledTriggerInvocations.scheduledFor,
152
147
  completedAt: scheduledTriggerInvocations.completedAt,
153
148
  conversationIds: scheduledTriggerInvocations.conversationIds
154
- }).from(scheduledTriggerInvocations).where(and(eq(scheduledTriggerInvocations.tenantId, tenantId), eq(scheduledTriggerInvocations.projectId, projectId), inArray(scheduledTriggerInvocations.scheduledTriggerId, params.triggerIds.map((t) => t.triggerId)))).orderBy(desc(scheduledTriggerInvocations.completedAt));
149
+ }).from(scheduledTriggerInvocations).where(and(projectScopedWhere(scheduledTriggerInvocations, params.scopes), inArray(scheduledTriggerInvocations.scheduledTriggerId, params.triggerIds.map((t) => t.triggerId)))).orderBy(desc(scheduledTriggerInvocations.completedAt));
155
150
  const result = /* @__PURE__ */ new Map();
156
151
  for (const trigger of params.triggerIds) result.set(trigger.triggerId, {
157
152
  lastRunAt: null,
@@ -180,12 +175,7 @@ const listUpcomingInvocationsForAgentPaginated = (db) => async (params) => {
180
175
  const limit = Math.min(params.pagination?.limit || 20, 100);
181
176
  const offset = (page - 1) * limit;
182
177
  const statusCondition = params.includeRunning ? inArray(scheduledTriggerInvocations.status, ["pending", "running"]) : eq(scheduledTriggerInvocations.status, "pending");
183
- const whereClause = and(...[
184
- eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId),
185
- eq(scheduledTriggerInvocations.projectId, params.scopes.projectId),
186
- eq(scheduledTriggerInvocations.agentId, params.scopes.agentId),
187
- statusCondition
188
- ]);
178
+ const whereClause = and(...[agentScopedWhere(scheduledTriggerInvocations, params.scopes), statusCondition]);
189
179
  const [data, totalResult] = await Promise.all([db.select().from(scheduledTriggerInvocations).where(whereClause).limit(limit).offset(offset).orderBy(asc(scheduledTriggerInvocations.scheduledFor)), db.select({ count: count() }).from(scheduledTriggerInvocations).where(whereClause)]);
190
180
  const total = totalResult[0]?.count || 0;
191
181
  return {
@@ -206,7 +196,7 @@ const listProjectScheduledTriggerInvocationsPaginated = (db) => async (params) =
206
196
  const page = params.pagination?.page || 1;
207
197
  const limit = Math.min(params.pagination?.limit || 20, 100);
208
198
  const offset = (page - 1) * limit;
209
- const conditions = [eq(scheduledTriggerInvocations.tenantId, params.scopes.tenantId), eq(scheduledTriggerInvocations.projectId, params.scopes.projectId)];
199
+ const conditions = [projectScopedWhere(scheduledTriggerInvocations, params.scopes)];
210
200
  if (params.filters?.status) conditions.push(eq(scheduledTriggerInvocations.status, params.filters.status));
211
201
  const whereClause = and(...conditions);
212
202
  const [data, totalResult] = await Promise.all([db.select().from(scheduledTriggerInvocations).where(whereClause).limit(limit).offset(offset).orderBy(desc(scheduledTriggerInvocations.createdAt)), db.select({ count: count() }).from(scheduledTriggerInvocations).where(whereClause)]);
@@ -1,5 +1,6 @@
1
1
  import { workAppSlackMcpToolAccessConfig, workAppSlackUserMappings } from "../../db/runtime/runtime-schema.js";
2
- import { and, eq } from "drizzle-orm";
2
+ import { tenantScopedWhere, toolScopedWhere } from "../manage/scope-helpers.js";
3
+ import { eq } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/slack-work-app-mcp.ts
5
6
  const getSlackMcpToolAccessConfig = (db) => async (scope) => {
@@ -7,7 +8,7 @@ const getSlackMcpToolAccessConfig = (db) => async (scope) => {
7
8
  channelAccessMode: workAppSlackMcpToolAccessConfig.channelAccessMode,
8
9
  dmEnabled: workAppSlackMcpToolAccessConfig.dmEnabled,
9
10
  channelIds: workAppSlackMcpToolAccessConfig.channelIds
10
- }).from(workAppSlackMcpToolAccessConfig).where(and(eq(workAppSlackMcpToolAccessConfig.tenantId, scope.tenantId), eq(workAppSlackMcpToolAccessConfig.projectId, scope.projectId), eq(workAppSlackMcpToolAccessConfig.toolId, scope.toolId))).limit(1))[0] ?? {
11
+ }).from(workAppSlackMcpToolAccessConfig).where(toolScopedWhere(workAppSlackMcpToolAccessConfig, scope)).limit(1))[0] ?? {
11
12
  channelAccessMode: "selected",
12
13
  dmEnabled: false,
13
14
  channelIds: []
@@ -42,13 +43,13 @@ const updateSlackMcpToolAccessChannelIds = (db) => async (scope, channelIds) =>
42
43
  await db.update(workAppSlackMcpToolAccessConfig).set({
43
44
  channelIds,
44
45
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
45
- }).where(and(eq(workAppSlackMcpToolAccessConfig.tenantId, scope.tenantId), eq(workAppSlackMcpToolAccessConfig.projectId, scope.projectId), eq(workAppSlackMcpToolAccessConfig.toolId, scope.toolId)));
46
+ }).where(toolScopedWhere(workAppSlackMcpToolAccessConfig, scope));
46
47
  };
47
48
  const deleteSlackMcpToolAccessConfig = (db) => async (scope) => {
48
- return (await db.delete(workAppSlackMcpToolAccessConfig).where(and(eq(workAppSlackMcpToolAccessConfig.tenantId, scope.tenantId), eq(workAppSlackMcpToolAccessConfig.projectId, scope.projectId), eq(workAppSlackMcpToolAccessConfig.toolId, scope.toolId))).returning()).length > 0;
49
+ return (await db.delete(workAppSlackMcpToolAccessConfig).where(toolScopedWhere(workAppSlackMcpToolAccessConfig, scope)).returning()).length > 0;
49
50
  };
50
51
  const deleteAllSlackMcpToolAccessConfigsByTenant = (db) => async (tenantId) => {
51
- return (await db.delete(workAppSlackMcpToolAccessConfig).where(eq(workAppSlackMcpToolAccessConfig.tenantId, tenantId)).returning()).length;
52
+ return (await db.delete(workAppSlackMcpToolAccessConfig).where(tenantScopedWhere(workAppSlackMcpToolAccessConfig, { tenantId })).returning()).length;
52
53
  };
53
54
  const isSlackWorkAppTool = (tool) => {
54
55
  return tool.isWorkApp && tool.config.mcp.server.url.includes("/slack/mcp");
@@ -1,3 +1,4 @@
1
+ import { ProjectScopeConfig } from "../../db/manage/scope-definitions.js";
1
2
  import { TaskMetadataConfig } from "../../types/utility.js";
2
3
  import "../../types/index.js";
3
4
  import { AgentsRunDatabaseClient } from "../../db/runtime/runtime-client.js";
@@ -7,26 +8,28 @@ import { TaskInsert, TaskSelect } from "../../types/entities.js";
7
8
  //#region src/data-access/runtime/tasks.d.ts
8
9
  declare const createTask: (db: AgentsRunDatabaseClient) => (params: TaskInsert) => Promise<{
9
10
  id: string;
11
+ tenantId: string;
12
+ projectId: string;
13
+ agentId: string;
10
14
  createdAt: string;
11
15
  updatedAt: string;
16
+ metadata: TaskMetadataConfig | null;
12
17
  ref: {
13
- type: "tag" | "commit" | "branch";
18
+ type: "commit" | "tag" | "branch";
14
19
  name: string;
15
20
  hash: string;
16
21
  } | null;
17
- metadata: TaskMetadataConfig | null;
18
22
  status: string;
19
23
  subAgentId: string;
20
- projectId: string;
21
- tenantId: string;
22
- agentId: string;
23
24
  contextId: string;
24
25
  }>;
25
26
  declare const getTask: (db: AgentsRunDatabaseClient) => (params: {
26
27
  id: string;
28
+ scopes: ProjectScopeConfig;
27
29
  }) => Promise<TaskSelect | null>;
28
30
  declare const updateTask: (db: AgentsRunDatabaseClient) => (params: {
29
31
  taskId: string;
32
+ scopes: ProjectScopeConfig;
30
33
  data: {
31
34
  status?: string;
32
35
  metadata?: any;
@@ -36,7 +39,7 @@ declare const updateTask: (db: AgentsRunDatabaseClient) => (params: {
36
39
  updatedAt: string;
37
40
  contextId: string;
38
41
  ref: {
39
- type: "tag" | "commit" | "branch";
42
+ type: "commit" | "tag" | "branch";
40
43
  name: string;
41
44
  hash: string;
42
45
  } | null;
@@ -50,6 +53,7 @@ declare const updateTask: (db: AgentsRunDatabaseClient) => (params: {
50
53
  }>;
51
54
  declare const listTaskIdsByContextId: (db: AgentsRunDatabaseClient) => (params: {
52
55
  contextId: string;
56
+ scopes: ProjectScopeConfig;
53
57
  }) => Promise<string[]>;
54
58
  //#endregion
55
59
  export { createTask, getTask, listTaskIdsByContextId, updateTask };
@@ -1,4 +1,5 @@
1
1
  import { tasks } from "../../db/runtime/runtime-schema.js";
2
+ import { projectScopedWhere } from "../manage/scope-helpers.js";
2
3
  import { and, eq } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/tasks.ts
@@ -12,20 +13,18 @@ const createTask = (db) => async (params) => {
12
13
  return created;
13
14
  };
14
15
  const getTask = (db) => async (params) => {
15
- const { id } = params;
16
- return (await db.select().from(tasks).where(eq(tasks.id, id)).limit(1))[0];
16
+ return (await db.select().from(tasks).where(and(projectScopedWhere(tasks, params.scopes), eq(tasks.id, params.id))).limit(1))[0] ?? null;
17
17
  };
18
18
  const updateTask = (db) => async (params) => {
19
19
  const now = (/* @__PURE__ */ new Date()).toISOString();
20
20
  const [updated] = await db.update(tasks).set({
21
21
  ...params.data,
22
22
  updatedAt: now
23
- }).where(and(eq(tasks.id, params.taskId))).returning();
23
+ }).where(and(projectScopedWhere(tasks, params.scopes), eq(tasks.id, params.taskId))).returning();
24
24
  return updated;
25
25
  };
26
26
  const listTaskIdsByContextId = (db) => async (params) => {
27
- const { contextId } = params;
28
- return (await db.select({ id: tasks.id }).from(tasks).where(eq(tasks.contextId, contextId))).map((r) => r.id);
27
+ return (await db.select({ id: tasks.id }).from(tasks).where(and(projectScopedWhere(tasks, params.scopes), eq(tasks.contextId, params.contextId)))).map((r) => r.id);
29
28
  };
30
29
 
31
30
  //#endregion
@@ -1,4 +1,5 @@
1
1
  import { triggerInvocations } from "../../db/runtime/runtime-schema.js";
2
+ import { agentScopedWhere } from "../manage/scope-helpers.js";
2
3
  import { and, count, desc, eq, gte, lte } from "drizzle-orm";
3
4
 
4
5
  //#region src/data-access/runtime/triggerInvocations.ts
@@ -6,7 +7,7 @@ import { and, count, desc, eq, gte, lte } from "drizzle-orm";
6
7
  * Get a trigger invocation by ID (agent-scoped)
7
8
  */
8
9
  const getTriggerInvocationById = (db) => async (params) => {
9
- return await db.query.triggerInvocations.findFirst({ where: and(eq(triggerInvocations.tenantId, params.scopes.tenantId), eq(triggerInvocations.projectId, params.scopes.projectId), eq(triggerInvocations.agentId, params.scopes.agentId), eq(triggerInvocations.triggerId, params.triggerId), eq(triggerInvocations.id, params.invocationId)) });
10
+ return await db.query.triggerInvocations.findFirst({ where: and(agentScopedWhere(triggerInvocations, params.scopes), eq(triggerInvocations.triggerId, params.triggerId), eq(triggerInvocations.id, params.invocationId)) });
10
11
  };
11
12
  /**
12
13
  * List trigger invocations with optional filtering (agent-scoped)
@@ -15,12 +16,7 @@ const listTriggerInvocationsPaginated = (db) => async (params) => {
15
16
  const page = params.pagination?.page || 1;
16
17
  const limit = Math.min(params.pagination?.limit || 10, 100);
17
18
  const offset = (page - 1) * limit;
18
- const conditions = [
19
- eq(triggerInvocations.tenantId, params.scopes.tenantId),
20
- eq(triggerInvocations.projectId, params.scopes.projectId),
21
- eq(triggerInvocations.agentId, params.scopes.agentId),
22
- eq(triggerInvocations.triggerId, params.triggerId)
23
- ];
19
+ const conditions = [agentScopedWhere(triggerInvocations, params.scopes), eq(triggerInvocations.triggerId, params.triggerId)];
24
20
  if (params.filters?.status) conditions.push(eq(triggerInvocations.status, params.filters.status));
25
21
  if (params.filters?.from) conditions.push(gte(triggerInvocations.createdAt, params.filters.from));
26
22
  if (params.filters?.to) conditions.push(lte(triggerInvocations.createdAt, params.filters.to));
@@ -47,7 +43,7 @@ const createTriggerInvocation = (db) => async (params) => {
47
43
  * Update trigger invocation status (agent-scoped)
48
44
  */
49
45
  const updateTriggerInvocationStatus = (db) => async (params) => {
50
- return (await db.update(triggerInvocations).set(params.data).where(and(eq(triggerInvocations.tenantId, params.scopes.tenantId), eq(triggerInvocations.projectId, params.scopes.projectId), eq(triggerInvocations.agentId, params.scopes.agentId), eq(triggerInvocations.triggerId, params.triggerId), eq(triggerInvocations.id, params.invocationId))).returning())[0];
46
+ return (await db.update(triggerInvocations).set(params.data).where(and(agentScopedWhere(triggerInvocations, params.scopes), eq(triggerInvocations.triggerId, params.triggerId), eq(triggerInvocations.id, params.invocationId))).returning())[0];
51
47
  };
52
48
 
53
49
  //#endregion