@haystackeditor/cli 0.8.0 → 0.9.0

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 (76) hide show
  1. package/README.md +105 -12
  2. package/dist/assets/hooks/agent-context/detect.ts +136 -0
  3. package/dist/assets/hooks/agent-context/format.ts +99 -0
  4. package/dist/assets/hooks/agent-context/index.ts +39 -0
  5. package/dist/assets/hooks/agent-context/parsers/claude.ts +253 -0
  6. package/dist/assets/hooks/agent-context/parsers/gemini.ts +155 -0
  7. package/dist/assets/hooks/agent-context/parsers/opencode.ts +174 -0
  8. package/dist/assets/hooks/agent-context/tsconfig.json +13 -0
  9. package/dist/assets/hooks/agent-context/types.ts +58 -0
  10. package/dist/assets/hooks/llm-rules-template.md +56 -0
  11. package/dist/assets/hooks/package.json +11 -0
  12. package/dist/assets/hooks/scripts/commit-msg.sh +4 -0
  13. package/dist/assets/hooks/scripts/post-commit.sh +4 -0
  14. package/dist/assets/hooks/scripts/pre-commit.sh +92 -0
  15. package/dist/assets/hooks/scripts/pre-push.sh +25 -0
  16. package/dist/assets/hooks/scripts/prepare-commit-msg.sh +3 -0
  17. package/dist/assets/hooks/truncation-checker/ast-analyzer.ts +528 -0
  18. package/dist/assets/hooks/truncation-checker/index.ts +595 -0
  19. package/dist/assets/hooks/truncation-checker/tsconfig.json +13 -0
  20. package/dist/assets/skills/prepare-haystack.md +323 -0
  21. package/dist/assets/skills/secrets.md +164 -0
  22. package/dist/assets/skills/setup-external-sandbox.md +243 -0
  23. package/dist/assets/skills/setup-haystack.md +639 -0
  24. package/dist/assets/skills/submit.md +154 -0
  25. package/dist/assets/templates/CLAUDE.md.snippet +42 -0
  26. package/dist/assets/templates/haystack.yml +193 -0
  27. package/dist/commands/check-pending.d.ts +19 -0
  28. package/dist/commands/check-pending.js +217 -0
  29. package/dist/commands/config.d.ts +18 -12
  30. package/dist/commands/config.js +327 -52
  31. package/dist/commands/hooks.d.ts +17 -0
  32. package/dist/commands/hooks.js +269 -0
  33. package/dist/commands/install-session-hooks.d.ts +16 -0
  34. package/dist/commands/install-session-hooks.js +302 -0
  35. package/dist/commands/login.js +1 -1
  36. package/dist/commands/policy.d.ts +31 -0
  37. package/dist/commands/policy.js +365 -0
  38. package/dist/commands/skills.d.ts +8 -0
  39. package/dist/commands/skills.js +80 -0
  40. package/dist/commands/submit.d.ts +22 -0
  41. package/dist/commands/submit.js +428 -0
  42. package/dist/commands/triage.d.ts +16 -0
  43. package/dist/commands/triage.js +354 -0
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.js +317 -2
  46. package/dist/tools/detect.d.ts +50 -0
  47. package/dist/tools/detect.js +853 -0
  48. package/dist/tools/fixtures.d.ts +38 -0
  49. package/dist/tools/fixtures.js +199 -0
  50. package/dist/tools/setup.d.ts +43 -0
  51. package/dist/tools/setup.js +597 -0
  52. package/dist/triage/prompts.d.ts +31 -0
  53. package/dist/triage/prompts.js +266 -0
  54. package/dist/triage/runner.d.ts +21 -0
  55. package/dist/triage/runner.js +325 -0
  56. package/dist/triage/traces.d.ts +20 -0
  57. package/dist/triage/traces.js +305 -0
  58. package/dist/triage/types.d.ts +47 -0
  59. package/dist/triage/types.js +7 -0
  60. package/dist/types.d.ts +1387 -191
  61. package/dist/types.js +254 -2
  62. package/dist/utils/analysis-api.d.ts +108 -0
  63. package/dist/utils/analysis-api.js +194 -0
  64. package/dist/utils/config.js +1 -1
  65. package/dist/utils/git.d.ts +80 -0
  66. package/dist/utils/git.js +302 -0
  67. package/dist/utils/github-api.d.ts +83 -0
  68. package/dist/utils/github-api.js +266 -0
  69. package/dist/utils/hooks.d.ts +26 -0
  70. package/dist/utils/hooks.js +226 -0
  71. package/dist/utils/pending-state.d.ts +38 -0
  72. package/dist/utils/pending-state.js +86 -0
  73. package/dist/utils/secrets.js +3 -3
  74. package/dist/utils/skill.d.ts +1 -1
  75. package/dist/utils/skill.js +658 -1
  76. package/package.json +5 -3
package/dist/types.d.ts CHANGED
@@ -1,203 +1,1398 @@
1
1
  /**
2
2
  * Haystack CLI Types
3
3
  *
4
- * These types define the .haystack.json schema that sandbox.py reads.
4
+ * Zod schemas for .haystack.json configuration + CLI-only types.
5
+ * The config schema matches what agent/modal/sandbox.py expects to read.
5
6
  */
