History

Use typed Convex ID validators across workspace APIs

Rhys Sullivan committed 8 months ago

Commit a11d7b61 parent 96afda918 files · +111 −89Browse files

Unified · Split

18 files
  1. executor/packages/database/convex/accountsInternal.ts +3 −2
  2. executor/packages/database/convex/billing.ts +3 −2
  3. executor/packages/database/convex/billingInternal.ts +5 −4
  4. executor/packages/database/convex/billingSync.ts +2 −1
  5. executor/packages/database/convex/database/approvals.ts +4 −3
  6. executor/packages/database/convex/database/tasks.ts +5 −4
  7. executor/packages/database/convex/database/tool_calls.ts +2 −1
  8. executor/packages/database/convex/executor.ts +6 −5
  9. executor/packages/database/convex/executorNode.ts +19 −18
  10. executor/packages/database/convex/invites.ts +9 −8
  11. executor/packages/database/convex/organizationMembers.ts +4 −3
  12. executor/packages/database/convex/organizations.ts +3 −2
  13. executor/packages/database/convex/runtimeCallbacks.ts +2 −1
  14. executor/packages/database/convex/toolRegistry.ts +21 −20
  15. executor/packages/database/convex/typedV.ts +4 −0
  16. executor/packages/database/convex/workspace.ts +10 −8
  17. executor/packages/database/convex/workspaceAuthInternal.ts +6 −5
  18. executor/packages/database/convex/workspaces.ts +3 −2
