voratiq 0.1.0-beta.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.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/auth/providers/claude/constants.d.ts +7 -0
- package/dist/auth/providers/claude/constants.js +9 -0
- package/dist/auth/providers/claude/credentials.d.ts +5 -0
- package/dist/auth/providers/claude/credentials.js +112 -0
- package/dist/auth/providers/claude/error.d.ts +5 -0
- package/dist/auth/providers/claude/error.js +6 -0
- package/dist/auth/providers/claude/keychain.d.ts +4 -0
- package/dist/auth/providers/claude/keychain.js +158 -0
- package/dist/auth/providers/claude.d.ts +2 -0
- package/dist/auth/providers/claude.js +124 -0
- package/dist/auth/providers/codex.d.ts +2 -0
- package/dist/auth/providers/codex.js +93 -0
- package/dist/auth/providers/gemini.d.ts +2 -0
- package/dist/auth/providers/gemini.js +159 -0
- package/dist/auth/providers/index.d.ts +2 -0
- package/dist/auth/providers/index.js +16 -0
- package/dist/auth/providers/messages.d.ts +1 -0
- package/dist/auth/providers/messages.js +3 -0
- package/dist/auth/providers/secret-staging.d.ts +14 -0
- package/dist/auth/providers/secret-staging.js +72 -0
- package/dist/auth/providers/teardown.d.ts +2 -0
- package/dist/auth/providers/teardown.js +6 -0
- package/dist/auth/providers/types.d.ts +31 -0
- package/dist/auth/providers/types.js +1 -0
- package/dist/auth/providers/utils.d.ts +20 -0
- package/dist/auth/providers/utils.js +148 -0
- package/dist/auth/runtime.d.ts +2 -0
- package/dist/auth/runtime.js +17 -0
- package/dist/auth/staging.d.ts +8 -0
- package/dist/auth/staging.js +7 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +142 -0
- package/dist/cli/apply.d.ts +14 -0
- package/dist/cli/apply.js +38 -0
- package/dist/cli/commander-utils.d.ts +3 -0
- package/dist/cli/commander-utils.js +27 -0
- package/dist/cli/confirmation.d.ts +14 -0
- package/dist/cli/confirmation.js +16 -0
- package/dist/cli/errors.d.ts +5 -0
- package/dist/cli/errors.js +16 -0
- package/dist/cli/init.d.ts +10 -0
- package/dist/cli/init.js +41 -0
- package/dist/cli/list.d.ts +14 -0
- package/dist/cli/list.js +48 -0
- package/dist/cli/output.d.ts +14 -0
- package/dist/cli/output.js +62 -0
- package/dist/cli/prune.d.ts +14 -0
- package/dist/cli/prune.js +54 -0
- package/dist/cli/review.d.ts +12 -0
- package/dist/cli/review.js +33 -0
- package/dist/cli/run.d.ts +13 -0
- package/dist/cli/run.js +51 -0
- package/dist/commands/apply/command.d.ts +9 -0
- package/dist/commands/apply/command.js +135 -0
- package/dist/commands/apply/errors.d.ts +35 -0
- package/dist/commands/apply/errors.js +73 -0
- package/dist/commands/apply/types.d.ts +13 -0
- package/dist/commands/apply/types.js +1 -0
- package/dist/commands/errors.d.ts +4 -0
- package/dist/commands/errors.js +7 -0
- package/dist/commands/fetch.d.ts +8 -0
- package/dist/commands/fetch.js +25 -0
- package/dist/commands/init/agents.d.ts +3 -0
- package/dist/commands/init/agents.js +159 -0
- package/dist/commands/init/command.d.ts +2 -0
- package/dist/commands/init/command.js +40 -0
- package/dist/commands/init/environment.d.ts +2 -0
- package/dist/commands/init/environment.js +76 -0
- package/dist/commands/init/evals.d.ts +4 -0
- package/dist/commands/init/evals.js +219 -0
- package/dist/commands/init/types.d.ts +48 -0
- package/dist/commands/init/types.js +1 -0
- package/dist/commands/list/command.d.ts +13 -0
- package/dist/commands/list/command.js +60 -0
- package/dist/commands/prune/command.d.ts +2 -0
- package/dist/commands/prune/command.js +336 -0
- package/dist/commands/prune/errors.d.ts +20 -0
- package/dist/commands/prune/errors.js +39 -0
- package/dist/commands/prune/types.d.ts +42 -0
- package/dist/commands/prune/types.js +1 -0
- package/dist/commands/review/command.d.ts +10 -0
- package/dist/commands/review/command.js +26 -0
- package/dist/commands/run/agent-execution.d.ts +19 -0
- package/dist/commands/run/agent-execution.js +63 -0
- package/dist/commands/run/agents/auth-stage.d.ts +23 -0
- package/dist/commands/run/agents/auth-stage.js +108 -0
- package/dist/commands/run/agents/chat-preserver.d.ts +9 -0
- package/dist/commands/run/agents/chat-preserver.js +35 -0
- package/dist/commands/run/agents/eval-runner.d.ts +19 -0
- package/dist/commands/run/agents/eval-runner.js +27 -0
- package/dist/commands/run/agents/failures.d.ts +7 -0
- package/dist/commands/run/agents/failures.js +32 -0
- package/dist/commands/run/agents/lifecycle.d.ts +9 -0
- package/dist/commands/run/agents/lifecycle.js +157 -0
- package/dist/commands/run/agents/preparation.d.ts +2 -0
- package/dist/commands/run/agents/preparation.js +123 -0
- package/dist/commands/run/agents/run-context.d.ts +46 -0
- package/dist/commands/run/agents/run-context.js +193 -0
- package/dist/commands/run/agents/sandbox-launcher.d.ts +44 -0
- package/dist/commands/run/agents/sandbox-launcher.js +211 -0
- package/dist/commands/run/agents/types.d.ts +47 -0
- package/dist/commands/run/agents/types.js +1 -0
- package/dist/commands/run/agents/watchdog.d.ts +39 -0
- package/dist/commands/run/agents/watchdog.js +172 -0
- package/dist/commands/run/agents/workspace-prep.d.ts +17 -0
- package/dist/commands/run/agents/workspace-prep.js +78 -0
- package/dist/commands/run/agents.d.ts +14 -0
- package/dist/commands/run/agents.js +47 -0
- package/dist/commands/run/argv.d.ts +1 -0
- package/dist/commands/run/argv.js +19 -0
- package/dist/commands/run/command.d.ts +14 -0
- package/dist/commands/run/command.js +170 -0
- package/dist/commands/run/errors.d.ts +61 -0
- package/dist/commands/run/errors.js +86 -0
- package/dist/commands/run/id.d.ts +1 -0
- package/dist/commands/run/id.js +22 -0
- package/dist/commands/run/lifecycle.d.ts +19 -0
- package/dist/commands/run/lifecycle.js +186 -0
- package/dist/commands/run/phases.d.ts +11 -0
- package/dist/commands/run/phases.js +1 -0
- package/dist/commands/run/prompts.d.ts +4 -0
- package/dist/commands/run/prompts.js +16 -0
- package/dist/commands/run/record-init.d.ts +15 -0
- package/dist/commands/run/record-init.js +29 -0
- package/dist/commands/run/reports.d.ts +14 -0
- package/dist/commands/run/reports.js +63 -0
- package/dist/commands/run/sandbox-registry.d.ts +4 -0
- package/dist/commands/run/sandbox-registry.js +54 -0
- package/dist/commands/run/sandbox.d.ts +16 -0
- package/dist/commands/run/sandbox.js +96 -0
- package/dist/commands/run/shim/agent-manifest.d.ts +7 -0
- package/dist/commands/run/shim/agent-manifest.js +1 -0
- package/dist/commands/run/shim/run-agent-shim.d.ts +1 -0
- package/dist/commands/run/shim/run-agent-shim.js +232 -0
- package/dist/commands/run/shim/run-agent-shim.mjs +10 -0
- package/dist/commands/run/validation.d.ts +20 -0
- package/dist/commands/run/validation.js +60 -0
- package/dist/configs/agents/defaults.d.ts +9 -0
- package/dist/configs/agents/defaults.js +55 -0
- package/dist/configs/agents/errors.d.ts +40 -0
- package/dist/configs/agents/errors.js +78 -0
- package/dist/configs/agents/loader.d.ts +8 -0
- package/dist/configs/agents/loader.js +137 -0
- package/dist/configs/agents/types.d.ts +39 -0
- package/dist/configs/agents/types.js +31 -0
- package/dist/configs/environment/detect.d.ts +17 -0
- package/dist/configs/environment/detect.js +79 -0
- package/dist/configs/environment/errors.d.ts +12 -0
- package/dist/configs/environment/errors.js +26 -0
- package/dist/configs/environment/loader.d.ts +10 -0
- package/dist/configs/environment/loader.js +80 -0
- package/dist/configs/environment/types.d.ts +21 -0
- package/dist/configs/environment/types.js +98 -0
- package/dist/configs/evals/defaults.d.ts +8 -0
- package/dist/configs/evals/defaults.js +28 -0
- package/dist/configs/evals/detect.d.ts +10 -0
- package/dist/configs/evals/detect.js +224 -0
- package/dist/configs/evals/errors.d.ts +16 -0
- package/dist/configs/evals/errors.js +29 -0
- package/dist/configs/evals/loader.d.ts +9 -0
- package/dist/configs/evals/loader.js +46 -0
- package/dist/configs/evals/types.d.ts +42 -0
- package/dist/configs/evals/types.js +74 -0
- package/dist/configs/sandbox/defaults.d.ts +14 -0
- package/dist/configs/sandbox/defaults.js +54 -0
- package/dist/configs/sandbox/errors.d.ts +5 -0
- package/dist/configs/sandbox/errors.js +8 -0
- package/dist/configs/sandbox/loader.d.ts +6 -0
- package/dist/configs/sandbox/loader.js +192 -0
- package/dist/configs/sandbox/merge.d.ts +9 -0
- package/dist/configs/sandbox/merge.js +94 -0
- package/dist/configs/sandbox/schemas.d.ts +58 -0
- package/dist/configs/sandbox/schemas.js +72 -0
- package/dist/configs/sandbox/types.d.ts +34 -0
- package/dist/configs/sandbox/types.js +1 -0
- package/dist/configs/shared/loader-factory.d.ts +19 -0
- package/dist/configs/shared/loader-factory.js +33 -0
- package/dist/configs/shared/yaml-error-formatter.d.ts +40 -0
- package/dist/configs/shared/yaml-error-formatter.js +41 -0
- package/dist/evals/runner.d.ts +16 -0
- package/dist/evals/runner.js +132 -0
- package/dist/preflight/errors.d.ts +10 -0
- package/dist/preflight/errors.js +21 -0
- package/dist/preflight/index.d.ts +30 -0
- package/dist/preflight/index.js +157 -0
- package/dist/records/enhanced.d.ts +38 -0
- package/dist/records/enhanced.js +139 -0
- package/dist/records/errors.d.ts +23 -0
- package/dist/records/errors.js +43 -0
- package/dist/records/history-lock.d.ts +27 -0
- package/dist/records/history-lock.js +184 -0
- package/dist/records/mutators.d.ts +17 -0
- package/dist/records/mutators.js +144 -0
- package/dist/records/persistence.d.ts +95 -0
- package/dist/records/persistence.js +459 -0
- package/dist/records/types.d.ts +238 -0
- package/dist/records/types.js +131 -0
- package/dist/render/interactions/confirmation.d.ts +19 -0
- package/dist/render/interactions/confirmation.js +63 -0
- package/dist/render/transcripts/apply.d.ts +2 -0
- package/dist/render/transcripts/apply.js +52 -0
- package/dist/render/transcripts/init.d.ts +18 -0
- package/dist/render/transcripts/init.js +84 -0
- package/dist/render/transcripts/list.d.ts +3 -0
- package/dist/render/transcripts/list.js +44 -0
- package/dist/render/transcripts/prune.d.ts +16 -0
- package/dist/render/transcripts/prune.js +50 -0
- package/dist/render/transcripts/review.d.ts +2 -0
- package/dist/render/transcripts/review.js +36 -0
- package/dist/render/transcripts/run.d.ts +25 -0
- package/dist/render/transcripts/run.js +295 -0
- package/dist/render/transcripts/shared.d.ts +12 -0
- package/dist/render/transcripts/shared.js +41 -0
- package/dist/render/utils/agents.d.ts +28 -0
- package/dist/render/utils/agents.js +261 -0
- package/dist/render/utils/badges.d.ts +20 -0
- package/dist/render/utils/badges.js +37 -0
- package/dist/render/utils/errors.d.ts +2 -0
- package/dist/render/utils/errors.js +14 -0
- package/dist/render/utils/records.d.ts +1 -0
- package/dist/render/utils/records.js +32 -0
- package/dist/render/utils/runs.d.ts +16 -0
- package/dist/render/utils/runs.js +50 -0
- package/dist/render/utils/table.d.ts +12 -0
- package/dist/render/utils/table.js +32 -0
- package/dist/render/utils/transcript.d.ts +14 -0
- package/dist/render/utils/transcript.js +44 -0
- package/dist/status/colors.d.ts +10 -0
- package/dist/status/colors.js +33 -0
- package/dist/status/index.d.ts +37 -0
- package/dist/status/index.js +30 -0
- package/dist/testing/test-hooks.d.ts +7 -0
- package/dist/testing/test-hooks.js +16 -0
- package/dist/utils/binaries.d.ts +1 -0
- package/dist/utils/binaries.js +13 -0
- package/dist/utils/cli-root.d.ts +2 -0
- package/dist/utils/cli-root.js +42 -0
- package/dist/utils/colors.d.ts +2 -0
- package/dist/utils/colors.js +23 -0
- package/dist/utils/diff.d.ts +9 -0
- package/dist/utils/diff.js +61 -0
- package/dist/utils/env.d.ts +10 -0
- package/dist/utils/env.js +56 -0
- package/dist/utils/errors.d.ts +31 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/fs.d.ts +13 -0
- package/dist/utils/fs.js +70 -0
- package/dist/utils/git.d.ts +40 -0
- package/dist/utils/git.js +126 -0
- package/dist/utils/output.d.ts +4 -0
- package/dist/utils/output.js +12 -0
- package/dist/utils/path.d.ts +11 -0
- package/dist/utils/path.js +84 -0
- package/dist/utils/process.d.ts +37 -0
- package/dist/utils/process.js +152 -0
- package/dist/utils/terminal.d.ts +5 -0
- package/dist/utils/terminal.js +5 -0
- package/dist/utils/validators.d.ts +1 -0
- package/dist/utils/validators.js +15 -0
- package/dist/utils/version.d.ts +1 -0
- package/dist/utils/version.js +25 -0
- package/dist/utils/yaml-reader.d.ts +14 -0
- package/dist/utils/yaml-reader.js +41 -0
- package/dist/utils/yaml.d.ts +33 -0
- package/dist/utils/yaml.js +75 -0
- package/dist/workspace/agents.d.ts +33 -0
- package/dist/workspace/agents.js +189 -0
- package/dist/workspace/chat/artifacts.d.ts +14 -0
- package/dist/workspace/chat/artifacts.js +157 -0
- package/dist/workspace/chat/sources.d.ts +5 -0
- package/dist/workspace/chat/sources.js +80 -0
- package/dist/workspace/chat/types.d.ts +1 -0
- package/dist/workspace/chat/types.js +1 -0
- package/dist/workspace/cleanup.d.ts +4 -0
- package/dist/workspace/cleanup.js +12 -0
- package/dist/workspace/credential-guard.d.ts +4 -0
- package/dist/workspace/credential-guard.js +71 -0
- package/dist/workspace/dependencies.d.ts +23 -0
- package/dist/workspace/dependencies.js +190 -0
- package/dist/workspace/errors.d.ts +16 -0
- package/dist/workspace/errors.js +43 -0
- package/dist/workspace/layout.d.ts +30 -0
- package/dist/workspace/layout.js +124 -0
- package/dist/workspace/prune.d.ts +8 -0
- package/dist/workspace/prune.js +29 -0
- package/dist/workspace/run.d.ts +14 -0
- package/dist/workspace/run.js +28 -0
- package/dist/workspace/sandbox-requirements.d.ts +17 -0
- package/dist/workspace/sandbox-requirements.js +69 -0
- package/dist/workspace/setup.d.ts +3 -0
- package/dist/workspace/setup.js +81 -0
- package/dist/workspace/shim.d.ts +4 -0
- package/dist/workspace/shim.js +65 -0
- package/dist/workspace/structure.d.ts +77 -0
- package/dist/workspace/structure.js +134 -0
- package/dist/workspace/templates.d.ts +9 -0
- package/dist/workspace/templates.js +66 -0
- package/dist/workspace/types.d.ts +4 -0
- package/dist/workspace/types.js +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const agentIdSchema: z.ZodString;
|
|
3
|
+
export type AgentId = z.infer<typeof agentIdSchema>;
|
|
4
|
+
export declare const agentConfigEntrySchema: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
provider: z.ZodString;
|
|
7
|
+
model: z.ZodString;
|
|
8
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
9
|
+
binary: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
10
|
+
extraArgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type AgentConfigEntry = z.infer<typeof agentConfigEntrySchema>;
|
|
13
|
+
export declare const agentsConfigSchema: z.ZodObject<{
|
|
14
|
+
agents: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
provider: z.ZodString;
|
|
17
|
+
model: z.ZodString;
|
|
18
|
+
enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
19
|
+
binary: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
20
|
+
extraArgs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
21
|
+
}, z.core.$strip>>>;
|
|
22
|
+
}, z.core.$strip>;
|
|
23
|
+
export type AgentsConfig = z.infer<typeof agentsConfigSchema>;
|
|
24
|
+
export declare const agentDefinitionSchema: z.ZodObject<{
|
|
25
|
+
id: z.ZodString;
|
|
26
|
+
provider: z.ZodString;
|
|
27
|
+
model: z.ZodString;
|
|
28
|
+
binary: z.ZodString;
|
|
29
|
+
argv: z.ZodArray<z.ZodString>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export type AgentDefinition = z.infer<typeof agentDefinitionSchema>;
|
|
32
|
+
export declare const agentCatalogSchema: z.ZodArray<z.ZodObject<{
|
|
33
|
+
id: z.ZodString;
|
|
34
|
+
provider: z.ZodString;
|
|
35
|
+
model: z.ZodString;
|
|
36
|
+
binary: z.ZodString;
|
|
37
|
+
argv: z.ZodArray<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
export type AgentCatalog = z.infer<typeof agentCatalogSchema>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const agentIdSchema = z.string().regex(/^[a-z0-9_-]{1,32}$/u, {
|
|
3
|
+
message: "Agent id must match /^[a-z0-9_-]{1,32}$/",
|
|
4
|
+
});
|
|
5
|
+
export const agentConfigEntrySchema = z.object({
|
|
6
|
+
id: agentIdSchema,
|
|
7
|
+
provider: z.string().min(1, { message: "Agent provider cannot be empty" }),
|
|
8
|
+
model: z.string().min(1, { message: "Agent model cannot be empty" }),
|
|
9
|
+
enabled: z.boolean().optional().default(true),
|
|
10
|
+
binary: z.string().optional().default(""),
|
|
11
|
+
extraArgs: z
|
|
12
|
+
.array(z
|
|
13
|
+
.string()
|
|
14
|
+
.trim()
|
|
15
|
+
.min(1, { message: "`extraArgs` entries cannot be empty" }))
|
|
16
|
+
.nonempty({ message: "`extraArgs` must include at least one value" })
|
|
17
|
+
.optional(),
|
|
18
|
+
});
|
|
19
|
+
export const agentsConfigSchema = z.object({
|
|
20
|
+
agents: z.array(agentConfigEntrySchema).default([]),
|
|
21
|
+
});
|
|
22
|
+
export const agentDefinitionSchema = z.object({
|
|
23
|
+
id: agentIdSchema,
|
|
24
|
+
provider: z.string().min(1, { message: "Agent provider cannot be empty" }),
|
|
25
|
+
model: z.string().min(1, { message: "Agent model cannot be empty" }),
|
|
26
|
+
binary: z.string(),
|
|
27
|
+
argv: z
|
|
28
|
+
.array(z.string())
|
|
29
|
+
.min(1, { message: "Agent argv must include at least one argument" }),
|
|
30
|
+
});
|
|
31
|
+
export const agentCatalogSchema = z.array(agentDefinitionSchema);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type EnvironmentConfig } from "./types.js";
|
|
2
|
+
export interface DetectEnvironmentOptions {
|
|
3
|
+
root: string;
|
|
4
|
+
interactive: boolean;
|
|
5
|
+
promptPath?: PromptPathHandler;
|
|
6
|
+
}
|
|
7
|
+
export type PromptPathHandler = (options: PromptPathOptions) => Promise<string>;
|
|
8
|
+
export interface PromptPathOptions {
|
|
9
|
+
message: string;
|
|
10
|
+
defaultValue?: string;
|
|
11
|
+
prefaceLines?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface EnvironmentDetectionResult {
|
|
14
|
+
config: EnvironmentConfig;
|
|
15
|
+
detectedEntries: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function detectEnvironmentConfig(options: DetectEnvironmentOptions): Promise<EnvironmentDetectionResult>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { pathExists } from "../../utils/fs.js";
|
|
3
|
+
import { resolvePath } from "../../utils/path.js";
|
|
4
|
+
import { normalizeEnvironmentConfig } from "./types.js";
|
|
5
|
+
const PYTHON_PATH_CANDIDATES = [".venv", "venv"];
|
|
6
|
+
const PYTHON_MARKER_FILES = [
|
|
7
|
+
"pyproject.toml",
|
|
8
|
+
"requirements.txt",
|
|
9
|
+
"requirements-dev.txt",
|
|
10
|
+
"setup.cfg",
|
|
11
|
+
"setup.py",
|
|
12
|
+
"Pipfile",
|
|
13
|
+
"poetry.lock",
|
|
14
|
+
"uv.lock",
|
|
15
|
+
];
|
|
16
|
+
export async function detectEnvironmentConfig(options) {
|
|
17
|
+
const { root, interactive, promptPath } = options;
|
|
18
|
+
const entries = [];
|
|
19
|
+
const config = {};
|
|
20
|
+
const nodeModulesDetected = await detectNodeDependencies(root);
|
|
21
|
+
if (nodeModulesDetected) {
|
|
22
|
+
config.node = { dependencyRoots: ["node_modules"] };
|
|
23
|
+
entries.push("node");
|
|
24
|
+
}
|
|
25
|
+
const pythonPath = await detectPythonEnvironmentPath(root);
|
|
26
|
+
if (pythonPath) {
|
|
27
|
+
config.python = { path: pythonPath };
|
|
28
|
+
entries.push(`python.path=${pythonPath}`);
|
|
29
|
+
}
|
|
30
|
+
else if (interactive && promptPath && (await hasPythonMarkers(root))) {
|
|
31
|
+
const selection = (await promptPath({
|
|
32
|
+
message: "Enter the path to an existing Python virtual environment (press Enter to skip)",
|
|
33
|
+
defaultValue: ".venv",
|
|
34
|
+
prefaceLines: [
|
|
35
|
+
"",
|
|
36
|
+
"Detected Python project markers but no virtual environment directory.",
|
|
37
|
+
],
|
|
38
|
+
})).trim();
|
|
39
|
+
if (selection.length > 0) {
|
|
40
|
+
config.python = { path: selection };
|
|
41
|
+
entries.push(`python.path=${selection}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
config: normalizeEnvironmentConfig(config),
|
|
46
|
+
detectedEntries: entries,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function detectNodeDependencies(root) {
|
|
50
|
+
return pathExists(resolvePath(root, "node_modules"));
|
|
51
|
+
}
|
|
52
|
+
async function detectPythonEnvironmentPath(root) {
|
|
53
|
+
for (const candidate of PYTHON_PATH_CANDIDATES) {
|
|
54
|
+
const absolute = resolvePath(root, candidate);
|
|
55
|
+
if (await pathExists(absolute)) {
|
|
56
|
+
if (await isDirectorySafe(absolute)) {
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
async function hasPythonMarkers(root) {
|
|
64
|
+
for (const marker of PYTHON_MARKER_FILES) {
|
|
65
|
+
if (await pathExists(resolvePath(root, marker))) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
async function isDirectorySafe(path) {
|
|
72
|
+
try {
|
|
73
|
+
const stats = await stat(path);
|
|
74
|
+
return stats.isDirectory();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WorkspaceError } from "../../workspace/errors.js";
|
|
2
|
+
export declare class EnvironmentConfigError extends WorkspaceError {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class MissingEnvironmentConfigError extends EnvironmentConfigError {
|
|
6
|
+
readonly filePath: string;
|
|
7
|
+
constructor(filePath: string);
|
|
8
|
+
}
|
|
9
|
+
export declare class EnvironmentConfigParseError extends EnvironmentConfigError {
|
|
10
|
+
readonly filePath: string;
|
|
11
|
+
constructor(filePath: string, detail?: string);
|
|
12
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { WorkspaceError } from "../../workspace/errors.js";
|
|
2
|
+
const DEFAULT_ENVIRONMENT_ERROR_CONTEXT = "Invalid workspace environment configuration";
|
|
3
|
+
export class EnvironmentConfigError extends WorkspaceError {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "EnvironmentConfigError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class MissingEnvironmentConfigError extends EnvironmentConfigError {
|
|
10
|
+
filePath;
|
|
11
|
+
constructor(filePath) {
|
|
12
|
+
super(`Missing workspace environment configuration at ${filePath}`);
|
|
13
|
+
this.filePath = filePath;
|
|
14
|
+
this.name = "MissingEnvironmentConfigError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class EnvironmentConfigParseError extends EnvironmentConfigError {
|
|
18
|
+
filePath;
|
|
19
|
+
constructor(filePath, detail) {
|
|
20
|
+
super(detail
|
|
21
|
+
? `${DEFAULT_ENVIRONMENT_ERROR_CONTEXT} (${filePath}): ${detail}`
|
|
22
|
+
: `${DEFAULT_ENVIRONMENT_ERROR_CONTEXT} at ${filePath}`);
|
|
23
|
+
this.filePath = filePath;
|
|
24
|
+
this.name = "EnvironmentConfigParseError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type EnvironmentConfig } from "./types.js";
|
|
2
|
+
export declare const DEFAULT_ENVIRONMENT_FILE_DISPLAY: string;
|
|
3
|
+
export interface LoadEnvironmentConfigOptions {
|
|
4
|
+
root?: string;
|
|
5
|
+
filePath?: string;
|
|
6
|
+
optional?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadEnvironmentConfig(options?: LoadEnvironmentConfigOptions): EnvironmentConfig;
|
|
9
|
+
export declare function readEnvironmentConfig(content: string): EnvironmentConfig;
|
|
10
|
+
export declare function serializeEnvironmentConfig(config: EnvironmentConfig): string;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { parseYamlDocument, } from "../../utils/yaml-reader.js";
|
|
2
|
+
import { formatWorkspacePath, resolveWorkspacePath, VORATIQ_ENVIRONMENT_FILE, } from "../../workspace/structure.js";
|
|
3
|
+
import { createConfigLoader } from "../shared/loader-factory.js";
|
|
4
|
+
import { formatYamlErrorDetail } from "../shared/yaml-error-formatter.js";
|
|
5
|
+
import { EnvironmentConfigParseError, MissingEnvironmentConfigError, } from "./errors.js";
|
|
6
|
+
import { environmentConfigSchema, getNodeDependencyRoots, getPythonEnvironmentPath, isNodeEnvironmentDisabled, isPythonEnvironmentDisabled, normalizeEnvironmentConfig, } from "./types.js";
|
|
7
|
+
export const DEFAULT_ENVIRONMENT_FILE_DISPLAY = formatWorkspacePath(VORATIQ_ENVIRONMENT_FILE);
|
|
8
|
+
const DEFAULT_ENVIRONMENT_ERROR_CONTEXT = "Failed to parse workspace environment configuration";
|
|
9
|
+
const loadEnvironmentConfigInternal = createConfigLoader({
|
|
10
|
+
resolveFilePath: (root, options) => options.filePath ?? resolveWorkspacePath(root, VORATIQ_ENVIRONMENT_FILE),
|
|
11
|
+
handleMissing: ({ filePath, options }) => {
|
|
12
|
+
if (options.optional) {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
throw new MissingEnvironmentConfigError(filePath);
|
|
16
|
+
},
|
|
17
|
+
parse: (content, { filePath }) => {
|
|
18
|
+
try {
|
|
19
|
+
return readEnvironmentConfig(content);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof EnvironmentConfigParseError) {
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
throw new EnvironmentConfigParseError(filePath, error instanceof Error
|
|
26
|
+
? error.message
|
|
27
|
+
: DEFAULT_ENVIRONMENT_ERROR_CONTEXT);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
export function loadEnvironmentConfig(options = {}) {
|
|
32
|
+
return loadEnvironmentConfigInternal(options);
|
|
33
|
+
}
|
|
34
|
+
export function readEnvironmentConfig(content) {
|
|
35
|
+
const parsed = parseYamlDocument(content, {
|
|
36
|
+
formatError: formatEnvironmentYamlError,
|
|
37
|
+
});
|
|
38
|
+
const config = environmentConfigSchema.parse(parsed);
|
|
39
|
+
return normalizeEnvironmentConfig(config);
|
|
40
|
+
}
|
|
41
|
+
function formatEnvironmentYamlError(detail) {
|
|
42
|
+
const errorDetail = formatYamlErrorDetail(detail, {
|
|
43
|
+
fallbackReason: DEFAULT_ENVIRONMENT_ERROR_CONTEXT,
|
|
44
|
+
});
|
|
45
|
+
return new EnvironmentConfigParseError(DEFAULT_ENVIRONMENT_FILE_DISPLAY, errorDetail);
|
|
46
|
+
}
|
|
47
|
+
export function serializeEnvironmentConfig(config) {
|
|
48
|
+
const lines = [];
|
|
49
|
+
const nodeDisabled = isNodeEnvironmentDisabled(config);
|
|
50
|
+
const nodeRoots = getNodeDependencyRoots(config);
|
|
51
|
+
const pythonDisabled = isPythonEnvironmentDisabled(config);
|
|
52
|
+
const pythonPath = getPythonEnvironmentPath(config);
|
|
53
|
+
if (nodeDisabled) {
|
|
54
|
+
lines.push("node: false");
|
|
55
|
+
if (pythonPath || pythonDisabled) {
|
|
56
|
+
lines.push("");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (nodeRoots.length > 0) {
|
|
60
|
+
lines.push("node:");
|
|
61
|
+
lines.push(" dependencyRoots:");
|
|
62
|
+
for (const root of nodeRoots) {
|
|
63
|
+
lines.push(` - ${root}`);
|
|
64
|
+
}
|
|
65
|
+
if (pythonPath || pythonDisabled) {
|
|
66
|
+
lines.push("");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (pythonDisabled) {
|
|
70
|
+
lines.push("python: false");
|
|
71
|
+
}
|
|
72
|
+
else if (pythonPath && pythonPath.length > 0) {
|
|
73
|
+
lines.push("python:");
|
|
74
|
+
lines.push(` path: ${pythonPath}`);
|
|
75
|
+
}
|
|
76
|
+
if (lines.length === 0) {
|
|
77
|
+
return "";
|
|
78
|
+
}
|
|
79
|
+
return lines.join("\n");
|
|
80
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const environmentNodeConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
3
|
+
dependencyRoots: z.ZodArray<z.ZodString>;
|
|
4
|
+
}, z.core.$strict>, z.ZodLiteral<false>]>;
|
|
5
|
+
export declare const environmentPythonConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
6
|
+
path: z.ZodString;
|
|
7
|
+
}, z.core.$strict>, z.ZodLiteral<false>]>;
|
|
8
|
+
export declare const environmentConfigSchema: z.ZodObject<{
|
|
9
|
+
node: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
|
|
10
|
+
dependencyRoots: z.ZodArray<z.ZodString>;
|
|
11
|
+
}, z.core.$strict>, z.ZodLiteral<false>]>>;
|
|
12
|
+
python: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
|
|
13
|
+
path: z.ZodString;
|
|
14
|
+
}, z.core.$strict>, z.ZodLiteral<false>]>>;
|
|
15
|
+
}, z.core.$strict>;
|
|
16
|
+
export type EnvironmentConfig = z.infer<typeof environmentConfigSchema>;
|
|
17
|
+
export declare function normalizeEnvironmentConfig(config: EnvironmentConfig): EnvironmentConfig;
|
|
18
|
+
export declare function isNodeEnvironmentDisabled(environment: EnvironmentConfig): boolean;
|
|
19
|
+
export declare function getNodeDependencyRoots(environment: EnvironmentConfig): readonly string[];
|
|
20
|
+
export declare function isPythonEnvironmentDisabled(environment: EnvironmentConfig): boolean;
|
|
21
|
+
export declare function getPythonEnvironmentPath(environment: EnvironmentConfig): string | undefined;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { assertRepoRelativePath } from "../../utils/path.js";
|
|
3
|
+
function formatEnvironmentPathError(label, value, reason) {
|
|
4
|
+
const displayValue = value.length === 0 ? "<empty>" : value;
|
|
5
|
+
return `Invalid ${label} "${displayValue}": ${reason}.`;
|
|
6
|
+
}
|
|
7
|
+
function createEnvironmentPathSchema(label) {
|
|
8
|
+
return z.string().superRefine((value, ctx) => {
|
|
9
|
+
if (value.length === 0) {
|
|
10
|
+
ctx.addIssue({
|
|
11
|
+
code: z.ZodIssueCode.custom,
|
|
12
|
+
message: formatEnvironmentPathError(label, value, "value must be a non-empty string."),
|
|
13
|
+
});
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (value.includes("\0")) {
|
|
17
|
+
ctx.addIssue({
|
|
18
|
+
code: z.ZodIssueCode.custom,
|
|
19
|
+
message: formatEnvironmentPathError(label, value, "paths may not contain null bytes."),
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
assertRepoRelativePath(value);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
ctx.addIssue({
|
|
28
|
+
code: z.ZodIssueCode.custom,
|
|
29
|
+
message: formatEnvironmentPathError(label, value, "paths must stay within the repository (no absolute entries, '..', or backslashes)."),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const dependencyRoot = createEnvironmentPathSchema("node.dependencyRoots[]");
|
|
35
|
+
const pythonPath = createEnvironmentPathSchema("python.path");
|
|
36
|
+
export const environmentNodeConfigSchema = z.union([
|
|
37
|
+
z
|
|
38
|
+
.object({
|
|
39
|
+
dependencyRoots: z.array(dependencyRoot).min(1),
|
|
40
|
+
})
|
|
41
|
+
.strict(),
|
|
42
|
+
z.literal(false),
|
|
43
|
+
]);
|
|
44
|
+
export const environmentPythonConfigSchema = z.union([
|
|
45
|
+
z
|
|
46
|
+
.object({
|
|
47
|
+
path: pythonPath,
|
|
48
|
+
})
|
|
49
|
+
.strict(),
|
|
50
|
+
z.literal(false),
|
|
51
|
+
]);
|
|
52
|
+
export const environmentConfigSchema = z
|
|
53
|
+
.object({
|
|
54
|
+
node: environmentNodeConfigSchema.optional(),
|
|
55
|
+
python: environmentPythonConfigSchema.optional(),
|
|
56
|
+
})
|
|
57
|
+
.strict();
|
|
58
|
+
export function normalizeEnvironmentConfig(config) {
|
|
59
|
+
const normalized = {};
|
|
60
|
+
if (config.node === false) {
|
|
61
|
+
normalized.node = false;
|
|
62
|
+
}
|
|
63
|
+
else if (config.node?.dependencyRoots?.length) {
|
|
64
|
+
normalized.node = {
|
|
65
|
+
dependencyRoots: [...new Set(config.node.dependencyRoots)],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const pythonPath = getPythonEnvironmentPath(config);
|
|
69
|
+
if (pythonPath) {
|
|
70
|
+
normalized.python = {
|
|
71
|
+
path: pythonPath,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
else if (isPythonEnvironmentDisabled(config)) {
|
|
75
|
+
normalized.python = false;
|
|
76
|
+
}
|
|
77
|
+
return normalized;
|
|
78
|
+
}
|
|
79
|
+
export function isNodeEnvironmentDisabled(environment) {
|
|
80
|
+
return environment.node === false;
|
|
81
|
+
}
|
|
82
|
+
export function getNodeDependencyRoots(environment) {
|
|
83
|
+
const node = environment.node;
|
|
84
|
+
if (node && typeof node === "object") {
|
|
85
|
+
return node.dependencyRoots;
|
|
86
|
+
}
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
export function isPythonEnvironmentDisabled(environment) {
|
|
90
|
+
return environment.python === false;
|
|
91
|
+
}
|
|
92
|
+
export function getPythonEnvironmentPath(environment) {
|
|
93
|
+
const python = environment.python;
|
|
94
|
+
if (python && typeof python === "object") {
|
|
95
|
+
return python.path;
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface EvalDefault {
|
|
2
|
+
readonly slug: string;
|
|
3
|
+
readonly command?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const DEFAULT_EVAL_TEMPLATE_HEADER: readonly string[];
|
|
6
|
+
export declare const DEFAULT_EVAL_DEFAULTS: readonly EvalDefault[];
|
|
7
|
+
export declare function serializeEvalDefaults(defaults: readonly EvalDefault[]): string[];
|
|
8
|
+
export declare function listEvalDefaults(): EvalDefault[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const DEFAULT_EVAL_TEMPLATE_HEADER = [
|
|
2
|
+
"# Eval commands run after each agent finishes its run.",
|
|
3
|
+
"# For each slug, provide the command that runs that eval.",
|
|
4
|
+
"# Leave any entry blank (or delete it entirely) to skip that eval.",
|
|
5
|
+
'# Example: format: "npm run format:check"',
|
|
6
|
+
"",
|
|
7
|
+
];
|
|
8
|
+
export const DEFAULT_EVAL_DEFAULTS = [
|
|
9
|
+
{ slug: "format" },
|
|
10
|
+
{ slug: "lint" },
|
|
11
|
+
{ slug: "typecheck" },
|
|
12
|
+
{ slug: "tests" },
|
|
13
|
+
];
|
|
14
|
+
export function serializeEvalDefaults(defaults) {
|
|
15
|
+
const lines = [...DEFAULT_EVAL_TEMPLATE_HEADER];
|
|
16
|
+
for (const { slug, command } of defaults) {
|
|
17
|
+
if (command && command.length > 0) {
|
|
18
|
+
lines.push(`${slug}: ${JSON.stringify(command)}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
lines.push(`${slug}:`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return lines;
|
|
25
|
+
}
|
|
26
|
+
export function listEvalDefaults() {
|
|
27
|
+
return DEFAULT_EVAL_DEFAULTS.map((definition) => ({ ...definition }));
|
|
28
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type EnvironmentConfig } from "../environment/types.js";
|
|
2
|
+
import type { EvalSlug } from "./types.js";
|
|
3
|
+
export declare const CANONICAL_EVAL_SLUGS: EvalSlug[];
|
|
4
|
+
export interface EvalSuggestion {
|
|
5
|
+
source: "node" | "python";
|
|
6
|
+
commands: Map<EvalSlug, string>;
|
|
7
|
+
notes: string[];
|
|
8
|
+
warnings: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function detectEvalSuggestions(root: string, environment: EnvironmentConfig): Promise<EvalSuggestion[]>;
|