6
- /**
7
- * Main configuration file schema (.haystack.json)
8
- */
9
- export interface HaystackConfig {
10
- /** Schema version - must be "1" */
11
- version: '1';
12
- /** Project name for display */
13
- name?: string;
14
- /** Package manager (auto-detected if not specified) */
15
- package_manager?: 'npm' | 'pnpm' | 'yarn' | 'bun';
16
- /**
17
- * Single dev server configuration.
18
- * Use this for simple projects with one service.
19
- * Mutually exclusive with `services`.
20
- */
21
- dev_server?: DevServer;
22
- /**
23
- * Multiple services configuration.
24
- * Use this for monorepos with multiple services.
25
- * Mutually exclusive with `dev_server`.
26
- */
27
- services?: Record<string, Service>;
28
- /** Verification configuration */
29
- verification?: VerificationConfig;
30
- /**
31
- * Network egress configuration for the sandbox.
32
- * By default, sandbox can only reach Cloudflare + GitHub IPs.
33
- * Add your own destinations here (staging servers, S3, etc.).
34
- */
35
- network?: NetworkConfig;
36
- /**
37
- * Secrets required by this project.
38
- * Values are stored securely on the Haystack platform via `haystack secrets set`.
39
- * At runtime, secrets are fetched and injected as environment variables.
40
- *
41
- * This field declares WHAT secrets are needed, not their values.
42
- * Use `haystack secrets set KEY VALUE` to store the actual values.
43
- *
44
- * @example
45
- * secrets:
46
- * OPENAI_API_KEY:
47
- * description: "OpenAI API key for LLM calls"
48
- * required: true
49
- * STAGING_TOKEN:
50
- * description: "Token for staging API access"
51
- * required: false
52
- */
53
- secrets?: Record<string, SecretDeclaration>;
54
- }
55
- /**
56
- * Secret declaration - describes what a secret is for, not its value
57
- */
58
- export interface SecretDeclaration {
59
- /** Human-readable description of what this secret is used for */
60
- description?: string;
61
- /**
62
- * Whether this secret is required for verification to run.
63
- * If true and the secret is not set, verification will fail with an error.
64
- * If false, verification will continue with a warning.
65
- * @default false
66
- */
67
- required?: boolean;
68
- /**
69
- * Services that use this secret.
70
- * If specified, the secret is only injected into these services' environments.
71
- * If omitted, the secret is available to all services.
72
- */
73
- services?: string[];
74
- }
75
- /**
76
- * Dev server configuration (simple mode)
77
- */
78
- export interface DevServer {
79
- /** Command to start the dev server (e.g., "pnpm dev") */
7
+ import { z } from 'zod';
8
+ declare const VerificationCommandSchema: z.ZodObject<{
9
+ /** Human-readable name (e.g., "Build", "Lint", "Typecheck") */
10
+ name: z.ZodString;
11
+ /** The shell command to run (e.g., "pnpm build", "pnpm lint") */
12
+ run: z.ZodString;
13
+ }, "strip", z.ZodTypeAny, {
14
+ name: string;
15
+ run: string;
16
+ }, {
17
+ name: string;
18
+ run: string;
19
+ }>;
20
+ declare const FixtureEntrySchema: z.ZodObject<{
21
+ /** Where to load fixture data from */
22
+ source: z.ZodEffects<z.ZodString, string, string>;
23
+ /** Headers to include when fetching from remote source */
24
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
25
+ /** Cookies to include when fetching from remote source */
26
+ cookies: z.ZodOptional<z.ZodString>;
27
+ }, "strip", z.ZodTypeAny, {
28
+ source: string;
29
+ headers?: Record<string, string> | undefined;
30
+ cookies?: string | undefined;
31
+ }, {
32
+ source: string;
33
+ headers?: Record<string, string> | undefined;
34
+ cookies?: string | undefined;
35
+ }>;
36
+ declare const DevServerSchema: z.ZodObject<{
37
+ /** Command to start dev server (e.g., "pnpm dev") */
38
+ command: z.ZodString;
39
+ /** Port the dev server runs on */
40
+ port: z.ZodNumber;
41
+ /** Pattern in stdout that indicates server is ready (e.g., "Local:") */
42
+ ready_pattern: z.ZodOptional<z.ZodString>;
43
+ /** Environment variables to set when starting the server */
44
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
45
+ }, "strip", z.ZodTypeAny, {
80
46
  command: string;
81
- /** Port the server runs on */
82
47
  port: number;
83
- /** Pattern in stdout indicating server is ready (e.g., "Local:") */
84
- ready_pattern?: string;
85
- /** Environment variables to set (e.g., { SKIP_AUTH: "true" }) */
86
- env?: Record<string, string>;
87
- }
88
- /**
89
- * Service configuration (monorepo mode)
90
- */
91
- export interface Service {
92
- /** Directory relative to repo root (e.g., "infra/api-worker") */
93
- root?: string;
94
- /** Command to start the service */
48
+ ready_pattern?: string | undefined;
49
+ env?: Record<string, string> | undefined;
50
+ }, {
95
51
  command: string;
96
- /** Port the service runs on (omit for batch jobs) */
97
- port?: number;
98
- /** Pattern in stdout indicating service is ready */
99
- ready_pattern?: string;
100
- /** Service type: "server" (default) or "batch" */
101
- type?: 'server' | 'batch';
52
+ port: number;
53
+ ready_pattern?: string | undefined;
54
+ env?: Record<string, string> | undefined;
55
+ }>;
56
+ /** Valid AI reviewer source identifiers that the merge queue can wait for */
57
+ export declare const AI_REVIEWER_SOURCES: readonly ["cursor", "coderabbit", "copilot", "greptile", "sourcery", "qodo", "codeant", "ellipsis", "korbit", "panto", "bito", "graphite", "deepsource", "snyk", "codacy", "sonarcloud", "sweep", "codeguru", "codereviewer", "codium"];
58
+ export declare const AI_REVIEWER_DISPLAY_NAMES: Record<typeof AI_REVIEWER_SOURCES[number], string>;
59
+ declare const BabysitterConfigSchema: z.ZodObject<{
60
+ /** Enable the Haystack auto-merge queue */
61
+ merge_queue: z.ZodOptional<z.ZodBoolean>;
62
+ /** Automatically rebase PRs that develop merge conflicts after pushes to the base branch */
63
+ auto_resolve_conflicts: z.ZodOptional<z.ZodBoolean>;
64
+ /** Grace period configuration before auto-merging */
65
+ merge_debounce: z.ZodOptional<z.ZodObject<{
66
+ /** Default wait time in minutes before auto-merging */
67
+ default_minutes: z.ZodOptional<z.ZodNumber>;
68
+ /** Per-author wait time overrides (author login → minutes) */
69
+ authors: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ default_minutes?: number | undefined;
72
+ authors?: Record<string, number> | undefined;
73
+ }, {
74
+ default_minutes?: number | undefined;
75
+ authors?: Record<string, number> | undefined;
76
+ }>>;
77
+ /** AI reviewer sources to wait for before starting the merge grace period */
78
+ expected_ai_reviewers: z.ZodOptional<z.ZodArray<z.ZodEnum<["cursor", "coderabbit", "copilot", "greptile", "sourcery", "qodo", "codeant", "ellipsis", "korbit", "panto", "bito", "graphite", "deepsource", "snyk", "codacy", "sonarcloud", "sweep", "codeguru", "codereviewer", "codium"]>, "many">>;
79
+ }, "strip", z.ZodTypeAny, {
80
+ merge_queue?: boolean | undefined;
81
+ auto_resolve_conflicts?: boolean | undefined;
82
+ merge_debounce?: {
83
+ default_minutes?: number | undefined;
84
+ authors?: Record<string, number> | undefined;
85
+ } | undefined;
86
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
87
+ }, {
88
+ merge_queue?: boolean | undefined;
89
+ auto_resolve_conflicts?: boolean | undefined;
90
+ merge_debounce?: {
91
+ default_minutes?: number | undefined;
92
+ authors?: Record<string, number> | undefined;
93
+ } | undefined;
94
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
95
+ }>;
96
+ declare const ServiceSchema: z.ZodObject<{
97
+ /** Root directory relative to repo root */
98
+ root: z.ZodOptional<z.ZodString>;
99
+ /** Command to start the service */
100
+ command: z.ZodString;
101
+ /** Port the service runs on (not required for batch jobs) */
102
+ port: z.ZodOptional<z.ZodNumber>;
103
+ /** Pattern in stdout that indicates service is ready */
104
+ ready_pattern: z.ZodOptional<z.ZodString>;
102
105
  /** Environment variables to set */
103
- env?: Record<string, string>;
104
- /**
105
- * Services that must be started before this service.
106
- * Used when a service proxies to another (e.g., frontend → API worker).
107
- * Auto-detected from vite.config.ts proxy configuration.
108
- *
109
- * @example
110
- * depends_on:
111
- * - haystack-worker # Start review-chat worker first
112
- */
113
- depends_on?: string[];
114
- }
115
- /**
116
- * Verification configuration
117
- */
118
- export interface VerificationConfig {
119
- /** Commands to run during sandbox creation */
120
- commands?: VerificationCommand[];
121
- /** Fixture definitions - array of pattern/source pairs */
122
- fixtures?: Fixture[];
123
- }
124
- /**
125
- * Network egress configuration
126
- */
127
- export interface NetworkConfig {
128
- /**
129
- * Additional hosts/domains to allow egress to.
130
- * The sandbox always allows Cloudflare and GitHub IPs.
131
- * Add your own destinations here.
132
- *
133
- * Supports:
134
- * - Exact domains: "staging.mycompany.com"
135
- * - Wildcards: "*.s3.amazonaws.com"
136
- * - CIDR blocks: "10.0.0.0/8"
137
- *
138
- * @example
139
- * allow:
140
- * - "staging.mycompany.com"
141
- * - "*.s3.amazonaws.com"
142
- * - "internal-api.example.com"
143
- */
144
- allow?: string[];
145
- }
146
- /**
147
- * Fixture definition - pattern to match and source to load from
148
- */
149
- export interface Fixture {
150
- /** URL pattern to match (e.g., "/api/github/repos/*") */
151
- pattern: string;
152
- /**
153
- * Source to load data from. Supports environment variable substitution:
154
- * - $VAR, ${VAR}, ${VAR:-default}
155
- *
156
- * Source types:
157
- * - file://path/to/file.json - Local file
158
- * - https://staging.example.com/api/... - Remote URL (e.g., staging server)
159
- * - https://${STAGING_HOST}/api/... - Remote URL with env var
160
- * - s3://bucket/key - AWS S3 (uses AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
161
- * - r2://bucket/key - Cloudflare R2 (uses R2_ACCOUNT_ID, R2_ACCESS_KEY_ID)
162
- * - passthrough - Don't intercept, let request through to real API
163
- *
164
- * @example
165
- * // Pull from staging with auth
166
- * source: "https://${STAGING_URL:-staging.example.com}/api/users"
167
- *
168
- * @example
169
- * // S3 with region override
170
- * source: "s3://my-bucket/fixtures/data.json"
171
- */
172
- source: string;
173
- /**
174
- * Headers for remote sources.
175
- * Supports environment variable substitution: $VAR, ${VAR}, ${VAR:-default}
176
- *
177
- * @example
178
- * headers:
179
- * Authorization: "Bearer $STAGING_API_TOKEN"
180
- * Cookie: "$STAGING_SESSION_COOKIE"
181
- * X-Api-Key: "${API_KEY:-test-key}"
182
- */
183
- headers?: Record<string, string>;
184
- }
185
- /**
186
- * A verification command (e.g., build, lint, typecheck)
187
- */
188
- export interface VerificationCommand {
189
- /** Human-readable name */
106
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
107
+ /** Service type: 'server' (default) or 'batch' (run once, no port) */
108
+ type: z.ZodOptional<z.ZodEnum<["server", "batch"]>>;
109
+ /** Services that must be started before this service */
110
+ depends_on: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
111
+ }, "strip", z.ZodTypeAny, {
112
+ command: string;
113
+ type?: "server" | "batch" | undefined;
114
+ port?: number | undefined;
115
+ ready_pattern?: string | undefined;
116
+ env?: Record<string, string> | undefined;
117
+ root?: string | undefined;
118
+ depends_on?: string[] | undefined;
119
+ }, {
120
+ command: string;
121
+ type?: "server" | "batch" | undefined;
122
+ port?: number | undefined;
123
+ ready_pattern?: string | undefined;
124
+ env?: Record<string, string> | undefined;
125
+ root?: string | undefined;
126
+ depends_on?: string[] | undefined;
127
+ }>;
128
+ declare const VerificationSchema: z.ZodObject<{
129
+ /** Commands to run for verification (build, lint, test, etc.) */
130
+ commands: z.ZodOptional<z.ZodArray<z.ZodObject<{
131
+ /** Human-readable name (e.g., "Build", "Lint", "Typecheck") */
132
+ name: z.ZodString;
133
+ /** The shell command to run (e.g., "pnpm build", "pnpm lint") */
134
+ run: z.ZodString;
135
+ }, "strip", z.ZodTypeAny, {
136
+ name: string;
137
+ run: string;
138
+ }, {
139
+ name: string;
140
+ run: string;
141
+ }>, "many">>;
142
+ /** Fixture data sources keyed by endpoint pattern */
143
+ fixtures: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
144
+ /** Where to load fixture data from */
145
+ source: z.ZodEffects<z.ZodString, string, string>;
146
+ /** Headers to include when fetching from remote source */
147
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
148
+ /** Cookies to include when fetching from remote source */
149
+ cookies: z.ZodOptional<z.ZodString>;
150
+ }, "strip", z.ZodTypeAny, {
151
+ source: string;
152
+ headers?: Record<string, string> | undefined;
153
+ cookies?: string | undefined;
154
+ }, {
155
+ source: string;
156
+ headers?: Record<string, string> | undefined;
157
+ cookies?: string | undefined;
158
+ }>>>;
159
+ }, "strip", z.ZodTypeAny, {
160
+ commands?: {
161
+ name: string;
162
+ run: string;
163
+ }[] | undefined;
164
+ fixtures?: Record<string, {
165
+ source: string;
166
+ headers?: Record<string, string> | undefined;
167
+ cookies?: string | undefined;
168
+ }> | undefined;
169
+ }, {
170
+ commands?: {
171
+ name: string;
172
+ run: string;
173
+ }[] | undefined;
174
+ fixtures?: Record<string, {
175
+ source: string;
176
+ headers?: Record<string, string> | undefined;
177
+ cookies?: string | undefined;
178
+ }> | undefined;
179
+ }>;
180
+ declare const AuthStrategySchema: z.ZodEnum<["bypass", "fixture", "token", "test_account"]>;
181
+ declare const TokenInjectionSchema: z.ZodObject<{
182
+ type: z.ZodEnum<["cookie", "localStorage", "sessionStorage", "header"]>;
183
+ name: z.ZodString;
184
+ secret: z.ZodString;
185
+ cookie_options: z.ZodOptional<z.ZodObject<{
186
+ path: z.ZodOptional<z.ZodString>;
187
+ domain: z.ZodOptional<z.ZodString>;
188
+ secure: z.ZodOptional<z.ZodBoolean>;
189
+ httpOnly: z.ZodOptional<z.ZodBoolean>;
190
+ sameSite: z.ZodOptional<z.ZodEnum<["Strict", "Lax", "None"]>>;
191
+ }, "strip", z.ZodTypeAny, {
192
+ path?: string | undefined;
193
+ domain?: string | undefined;
194
+ secure?: boolean | undefined;
195
+ httpOnly?: boolean | undefined;
196
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
197
+ }, {
198
+ path?: string | undefined;
199
+ domain?: string | undefined;
200
+ secure?: boolean | undefined;
201
+ httpOnly?: boolean | undefined;
202
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
203
+ }>>;
204
+ }, "strip", z.ZodTypeAny, {
190
205
  name: string;
191
- /** Shell command to run */
192
- run: string;
193
- }
194
- /**
195
- * @deprecated Use Fixture interface instead. This is kept for backwards compatibility.
196
- */
197
- export interface FixtureEntry {
198
- source: string;
199
- headers?: Record<string, string>;
200
- }
206
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
207
+ secret: string;
208
+ cookie_options?: {
209
+ path?: string | undefined;
210
+ domain?: string | undefined;
211
+ secure?: boolean | undefined;
212
+ httpOnly?: boolean | undefined;
213
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
214
+ } | undefined;
215
+ }, {
216
+ name: string;
217
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
218
+ secret: string;
219
+ cookie_options?: {
220
+ path?: string | undefined;
221
+ domain?: string | undefined;
222
+ secure?: boolean | undefined;
223
+ httpOnly?: boolean | undefined;
224
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
225
+ } | undefined;
226
+ }>;
227
+ declare const LoginStepSchema: z.ZodObject<{
228
+ action: z.ZodEnum<["navigate", "type", "click", "wait", "submit"]>;
229
+ url: z.ZodOptional<z.ZodString>;
230
+ selector: z.ZodOptional<z.ZodString>;
231
+ value: z.ZodOptional<z.ZodString>;
232
+ timeout: z.ZodOptional<z.ZodNumber>;
233
+ }, "strip", z.ZodTypeAny, {
234
+ action: "type" | "navigate" | "click" | "wait" | "submit";
235
+ value?: string | undefined;
236
+ url?: string | undefined;
237
+ selector?: string | undefined;
238
+ timeout?: number | undefined;
239
+ }, {
240
+ action: "type" | "navigate" | "click" | "wait" | "submit";
241
+ value?: string | undefined;
242
+ url?: string | undefined;
243
+ selector?: string | undefined;
244
+ timeout?: number | undefined;
245
+ }>;
246
+ declare const TestAccountSchema: z.ZodObject<{
247
+ credentials_secret: z.ZodString;
248
+ login_flow: z.ZodArray<z.ZodObject<{
249
+ action: z.ZodEnum<["navigate", "type", "click", "wait", "submit"]>;
250
+ url: z.ZodOptional<z.ZodString>;
251
+ selector: z.ZodOptional<z.ZodString>;
252
+ value: z.ZodOptional<z.ZodString>;
253
+ timeout: z.ZodOptional<z.ZodNumber>;
254
+ }, "strip", z.ZodTypeAny, {
255
+ action: "type" | "navigate" | "click" | "wait" | "submit";
256
+ value?: string | undefined;
257
+ url?: string | undefined;
258
+ selector?: string | undefined;
259
+ timeout?: number | undefined;
260
+ }, {
261
+ action: "type" | "navigate" | "click" | "wait" | "submit";
262
+ value?: string | undefined;
263
+ url?: string | undefined;
264
+ selector?: string | undefined;
265
+ timeout?: number | undefined;
266
+ }>, "many">;
267
+ success_selector: z.ZodOptional<z.ZodString>;
268
+ failure_selector: z.ZodOptional<z.ZodString>;
269
+ }, "strip", z.ZodTypeAny, {
270
+ credentials_secret: string;
271
+ login_flow: {
272
+ action: "type" | "navigate" | "click" | "wait" | "submit";
273
+ value?: string | undefined;
274
+ url?: string | undefined;
275
+ selector?: string | undefined;
276
+ timeout?: number | undefined;
277
+ }[];
278
+ success_selector?: string | undefined;
279
+ failure_selector?: string | undefined;
280
+ }, {
281
+ credentials_secret: string;
282
+ login_flow: {
283
+ action: "type" | "navigate" | "click" | "wait" | "submit";
284
+ value?: string | undefined;
285
+ url?: string | undefined;
286
+ selector?: string | undefined;
287
+ timeout?: number | undefined;
288
+ }[];
289
+ success_selector?: string | undefined;
290
+ failure_selector?: string | undefined;
291
+ }>;
292
+ declare const AuthConfigSchema: z.ZodObject<{
293
+ strategy: z.ZodDefault<z.ZodEnum<["bypass", "fixture", "token", "test_account"]>>;
294
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
295
+ fixture: z.ZodOptional<z.ZodObject<{
296
+ pattern: z.ZodString;
297
+ source: z.ZodString;
298
+ }, "strip", z.ZodTypeAny, {
299
+ source: string;
300
+ pattern: string;
301
+ }, {
302
+ source: string;
303
+ pattern: string;
304
+ }>>;
305
+ token: z.ZodOptional<z.ZodObject<{
306
+ type: z.ZodEnum<["cookie", "localStorage", "sessionStorage", "header"]>;
307
+ name: z.ZodString;
308
+ secret: z.ZodString;
309
+ cookie_options: z.ZodOptional<z.ZodObject<{
310
+ path: z.ZodOptional<z.ZodString>;
311
+ domain: z.ZodOptional<z.ZodString>;
312
+ secure: z.ZodOptional<z.ZodBoolean>;
313
+ httpOnly: z.ZodOptional<z.ZodBoolean>;
314
+ sameSite: z.ZodOptional<z.ZodEnum<["Strict", "Lax", "None"]>>;
315
+ }, "strip", z.ZodTypeAny, {
316
+ path?: string | undefined;
317
+ domain?: string | undefined;
318
+ secure?: boolean | undefined;
319
+ httpOnly?: boolean | undefined;
320
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
321
+ }, {
322
+ path?: string | undefined;
323
+ domain?: string | undefined;
324
+ secure?: boolean | undefined;
325
+ httpOnly?: boolean | undefined;
326
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
327
+ }>>;
328
+ }, "strip", z.ZodTypeAny, {
329
+ name: string;
330
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
331
+ secret: string;
332
+ cookie_options?: {
333
+ path?: string | undefined;
334
+ domain?: string | undefined;
335
+ secure?: boolean | undefined;
336
+ httpOnly?: boolean | undefined;
337
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
338
+ } | undefined;
339
+ }, {
340
+ name: string;
341
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
342
+ secret: string;
343
+ cookie_options?: {
344
+ path?: string | undefined;
345
+ domain?: string | undefined;
346
+ secure?: boolean | undefined;
347
+ httpOnly?: boolean | undefined;
348
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
349
+ } | undefined;
350
+ }>>;
351
+ test_account: z.ZodOptional<z.ZodObject<{
352
+ credentials_secret: z.ZodString;
353
+ login_flow: z.ZodArray<z.ZodObject<{
354
+ action: z.ZodEnum<["navigate", "type", "click", "wait", "submit"]>;
355
+ url: z.ZodOptional<z.ZodString>;
356
+ selector: z.ZodOptional<z.ZodString>;
357
+ value: z.ZodOptional<z.ZodString>;
358
+ timeout: z.ZodOptional<z.ZodNumber>;
359
+ }, "strip", z.ZodTypeAny, {
360
+ action: "type" | "navigate" | "click" | "wait" | "submit";
361
+ value?: string | undefined;
362
+ url?: string | undefined;
363
+ selector?: string | undefined;
364
+ timeout?: number | undefined;
365
+ }, {
366
+ action: "type" | "navigate" | "click" | "wait" | "submit";
367
+ value?: string | undefined;
368
+ url?: string | undefined;
369
+ selector?: string | undefined;
370
+ timeout?: number | undefined;
371
+ }>, "many">;
372
+ success_selector: z.ZodOptional<z.ZodString>;
373
+ failure_selector: z.ZodOptional<z.ZodString>;
374
+ }, "strip", z.ZodTypeAny, {
375
+ credentials_secret: string;
376
+ login_flow: {
377
+ action: "type" | "navigate" | "click" | "wait" | "submit";
378
+ value?: string | undefined;
379
+ url?: string | undefined;
380
+ selector?: string | undefined;
381
+ timeout?: number | undefined;
382
+ }[];
383
+ success_selector?: string | undefined;
384
+ failure_selector?: string | undefined;
385
+ }, {
386
+ credentials_secret: string;
387
+ login_flow: {
388
+ action: "type" | "navigate" | "click" | "wait" | "submit";
389
+ value?: string | undefined;
390
+ url?: string | undefined;
391
+ selector?: string | undefined;
392
+ timeout?: number | undefined;
393
+ }[];
394
+ success_selector?: string | undefined;
395
+ failure_selector?: string | undefined;
396
+ }>>;
397
+ fallback: z.ZodOptional<z.ZodEnum<["bypass", "fixture", "token", "test_account"]>>;
398
+ }, "strip", z.ZodTypeAny, {
399
+ strategy: "bypass" | "fixture" | "token" | "test_account";
400
+ env?: Record<string, string> | undefined;
401
+ fixture?: {
402
+ source: string;
403
+ pattern: string;
404
+ } | undefined;
405
+ token?: {
406
+ name: string;
407
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
408
+ secret: string;
409
+ cookie_options?: {
410
+ path?: string | undefined;
411
+ domain?: string | undefined;
412
+ secure?: boolean | undefined;
413
+ httpOnly?: boolean | undefined;
414
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
415
+ } | undefined;
416
+ } | undefined;
417
+ test_account?: {
418
+ credentials_secret: string;
419
+ login_flow: {
420
+ action: "type" | "navigate" | "click" | "wait" | "submit";
421
+ value?: string | undefined;
422
+ url?: string | undefined;
423
+ selector?: string | undefined;
424
+ timeout?: number | undefined;
425
+ }[];
426
+ success_selector?: string | undefined;
427
+ failure_selector?: string | undefined;
428
+ } | undefined;
429
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
430
+ }, {
431
+ env?: Record<string, string> | undefined;
432
+ fixture?: {
433
+ source: string;
434
+ pattern: string;
435
+ } | undefined;
436
+ token?: {
437
+ name: string;
438
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
439
+ secret: string;
440
+ cookie_options?: {
441
+ path?: string | undefined;
442
+ domain?: string | undefined;
443
+ secure?: boolean | undefined;
444
+ httpOnly?: boolean | undefined;
445
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
446
+ } | undefined;
447
+ } | undefined;
448
+ test_account?: {
449
+ credentials_secret: string;
450
+ login_flow: {
451
+ action: "type" | "navigate" | "click" | "wait" | "submit";
452
+ value?: string | undefined;
453
+ url?: string | undefined;
454
+ selector?: string | undefined;
455
+ timeout?: number | undefined;
456
+ }[];
457
+ success_selector?: string | undefined;
458
+ failure_selector?: string | undefined;
459
+ } | undefined;
460
+ strategy?: "bypass" | "fixture" | "token" | "test_account" | undefined;
461
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
462
+ }>;
463
+ declare const DatabaseStrategySchema: z.ZodEnum<["fixture", "memory", "seed", "docker", "remote"]>;
464
+ declare const DockerServiceSchema: z.ZodObject<{
465
+ image: z.ZodString;
466
+ port: z.ZodNumber;
467
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
468
+ health_check: z.ZodOptional<z.ZodString>;
469
+ health_timeout: z.ZodOptional<z.ZodNumber>;
470
+ }, "strip", z.ZodTypeAny, {
471
+ port: number;
472
+ image: string;
473
+ env?: Record<string, string> | undefined;
474
+ health_check?: string | undefined;
475
+ health_timeout?: number | undefined;
476
+ }, {
477
+ port: number;
478
+ image: string;
479
+ env?: Record<string, string> | undefined;
480
+ health_check?: string | undefined;
481
+ health_timeout?: number | undefined;
482
+ }>;
483
+ declare const DatabaseConfigSchema: z.ZodObject<{
484
+ strategy: z.ZodDefault<z.ZodEnum<["fixture", "memory", "seed", "docker", "remote"]>>;
485
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
486
+ seed_command: z.ZodOptional<z.ZodString>;
487
+ migrate_command: z.ZodOptional<z.ZodString>;
488
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
489
+ image: z.ZodString;
490
+ port: z.ZodNumber;
491
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
492
+ health_check: z.ZodOptional<z.ZodString>;
493
+ health_timeout: z.ZodOptional<z.ZodNumber>;
494
+ }, "strip", z.ZodTypeAny, {
495
+ port: number;
496
+ image: string;
497
+ env?: Record<string, string> | undefined;
498
+ health_check?: string | undefined;
499
+ health_timeout?: number | undefined;
500
+ }, {
501
+ port: number;
502
+ image: string;
503
+ env?: Record<string, string> | undefined;
504
+ health_check?: string | undefined;
505
+ health_timeout?: number | undefined;
506
+ }>, "many">>;
507
+ read_only: z.ZodOptional<z.ZodBoolean>;
508
+ ready_timeout: z.ZodOptional<z.ZodNumber>;
509
+ } & {
510
+ fallback: z.ZodOptional<z.ZodObject<{
511
+ strategy: z.ZodDefault<z.ZodEnum<["fixture", "memory", "seed", "docker", "remote"]>>;
512
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
513
+ seed_command: z.ZodOptional<z.ZodString>;
514
+ migrate_command: z.ZodOptional<z.ZodString>;
515
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
516
+ image: z.ZodString;
517
+ port: z.ZodNumber;
518
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
519
+ health_check: z.ZodOptional<z.ZodString>;
520
+ health_timeout: z.ZodOptional<z.ZodNumber>;
521
+ }, "strip", z.ZodTypeAny, {
522
+ port: number;
523
+ image: string;
524
+ env?: Record<string, string> | undefined;
525
+ health_check?: string | undefined;
526
+ health_timeout?: number | undefined;
527
+ }, {
528
+ port: number;
529
+ image: string;
530
+ env?: Record<string, string> | undefined;
531
+ health_check?: string | undefined;
532
+ health_timeout?: number | undefined;
533
+ }>, "many">>;
534
+ read_only: z.ZodOptional<z.ZodBoolean>;
535
+ ready_timeout: z.ZodOptional<z.ZodNumber>;
536
+ }, "strip", z.ZodTypeAny, {
537
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
538
+ env?: Record<string, string> | undefined;
539
+ seed_command?: string | undefined;
540
+ migrate_command?: string | undefined;
541
+ services?: {
542
+ port: number;
543
+ image: string;
544
+ env?: Record<string, string> | undefined;
545
+ health_check?: string | undefined;
546
+ health_timeout?: number | undefined;
547
+ }[] | undefined;
548
+ read_only?: boolean | undefined;
549
+ ready_timeout?: number | undefined;
550
+ }, {
551
+ env?: Record<string, string> | undefined;
552
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
553
+ seed_command?: string | undefined;
554
+ migrate_command?: string | undefined;
555
+ services?: {
556
+ port: number;
557
+ image: string;
558
+ env?: Record<string, string> | undefined;
559
+ health_check?: string | undefined;
560
+ health_timeout?: number | undefined;
561
+ }[] | undefined;
562
+ read_only?: boolean | undefined;
563
+ ready_timeout?: number | undefined;
564
+ }>>;
565
+ }, "strip", z.ZodTypeAny, {
566
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
567
+ env?: Record<string, string> | undefined;
568
+ fallback?: {
569
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
570
+ env?: Record<string, string> | undefined;
571
+ seed_command?: string | undefined;
572
+ migrate_command?: string | undefined;
573
+ services?: {
574
+ port: number;
575
+ image: string;
576
+ env?: Record<string, string> | undefined;
577
+ health_check?: string | undefined;
578
+ health_timeout?: number | undefined;
579
+ }[] | undefined;
580
+ read_only?: boolean | undefined;
581
+ ready_timeout?: number | undefined;
582
+ } | undefined;
583
+ seed_command?: string | undefined;
584
+ migrate_command?: string | undefined;
585
+ services?: {
586
+ port: number;
587
+ image: string;
588
+ env?: Record<string, string> | undefined;
589
+ health_check?: string | undefined;
590
+ health_timeout?: number | undefined;
591
+ }[] | undefined;
592
+ read_only?: boolean | undefined;
593
+ ready_timeout?: number | undefined;
594
+ }, {
595
+ env?: Record<string, string> | undefined;
596
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
597
+ fallback?: {
598
+ env?: Record<string, string> | undefined;
599
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
600
+ seed_command?: string | undefined;
601
+ migrate_command?: string | undefined;
602
+ services?: {
603
+ port: number;
604
+ image: string;
605
+ env?: Record<string, string> | undefined;
606
+ health_check?: string | undefined;
607
+ health_timeout?: number | undefined;
608
+ }[] | undefined;
609
+ read_only?: boolean | undefined;
610
+ ready_timeout?: number | undefined;
611
+ } | undefined;
612
+ seed_command?: string | undefined;
613
+ migrate_command?: string | undefined;
614
+ services?: {
615
+ port: number;
616
+ image: string;
617
+ env?: Record<string, string> | undefined;
618
+ health_check?: string | undefined;
619
+ health_timeout?: number | undefined;
620
+ }[] | undefined;
621
+ read_only?: boolean | undefined;
622
+ ready_timeout?: number | undefined;
623
+ }>;
624
+ declare const AgenticToolSchema: z.ZodEnum<["opencode", "claude-code", "codex"]>;
625
+ declare const AgenticSchema: z.ZodObject<{
626
+ tool: z.ZodOptional<z.ZodEnum<["opencode", "claude-code", "codex"]>>;
627
+ }, "strip", z.ZodTypeAny, {
628
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
629
+ }, {
630
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
631
+ }>;
632
+ declare const NetworkConfigSchema: z.ZodObject<{
633
+ /** Additional hosts/domains to allow egress to */
634
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
635
+ }, "strip", z.ZodTypeAny, {
636
+ allow?: string[] | undefined;
637
+ }, {
638
+ allow?: string[] | undefined;
639
+ }>;
640
+ declare const SecretDeclarationSchema: z.ZodObject<{
641
+ description: z.ZodOptional<z.ZodString>;
642
+ required: z.ZodOptional<z.ZodBoolean>;
643
+ services: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
644
+ }, "strip", z.ZodTypeAny, {
645
+ required?: boolean | undefined;
646
+ services?: string[] | undefined;
647
+ description?: string | undefined;
648
+ }, {
649
+ required?: boolean | undefined;
650
+ services?: string[] | undefined;
651
+ description?: string | undefined;
652
+ }>;
653
+ export declare const HaystackConfigSchema: z.ZodObject<{
654
+ /** Config version (must be "1") */
655
+ version: z.ZodLiteral<"1">;
656
+ /** Project name (for display) */
657
+ name: z.ZodOptional<z.ZodString>;
658
+ /** Package manager override (auto-detected if not specified) */
659
+ package_manager: z.ZodOptional<z.ZodEnum<["npm", "pnpm", "yarn", "bun"]>>;
660
+ /** Development server configuration */
661
+ dev_server: z.ZodOptional<z.ZodObject<{
662
+ /** Command to start dev server (e.g., "pnpm dev") */
663
+ command: z.ZodString;
664
+ /** Port the dev server runs on */
665
+ port: z.ZodNumber;
666
+ /** Pattern in stdout that indicates server is ready (e.g., "Local:") */
667
+ ready_pattern: z.ZodOptional<z.ZodString>;
668
+ /** Environment variables to set when starting the server */
669
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
670
+ }, "strip", z.ZodTypeAny, {
671
+ command: string;
672
+ port: number;
673
+ ready_pattern?: string | undefined;
674
+ env?: Record<string, string> | undefined;
675
+ }, {
676
+ command: string;
677
+ port: number;
678
+ ready_pattern?: string | undefined;
679
+ env?: Record<string, string> | undefined;
680
+ }>>;
681
+ /** Multiple services (for monorepos) */
682
+ services: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
683
+ /** Root directory relative to repo root */
684
+ root: z.ZodOptional<z.ZodString>;
685
+ /** Command to start the service */
686
+ command: z.ZodString;
687
+ /** Port the service runs on (not required for batch jobs) */
688
+ port: z.ZodOptional<z.ZodNumber>;
689
+ /** Pattern in stdout that indicates service is ready */
690
+ ready_pattern: z.ZodOptional<z.ZodString>;
691
+ /** Environment variables to set */
692
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
693
+ /** Service type: 'server' (default) or 'batch' (run once, no port) */
694
+ type: z.ZodOptional<z.ZodEnum<["server", "batch"]>>;
695
+ /** Services that must be started before this service */
696
+ depends_on: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
697
+ }, "strip", z.ZodTypeAny, {
698
+ command: string;
699
+ type?: "server" | "batch" | undefined;
700
+ port?: number | undefined;
701
+ ready_pattern?: string | undefined;
702
+ env?: Record<string, string> | undefined;
703
+ root?: string | undefined;
704
+ depends_on?: string[] | undefined;
705
+ }, {
706
+ command: string;
707
+ type?: "server" | "batch" | undefined;
708
+ port?: number | undefined;
709
+ ready_pattern?: string | undefined;
710
+ env?: Record<string, string> | undefined;
711
+ root?: string | undefined;
712
+ depends_on?: string[] | undefined;
713
+ }>>>;
714
+ /** Verification configuration */
715
+ verification: z.ZodOptional<z.ZodObject<{
716
+ /** Commands to run for verification (build, lint, test, etc.) */
717
+ commands: z.ZodOptional<z.ZodArray<z.ZodObject<{
718
+ /** Human-readable name (e.g., "Build", "Lint", "Typecheck") */
719
+ name: z.ZodString;
720
+ /** The shell command to run (e.g., "pnpm build", "pnpm lint") */
721
+ run: z.ZodString;
722
+ }, "strip", z.ZodTypeAny, {
723
+ name: string;
724
+ run: string;
725
+ }, {
726
+ name: string;
727
+ run: string;
728
+ }>, "many">>;
729
+ /** Fixture data sources keyed by endpoint pattern */
730
+ fixtures: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
731
+ /** Where to load fixture data from */
732
+ source: z.ZodEffects<z.ZodString, string, string>;
733
+ /** Headers to include when fetching from remote source */
734
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
735
+ /** Cookies to include when fetching from remote source */
736
+ cookies: z.ZodOptional<z.ZodString>;
737
+ }, "strip", z.ZodTypeAny, {
738
+ source: string;
739
+ headers?: Record<string, string> | undefined;
740
+ cookies?: string | undefined;
741
+ }, {
742
+ source: string;
743
+ headers?: Record<string, string> | undefined;
744
+ cookies?: string | undefined;
745
+ }>>>;
746
+ }, "strip", z.ZodTypeAny, {
747
+ commands?: {
748
+ name: string;
749
+ run: string;
750
+ }[] | undefined;
751
+ fixtures?: Record<string, {
752
+ source: string;
753
+ headers?: Record<string, string> | undefined;
754
+ cookies?: string | undefined;
755
+ }> | undefined;
756
+ }, {
757
+ commands?: {
758
+ name: string;
759
+ run: string;
760
+ }[] | undefined;
761
+ fixtures?: Record<string, {
762
+ source: string;
763
+ headers?: Record<string, string> | undefined;
764
+ cookies?: string | undefined;
765
+ }> | undefined;
766
+ }>>;
767
+ /** Auth configuration for sandbox verification */
768
+ auth: z.ZodOptional<z.ZodObject<{
769
+ strategy: z.ZodDefault<z.ZodEnum<["bypass", "fixture", "token", "test_account"]>>;
770
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
771
+ fixture: z.ZodOptional<z.ZodObject<{
772
+ pattern: z.ZodString;
773
+ source: z.ZodString;
774
+ }, "strip", z.ZodTypeAny, {
775
+ source: string;
776
+ pattern: string;
777
+ }, {
778
+ source: string;
779
+ pattern: string;
780
+ }>>;
781
+ token: z.ZodOptional<z.ZodObject<{
782
+ type: z.ZodEnum<["cookie", "localStorage", "sessionStorage", "header"]>;
783
+ name: z.ZodString;
784
+ secret: z.ZodString;
785
+ cookie_options: z.ZodOptional<z.ZodObject<{
786
+ path: z.ZodOptional<z.ZodString>;
787
+ domain: z.ZodOptional<z.ZodString>;
788
+ secure: z.ZodOptional<z.ZodBoolean>;
789
+ httpOnly: z.ZodOptional<z.ZodBoolean>;
790
+ sameSite: z.ZodOptional<z.ZodEnum<["Strict", "Lax", "None"]>>;
791
+ }, "strip", z.ZodTypeAny, {
792
+ path?: string | undefined;
793
+ domain?: string | undefined;
794
+ secure?: boolean | undefined;
795
+ httpOnly?: boolean | undefined;
796
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
797
+ }, {
798
+ path?: string | undefined;
799
+ domain?: string | undefined;
800
+ secure?: boolean | undefined;
801
+ httpOnly?: boolean | undefined;
802
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
803
+ }>>;
804
+ }, "strip", z.ZodTypeAny, {
805
+ name: string;
806
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
807
+ secret: string;
808
+ cookie_options?: {
809
+ path?: string | undefined;
810
+ domain?: string | undefined;
811
+ secure?: boolean | undefined;
812
+ httpOnly?: boolean | undefined;
813
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
814
+ } | undefined;
815
+ }, {
816
+ name: string;
817
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
818
+ secret: string;
819
+ cookie_options?: {
820
+ path?: string | undefined;
821
+ domain?: string | undefined;
822
+ secure?: boolean | undefined;
823
+ httpOnly?: boolean | undefined;
824
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
825
+ } | undefined;
826
+ }>>;
827
+ test_account: z.ZodOptional<z.ZodObject<{
828
+ credentials_secret: z.ZodString;
829
+ login_flow: z.ZodArray<z.ZodObject<{
830
+ action: z.ZodEnum<["navigate", "type", "click", "wait", "submit"]>;
831
+ url: z.ZodOptional<z.ZodString>;
832
+ selector: z.ZodOptional<z.ZodString>;
833
+ value: z.ZodOptional<z.ZodString>;
834
+ timeout: z.ZodOptional<z.ZodNumber>;
835
+ }, "strip", z.ZodTypeAny, {
836
+ action: "type" | "navigate" | "click" | "wait" | "submit";
837
+ value?: string | undefined;
838
+ url?: string | undefined;
839
+ selector?: string | undefined;
840
+ timeout?: number | undefined;
841
+ }, {
842
+ action: "type" | "navigate" | "click" | "wait" | "submit";
843
+ value?: string | undefined;
844
+ url?: string | undefined;
845
+ selector?: string | undefined;
846
+ timeout?: number | undefined;
847
+ }>, "many">;
848
+ success_selector: z.ZodOptional<z.ZodString>;
849
+ failure_selector: z.ZodOptional<z.ZodString>;
850
+ }, "strip", z.ZodTypeAny, {
851
+ credentials_secret: string;
852
+ login_flow: {
853
+ action: "type" | "navigate" | "click" | "wait" | "submit";
854
+ value?: string | undefined;
855
+ url?: string | undefined;
856
+ selector?: string | undefined;
857
+ timeout?: number | undefined;
858
+ }[];
859
+ success_selector?: string | undefined;
860
+ failure_selector?: string | undefined;
861
+ }, {
862
+ credentials_secret: string;
863
+ login_flow: {
864
+ action: "type" | "navigate" | "click" | "wait" | "submit";
865
+ value?: string | undefined;
866
+ url?: string | undefined;
867
+ selector?: string | undefined;
868
+ timeout?: number | undefined;
869
+ }[];
870
+ success_selector?: string | undefined;
871
+ failure_selector?: string | undefined;
872
+ }>>;
873
+ fallback: z.ZodOptional<z.ZodEnum<["bypass", "fixture", "token", "test_account"]>>;
874
+ }, "strip", z.ZodTypeAny, {
875
+ strategy: "bypass" | "fixture" | "token" | "test_account";
876
+ env?: Record<string, string> | undefined;
877
+ fixture?: {
878
+ source: string;
879
+ pattern: string;
880
+ } | undefined;
881
+ token?: {
882
+ name: string;
883
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
884
+ secret: string;
885
+ cookie_options?: {
886
+ path?: string | undefined;
887
+ domain?: string | undefined;
888
+ secure?: boolean | undefined;
889
+ httpOnly?: boolean | undefined;
890
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
891
+ } | undefined;
892
+ } | undefined;
893
+ test_account?: {
894
+ credentials_secret: string;
895
+ login_flow: {
896
+ action: "type" | "navigate" | "click" | "wait" | "submit";
897
+ value?: string | undefined;
898
+ url?: string | undefined;
899
+ selector?: string | undefined;
900
+ timeout?: number | undefined;
901
+ }[];
902
+ success_selector?: string | undefined;
903
+ failure_selector?: string | undefined;
904
+ } | undefined;
905
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
906
+ }, {
907
+ env?: Record<string, string> | undefined;
908
+ fixture?: {
909
+ source: string;
910
+ pattern: string;
911
+ } | undefined;
912
+ token?: {
913
+ name: string;
914
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
915
+ secret: string;
916
+ cookie_options?: {
917
+ path?: string | undefined;
918
+ domain?: string | undefined;
919
+ secure?: boolean | undefined;
920
+ httpOnly?: boolean | undefined;
921
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
922
+ } | undefined;
923
+ } | undefined;
924
+ test_account?: {
925
+ credentials_secret: string;
926
+ login_flow: {
927
+ action: "type" | "navigate" | "click" | "wait" | "submit";
928
+ value?: string | undefined;
929
+ url?: string | undefined;
930
+ selector?: string | undefined;
931
+ timeout?: number | undefined;
932
+ }[];
933
+ success_selector?: string | undefined;
934
+ failure_selector?: string | undefined;
935
+ } | undefined;
936
+ strategy?: "bypass" | "fixture" | "token" | "test_account" | undefined;
937
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
938
+ }>>;
939
+ /** Agentic configuration (project-level override) */
940
+ agentic: z.ZodOptional<z.ZodObject<{
941
+ tool: z.ZodOptional<z.ZodEnum<["opencode", "claude-code", "codex"]>>;
942
+ }, "strip", z.ZodTypeAny, {
943
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
944
+ }, {
945
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
946
+ }>>;
947
+ /** Database configuration for sandbox verification */
948
+ database: z.ZodOptional<z.ZodObject<{
949
+ strategy: z.ZodDefault<z.ZodEnum<["fixture", "memory", "seed", "docker", "remote"]>>;
950
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
951
+ seed_command: z.ZodOptional<z.ZodString>;
952
+ migrate_command: z.ZodOptional<z.ZodString>;
953
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
954
+ image: z.ZodString;
955
+ port: z.ZodNumber;
956
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
957
+ health_check: z.ZodOptional<z.ZodString>;
958
+ health_timeout: z.ZodOptional<z.ZodNumber>;
959
+ }, "strip", z.ZodTypeAny, {
960
+ port: number;
961
+ image: string;
962
+ env?: Record<string, string> | undefined;
963
+ health_check?: string | undefined;
964
+ health_timeout?: number | undefined;
965
+ }, {
966
+ port: number;
967
+ image: string;
968
+ env?: Record<string, string> | undefined;
969
+ health_check?: string | undefined;
970
+ health_timeout?: number | undefined;
971
+ }>, "many">>;
972
+ read_only: z.ZodOptional<z.ZodBoolean>;
973
+ ready_timeout: z.ZodOptional<z.ZodNumber>;
974
+ } & {
975
+ fallback: z.ZodOptional<z.ZodObject<{
976
+ strategy: z.ZodDefault<z.ZodEnum<["fixture", "memory", "seed", "docker", "remote"]>>;
977
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
978
+ seed_command: z.ZodOptional<z.ZodString>;
979
+ migrate_command: z.ZodOptional<z.ZodString>;
980
+ services: z.ZodOptional<z.ZodArray<z.ZodObject<{
981
+ image: z.ZodString;
982
+ port: z.ZodNumber;
983
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
984
+ health_check: z.ZodOptional<z.ZodString>;
985
+ health_timeout: z.ZodOptional<z.ZodNumber>;
986
+ }, "strip", z.ZodTypeAny, {
987
+ port: number;
988
+ image: string;
989
+ env?: Record<string, string> | undefined;
990
+ health_check?: string | undefined;
991
+ health_timeout?: number | undefined;
992
+ }, {
993
+ port: number;
994
+ image: string;
995
+ env?: Record<string, string> | undefined;
996
+ health_check?: string | undefined;
997
+ health_timeout?: number | undefined;
998
+ }>, "many">>;
999
+ read_only: z.ZodOptional<z.ZodBoolean>;
1000
+ ready_timeout: z.ZodOptional<z.ZodNumber>;
1001
+ }, "strip", z.ZodTypeAny, {
1002
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
1003
+ env?: Record<string, string> | undefined;
1004
+ seed_command?: string | undefined;
1005
+ migrate_command?: string | undefined;
1006
+ services?: {
1007
+ port: number;
1008
+ image: string;
1009
+ env?: Record<string, string> | undefined;
1010
+ health_check?: string | undefined;
1011
+ health_timeout?: number | undefined;
1012
+ }[] | undefined;
1013
+ read_only?: boolean | undefined;
1014
+ ready_timeout?: number | undefined;
1015
+ }, {
1016
+ env?: Record<string, string> | undefined;
1017
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
1018
+ seed_command?: string | undefined;
1019
+ migrate_command?: string | undefined;
1020
+ services?: {
1021
+ port: number;
1022
+ image: string;
1023
+ env?: Record<string, string> | undefined;
1024
+ health_check?: string | undefined;
1025
+ health_timeout?: number | undefined;
1026
+ }[] | undefined;
1027
+ read_only?: boolean | undefined;
1028
+ ready_timeout?: number | undefined;
1029
+ }>>;
1030
+ }, "strip", z.ZodTypeAny, {
1031
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
1032
+ env?: Record<string, string> | undefined;
1033
+ fallback?: {
1034
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
1035
+ env?: Record<string, string> | undefined;
1036
+ seed_command?: string | undefined;
1037
+ migrate_command?: string | undefined;
1038
+ services?: {
1039
+ port: number;
1040
+ image: string;
1041
+ env?: Record<string, string> | undefined;
1042
+ health_check?: string | undefined;
1043
+ health_timeout?: number | undefined;
1044
+ }[] | undefined;
1045
+ read_only?: boolean | undefined;
1046
+ ready_timeout?: number | undefined;
1047
+ } | undefined;
1048
+ seed_command?: string | undefined;
1049
+ migrate_command?: string | undefined;
1050
+ services?: {
1051
+ port: number;
1052
+ image: string;
1053
+ env?: Record<string, string> | undefined;
1054
+ health_check?: string | undefined;
1055
+ health_timeout?: number | undefined;
1056
+ }[] | undefined;
1057
+ read_only?: boolean | undefined;
1058
+ ready_timeout?: number | undefined;
1059
+ }, {
1060
+ env?: Record<string, string> | undefined;
1061
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
1062
+ fallback?: {
1063
+ env?: Record<string, string> | undefined;
1064
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
1065
+ seed_command?: string | undefined;
1066
+ migrate_command?: string | undefined;
1067
+ services?: {
1068
+ port: number;
1069
+ image: string;
1070
+ env?: Record<string, string> | undefined;
1071
+ health_check?: string | undefined;
1072
+ health_timeout?: number | undefined;
1073
+ }[] | undefined;
1074
+ read_only?: boolean | undefined;
1075
+ ready_timeout?: number | undefined;
1076
+ } | undefined;
1077
+ seed_command?: string | undefined;
1078
+ migrate_command?: string | undefined;
1079
+ services?: {
1080
+ port: number;
1081
+ image: string;
1082
+ env?: Record<string, string> | undefined;
1083
+ health_check?: string | undefined;
1084
+ health_timeout?: number | undefined;
1085
+ }[] | undefined;
1086
+ read_only?: boolean | undefined;
1087
+ ready_timeout?: number | undefined;
1088
+ }>>;
1089
+ /** Network egress configuration */
1090
+ network: z.ZodOptional<z.ZodObject<{
1091
+ /** Additional hosts/domains to allow egress to */
1092
+ allow: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1093
+ }, "strip", z.ZodTypeAny, {
1094
+ allow?: string[] | undefined;
1095
+ }, {
1096
+ allow?: string[] | undefined;
1097
+ }>>;
1098
+ /** Secrets required by this project */
1099
+ secrets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1100
+ description: z.ZodOptional<z.ZodString>;
1101
+ required: z.ZodOptional<z.ZodBoolean>;
1102
+ services: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1103
+ }, "strip", z.ZodTypeAny, {
1104
+ required?: boolean | undefined;
1105
+ services?: string[] | undefined;
1106
+ description?: string | undefined;
1107
+ }, {
1108
+ required?: boolean | undefined;
1109
+ services?: string[] | undefined;
1110
+ description?: string | undefined;
1111
+ }>>>;
1112
+ /** Babysitter configuration for autonomous PR maintenance */
1113
+ babysitter: z.ZodOptional<z.ZodObject<{
1114
+ /** Enable the Haystack auto-merge queue */
1115
+ merge_queue: z.ZodOptional<z.ZodBoolean>;
1116
+ /** Automatically rebase PRs that develop merge conflicts after pushes to the base branch */
1117
+ auto_resolve_conflicts: z.ZodOptional<z.ZodBoolean>;
1118
+ /** Grace period configuration before auto-merging */
1119
+ merge_debounce: z.ZodOptional<z.ZodObject<{
1120
+ /** Default wait time in minutes before auto-merging */
1121
+ default_minutes: z.ZodOptional<z.ZodNumber>;
1122
+ /** Per-author wait time overrides (author login → minutes) */
1123
+ authors: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
1124
+ }, "strip", z.ZodTypeAny, {
1125
+ default_minutes?: number | undefined;
1126
+ authors?: Record<string, number> | undefined;
1127
+ }, {
1128
+ default_minutes?: number | undefined;
1129
+ authors?: Record<string, number> | undefined;
1130
+ }>>;
1131
+ /** AI reviewer sources to wait for before starting the merge grace period */
1132
+ expected_ai_reviewers: z.ZodOptional<z.ZodArray<z.ZodEnum<["cursor", "coderabbit", "copilot", "greptile", "sourcery", "qodo", "codeant", "ellipsis", "korbit", "panto", "bito", "graphite", "deepsource", "snyk", "codacy", "sonarcloud", "sweep", "codeguru", "codereviewer", "codium"]>, "many">>;
1133
+ }, "strip", z.ZodTypeAny, {
1134
+ merge_queue?: boolean | undefined;
1135
+ auto_resolve_conflicts?: boolean | undefined;
1136
+ merge_debounce?: {
1137
+ default_minutes?: number | undefined;
1138
+ authors?: Record<string, number> | undefined;
1139
+ } | undefined;
1140
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
1141
+ }, {
1142
+ merge_queue?: boolean | undefined;
1143
+ auto_resolve_conflicts?: boolean | undefined;
1144
+ merge_debounce?: {
1145
+ default_minutes?: number | undefined;
1146
+ authors?: Record<string, number> | undefined;
1147
+ } | undefined;
1148
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
1149
+ }>>;
1150
+ }, "strip", z.ZodTypeAny, {
1151
+ version: "1";
1152
+ name?: string | undefined;
1153
+ services?: Record<string, {
1154
+ command: string;
1155
+ type?: "server" | "batch" | undefined;
1156
+ port?: number | undefined;
1157
+ ready_pattern?: string | undefined;
1158
+ env?: Record<string, string> | undefined;
1159
+ root?: string | undefined;
1160
+ depends_on?: string[] | undefined;
1161
+ }> | undefined;
1162
+ package_manager?: "npm" | "pnpm" | "yarn" | "bun" | undefined;
1163
+ dev_server?: {
1164
+ command: string;
1165
+ port: number;
1166
+ ready_pattern?: string | undefined;
1167
+ env?: Record<string, string> | undefined;
1168
+ } | undefined;
1169
+ verification?: {
1170
+ commands?: {
1171
+ name: string;
1172
+ run: string;
1173
+ }[] | undefined;
1174
+ fixtures?: Record<string, {
1175
+ source: string;
1176
+ headers?: Record<string, string> | undefined;
1177
+ cookies?: string | undefined;
1178
+ }> | undefined;
1179
+ } | undefined;
1180
+ auth?: {
1181
+ strategy: "bypass" | "fixture" | "token" | "test_account";
1182
+ env?: Record<string, string> | undefined;
1183
+ fixture?: {
1184
+ source: string;
1185
+ pattern: string;
1186
+ } | undefined;
1187
+ token?: {
1188
+ name: string;
1189
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
1190
+ secret: string;
1191
+ cookie_options?: {
1192
+ path?: string | undefined;
1193
+ domain?: string | undefined;
1194
+ secure?: boolean | undefined;
1195
+ httpOnly?: boolean | undefined;
1196
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
1197
+ } | undefined;
1198
+ } | undefined;
1199
+ test_account?: {
1200
+ credentials_secret: string;
1201
+ login_flow: {
1202
+ action: "type" | "navigate" | "click" | "wait" | "submit";
1203
+ value?: string | undefined;
1204
+ url?: string | undefined;
1205
+ selector?: string | undefined;
1206
+ timeout?: number | undefined;
1207
+ }[];
1208
+ success_selector?: string | undefined;
1209
+ failure_selector?: string | undefined;
1210
+ } | undefined;
1211
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
1212
+ } | undefined;
1213
+ agentic?: {
1214
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
1215
+ } | undefined;
1216
+ database?: {
1217
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
1218
+ env?: Record<string, string> | undefined;
1219
+ fallback?: {
1220
+ strategy: "fixture" | "memory" | "seed" | "docker" | "remote";
1221
+ env?: Record<string, string> | undefined;
1222
+ seed_command?: string | undefined;
1223
+ migrate_command?: string | undefined;
1224
+ services?: {
1225
+ port: number;
1226
+ image: string;
1227
+ env?: Record<string, string> | undefined;
1228
+ health_check?: string | undefined;
1229
+ health_timeout?: number | undefined;
1230
+ }[] | undefined;
1231
+ read_only?: boolean | undefined;
1232
+ ready_timeout?: number | undefined;
1233
+ } | undefined;
1234
+ seed_command?: string | undefined;
1235
+ migrate_command?: string | undefined;
1236
+ services?: {
1237
+ port: number;
1238
+ image: string;
1239
+ env?: Record<string, string> | undefined;
1240
+ health_check?: string | undefined;
1241
+ health_timeout?: number | undefined;
1242
+ }[] | undefined;
1243
+ read_only?: boolean | undefined;
1244
+ ready_timeout?: number | undefined;
1245
+ } | undefined;
1246
+ network?: {
1247
+ allow?: string[] | undefined;
1248
+ } | undefined;
1249
+ secrets?: Record<string, {
1250
+ required?: boolean | undefined;
1251
+ services?: string[] | undefined;
1252
+ description?: string | undefined;
1253
+ }> | undefined;
1254
+ babysitter?: {
1255
+ merge_queue?: boolean | undefined;
1256
+ auto_resolve_conflicts?: boolean | undefined;
1257
+ merge_debounce?: {
1258
+ default_minutes?: number | undefined;
1259
+ authors?: Record<string, number> | undefined;
1260
+ } | undefined;
1261
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
1262
+ } | undefined;
1263
+ }, {
1264
+ version: "1";
1265
+ name?: string | undefined;
1266
+ services?: Record<string, {
1267
+ command: string;
1268
+ type?: "server" | "batch" | undefined;
1269
+ port?: number | undefined;
1270
+ ready_pattern?: string | undefined;
1271
+ env?: Record<string, string> | undefined;
1272
+ root?: string | undefined;
1273
+ depends_on?: string[] | undefined;
1274
+ }> | undefined;
1275
+ package_manager?: "npm" | "pnpm" | "yarn" | "bun" | undefined;
1276
+ dev_server?: {
1277
+ command: string;
1278
+ port: number;
1279
+ ready_pattern?: string | undefined;
1280
+ env?: Record<string, string> | undefined;
1281
+ } | undefined;
1282
+ verification?: {
1283
+ commands?: {
1284
+ name: string;
1285
+ run: string;
1286
+ }[] | undefined;
1287
+ fixtures?: Record<string, {
1288
+ source: string;
1289
+ headers?: Record<string, string> | undefined;
1290
+ cookies?: string | undefined;
1291
+ }> | undefined;
1292
+ } | undefined;
1293
+ auth?: {
1294
+ env?: Record<string, string> | undefined;
1295
+ fixture?: {
1296
+ source: string;
1297
+ pattern: string;
1298
+ } | undefined;
1299
+ token?: {
1300
+ name: string;
1301
+ type: "cookie" | "localStorage" | "sessionStorage" | "header";
1302
+ secret: string;
1303
+ cookie_options?: {
1304
+ path?: string | undefined;
1305
+ domain?: string | undefined;
1306
+ secure?: boolean | undefined;
1307
+ httpOnly?: boolean | undefined;
1308
+ sameSite?: "Strict" | "Lax" | "None" | undefined;
1309
+ } | undefined;
1310
+ } | undefined;
1311
+ test_account?: {
1312
+ credentials_secret: string;
1313
+ login_flow: {
1314
+ action: "type" | "navigate" | "click" | "wait" | "submit";
1315
+ value?: string | undefined;
1316
+ url?: string | undefined;
1317
+ selector?: string | undefined;
1318
+ timeout?: number | undefined;
1319
+ }[];
1320
+ success_selector?: string | undefined;
1321
+ failure_selector?: string | undefined;
1322
+ } | undefined;
1323
+ strategy?: "bypass" | "fixture" | "token" | "test_account" | undefined;
1324
+ fallback?: "bypass" | "fixture" | "token" | "test_account" | undefined;
1325
+ } | undefined;
1326
+ agentic?: {
1327
+ tool?: "opencode" | "claude-code" | "codex" | undefined;
1328
+ } | undefined;
1329
+ database?: {
1330
+ env?: Record<string, string> | undefined;
1331
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
1332
+ fallback?: {
1333
+ env?: Record<string, string> | undefined;
1334
+ strategy?: "fixture" | "memory" | "seed" | "docker" | "remote" | undefined;
1335
+ seed_command?: string | undefined;
1336
+ migrate_command?: string | undefined;
1337
+ services?: {
1338
+ port: number;
1339
+ image: string;
1340
+ env?: Record<string, string> | undefined;
1341
+ health_check?: string | undefined;
1342
+ health_timeout?: number | undefined;
1343
+ }[] | undefined;
1344
+ read_only?: boolean | undefined;
1345
+ ready_timeout?: number | undefined;
1346
+ } | undefined;
1347
+ seed_command?: string | undefined;
1348
+ migrate_command?: string | undefined;
1349
+ services?: {
1350
+ port: number;
1351
+ image: string;
1352
+ env?: Record<string, string> | undefined;
1353
+ health_check?: string | undefined;
1354
+ health_timeout?: number | undefined;
1355
+ }[] | undefined;
1356
+ read_only?: boolean | undefined;
1357
+ ready_timeout?: number | undefined;
1358
+ } | undefined;
1359
+ network?: {
1360
+ allow?: string[] | undefined;
1361
+ } | undefined;
1362
+ secrets?: Record<string, {
1363
+ required?: boolean | undefined;
1364
+ services?: string[] | undefined;
1365
+ description?: string | undefined;
1366
+ }> | undefined;
1367
+ babysitter?: {
1368
+ merge_queue?: boolean | undefined;
1369
+ auto_resolve_conflicts?: boolean | undefined;
1370
+ merge_debounce?: {
1371
+ default_minutes?: number | undefined;
1372
+ authors?: Record<string, number> | undefined;
1373
+ } | undefined;
1374
+ expected_ai_reviewers?: ("cursor" | "coderabbit" | "copilot" | "greptile" | "sourcery" | "qodo" | "codeant" | "ellipsis" | "korbit" | "panto" | "bito" | "graphite" | "deepsource" | "snyk" | "codacy" | "sonarcloud" | "sweep" | "codeguru" | "codereviewer" | "codium")[] | undefined;
1375
+ } | undefined;
1376
+ }>;
1377
+ export type HaystackConfig = z.infer<typeof HaystackConfigSchema>;
1378
+ export type VerificationCommand = z.infer<typeof VerificationCommandSchema>;
1379
+ export type FixtureEntry = z.infer<typeof FixtureEntrySchema>;
1380
+ export type DevServer = z.infer<typeof DevServerSchema>;
1381
+ export type Service = z.infer<typeof ServiceSchema>;
1382
+ export type Verification = z.infer<typeof VerificationSchema>;
1383
+ export type AuthStrategy = z.infer<typeof AuthStrategySchema>;
1384
+ export type TokenInjection = z.infer<typeof TokenInjectionSchema>;
1385
+ export type LoginStep = z.infer<typeof LoginStepSchema>;
1386
+ export type TestAccount = z.infer<typeof TestAccountSchema>;
1387
+ export type AuthConfig = z.infer<typeof AuthConfigSchema>;
1388
+ export type AgenticTool = z.infer<typeof AgenticToolSchema>;
1389
+ export type Agentic = z.infer<typeof AgenticSchema>;
1390
+ export type DatabaseStrategy = z.infer<typeof DatabaseStrategySchema>;
1391
+ export type DockerService = z.infer<typeof DockerServiceSchema>;
1392
+ export type DatabaseConfig = z.infer<typeof DatabaseConfigSchema>;
1393
+ export type NetworkConfig = z.infer<typeof NetworkConfigSchema>;
1394
+ export type SecretDeclaration = z.infer<typeof SecretDeclarationSchema>;
1395
+ export type BabysitterConfig = z.infer<typeof BabysitterConfigSchema>;
201
1396
  /**
202
1397
  * Project detection results
203
1398
  */
@@ -266,3 +1461,4 @@ export interface StoredSecret {
266
1461
  createdAt: string;
267
1462
  updatedAt: string;
268
1463
  }
1464
+ export {};