executor/packages/database/convex/accountsInternal.ts+3−2
@@ -3,6 +3,7 @@ import { internal } from "./_generated/api"; · 2 unmodified lines
3import { internalAction, internalMutation } from "./_generated/server";3import { internalAction, internalMutation } from "./_generated/server";
4import { deleteCurrentAccountBatchStep } from "../src/accounts/delete-current-account-batch";4import { deleteCurrentAccountBatchStep } from "../src/accounts/delete-current-account-batch";
5import { safeRunAfter } from "../src/lib/scheduler";5import { safeRunAfter } from "../src/lib/scheduler";
6import { vv } from "./typedV";
6 7
7const DEFAULT_DELETE_BATCH_SIZE = 200;8const DEFAULT_DELETE_BATCH_SIZE = 200;
8 9
@@ -16,7 +17,7 @@ function normalizeBatchSize(value: number | undefined): number { · 7 unmodified lines
16 17
17export const processDeleteCurrentAccountBatch = internalMutation({18export const processDeleteCurrentAccountBatch = internalMutation({
18 args: {19 args: {
19 accountId: v.id("accounts"),20 accountId: vv.id("accounts"),
20 batchSize: v.optional(v.number()),21 batchSize: v.optional(v.number()),
21 },22 },
22 handler: async (ctx, args) => {23 handler: async (ctx, args) => {
@@ -38,7 +39,7 @@ export const processDeleteCurrentAccountBatch = internalMutation({ · 15 unmodified lines
38 39
39export const runDeleteCurrentAccount = internalAction({40export const runDeleteCurrentAccount = internalAction({
40 args: {41 args: {
41 accountId: v.id("accounts"),42 accountId: vv.id("accounts"),
42 batchSize: v.optional(v.number()),43 batchSize: v.optional(v.number()),
43 },44 },
44 handler: async (ctx, args) => {45 handler: async (ctx, args) => {
executor/packages/database/convex/billing.ts+3−2
@@ -1,6 +1,7 @@
1import { StripeSubscriptions } from "@convex-dev/stripe";1import { StripeSubscriptions } from "@convex-dev/stripe";
2import { v } from "convex/values";2import { v } from "convex/values";
3import { components, internal } from "./_generated/api";3import { components, internal } from "./_generated/api";
4import { vv } from "./typedV";
4import { customAction, organizationMutation, organizationQuery } from "../../core/src/function-builders";5import { customAction, organizationMutation, organizationQuery } from "../../core/src/function-builders";
5import {6import {
6 createCustomerPortalHandler,7 createCustomerPortalHandler,
@@ -22,7 +23,7 @@ export const getSummary = organizationQuery({ · 15 unmodified lines
22export const createSubscriptionCheckout = customAction({23export const createSubscriptionCheckout = customAction({
23 method: "POST",24 method: "POST",
24 args: {25 args: {
25 organizationId: v.id("organizations"),26 organizationId: vv.id("organizations"),
26 priceId: v.string(),27 priceId: v.string(),
27 successUrl: v.optional(v.string()),28 successUrl: v.optional(v.string()),
28 cancelUrl: v.optional(v.string()),29 cancelUrl: v.optional(v.string()),
@@ -36,7 +37,7 @@ export const createSubscriptionCheckout = customAction({ · 7 unmodified lines
36export const createCustomerPortal = customAction({37export const createCustomerPortal = customAction({
37 method: "POST",38 method: "POST",
38 args: {39 args: {
39 organizationId: v.id("organizations"),40 organizationId: vv.id("organizations"),
40 returnUrl: v.optional(v.string()),41 returnUrl: v.optional(v.string()),
41 sessionId: v.optional(v.string()),42 sessionId: v.optional(v.string()),
42 },43 },
executor/packages/database/convex/billingInternal.ts+5−4
@@ -8,6 +8,7 @@ import { · 7 unmodified lines
8 upsertCustomerLinkHandler,8 upsertCustomerLinkHandler,
9 upsertSeatStateHandler,9 upsertSeatStateHandler,
10} from "../src/billing/internal-handlers";10} from "../src/billing/internal-handlers";
11import { vv } from "./typedV";
11 12
12export const getBillingAccessForRequest = internalOrganizationQuery({13export const getBillingAccessForRequest = internalOrganizationQuery({
13 args: {},14 args: {},
@@ -18,7 +19,7 @@ export const getBillingAccessForRequest = internalOrganizationQuery({ · 4 unmodified lines
18 19
19export const getSeatSyncSnapshot = internalQuery({20export const getSeatSyncSnapshot = internalQuery({
20 args: {21 args: {
21 organizationId: v.id("organizations"),22 organizationId: vv.id("organizations"),
22 },23 },
23 handler: async (ctx, args) => {24 handler: async (ctx, args) => {
24 return await getSeatSyncSnapshotHandler(ctx, args);25 return await getSeatSyncSnapshotHandler(ctx, args);
@@ -27,7 +28,7 @@ export const getSeatSyncSnapshot = internalQuery({ · 2 unmodified lines
27 28
28export const upsertCustomerLink = internalMutation({29export const upsertCustomerLink = internalMutation({
29 args: {30 args: {
30 organizationId: v.id("organizations"),31 organizationId: vv.id("organizations"),
31 stripeCustomerId: v.string(),32 stripeCustomerId: v.string(),
32 },33 },
33 handler: async (ctx, args) => {34 handler: async (ctx, args) => {
@@ -37,7 +38,7 @@ export const upsertCustomerLink = internalMutation({ · 3 unmodified lines
37 38
38export const bumpSeatSyncVersion = internalMutation({39export const bumpSeatSyncVersion = internalMutation({
39 args: {40 args: {
40 organizationId: v.id("organizations"),41 organizationId: vv.id("organizations"),
41 },42 },
42 handler: async (ctx, args) => {43 handler: async (ctx, args) => {
43 return await bumpSeatSyncVersionHandler(ctx, args);44 return await bumpSeatSyncVersionHandler(ctx, args);
@@ -46,7 +47,7 @@ export const bumpSeatSyncVersion = internalMutation({ · 2 unmodified lines
46 47
47export const upsertSeatState = internalMutation({48export const upsertSeatState = internalMutation({
48 args: {49 args: {
49 organizationId: v.id("organizations"),50 organizationId: vv.id("organizations"),
50 desiredSeats: v.number(),51 desiredSeats: v.number(),
51 lastAppliedSeats: v.union(v.number(), v.null()),52 lastAppliedSeats: v.union(v.number(), v.null()),
52 syncError: v.union(v.string(), v.null()),53 syncError: v.union(v.string(), v.null()),
executor/packages/database/convex/billingSync.ts+2−1
@@ -2,12 +2,13 @@ import { StripeSubscriptions } from "@convex-dev/stripe"; · 1 unmodified line
2import { v } from "convex/values";2import { v } from "convex/values";
3import { components, internal } from "./_generated/api";3import { components, internal } from "./_generated/api";
4import { internalAction } from "./_generated/server";4import { internalAction } from "./_generated/server";
5import { vv } from "./typedV";
5 6
6const stripeClient = new StripeSubscriptions(components.stripe, {});7const stripeClient = new StripeSubscriptions(components.stripe, {});
7 8
8export const syncSeatQuantity = internalAction({9export const syncSeatQuantity = internalAction({
9 args: {10 args: {
10 organizationId: v.id("organizations"),11 organizationId: vv.id("organizations"),
11 expectedVersion: v.number(),12 expectedVersion: v.number(),
12 },13 },
13 handler: async (ctx, args) => {14 handler: async (ctx, args) => {
executor/packages/database/convex/database/approvals.ts+4−3
@@ -4,6 +4,7 @@ import { mapApproval } from "../../src/database/mappers"; · 3 unmodified lines
4import { getApprovalDoc, getTaskDoc } from "../../src/database/readers";4import { getApprovalDoc, getTaskDoc } from "../../src/database/readers";
5import { approvalStatusValidator, jsonObjectValidator } from "../../src/database/validators";5import { approvalStatusValidator, jsonObjectValidator } from "../../src/database/validators";
6import type { TaskStatus } from "../../../core/src/types";6import type { TaskStatus } from "../../../core/src/types";
7import { vv } from "../typedV";
7 8
8export const createApproval = internalMutation({9export const createApproval = internalMutation({
9 args: {10 args: {
@@ -52,7 +53,7 @@ export const getApproval = internalQuery({ · 42 unmodified lines
52 53
53export const listApprovals = internalQuery({54export const listApprovals = internalQuery({
54 args: {55 args: {
55 workspaceId: v.id("workspaces"),56 workspaceId: vv.id("workspaces"),
56 status: v.optional(approvalStatusValidator),57 status: v.optional(approvalStatusValidator),
57 },58 },
58 handler: async (ctx, args) => {59 handler: async (ctx, args) => {
@@ -78,7 +79,7 @@ export const listApprovals = internalQuery({ · 19 unmodified lines
78});79});
79 80
80export const listPendingApprovals = internalQuery({81export const listPendingApprovals = internalQuery({
81 args: { workspaceId: v.id("workspaces") },82 args: { workspaceId: vv.id("workspaces") },
82 handler: async (ctx, args) => {83 handler: async (ctx, args) => {
83 const docs = await ctx.db84 const docs = await ctx.db
84 .query("approvals")85 .query("approvals")
@@ -145,7 +146,7 @@ export const resolveApproval = internalMutation({ · 60 unmodified lines
145});146});
146 147
147export const getApprovalInWorkspace = internalQuery({148export const getApprovalInWorkspace = internalQuery({
148 args: { approvalId: v.string(), workspaceId: v.id("workspaces") },149 args: { approvalId: v.string(), workspaceId: vv.id("workspaces") },
149 handler: async (ctx, args) => {150 handler: async (ctx, args) => {
150 const doc = await getApprovalDoc(ctx, args.approvalId);151 const doc = await getApprovalDoc(ctx, args.approvalId);
151 if (!doc || doc.workspaceId !== args.workspaceId) {152 if (!doc || doc.workspaceId !== args.workspaceId) {
executor/packages/database/convex/database/tasks.ts+5−4
@@ -8,6 +8,7 @@ import { · 7 unmodified lines
8 storageAccessTypeValidator,8 storageAccessTypeValidator,
9 storageScopeTypeValidator,9 storageScopeTypeValidator,
10} from "../../src/database/validators";10} from "../../src/database/validators";
11import { vv } from "../typedV";
11import { DEFAULT_TASK_TIMEOUT_MS, MAX_TASK_TIMEOUT_MS } from "../../src/task/constants";12import { DEFAULT_TASK_TIMEOUT_MS, MAX_TASK_TIMEOUT_MS } from "../../src/task/constants";
12import { isTerminalTaskStatus } from "../../src/task/status";13import { isTerminalTaskStatus } from "../../src/task/status";
13 14
@@ -62,8 +63,8 @@ export const createTask = internalMutation({ · 48 unmodified lines
62 runtimeId: v.string(),63 runtimeId: v.string(),
63 timeoutMs: v.optional(v.number()),64 timeoutMs: v.optional(v.number()),
64 metadata: v.optional(jsonObjectValidator),65 metadata: v.optional(jsonObjectValidator),
65 workspaceId: v.id("workspaces"),66 workspaceId: vv.id("workspaces"),
66 accountId: v.optional(v.id("accounts")),67 accountId: v.optional(vv.id("accounts")),
67 clientId: v.optional(v.string()),68 clientId: v.optional(v.string()),
68 },69 },
69 handler: async (ctx, args) => {70 handler: async (ctx, args) => {
@@ -107,7 +108,7 @@ export const getTask = internalQuery({ · 37 unmodified lines
107});108});
108 109
109export const listTasks = internalQuery({110export const listTasks = internalQuery({
110 args: { workspaceId: v.id("workspaces") },111 args: { workspaceId: vv.id("workspaces") },
111 handler: async (ctx, args) => {112 handler: async (ctx, args) => {
112 const docs = await ctx.db113 const docs = await ctx.db
113 .query("tasks")114 .query("tasks")
@@ -132,7 +133,7 @@ export const listQueuedTaskIds = internalQuery({ · 18 unmodified lines
132});133});
133 134
134export const getTaskInWorkspace = internalQuery({135export const getTaskInWorkspace = internalQuery({
135 args: { taskId: v.string(), workspaceId: v.id("workspaces") },136 args: { taskId: v.string(), workspaceId: vv.id("workspaces") },
136 handler: async (ctx, args) => {137 handler: async (ctx, args) => {
137 const doc = await getTaskDoc(ctx, args.taskId);138 const doc = await getTaskDoc(ctx, args.taskId);
138 if (!doc || doc.workspaceId !== args.workspaceId) {139 if (!doc || doc.workspaceId !== args.workspaceId) {
executor/packages/database/convex/database/tool_calls.ts+2−1
@@ -3,12 +3,13 @@ import { internalMutation, internalQuery } from "../_generated/server"; · 2 unmodified lines
3import { mapToolCall } from "../../src/database/mappers";3import { mapToolCall } from "../../src/database/mappers";
4import { getToolCallDoc } from "../../src/database/readers";4import { getToolCallDoc } from "../../src/database/readers";
5import { terminalToolCallStatusValidator } from "../../src/database/validators";5import { terminalToolCallStatusValidator } from "../../src/database/validators";
6import { vv } from "../typedV";
6 7
7export const upsertToolCallRequested = internalMutation({8export const upsertToolCallRequested = internalMutation({
8 args: {9 args: {
9 taskId: v.string(),10 taskId: v.string(),
10 callId: v.string(),11 callId: v.string(),
11 workspaceId: v.id("workspaces"),12 workspaceId: vv.id("workspaces"),
12 toolPath: v.string(),13 toolPath: v.string(),
13 },14 },
14 handler: async (ctx, args) => {15 handler: async (ctx, args) => {
executor/packages/database/convex/executor.ts+6−5
@@ -10,6 +10,7 @@ import { · 9 unmodified lines
10 resolveApprovalInternalHandler,10 resolveApprovalInternalHandler,
11} from "../src/executor/handlers";11} from "../src/executor/handlers";
12import { jsonObjectValidator } from "../src/database/validators";12import { jsonObjectValidator } from "../src/database/validators";
13import { vv } from "./typedV";
13 14
14export const createTask = customAction({15export const createTask = customAction({
15 method: "POST",16 method: "POST",
@@ -18,9 +19,9 @@ export const createTask = customAction({ · 2 unmodified lines
18 timeoutMs: v.optional(v.number()),19 timeoutMs: v.optional(v.number()),
19 runtimeId: v.optional(v.string()),20 runtimeId: v.optional(v.string()),
20 metadata: v.optional(jsonObjectValidator),21 metadata: v.optional(jsonObjectValidator),
21 workspaceId: v.id("workspaces"),22 workspaceId: vv.id("workspaces"),
22 sessionId: v.optional(v.string()),23 sessionId: v.optional(v.string()),
23 accountId: v.optional(v.id("accounts")),24 accountId: v.optional(vv.id("accounts")),
24 waitForResult: v.optional(v.boolean()),25 waitForResult: v.optional(v.boolean()),
25 },26 },
26 handler: async (ctx, args) => {27 handler: async (ctx, args) => {
@@ -34,8 +35,8 @@ export const createTaskInternal = internalMutation({ · 7 unmodified lines
34 timeoutMs: v.optional(v.number()),35 timeoutMs: v.optional(v.number()),
35 runtimeId: v.optional(v.string()),36 runtimeId: v.optional(v.string()),
36 metadata: v.optional(jsonObjectValidator),37 metadata: v.optional(jsonObjectValidator),
37 workspaceId: v.id("workspaces"),38 workspaceId: vv.id("workspaces"),
38 accountId: v.id("accounts"),39 accountId: vv.id("accounts"),
39 clientId: v.optional(v.string()),40 clientId: v.optional(v.string()),
40 scheduleAfterCreate: v.optional(v.boolean()),41 scheduleAfterCreate: v.optional(v.boolean()),
41 },42 },
@@ -60,7 +61,7 @@ export const resolveApproval = workspaceMutation({ · 18 unmodified lines
60 61
61export const resolveApprovalInternal = internalMutation({62export const resolveApprovalInternal = internalMutation({
62 args: {63 args: {
63 workspaceId: v.id("workspaces"),64 workspaceId: vv.id("workspaces"),
64 approvalId: v.string(),65 approvalId: v.string(),
65 decision: v.union(v.literal("approved"), v.literal("denied")),66 decision: v.union(v.literal("approved"), v.literal("denied")),
66 reviewerId: v.optional(v.string()),67 reviewerId: v.optional(v.string()),
executor/packages/database/convex/executorNode.ts+19−18
@@ -26,6 +26,7 @@ import { previewOpenApiSourceUpgradeForContext, type OpenApiUpgradeDiffPreview } · 25 unmodified lines
26import { getStorageProvider, type StorageEncoding, type StorageProvider } from "../src/runtime/storage_provider";26import { getStorageProvider, type StorageEncoding, type StorageProvider } from "../src/runtime/storage_provider";
27import { shouldTouchStorageOnRead } from "../src/runtime/storage_touch_policy";27import { shouldTouchStorageOnRead } from "../src/runtime/storage_touch_policy";
28import { shouldRefreshStorageUsage } from "../src/runtime/storage_usage_refresh";28import { shouldRefreshStorageUsage } from "../src/runtime/storage_usage_refresh";
29import { vv } from "./typedV";
29 30
30function isReadOnlySql(sql: string): boolean {31function isReadOnlySql(sql: string): boolean {
31 const trimmed = sql.trim().toLowerCase();32 const trimmed = sql.trim().toLowerCase();
@@ -109,8 +110,8 @@ async function touchStorageInstance( · 77 unmodified lines
109export const listToolsWithWarnings = customAction({110export const listToolsWithWarnings = customAction({
110 method: "POST",111 method: "POST",
111 args: {112 args: {
112 workspaceId: v.id("workspaces"),113 workspaceId: vv.id("workspaces"),
113 accountId: v.optional(v.id("accounts")),114 accountId: v.optional(vv.id("accounts")),
114 sessionId: v.optional(v.string()),115 sessionId: v.optional(v.string()),
115 includeDetails: v.optional(v.boolean()),116 includeDetails: v.optional(v.boolean()),
116 includeSourceMeta: v.optional(v.boolean()),117 includeSourceMeta: v.optional(v.boolean()),
@@ -181,8 +182,8 @@ export const listToolsWithWarnings = customAction({ · 64 unmodified lines
181 182
182export const listToolsInternal = internalAction({183export const listToolsInternal = internalAction({
183 args: {184 args: {
184 workspaceId: v.id("workspaces"),185 workspaceId: vv.id("workspaces"),
185 accountId: v.optional(v.id("accounts")),186 accountId: v.optional(vv.id("accounts")),
186 clientId: v.optional(v.string()),187 clientId: v.optional(v.string()),
187 },188 },
188 handler: async (ctx, args): Promise<ToolDescriptor[]> => {189 handler: async (ctx, args): Promise<ToolDescriptor[]> => {
@@ -192,8 +193,8 @@ export const listToolsInternal = internalAction({ · 3 unmodified lines
192 193
193export const listToolsWithWarningsInternal = internalAction({194export const listToolsWithWarningsInternal = internalAction({
194 args: {195 args: {
195 workspaceId: v.id("workspaces"),196 workspaceId: vv.id("workspaces"),
196 accountId: v.optional(v.id("accounts")),197 accountId: v.optional(vv.id("accounts")),
197 clientId: v.optional(v.string()),198 clientId: v.optional(v.string()),
198 },199 },
199 handler: async (200 handler: async (
@@ -215,8 +216,8 @@ export const listToolsWithWarningsInternal = internalAction({ · 15 unmodified lines
215 216
216export const rebuildToolInventoryInternal = internalAction({217export const rebuildToolInventoryInternal = internalAction({
217 args: {218 args: {
218 workspaceId: v.id("workspaces"),219 workspaceId: vv.id("workspaces"),
219 accountId: v.optional(v.id("accounts")),220 accountId: v.optional(vv.id("accounts")),
220 clientId: v.optional(v.string()),221 clientId: v.optional(v.string()),
221 },222 },
222 handler: async (ctx, args): Promise<{ rebuilt: boolean }> => {223 handler: async (ctx, args): Promise<{ rebuilt: boolean }> => {
@@ -230,8 +231,8 @@ export const rebuildToolInventoryInternal = internalAction({ · 7 unmodified lines
230export const previewOpenApiSourceUpgrade = customAction({231export const previewOpenApiSourceUpgrade = customAction({
231 method: "POST",232 method: "POST",
232 args: {233 args: {
233 workspaceId: v.id("workspaces"),234 workspaceId: vv.id("workspaces"),
234 accountId: v.optional(v.id("accounts")),235 accountId: v.optional(vv.id("accounts")),
235 sessionId: v.optional(v.string()),236 sessionId: v.optional(v.string()),
236 sourceId: v.string(),237 sourceId: v.string(),
237 name: v.string(),238 name: v.string(),
@@ -263,8 +264,8 @@ export const previewOpenApiSourceUpgrade = customAction({ · 25 unmodified lines
263export const storageListDirectory = customAction({264export const storageListDirectory = customAction({
264 method: "POST",265 method: "POST",
265 args: {266 args: {
266 workspaceId: v.id("workspaces"),267 workspaceId: vv.id("workspaces"),
267 accountId: v.optional(v.id("accounts")),268 accountId: v.optional(vv.id("accounts")),
268 sessionId: v.optional(v.string()),269 sessionId: v.optional(v.string()),
269 instanceId: v.string(),270 instanceId: v.string(),
270 path: v.optional(v.string()),271 path: v.optional(v.string()),
@@ -291,8 +292,8 @@ export const storageListDirectory = customAction({ · 20 unmodified lines
291export const storageReadFile = customAction({292export const storageReadFile = customAction({
292 method: "POST",293 method: "POST",
293 args: {294 args: {
294 workspaceId: v.id("workspaces"),295 workspaceId: vv.id("workspaces"),
295 accountId: v.optional(v.id("accounts")),296 accountId: v.optional(vv.id("accounts")),
296 sessionId: v.optional(v.string()),297 sessionId: v.optional(v.string()),
297 instanceId: v.string(),298 instanceId: v.string(),
298 path: v.string(),299 path: v.string(),
@@ -322,8 +323,8 @@ export const storageReadFile = customAction({ · 23 unmodified lines
322export const storageListKv = customAction({323export const storageListKv = customAction({
323 method: "POST",324 method: "POST",
324 args: {325 args: {
325 workspaceId: v.id("workspaces"),326 workspaceId: vv.id("workspaces"),
326 accountId: v.optional(v.id("accounts")),327 accountId: v.optional(vv.id("accounts")),
327 sessionId: v.optional(v.string()),328 sessionId: v.optional(v.string()),
328 instanceId: v.string(),329 instanceId: v.string(),
329 prefix: v.optional(v.string()),330 prefix: v.optional(v.string()),
@@ -353,8 +354,8 @@ export const storageListKv = customAction({ · 23 unmodified lines
353export const storageQuerySql = customAction({354export const storageQuerySql = customAction({
354 method: "POST",355 method: "POST",
355 args: {356 args: {
356 workspaceId: v.id("workspaces"),357 workspaceId: vv.id("workspaces"),
357 accountId: v.optional(v.id("accounts")),358 accountId: v.optional(vv.id("accounts")),
358 sessionId: v.optional(v.string()),359 sessionId: v.optional(v.string()),
359 instanceId: v.string(),360 instanceId: v.string(),
360 sql: v.string(),361 sql: v.string(),
executor/packages/database/convex/invites.ts+9−8
@@ -14,6 +14,7 @@ import { · 13 unmodified lines
14} from "../src/invites/workos";14} from "../src/invites/workos";
15import { normalizePersonalOrganizationName } from "../src/invites/normalize";15import { normalizePersonalOrganizationName } from "../src/invites/normalize";
16import { safeRunAfter } from "../src/lib/scheduler";16import { safeRunAfter } from "../src/lib/scheduler";
17import { vv } from "./typedV";
17 18
18const organizationRoleValidator = v.union(19const organizationRoleValidator = v.union(
19 v.literal("owner"),20 v.literal("owner"),
@@ -124,7 +125,7 @@ export const create = organizationMutation({ · 104 unmodified lines
124 125
125export const deliverWorkosInvite = internalAction({126export const deliverWorkosInvite = internalAction({
126 args: {127 args: {
127 inviteId: v.id("invites"),128 inviteId: vv.id("invites"),
128 inviterWorkosUserId: v.string(),129 inviterWorkosUserId: v.string(),
129 expiresInDays: v.optional(v.number()),130 expiresInDays: v.optional(v.number()),
130 roleSlug: v.optional(v.string()),131 roleSlug: v.optional(v.string()),
@@ -192,7 +193,7 @@ export const revoke = organizationMutation({ · 61 unmodified lines
192 method: "POST",193 method: "POST",
193 requireAdmin: true,194 requireAdmin: true,
194 args: {195 args: {
195 inviteId: v.id("invites"),196 inviteId: vv.id("invites"),
196 },197 },
197 handler: async (ctx, args) => {198 handler: async (ctx, args) => {
198 const invite = await ctx.db.get(args.inviteId);199 const invite = await ctx.db.get(args.inviteId);
@@ -222,7 +223,7 @@ export const revoke = organizationMutation({ · 23 unmodified lines
222 223
223export const revokeWorkosInvite = internalAction({224export const revokeWorkosInvite = internalAction({
224 args: {225 args: {
225 inviteId: v.id("invites"),226 inviteId: vv.id("invites"),
226 providerInviteId: v.string(),227 providerInviteId: v.string(),
227 },228 },
228 handler: async (ctx, args) => {229 handler: async (ctx, args) => {
@@ -239,7 +240,7 @@ export const revokeWorkosInvite = internalAction({ · 10 unmodified lines
239 240
240export const getInviteDeliveryContext = internalQuery({241export const getInviteDeliveryContext = internalQuery({
241 args: {242 args: {
242 inviteId: v.id("invites"),243 inviteId: vv.id("invites"),
243 },244 },
244 handler: async (ctx, args) => {245 handler: async (ctx, args) => {
245 const invite = await ctx.db.get(args.inviteId);246 const invite = await ctx.db.get(args.inviteId);
@@ -264,7 +265,7 @@ export const getInviteDeliveryContext = internalQuery({ · 18 unmodified lines
264 265
265export const linkOrganizationToWorkos = internalMutation({266export const linkOrganizationToWorkos = internalMutation({
266 args: {267 args: {
267 organizationId: v.id("organizations"),268 organizationId: vv.id("organizations"),
268 workosOrgId: v.string(),269 workosOrgId: v.string(),
269 },270 },
270 handler: async (ctx, args) => {271 handler: async (ctx, args) => {
@@ -277,7 +278,7 @@ export const linkOrganizationToWorkos = internalMutation({ · 6 unmodified lines
277 278
278export const getInviteById = internalQuery({279export const getInviteById = internalQuery({
279 args: {280 args: {
280 inviteId: v.id("invites"),281 inviteId: vv.id("invites"),
281 },282 },
282 handler: async (ctx, args) => {283 handler: async (ctx, args) => {
283 return await ctx.db.get(args.inviteId);284 return await ctx.db.get(args.inviteId);
@@ -286,7 +287,7 @@ export const getInviteById = internalQuery({ · 2 unmodified lines
286 287
287export const markInviteDelivered = internalMutation({288export const markInviteDelivered = internalMutation({
288 args: {289 args: {
289 inviteId: v.id("invites"),290 inviteId: vv.id("invites"),
290 providerInviteId: v.string(),291 providerInviteId: v.string(),
291 },292 },
292 handler: async (ctx, args) => {293 handler: async (ctx, args) => {
@@ -304,7 +305,7 @@ export const markInviteDelivered = internalMutation({ · 11 unmodified lines
304 305
305export const markInviteDeliveryFailed = internalMutation({306export const markInviteDeliveryFailed = internalMutation({
306 args: {307 args: {
307 inviteId: v.id("invites"),308 inviteId: vv.id("invites"),
308 errorMessage: v.string(),309 errorMessage: v.string(),
309 },310 },
310 handler: async (ctx, args) => {311 handler: async (ctx, args) => {
executor/packages/database/convex/organizationMembers.ts+4−3
@@ -4,6 +4,7 @@ import { getOrganizationMembership } from "../../core/src/identity"; · 3 unmodified lines
4import { organizationMutation, organizationQuery } from "../../core/src/function-builders";4import { organizationMutation, organizationQuery } from "../../core/src/function-builders";
5import { upsertOrganizationMembership } from "../src/auth/memberships";5import { upsertOrganizationMembership } from "../src/auth/memberships";
6import { safeRunAfter } from "../src/lib/scheduler";6import { safeRunAfter } from "../src/lib/scheduler";
7import { vv } from "./typedV";
7 8
8const organizationRoleValidator = v.union(9const organizationRoleValidator = v.union(
9 v.literal("owner"),10 v.literal("owner"),
@@ -46,7 +47,7 @@ export const list = organizationQuery({ · 36 unmodified lines
46export const updateRole = organizationMutation({47export const updateRole = organizationMutation({
47 method: "POST",48 method: "POST",
48 args: {49 args: {
49 accountId: v.id("accounts"),50 accountId: vv.id("accounts"),
50 role: organizationRoleValidator,51 role: organizationRoleValidator,
51 },52 },
52 requireAdmin: true,53 requireAdmin: true,
@@ -84,7 +85,7 @@ export const updateRole = organizationMutation({ · 31 unmodified lines
84export const updateBillable = organizationMutation({85export const updateBillable = organizationMutation({
85 method: "POST",86 method: "POST",
86 args: {87 args: {
87 accountId: v.id("accounts"),88 accountId: vv.id("accounts"),
88 billable: v.boolean(),89 billable: v.boolean(),
89 },90 },
90 requireBillingAdmin: true,91 requireBillingAdmin: true,
@@ -114,7 +115,7 @@ export const updateBillable = organizationMutation({ · 23 unmodified lines
114export const remove = organizationMutation({115export const remove = organizationMutation({
115 method: "POST",116 method: "POST",
116 args: {117 args: {
117 accountId: v.id("accounts"),118 accountId: vv.id("accounts"),
118 },119 },
119 requireAdmin: true,120 requireAdmin: true,
120 handler: async (ctx, args) => {121 handler: async (ctx, args) => {
executor/packages/database/convex/organizations.ts+3−2
@@ -7,6 +7,7 @@ import { · 6 unmodified lines
7 listOrganizationsMineHandler,7 listOrganizationsMineHandler,
8 resolveWorkosOrganizationIdHandler,8 resolveWorkosOrganizationIdHandler,
9} from "../src/organizations/handlers";9} from "../src/organizations/handlers";
10import { vv } from "./typedV";
10 11
11export const create = authedMutation({12export const create = authedMutation({
12 method: "POST",13 method: "POST",
@@ -37,7 +38,7 @@ export const getNavigationState = optionalAccountQuery({ · 24 unmodified lines
37export const getOrganizationAccess = optionalAccountQuery({38export const getOrganizationAccess = optionalAccountQuery({
38 method: "GET",39 method: "GET",
39 args: {40 args: {
40 organizationId: v.id("organizations"),41 organizationId: vv.id("organizations"),
41 },42 },
42 handler: async (ctx, args) => {43 handler: async (ctx, args) => {
43 return await getOrganizationAccessHandler(ctx, args);44 return await getOrganizationAccessHandler(ctx, args);
@@ -47,7 +48,7 @@ export const getOrganizationAccess = optionalAccountQuery({ · 3 unmodified lines
47export const resolveWorkosOrganizationId = optionalAccountQuery({48export const resolveWorkosOrganizationId = optionalAccountQuery({
48 method: "GET",49 method: "GET",
49 args: {50 args: {
50 organizationId: v.id("organizations"),51 organizationId: vv.id("organizations"),
51 },52 },
52 handler: async (ctx, args) => {53 handler: async (ctx, args) => {
53 return await resolveWorkosOrganizationIdHandler(ctx, args);54 return await resolveWorkosOrganizationIdHandler(ctx, args);
executor/packages/database/convex/runtimeCallbacks.ts+2−1
@@ -8,6 +8,7 @@ import { · 7 unmodified lines
8 handleToolCallHandler,8 handleToolCallHandler,
9} from "../src/runtime-callbacks/handlers";9} from "../src/runtime-callbacks/handlers";
10import { jsonObjectValidator } from "../src/database/validators";10import { jsonObjectValidator } from "../src/database/validators";
11import { vv } from "./typedV";
11 12
12export const handleToolCall = customAction({13export const handleToolCall = customAction({
13 method: "POST",14 method: "POST",
@@ -55,7 +56,7 @@ export const getTaskWatchStatus = customQuery({ · 41 unmodified lines
55 args: {56 args: {
56 internalSecret: v.string(),57 internalSecret: v.string(),
57 runId: v.string(),58 runId: v.string(),
58 workspaceId: v.id("workspaces"),59 workspaceId: vv.id("workspaces"),
59 },60 },
60 handler: async (ctx, args) => {61 handler: async (ctx, args) => {
61 return await getTaskWatchStatusHandler(ctx, internal, args);62 return await getTaskWatchStatusHandler(ctx, internal, args);
executor/packages/database/convex/toolRegistry.ts+21−20
@@ -1,10 +1,11 @@
1import { v } from "convex/values";1import { v } from "convex/values";
2import { internal } from "./_generated/api";2import { internal } from "./_generated/api";
3import { internalAction, internalMutation, internalQuery } from "./_generated/server";3import { internalAction, internalMutation, internalQuery } from "./_generated/server";
4import { vv } from "./typedV";
4 5
5export const getState = internalQuery({6export const getState = internalQuery({
6 args: {7 args: {
7 workspaceId: v.id("workspaces"),8 workspaceId: vv.id("workspaces"),
8 },9 },
9 handler: async (ctx, args) => {10 handler: async (ctx, args) => {
10 const entry = await ctx.db11 const entry = await ctx.db
@@ -40,7 +41,7 @@ export const getState = internalQuery({ · 29 unmodified lines
40 41
41export const beginBuild = internalMutation({42export const beginBuild = internalMutation({
42 args: {43 args: {
43 workspaceId: v.id("workspaces"),44 workspaceId: vv.id("workspaces"),
44 signature: v.string(),45 signature: v.string(),
45 buildId: v.string(),46 buildId: v.string(),
46 },47 },
@@ -88,7 +89,7 @@ export const beginBuild = internalMutation({ · 41 unmodified lines
88 89
89export const putToolsBatch = internalMutation({90export const putToolsBatch = internalMutation({
90 args: {91 args: {
91 workspaceId: v.id("workspaces"),92 workspaceId: vv.id("workspaces"),
92 buildId: v.string(),93 buildId: v.string(),
93 tools: v.array(94 tools: v.array(
94 v.object({95 v.object({
@@ -152,7 +153,7 @@ export const putToolsBatch = internalMutation({ · 57 unmodified lines
152 153
153export const putNamespacesBatch = internalMutation({154export const putNamespacesBatch = internalMutation({
154 args: {155 args: {
155 workspaceId: v.id("workspaces"),156 workspaceId: vv.id("workspaces"),
156 buildId: v.string(),157 buildId: v.string(),
157 namespaces: v.array(158 namespaces: v.array(
158 v.object({159 v.object({
@@ -179,7 +180,7 @@ export const putNamespacesBatch = internalMutation({ · 20 unmodified lines
179 180
180export const finishBuild = internalMutation({181export const finishBuild = internalMutation({
181 args: {182 args: {
182 workspaceId: v.id("workspaces"),183 workspaceId: vv.id("workspaces"),
183 buildId: v.string(),184 buildId: v.string(),
184 signature: v.string(),185 signature: v.string(),
185 },186 },
@@ -235,7 +236,7 @@ export const finishBuild = internalMutation({ · 49 unmodified lines
235 236
236export const updateBuildMetadata = internalMutation({237export const updateBuildMetadata = internalMutation({
237 args: {238 args: {
238 workspaceId: v.id("workspaces"),239 workspaceId: vv.id("workspaces"),
239 buildId: v.string(),240 buildId: v.string(),
240 typesStorageId: v.optional(v.id("_storage")),241 typesStorageId: v.optional(v.id("_storage")),
241 warnings: v.array(v.string()),242 warnings: v.array(v.string()),
@@ -303,7 +304,7 @@ export const updateBuildMetadata = internalMutation({ · 61 unmodified lines
303 304
304export const failBuild = internalMutation({305export const failBuild = internalMutation({
305 args: {306 args: {
306 workspaceId: v.id("workspaces"),307 workspaceId: vv.id("workspaces"),
307 buildId: v.string(),308 buildId: v.string(),
308 error: v.optional(v.string()),309 error: v.optional(v.string()),
309 },310 },
@@ -335,7 +336,7 @@ const PRUNE_NAMESPACE_SCAN_PAGE_SIZE = 250; · 25 unmodified lines
335 336
336export const scanNamespaceBuildsForPrune = internalQuery({337export const scanNamespaceBuildsForPrune = internalQuery({
337 args: {338 args: {
338 workspaceId: v.id("workspaces"),339 workspaceId: vv.id("workspaces"),
339 cursor: v.optional(v.string()),340 cursor: v.optional(v.string()),
340 },341 },
341 handler: async (ctx, args) => {342 handler: async (ctx, args) => {
@@ -356,7 +357,7 @@ export const scanNamespaceBuildsForPrune = internalQuery({ · 14 unmodified lines
356 357
357export const deleteToolRegistryToolsPage = internalMutation({358export const deleteToolRegistryToolsPage = internalMutation({
358 args: {359 args: {
359 workspaceId: v.id("workspaces"),360 workspaceId: vv.id("workspaces"),
360 buildId: v.string(),361 buildId: v.string(),
361 cursor: v.optional(v.string()),362 cursor: v.optional(v.string()),
362 },363 },
@@ -376,7 +377,7 @@ export const deleteToolRegistryToolsPage = internalMutation({ · 13 unmodified lines
376 377
377export const deleteToolRegistryPayloadsPage = internalMutation({378export const deleteToolRegistryPayloadsPage = internalMutation({
378 args: {379 args: {
379 workspaceId: v.id("workspaces"),380 workspaceId: vv.id("workspaces"),
380 buildId: v.string(),381 buildId: v.string(),
381 cursor: v.optional(v.string()),382 cursor: v.optional(v.string()),
382 },383 },
@@ -396,7 +397,7 @@ export const deleteToolRegistryPayloadsPage = internalMutation({ · 13 unmodified lines
396 397
397export const deleteToolRegistryNamespacesPage = internalMutation({398export const deleteToolRegistryNamespacesPage = internalMutation({
398 args: {399 args: {
399 workspaceId: v.id("workspaces"),400 workspaceId: vv.id("workspaces"),
400 buildId: v.string(),401 buildId: v.string(),
401 cursor: v.optional(v.string()),402 cursor: v.optional(v.string()),
402 },403 },
@@ -416,7 +417,7 @@ export const deleteToolRegistryNamespacesPage = internalMutation({ · 13 unmodified lines
416 417
417export const pruneBuilds = internalAction({418export const pruneBuilds = internalAction({
418 args: {419 args: {
419 workspaceId: v.id("workspaces"),420 workspaceId: vv.id("workspaces"),
420 maxRetainedBuilds: v.optional(v.number()),421 maxRetainedBuilds: v.optional(v.number()),
421 },422 },
422 handler: async (ctx, args) => {423 handler: async (ctx, args) => {
@@ -528,7 +529,7 @@ export const pruneBuilds = internalAction({ · 105 unmodified lines
528 529
529export const getToolByPath = internalQuery({530export const getToolByPath = internalQuery({
530 args: {531 args: {
531 workspaceId: v.id("workspaces"),532 workspaceId: vv.id("workspaces"),
532 buildId: v.string(),533 buildId: v.string(),
533 path: v.string(),534 path: v.string(),
534 },535 },
@@ -569,7 +570,7 @@ export const getToolByPath = internalQuery({ · 34 unmodified lines
569 570
570export const getSerializedToolsByPaths = internalQuery({571export const getSerializedToolsByPaths = internalQuery({
571 args: {572 args: {
572 workspaceId: v.id("workspaces"),573 workspaceId: vv.id("workspaces"),
573 buildId: v.string(),574 buildId: v.string(),
574 paths: v.array(v.string()),575 paths: v.array(v.string()),
575 },576 },
@@ -601,7 +602,7 @@ export const getSerializedToolsByPaths = internalQuery({ · 25 unmodified lines
601 602
602export const listToolsByNamespace = internalQuery({603export const listToolsByNamespace = internalQuery({
603 args: {604 args: {
604 workspaceId: v.id("workspaces"),605 workspaceId: vv.id("workspaces"),
605 buildId: v.string(),606 buildId: v.string(),
606 namespace: v.string(),607 namespace: v.string(),
607 limit: v.number(),608 limit: v.number(),
@@ -636,7 +637,7 @@ export const listToolsByNamespace = internalQuery({ · 28 unmodified lines
636 637
637export const listToolsPage = internalQuery({638export const listToolsPage = internalQuery({
638 args: {639 args: {
639 workspaceId: v.id("workspaces"),640 workspaceId: vv.id("workspaces"),
640 buildId: v.string(),641 buildId: v.string(),
641 cursor: v.optional(v.string()),642 cursor: v.optional(v.string()),
642 limit: v.number(),643 limit: v.number(),
@@ -674,7 +675,7 @@ export const listToolsPage = internalQuery({ · 31 unmodified lines
674 675
675export const listToolsBySourcePage = internalQuery({676export const listToolsBySourcePage = internalQuery({
676 args: {677 args: {
677 workspaceId: v.id("workspaces"),678 workspaceId: vv.id("workspaces"),
678 buildId: v.string(),679 buildId: v.string(),
679 source: v.string(),680 source: v.string(),
680 cursor: v.optional(v.string()),681 cursor: v.optional(v.string()),
@@ -737,7 +738,7 @@ export const listToolsBySourcePage = internalQuery({ · 56 unmodified lines
737 738
738export const getToolsByNormalizedPath = internalQuery({739export const getToolsByNormalizedPath = internalQuery({
739 args: {740 args: {
740 workspaceId: v.id("workspaces"),741 workspaceId: vv.id("workspaces"),
741 buildId: v.string(),742 buildId: v.string(),
742 normalizedPath: v.string(),743 normalizedPath: v.string(),
743 limit: v.number(),744 limit: v.number(),
@@ -781,7 +782,7 @@ export const getToolsByNormalizedPath = internalQuery({ · 37 unmodified lines
781 782
782export const searchTools = internalQuery({783export const searchTools = internalQuery({
783 args: {784 args: {
784 workspaceId: v.id("workspaces"),785 workspaceId: vv.id("workspaces"),
785 buildId: v.string(),786 buildId: v.string(),
786 query: v.string(),787 query: v.string(),
787 limit: v.number(),788 limit: v.number(),
@@ -818,7 +819,7 @@ export const searchTools = internalQuery({ · 30 unmodified lines
818 819
819export const listNamespaces = internalQuery({820export const listNamespaces = internalQuery({
820 args: {821 args: {
821 workspaceId: v.id("workspaces"),822 workspaceId: vv.id("workspaces"),
822 buildId: v.string(),823 buildId: v.string(),
823 limit: v.number(),824 limit: v.number(),
824 },825 },
executor/packages/database/convex/typedV.ts+4−0
@@ -0,0 +1,4 @@
1import { typedV } from "convex-helpers/validators";
2import schema from "./schema";
3
4export const vv = typedV(schema);
executor/packages/database/convex/workspace.ts+10−8
@@ -3,6 +3,7 @@ import { internal } from "./_generated/api"; · 2 unmodified lines
3import { customMutation, workspaceMutation, workspaceQuery } from "../../core/src/function-builders";3import { customMutation, workspaceMutation, workspaceQuery } from "../../core/src/function-builders";
4import { getOrganizationMembership, isAdminRole } from "../../core/src/identity";4import { getOrganizationMembership, isAdminRole } from "../../core/src/identity";
5import {5import {
6 argumentConditionValidator,
6 credentialProviderValidator,7 credentialProviderValidator,
7 credentialScopeTypeValidator,8 credentialScopeTypeValidator,
8 jsonObjectValidator,9 jsonObjectValidator,
@@ -17,6 +18,7 @@ import { · 8 unmodified lines
17 toolSourceScopeTypeValidator,18 toolSourceScopeTypeValidator,
18 toolSourceTypeValidator,19 toolSourceTypeValidator,
19} from "../src/database/validators";20} from "../src/database/validators";
21import { vv } from "./typedV";
20import { safeRunAfter } from "../src/lib/scheduler";22import { safeRunAfter } from "../src/lib/scheduler";
21import {23import {
22 getWorkspaceInventoryProgressForContext,24 getWorkspaceInventoryProgressForContext,
@@ -111,6 +113,8 @@ export const listTasks = workspaceQuery({ · 88 unmodified lines
111 method: "GET",113 method: "GET",
112 args: {},114 args: {},
113 handler: async (ctx) => {115 handler: async (ctx) => {
116 // TODO(security): Revisit member-level visibility for task code/output
117 // and provide redacted views by default outside admin contexts.
114 return await ctx.runQuery(internal.database.listTasks, {118 return await ctx.runQuery(internal.database.listTasks, {
115 workspaceId: ctx.workspaceId,119 workspaceId: ctx.workspaceId,
116 });120 });
@@ -121,6 +125,8 @@ export const listPendingApprovals = workspaceQuery({ · 4 unmodified lines
121 method: "GET",125 method: "GET",
122 args: {},126 args: {},
123 handler: async (ctx) => {127 handler: async (ctx) => {
128 // TODO(security): Revisit member-level visibility for approval inputs,
129 // which can include sensitive request payloads.
124 return await ctx.runQuery(internal.database.listPendingApprovals, {130 return await ctx.runQuery(internal.database.listPendingApprovals, {
125 workspaceId: ctx.workspaceId,131 workspaceId: ctx.workspaceId,
126 });132 });
@@ -192,11 +198,7 @@ export const upsertToolPolicyRule = workspaceMutation({ · 65 unmodified lines
192 matchType: v.optional(policyMatchTypeValidator),198 matchType: v.optional(policyMatchTypeValidator),
193 effect: v.optional(policyEffectValidator),199 effect: v.optional(policyEffectValidator),
194 approvalMode: v.optional(policyApprovalModeValidator),200 approvalMode: v.optional(policyApprovalModeValidator),
195 argumentConditions: v.optional(v.array(v.object({201 argumentConditions: v.optional(v.array(argumentConditionValidator)),
196 key: v.string(),
197 operator: v.union(v.literal("equals"), v.literal("contains"), v.literal("starts_with"), v.literal("not_equals")),
198 value: v.string(),
199 }))),
200 priority: v.optional(v.number()),202 priority: v.optional(v.number()),
201 },203 },
202 handler: async (ctx, args) => {204 handler: async (ctx, args) => {
@@ -244,7 +246,7 @@ export const upsertToolPolicyAssignment = workspaceMutation({ · 41 unmodified lines
244 id: v.optional(v.string()),246 id: v.optional(v.string()),
245 roleId: v.string(),247 roleId: v.string(),
246 scopeType: v.optional(policyScopeTypeValidator),248 scopeType: v.optional(policyScopeTypeValidator),
247 targetAccountId: v.optional(v.id("accounts")),249 targetAccountId: v.optional(vv.id("accounts")),
248 clientId: v.optional(v.string()),250 clientId: v.optional(v.string()),
249 status: v.optional(toolRoleBindingStatusValidator),251 status: v.optional(toolRoleBindingStatusValidator),
250 expiresAt: v.optional(v.number()),252 expiresAt: v.optional(v.number()),
@@ -292,7 +294,7 @@ export const upsertCredential = workspaceMutation({ · 41 unmodified lines
292 id: v.optional(v.string()),294 id: v.optional(v.string()),
293 scopeType: v.optional(credentialScopeTypeValidator),295 scopeType: v.optional(credentialScopeTypeValidator),
294 sourceKey: v.string(),296 sourceKey: v.string(),
295 accountId: v.optional(v.id("accounts")),297 accountId: v.optional(vv.id("accounts")),
296 provider: v.optional(credentialProviderValidator),298 provider: v.optional(credentialProviderValidator),
297 secretJson: jsonObjectValidator,299 secretJson: jsonObjectValidator,
298 overridesJson: v.optional(jsonObjectValidator),300 overridesJson: v.optional(jsonObjectValidator),
@@ -342,7 +344,7 @@ export const resolveCredential = workspaceQuery({ · 43 unmodified lines
342 args: {344 args: {
343 sourceKey: v.string(),345 sourceKey: v.string(),
344 scopeType: credentialScopeTypeValidator,346 scopeType: credentialScopeTypeValidator,
345 accountId: v.optional(v.id("accounts")),347 accountId: v.optional(vv.id("accounts")),
346 },348 },
347 handler: async (ctx, args) => {349 handler: async (ctx, args) => {
348 return await ctx.runQuery(internal.database.resolveCredential, {350 return await ctx.runQuery(internal.database.resolveCredential, {
executor/packages/database/convex/workspaceAuthInternal.ts+6−5
@@ -6,10 +6,11 @@ import { · 5 unmodified lines
6 resolveWorkosAccountBySubject,6 resolveWorkosAccountBySubject,
7} from "../../core/src/identity";7} from "../../core/src/identity";
8import type { Id } from "./_generated/dataModel.d.ts";8import type { Id } from "./_generated/dataModel.d.ts";
9import { vv } from "./typedV";
9 10
10export const getWorkspaceAccessForRequest = internalQuery({11export const getWorkspaceAccessForRequest = internalQuery({
11 args: {12 args: {
12 workspaceId: v.id("workspaces"),13 workspaceId: vv.id("workspaces"),
13 sessionId: v.optional(v.string()),14 sessionId: v.optional(v.string()),
14 },15 },
15 handler: async (ctx, args) => {16 handler: async (ctx, args) => {
@@ -32,7 +33,7 @@ export const getWorkspaceAccessForRequest = internalQuery({ · 16 unmodified lines
32 33
33export const getWorkspaceAccessForWorkosSubject = internalQuery({34export const getWorkspaceAccessForWorkosSubject = internalQuery({
34 args: {35 args: {
35 workspaceId: v.id("workspaces"),36 workspaceId: vv.id("workspaces"),
36 subject: v.string(),37 subject: v.string(),
37 },38 },
38 handler: async (ctx, args) => {39 handler: async (ctx, args) => {
@@ -55,7 +56,7 @@ export const getWorkspaceAccessForWorkosSubject = internalQuery({ · 16 unmodified lines
55 56
56export const getWorkspaceAccessForAnonymousSubject = internalQuery({57export const getWorkspaceAccessForAnonymousSubject = internalQuery({
57 args: {58 args: {
58 workspaceId: v.id("workspaces"),59 workspaceId: vv.id("workspaces"),
59 accountId: v.string(),60 accountId: v.string(),
60 },61 },
61 handler: async (ctx, args) => {62 handler: async (ctx, args) => {
@@ -83,8 +84,8 @@ export const getWorkspaceAccessForAnonymousSubject = internalQuery({ · 21 unmodified lines
83 84
84export const getWorkspaceAccessForAccount = internalQuery({85export const getWorkspaceAccessForAccount = internalQuery({
85 args: {86 args: {
86 workspaceId: v.id("workspaces"),87 workspaceId: vv.id("workspaces"),
87 accountId: v.id("accounts"),88 accountId: vv.id("accounts"),
88 },89 },
89 handler: async (ctx, args) => {90 handler: async (ctx, args) => {
90 const account = await ctx.db.get(args.accountId);91 const account = await ctx.db.get(args.accountId);
executor/packages/database/convex/workspaces.ts+3−2
@@ -5,12 +5,13 @@ import { · 4 unmodified lines
5 generateWorkspaceIconUploadUrlHandler,5 generateWorkspaceIconUploadUrlHandler,
6 listWorkspacesHandler,6 listWorkspacesHandler,
7} from "../src/workspaces/handlers";7} from "../src/workspaces/handlers";
8import { vv } from "./typedV";
8 9
9export const create = authedMutation({10export const create = authedMutation({
10 method: "POST",11 method: "POST",
11 args: {12 args: {
12 name: v.string(),13 name: v.string(),
13 organizationId: v.optional(v.id("organizations")),14 organizationId: v.optional(vv.id("organizations")),
14 iconStorageId: v.optional(v.id("_storage")),15 iconStorageId: v.optional(v.id("_storage")),
15 },16 },
16 handler: async (ctx, args) => {17 handler: async (ctx, args) => {
@@ -21,7 +22,7 @@ export const create = authedMutation({ · 4 unmodified lines
21export const list = optionalAccountQuery({22export const list = optionalAccountQuery({
22 method: "GET",23 method: "GET",
23 args: {24 args: {
24 organizationId: v.optional(v.id("organizations")),25 organizationId: v.optional(vv.id("organizations")),
25 },26 },
26 handler: async (ctx, args) => {27 handler: async (ctx, args) => {
27 return await listWorkspacesHandler(ctx, args);28 return await listWorkspacesHandler(ctx, args);