-
Notifications
You must be signed in to change notification settings - Fork 968
Expand file tree
/
Copy pathenv-schema.ts
More file actions
131 lines (121 loc) · 5.67 KB
/
Copy pathenv-schema.ts
File metadata and controls
131 lines (121 loc) · 5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import { clientEnvSchema, clientProcessEnv } from '@codebuff/common/env-schema'
import z from 'zod/v4'
export const serverEnvSchema = clientEnvSchema.extend({
// LLM API keys
OPEN_ROUTER_API_KEY: z.string().min(1),
OPENAI_API_KEY: z.string().min(1),
ANTHROPIC_API_KEY: z.string().min(1),
FIREWORKS_API_KEY: z.string().min(1),
MOONSHOT_API_KEY: z.string().min(1).optional(),
CANOPYWAVE_API_KEY: z.string().min(1).optional(),
DEEPSEEK_API_KEY: z.string().min(1).optional(),
SILICONFLOW_API_KEY: z.string().min(1).optional(),
OPENCODE_API_KEY: z.string().min(1).optional(),
LINKUP_API_KEY: z.string().min(1),
CONTEXT7_API_KEY: z.string().optional(),
GRAVITY_API_KEY: z.string().min(1),
IPINFO_TOKEN: z.string().min(1),
// BuySellAds (Carbon) zone key used for the Freebuff waiting-room ad.
// Optional: when unset the Carbon provider returns no ad and callers fall
// back to their cached ads / fallback content. `CVADC53U` is the public
// test key from BSA docs and is safe to use in dev.
CARBON_ZONE_KEY: z.string().min(1).optional(),
PORT: z.coerce.number().min(1000),
// Web/Database variables
DATABASE_URL: z.string().min(1),
CODEBUFF_GITHUB_ID: z.string().min(1),
CODEBUFF_GITHUB_SECRET: z.string().min(1),
FREEBUFF_GITHUB_ID: z.string().min(1).optional(),
FREEBUFF_GITHUB_SECRET: z.string().min(1).optional(),
NEXTAUTH_URL: z.url().optional(),
NEXTAUTH_SECRET: z.string().min(1),
STRIPE_SECRET_KEY: z.string().min(1),
STRIPE_WEBHOOK_SECRET_KEY: z.string().min(1),
STRIPE_TEAM_FEE_PRICE_ID: z.string().min(1),
STRIPE_SUBSCRIPTION_100_PRICE_ID: z.string().min(1),
STRIPE_SUBSCRIPTION_200_PRICE_ID: z.string().min(1),
STRIPE_SUBSCRIPTION_500_PRICE_ID: z.string().min(1),
LOOPS_API_KEY: z.string().min(1),
DISCORD_PUBLIC_KEY: z.string().min(1),
DISCORD_BOT_TOKEN: z.string().min(1),
DISCORD_APPLICATION_ID: z.string().min(1),
// Shared secret for the hourly bot-sweep GitHub Action. Callers must send
// `Authorization: Bearer $BOT_SWEEP_SECRET` to /api/admin/bot-sweep.
// Optional so dev environments can start without it; the endpoint returns
// 503 if the secret isn't configured.
BOT_SWEEP_SECRET: z.string().min(16).optional(),
// Optional GitHub PAT used by the bot-sweep to look up each suspect's
// GitHub account age. Without it we fall back to unauthenticated API
// calls (60 req/hr from the server IP) which is enough for a normal
// sweep but risks rate-limiting.
BOT_SWEEP_GITHUB_TOKEN: z.string().min(1).optional(),
// Freebuff waiting room. Defaults to OFF so the feature requires explicit
// opt-in per environment — the CLI/SDK do not yet send
// freebuff_instance_id, so enabling this before they ship would reject
// every free-mode request with 428 waiting_room_required.
FREEBUFF_WAITING_ROOM_ENABLED: z
.enum(['true', 'false'])
.default('false')
.transform((v) => v === 'true'),
FREEBUFF_SESSION_LENGTH_MS: z.coerce
.number()
.int()
.positive()
.default(60 * 60 * 1000),
})
export const serverEnvVars = serverEnvSchema.keyof().options
export type ServerEnvVar = (typeof serverEnvVars)[number]
export type ServerInput = {
[K in (typeof serverEnvVars)[number]]: string | undefined
}
export type ServerEnv = z.infer<typeof serverEnvSchema>
// CI-only env vars that are NOT in the typed schema
// These are injected for SDK tests but should never be accessed via env.* in code
export const ciOnlyEnvVars = ['CODEBUFF_API_KEY'] as const
export type CiOnlyEnvVar = (typeof ciOnlyEnvVars)[number]
// Bun will inject all these values, so we need to reference them individually (no for-loops)
export const serverProcessEnv: ServerInput = {
...clientProcessEnv,
// LLM API keys
OPEN_ROUTER_API_KEY: process.env.OPEN_ROUTER_API_KEY,
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY,
FIREWORKS_API_KEY: process.env.FIREWORKS_API_KEY,
MOONSHOT_API_KEY: process.env.MOONSHOT_API_KEY,
CANOPYWAVE_API_KEY: process.env.CANOPYWAVE_API_KEY,
DEEPSEEK_API_KEY: process.env.DEEPSEEK_API_KEY,
SILICONFLOW_API_KEY: process.env.SILICONFLOW_API_KEY,
OPENCODE_API_KEY: process.env.OPENCODE_API_KEY,
LINKUP_API_KEY: process.env.LINKUP_API_KEY,
CONTEXT7_API_KEY: process.env.CONTEXT7_API_KEY,
GRAVITY_API_KEY: process.env.GRAVITY_API_KEY,
IPINFO_TOKEN: process.env.IPINFO_TOKEN,
CARBON_ZONE_KEY: process.env.CARBON_ZONE_KEY,
PORT: process.env.PORT,
// Web/Database variables
DATABASE_URL: process.env.DATABASE_URL,
CODEBUFF_GITHUB_ID: process.env.CODEBUFF_GITHUB_ID,
CODEBUFF_GITHUB_SECRET: process.env.CODEBUFF_GITHUB_SECRET,
FREEBUFF_GITHUB_ID: process.env.FREEBUFF_GITHUB_ID,
FREEBUFF_GITHUB_SECRET: process.env.FREEBUFF_GITHUB_SECRET,
NEXTAUTH_URL: process.env.NEXTAUTH_URL,
NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET,
STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY,
STRIPE_WEBHOOK_SECRET_KEY: process.env.STRIPE_WEBHOOK_SECRET_KEY,
STRIPE_TEAM_FEE_PRICE_ID: process.env.STRIPE_TEAM_FEE_PRICE_ID,
STRIPE_SUBSCRIPTION_100_PRICE_ID:
process.env.STRIPE_SUBSCRIPTION_100_PRICE_ID,
STRIPE_SUBSCRIPTION_200_PRICE_ID:
process.env.STRIPE_SUBSCRIPTION_200_PRICE_ID,
STRIPE_SUBSCRIPTION_500_PRICE_ID:
process.env.STRIPE_SUBSCRIPTION_500_PRICE_ID,
LOOPS_API_KEY: process.env.LOOPS_API_KEY,
DISCORD_PUBLIC_KEY: process.env.DISCORD_PUBLIC_KEY,
DISCORD_BOT_TOKEN: process.env.DISCORD_BOT_TOKEN,
DISCORD_APPLICATION_ID: process.env.DISCORD_APPLICATION_ID,
BOT_SWEEP_SECRET: process.env.BOT_SWEEP_SECRET,
BOT_SWEEP_GITHUB_TOKEN: process.env.BOT_SWEEP_GITHUB_TOKEN,
// Freebuff waiting room
FREEBUFF_WAITING_ROOM_ENABLED: process.env.FREEBUFF_WAITING_ROOM_ENABLED,
FREEBUFF_SESSION_LENGTH_MS: process.env.FREEBUFF_SESSION_LENGTH_MS,
}