@hypercli/gen 0.1.1
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 +24 -0
- package/dist/actions/communication.d.ts +201 -0
- package/dist/actions/communication.d.ts.map +1 -0
- package/dist/actions/communication.js +515 -0
- package/dist/actions/communication.js.map +1 -0
- package/dist/actions/decorator.d.ts +22 -0
- package/dist/actions/decorator.d.ts.map +1 -0
- package/dist/actions/decorator.js +110 -0
- package/dist/actions/decorator.js.map +1 -0
- package/dist/actions/executor.d.ts +85 -0
- package/dist/actions/executor.d.ts.map +1 -0
- package/dist/actions/executor.js +289 -0
- package/dist/actions/executor.js.map +1 -0
- package/dist/actions/index.d.ts +14 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +15 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/parameter-resolver.d.ts +54 -0
- package/dist/actions/parameter-resolver.d.ts.map +1 -0
- package/dist/actions/parameter-resolver.js +300 -0
- package/dist/actions/parameter-resolver.js.map +1 -0
- package/dist/actions/registry.d.ts +78 -0
- package/dist/actions/registry.d.ts.map +1 -0
- package/dist/actions/registry.js +221 -0
- package/dist/actions/registry.js.map +1 -0
- package/dist/actions/types.d.ts +109 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/types.js +31 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/actions/utils.d.ts +42 -0
- package/dist/actions/utils.d.ts.map +1 -0
- package/dist/actions/utils.js +144 -0
- package/dist/actions/utils.js.map +1 -0
- package/dist/ai/ai-collector.d.ts +52 -0
- package/dist/ai/ai-collector.d.ts.map +1 -0
- package/dist/ai/ai-collector.js +64 -0
- package/dist/ai/ai-collector.js.map +1 -0
- package/dist/ai/ai-config.d.ts +230 -0
- package/dist/ai/ai-config.d.ts.map +1 -0
- package/dist/ai/ai-config.js +8 -0
- package/dist/ai/ai-config.js.map +1 -0
- package/dist/ai/ai-service.d.ts +66 -0
- package/dist/ai/ai-service.d.ts.map +1 -0
- package/dist/ai/ai-service.js +198 -0
- package/dist/ai/ai-service.js.map +1 -0
- package/dist/ai/ai-variable-resolver.d.ts +59 -0
- package/dist/ai/ai-variable-resolver.d.ts.map +1 -0
- package/dist/ai/ai-variable-resolver.js +219 -0
- package/dist/ai/ai-variable-resolver.js.map +1 -0
- package/dist/ai/context-collector.d.ts +30 -0
- package/dist/ai/context-collector.d.ts.map +1 -0
- package/dist/ai/context-collector.js +158 -0
- package/dist/ai/context-collector.js.map +1 -0
- package/dist/ai/cost-tracker.d.ts +41 -0
- package/dist/ai/cost-tracker.d.ts.map +1 -0
- package/dist/ai/cost-tracker.js +131 -0
- package/dist/ai/cost-tracker.js.map +1 -0
- package/dist/ai/env.d.ts +36 -0
- package/dist/ai/env.d.ts.map +1 -0
- package/dist/ai/env.js +100 -0
- package/dist/ai/env.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +25 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/model-router.d.ts +32 -0
- package/dist/ai/model-router.d.ts.map +1 -0
- package/dist/ai/model-router.js +113 -0
- package/dist/ai/model-router.js.map +1 -0
- package/dist/ai/output-validator.d.ts +24 -0
- package/dist/ai/output-validator.d.ts.map +1 -0
- package/dist/ai/output-validator.js +279 -0
- package/dist/ai/output-validator.js.map +1 -0
- package/dist/ai/prompt-assembler.d.ts +30 -0
- package/dist/ai/prompt-assembler.d.ts.map +1 -0
- package/dist/ai/prompt-assembler.js +93 -0
- package/dist/ai/prompt-assembler.js.map +1 -0
- package/dist/ai/prompt-pipeline.d.ts +63 -0
- package/dist/ai/prompt-pipeline.d.ts.map +1 -0
- package/dist/ai/prompt-pipeline.js +119 -0
- package/dist/ai/prompt-pipeline.js.map +1 -0
- package/dist/ai/prompt-template.jig +88 -0
- package/dist/ai/transports/api-transport.d.ts +12 -0
- package/dist/ai/transports/api-transport.d.ts.map +1 -0
- package/dist/ai/transports/api-transport.js +86 -0
- package/dist/ai/transports/api-transport.js.map +1 -0
- package/dist/ai/transports/command-transport.d.ts +20 -0
- package/dist/ai/transports/command-transport.d.ts.map +1 -0
- package/dist/ai/transports/command-transport.js +203 -0
- package/dist/ai/transports/command-transport.js.map +1 -0
- package/dist/ai/transports/index.d.ts +11 -0
- package/dist/ai/transports/index.d.ts.map +1 -0
- package/dist/ai/transports/index.js +10 -0
- package/dist/ai/transports/index.js.map +1 -0
- package/dist/ai/transports/resolve-transport.d.ts +15 -0
- package/dist/ai/transports/resolve-transport.d.ts.map +1 -0
- package/dist/ai/transports/resolve-transport.js +96 -0
- package/dist/ai/transports/resolve-transport.js.map +1 -0
- package/dist/ai/transports/stdout-transport.d.ts +14 -0
- package/dist/ai/transports/stdout-transport.d.ts.map +1 -0
- package/dist/ai/transports/stdout-transport.js +27 -0
- package/dist/ai/transports/stdout-transport.js.map +1 -0
- package/dist/ai/transports/types.d.ts +77 -0
- package/dist/ai/transports/types.d.ts.map +1 -0
- package/dist/ai/transports/types.js +8 -0
- package/dist/ai/transports/types.js.map +1 -0
- package/dist/commands/cookbook/info.d.ts +22 -0
- package/dist/commands/cookbook/info.d.ts.map +1 -0
- package/dist/commands/cookbook/info.js +217 -0
- package/dist/commands/cookbook/info.js.map +1 -0
- package/dist/commands/cookbook/list.d.ts +20 -0
- package/dist/commands/cookbook/list.d.ts.map +1 -0
- package/dist/commands/cookbook/list.js +133 -0
- package/dist/commands/cookbook/list.js.map +1 -0
- package/dist/commands/gen.d.ts +65 -0
- package/dist/commands/gen.d.ts.map +1 -0
- package/dist/commands/gen.js +478 -0
- package/dist/commands/gen.js.map +1 -0
- package/dist/commands/recipe/info.d.ts +18 -0
- package/dist/commands/recipe/info.d.ts.map +1 -0
- package/dist/commands/recipe/info.js +89 -0
- package/dist/commands/recipe/info.js.map +1 -0
- package/dist/commands/recipe/list.d.ts +29 -0
- package/dist/commands/recipe/list.d.ts.map +1 -0
- package/dist/commands/recipe/list.js +215 -0
- package/dist/commands/recipe/list.js.map +1 -0
- package/dist/commands/recipe/run.d.ts +44 -0
- package/dist/commands/recipe/run.d.ts.map +1 -0
- package/dist/commands/recipe/run.js +239 -0
- package/dist/commands/recipe/run.js.map +1 -0
- package/dist/commands/recipe/validate.d.ts +19 -0
- package/dist/commands/recipe/validate.d.ts.map +1 -0
- package/dist/commands/recipe/validate.js +66 -0
- package/dist/commands/recipe/validate.js.map +1 -0
- package/dist/discovery/generator-discovery.d.ts +130 -0
- package/dist/discovery/generator-discovery.d.ts.map +1 -0
- package/dist/discovery/generator-discovery.js +674 -0
- package/dist/discovery/generator-discovery.js.map +1 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +7 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/hooks/command-not-found.d.ts +18 -0
- package/dist/hooks/command-not-found.d.ts.map +1 -0
- package/dist/hooks/command-not-found.js +182 -0
- package/dist/hooks/command-not-found.js.map +1 -0
- package/dist/hooks/suggest.d.ts +13 -0
- package/dist/hooks/suggest.d.ts.map +1 -0
- package/dist/hooks/suggest.js +28 -0
- package/dist/hooks/suggest.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/base-command.d.ts +26 -0
- package/dist/lib/base-command.d.ts.map +1 -0
- package/dist/lib/base-command.js +24 -0
- package/dist/lib/base-command.js.map +1 -0
- package/dist/lib/flags.d.ts +33 -0
- package/dist/lib/flags.d.ts.map +1 -0
- package/dist/lib/flags.js +64 -0
- package/dist/lib/flags.js.map +1 -0
- package/dist/ops/add.d.ts +4 -0
- package/dist/ops/add.d.ts.map +1 -0
- package/dist/ops/add.js +85 -0
- package/dist/ops/add.js.map +1 -0
- package/dist/ops/inject.d.ts +4 -0
- package/dist/ops/inject.d.ts.map +1 -0
- package/dist/ops/inject.js +28 -0
- package/dist/ops/inject.js.map +1 -0
- package/dist/ops/injector.d.ts +4 -0
- package/dist/ops/injector.d.ts.map +1 -0
- package/dist/ops/injector.js +68 -0
- package/dist/ops/injector.js.map +1 -0
- package/dist/ops/result.d.ts +3 -0
- package/dist/ops/result.d.ts.map +1 -0
- package/dist/ops/result.js +8 -0
- package/dist/ops/result.js.map +1 -0
- package/dist/prompts/interactive-prompts.d.ts +152 -0
- package/dist/prompts/interactive-prompts.d.ts.map +1 -0
- package/dist/prompts/interactive-prompts.js +574 -0
- package/dist/prompts/interactive-prompts.js.map +1 -0
- package/dist/recipe-engine/group-executor.d.ts +97 -0
- package/dist/recipe-engine/group-executor.d.ts.map +1 -0
- package/dist/recipe-engine/group-executor.js +293 -0
- package/dist/recipe-engine/group-executor.js.map +1 -0
- package/dist/recipe-engine/index.d.ts +112 -0
- package/dist/recipe-engine/index.d.ts.map +1 -0
- package/dist/recipe-engine/index.js +223 -0
- package/dist/recipe-engine/index.js.map +1 -0
- package/dist/recipe-engine/output-evaluator.d.ts +28 -0
- package/dist/recipe-engine/output-evaluator.d.ts.map +1 -0
- package/dist/recipe-engine/output-evaluator.js +78 -0
- package/dist/recipe-engine/output-evaluator.js.map +1 -0
- package/dist/recipe-engine/recipe-engine.d.ts +227 -0
- package/dist/recipe-engine/recipe-engine.d.ts.map +1 -0
- package/dist/recipe-engine/recipe-engine.js +1036 -0
- package/dist/recipe-engine/recipe-engine.js.map +1 -0
- package/dist/recipe-engine/step-executor.d.ts +172 -0
- package/dist/recipe-engine/step-executor.d.ts.map +1 -0
- package/dist/recipe-engine/step-executor.js +802 -0
- package/dist/recipe-engine/step-executor.js.map +1 -0
- package/dist/recipe-engine/tools/action-tool.d.ts +103 -0
- package/dist/recipe-engine/tools/action-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/action-tool.js +473 -0
- package/dist/recipe-engine/tools/action-tool.js.map +1 -0
- package/dist/recipe-engine/tools/ai-tool.d.ts +26 -0
- package/dist/recipe-engine/tools/ai-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/ai-tool.js +233 -0
- package/dist/recipe-engine/tools/ai-tool.js.map +1 -0
- package/dist/recipe-engine/tools/base.d.ts +214 -0
- package/dist/recipe-engine/tools/base.d.ts.map +1 -0
- package/dist/recipe-engine/tools/base.js +397 -0
- package/dist/recipe-engine/tools/base.js.map +1 -0
- package/dist/recipe-engine/tools/codemod-tool.d.ts +130 -0
- package/dist/recipe-engine/tools/codemod-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/codemod-tool.js +786 -0
- package/dist/recipe-engine/tools/codemod-tool.js.map +1 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.js +130 -0
- package/dist/recipe-engine/tools/ensure-dirs-tool.js.map +1 -0
- package/dist/recipe-engine/tools/index.d.ts +126 -0
- package/dist/recipe-engine/tools/index.d.ts.map +1 -0
- package/dist/recipe-engine/tools/index.js +290 -0
- package/dist/recipe-engine/tools/index.js.map +1 -0
- package/dist/recipe-engine/tools/install-tool.d.ts +20 -0
- package/dist/recipe-engine/tools/install-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/install-tool.js +194 -0
- package/dist/recipe-engine/tools/install-tool.js.map +1 -0
- package/dist/recipe-engine/tools/parallel-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/parallel-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/parallel-tool.js +134 -0
- package/dist/recipe-engine/tools/parallel-tool.js.map +1 -0
- package/dist/recipe-engine/tools/patch-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/patch-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/patch-tool.js +248 -0
- package/dist/recipe-engine/tools/patch-tool.js.map +1 -0
- package/dist/recipe-engine/tools/prompt-tool.d.ts +25 -0
- package/dist/recipe-engine/tools/prompt-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/prompt-tool.js +162 -0
- package/dist/recipe-engine/tools/prompt-tool.js.map +1 -0
- package/dist/recipe-engine/tools/query-tool.d.ts +21 -0
- package/dist/recipe-engine/tools/query-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/query-tool.js +249 -0
- package/dist/recipe-engine/tools/query-tool.js.map +1 -0
- package/dist/recipe-engine/tools/recipe-tool.d.ts +103 -0
- package/dist/recipe-engine/tools/recipe-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/recipe-tool.js +617 -0
- package/dist/recipe-engine/tools/recipe-tool.js.map +1 -0
- package/dist/recipe-engine/tools/registry.d.ts +151 -0
- package/dist/recipe-engine/tools/registry.d.ts.map +1 -0
- package/dist/recipe-engine/tools/registry.js +244 -0
- package/dist/recipe-engine/tools/registry.js.map +1 -0
- package/dist/recipe-engine/tools/sequence-tool.d.ts +22 -0
- package/dist/recipe-engine/tools/sequence-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/sequence-tool.js +122 -0
- package/dist/recipe-engine/tools/sequence-tool.js.map +1 -0
- package/dist/recipe-engine/tools/shell-tool.d.ts +25 -0
- package/dist/recipe-engine/tools/shell-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/shell-tool.js +149 -0
- package/dist/recipe-engine/tools/shell-tool.js.map +1 -0
- package/dist/recipe-engine/tools/template-tool.d.ts +88 -0
- package/dist/recipe-engine/tools/template-tool.d.ts.map +1 -0
- package/dist/recipe-engine/tools/template-tool.js +613 -0
- package/dist/recipe-engine/tools/template-tool.js.map +1 -0
- package/dist/recipe-engine/types.d.ts +963 -0
- package/dist/recipe-engine/types.d.ts.map +1 -0
- package/dist/recipe-engine/types.js +94 -0
- package/dist/recipe-engine/types.js.map +1 -0
- package/dist/template-engines/ai-tags.d.ts +26 -0
- package/dist/template-engines/ai-tags.d.ts.map +1 -0
- package/dist/template-engines/ai-tags.js +233 -0
- package/dist/template-engines/ai-tags.js.map +1 -0
- package/dist/template-engines/index.d.ts +8 -0
- package/dist/template-engines/index.d.ts.map +1 -0
- package/dist/template-engines/index.js +8 -0
- package/dist/template-engines/index.js.map +1 -0
- package/dist/template-engines/jig-engine.d.ts +47 -0
- package/dist/template-engines/jig-engine.d.ts.map +1 -0
- package/dist/template-engines/jig-engine.js +173 -0
- package/dist/template-engines/jig-engine.js.map +1 -0
- package/dist/utils/coerce-value.d.ts +7 -0
- package/dist/utils/coerce-value.d.ts.map +1 -0
- package/dist/utils/coerce-value.js +18 -0
- package/dist/utils/coerce-value.js.map +1 -0
- package/dist/utils/diff.d.ts +8 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +10 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/global-packages.d.ts +11 -0
- package/dist/utils/global-packages.d.ts.map +1 -0
- package/dist/utils/global-packages.js +88 -0
- package/dist/utils/global-packages.js.map +1 -0
- package/dist/utils/pager.d.ts +6 -0
- package/dist/utils/pager.d.ts.map +1 -0
- package/dist/utils/pager.js +41 -0
- package/dist/utils/pager.js.map +1 -0
- package/help/cookbook/info.md +35 -0
- package/help/cookbook/list.md +37 -0
- package/help/gen.md +26 -0
- package/help/recipe/run.md +52 -0
- package/help/recipe/validate.md +51 -0
- package/oclif.manifest.json +580 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/ai/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAY5D,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,UAA2C,CAAC;AAI/E;;;GAGG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAmBjC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAyBpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CACjC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAIT"}
|
package/dist/ai/env.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Environment Variable Resolution
|
|
3
|
+
*
|
|
4
|
+
* Centralizes API key resolution from environment variables.
|
|
5
|
+
* Loads .env files via dotenvx on first use.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import createDebug from "debug";
|
|
9
|
+
const debug = createDebug("hypergen:ai:env");
|
|
10
|
+
/**
|
|
11
|
+
* Well-known environment variable names for each AI provider's API key.
|
|
12
|
+
* These match the defaults used by the Vercel AI SDK provider packages.
|
|
13
|
+
*/
|
|
14
|
+
export const PROVIDER_API_KEY_ENV_VARS = {
|
|
15
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
16
|
+
openai: "OPENAI_API_KEY",
|
|
17
|
+
google: "GOOGLE_GENERATIVE_AI_API_KEY",
|
|
18
|
+
mistral: "MISTRAL_API_KEY",
|
|
19
|
+
groq: "GROQ_API_KEY",
|
|
20
|
+
cohere: "COHERE_API_KEY",
|
|
21
|
+
xai: "XAI_API_KEY",
|
|
22
|
+
fireworks: "FIREWORKS_API_KEY",
|
|
23
|
+
perplexity: "PERPLEXITY_API_KEY",
|
|
24
|
+
together: "TOGETHER_AI_API_KEY",
|
|
25
|
+
deepseek: "DEEPSEEK_API_KEY",
|
|
26
|
+
};
|
|
27
|
+
/** All well-known env var names (for auto-detection scans) */
|
|
28
|
+
export const ALL_KNOWN_API_KEY_VARS = Object.values(PROVIDER_API_KEY_ENV_VARS);
|
|
29
|
+
let dotenvLoaded = false;
|
|
30
|
+
/**
|
|
31
|
+
* Ensure .env files are loaded into process.env.
|
|
32
|
+
* Called lazily on first API key resolution.
|
|
33
|
+
*/
|
|
34
|
+
export function loadDotenv() {
|
|
35
|
+
if (dotenvLoaded)
|
|
36
|
+
return;
|
|
37
|
+
dotenvLoaded = true;
|
|
38
|
+
// Only attempt to load if a .env file actually exists — dotenvx is noisy
|
|
39
|
+
// about missing files and there's no reliable way to silence it.
|
|
40
|
+
if (!fs.existsSync(".env")) {
|
|
41
|
+
debug("No .env file found, skipping dotenvx");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
46
|
+
const dotenvx = require("@dotenvx/dotenvx");
|
|
47
|
+
dotenvx.config({ quiet: true });
|
|
48
|
+
debug("Loaded .env file via dotenvx");
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
debug("dotenvx not available");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve an API key from the environment.
|
|
56
|
+
*
|
|
57
|
+
* @param envVarName Explicit env var name from config (e.g. 'ANTHROPIC_API_KEY')
|
|
58
|
+
* @param provider Provider name, used to infer default env var when envVarName is omitted
|
|
59
|
+
* @returns The API key string, or undefined if not found
|
|
60
|
+
*/
|
|
61
|
+
export function resolveApiKey(envVarName, provider) {
|
|
62
|
+
loadDotenv();
|
|
63
|
+
// If an explicit env var name is given, use it
|
|
64
|
+
if (envVarName) {
|
|
65
|
+
const value = process.env[envVarName];
|
|
66
|
+
if (value) {
|
|
67
|
+
debug("Resolved API key from explicit env var: %s", envVarName);
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
debug("Explicit env var %s is not set", envVarName);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
// Fall back to well-known env var for this provider
|
|
74
|
+
const defaultVar = PROVIDER_API_KEY_ENV_VARS[provider];
|
|
75
|
+
if (defaultVar) {
|
|
76
|
+
const value = process.env[defaultVar];
|
|
77
|
+
if (value) {
|
|
78
|
+
debug("Resolved API key from provider default env var: %s", defaultVar);
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the env var name that would be used for a provider (for error messages).
|
|
86
|
+
*/
|
|
87
|
+
export function getExpectedEnvVar(envVarName, provider) {
|
|
88
|
+
return envVarName || PROVIDER_API_KEY_ENV_VARS[provider] || `${provider.toUpperCase()}_API_KEY`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if any API key is available for the given config, without loading it.
|
|
92
|
+
* Used by auto-detection in resolveTransport.
|
|
93
|
+
*/
|
|
94
|
+
export function hasApiKeyAvailable(envVarName, provider) {
|
|
95
|
+
if (!provider)
|
|
96
|
+
return false;
|
|
97
|
+
loadDotenv();
|
|
98
|
+
return !!resolveApiKey(envVarName, provider);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/ai/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAChE,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,8BAA8B;IACtC,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;IACxB,GAAG,EAAE,aAAa;IAClB,SAAS,EAAE,mBAAmB;IAC9B,UAAU,EAAE,oBAAoB;IAChC,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,kBAAkB;CAC5B,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAE/E,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB;;;GAGG;AACH,MAAM,UAAU,UAAU;IACzB,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IAEpB,yEAAyE;IACzE,iEAAiE;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9C,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,iEAAiE;QACjE,MAAM,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACR,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChC,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC5B,UAA8B,EAC9B,QAAgB;IAEhB,UAAU,EAAE,CAAC;IAEb,+CAA+C;IAC/C,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,4CAA4C,EAAE,UAAU,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACd,CAAC;QACD,KAAK,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;QACpD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,oDAAoD;IACpD,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,CAAC,oDAAoD,EAAE,UAAU,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAE,QAAgB;IACjF,OAAO,UAAU,IAAI,yBAAyB,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CACjC,UAA8B,EAC9B,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,UAAU,EAAE,CAAC;IACb,OAAO,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Public exports for Hypergen's AI integration.
|
|
5
|
+
*/
|
|
6
|
+
export type { AiServiceConfig, AIModelRef, AIModelPricing, AIBudgetConfig, AIOutputConfig, AIContextConfig, AIExample, AIGuardrailConfig, AIExecutionResult, AICostSummary, } from "./ai-config.js";
|
|
7
|
+
export { AiService, type GenerateOptions } from "./ai-service.js";
|
|
8
|
+
export { ModelRouter, type ResolvedModel } from "./model-router.js";
|
|
9
|
+
export { CostTracker } from "./cost-tracker.js";
|
|
10
|
+
export { PromptPipeline, type AssembledPrompt, type PromptPipelineOptions, } from "./prompt-pipeline.js";
|
|
11
|
+
export { ContextCollector, type ContextBundle } from "./context-collector.js";
|
|
12
|
+
export { validateOutput, buildValidationFeedback, type ValidationResult, } from "./output-validator.js";
|
|
13
|
+
export { resolveApiKey, hasApiKeyAvailable, getExpectedEnvVar, loadDotenv, PROVIDER_API_KEY_ENV_VARS, ALL_KNOWN_API_KEY_VARS, } from "./env.js";
|
|
14
|
+
export { AiCollector, type AiBlockEntry } from "./ai-collector.js";
|
|
15
|
+
export { PromptAssembler, type AssemblerOptions } from "./prompt-assembler.js";
|
|
16
|
+
export { resolveTransport, StdoutTransport, ApiTransport, CommandTransport, type AiTransport, type TransportResult, type TransportContext, } from "./transports/index.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACX,eAAe,EACf,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACN,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG9E,OAAO,EACN,cAAc,EACd,uBAAuB,EACvB,KAAK,gBAAgB,GACrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACrB,MAAM,uBAAuB,CAAC"}
|
package/dist/ai/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Public exports for Hypergen's AI integration.
|
|
5
|
+
*/
|
|
6
|
+
// Core service
|
|
7
|
+
export { AiService } from "./ai-service.js";
|
|
8
|
+
// Model routing
|
|
9
|
+
export { ModelRouter } from "./model-router.js";
|
|
10
|
+
// Cost tracking
|
|
11
|
+
export { CostTracker } from "./cost-tracker.js";
|
|
12
|
+
// Prompt pipeline
|
|
13
|
+
export { PromptPipeline, } from "./prompt-pipeline.js";
|
|
14
|
+
// Context collection
|
|
15
|
+
export { ContextCollector } from "./context-collector.js";
|
|
16
|
+
// Output validation
|
|
17
|
+
export { validateOutput, buildValidationFeedback, } from "./output-validator.js";
|
|
18
|
+
// Environment / API key resolution
|
|
19
|
+
export { resolveApiKey, hasApiKeyAvailable, getExpectedEnvVar, loadDotenv, PROVIDER_API_KEY_ENV_VARS, ALL_KNOWN_API_KEY_VARS, } from "./env.js";
|
|
20
|
+
// 2-pass AI generation
|
|
21
|
+
export { AiCollector } from "./ai-collector.js";
|
|
22
|
+
export { PromptAssembler } from "./prompt-assembler.js";
|
|
23
|
+
// AI transports (pluggable resolution for 2-pass @ai blocks)
|
|
24
|
+
export { resolveTransport, StdoutTransport, ApiTransport, CommandTransport, } from "./transports/index.js";
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,eAAe;AACf,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAElE,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AAEpE,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,kBAAkB;AAClB,OAAO,EACN,cAAc,GAGd,MAAM,sBAAsB,CAAC;AAE9B,qBAAqB;AACrB,OAAO,EAAE,gBAAgB,EAAsB,MAAM,wBAAwB,CAAC;AAE9E,oBAAoB;AACpB,OAAO,EACN,cAAc,EACd,uBAAuB,GAEvB,MAAM,uBAAuB,CAAC;AAE/B,mCAAmC;AACnC,OAAO,EACN,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,UAAU,CAAC;AAElB,uBAAuB;AACvB,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAyB,MAAM,uBAAuB,CAAC;AAE/E,6DAA6D;AAC7D,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,GAIhB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Router
|
|
3
|
+
*
|
|
4
|
+
* Resolves AI provider + model, manages fallback chains,
|
|
5
|
+
* and dynamically imports Vercel AI SDK provider packages.
|
|
6
|
+
*/
|
|
7
|
+
import type { AiServiceConfig } from "./ai-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* A resolved provider instance that can be passed to Vercel AI SDK
|
|
10
|
+
*/
|
|
11
|
+
export interface ResolvedModel {
|
|
12
|
+
/** The Vercel AI SDK model instance */
|
|
13
|
+
model: any;
|
|
14
|
+
/** Provider name */
|
|
15
|
+
provider: string;
|
|
16
|
+
/** Model name */
|
|
17
|
+
modelName: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class ModelRouter {
|
|
20
|
+
private readonly config;
|
|
21
|
+
constructor(config: AiServiceConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a model instance for a given step, with fallback chain.
|
|
24
|
+
*
|
|
25
|
+
* @param stepProvider Provider override from step config
|
|
26
|
+
* @param stepModel Model override from step config
|
|
27
|
+
* @param stepApiKeyEnvVar Env var name override for API key (from step config)
|
|
28
|
+
* @returns ResolvedModel ready for Vercel AI SDK
|
|
29
|
+
*/
|
|
30
|
+
resolve(stepProvider?: string, stepModel?: string, stepApiKeyEnvVar?: string): Promise<ResolvedModel>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=model-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/ai/model-router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,uCAAuC;IACvC,KAAK,EAAE,GAAG,CAAC;IACX,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB;AAuED,qBAAa,WAAW;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAEpD;;;;;;;OAOG;IACG,OAAO,CACZ,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,CAAC;CA8CzB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Router
|
|
3
|
+
*
|
|
4
|
+
* Resolves AI provider + model, manages fallback chains,
|
|
5
|
+
* and dynamically imports Vercel AI SDK provider packages.
|
|
6
|
+
*/
|
|
7
|
+
import { ErrorCode, ErrorHandler } from "@hypercli/core";
|
|
8
|
+
import createDebug from "debug";
|
|
9
|
+
import { resolveApiKey } from "./env.js";
|
|
10
|
+
const debug = createDebug("hypergen:ai:model-router");
|
|
11
|
+
/**
|
|
12
|
+
* Infer provider name from model string.
|
|
13
|
+
* e.g., 'claude-sonnet-4-5' → 'anthropic', 'gpt-4o' → 'openai'
|
|
14
|
+
*/
|
|
15
|
+
function inferProvider(model) {
|
|
16
|
+
if (model.startsWith("claude"))
|
|
17
|
+
return "anthropic";
|
|
18
|
+
if (model.startsWith("gpt") || model.startsWith("o1") || model.startsWith("o3"))
|
|
19
|
+
return "openai";
|
|
20
|
+
if (model.startsWith("gemini"))
|
|
21
|
+
return "google";
|
|
22
|
+
if (model.startsWith("llama") || model.startsWith("mistral") || model.startsWith("codellama"))
|
|
23
|
+
return "ollama";
|
|
24
|
+
return "openai"; // fallback assumption
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Dynamically import a Vercel AI SDK provider and create a model instance
|
|
28
|
+
*/
|
|
29
|
+
async function createModelInstance(provider, modelName, apiKey) {
|
|
30
|
+
debug("Creating model instance: provider=%s, model=%s", provider, modelName);
|
|
31
|
+
switch (provider) {
|
|
32
|
+
case "anthropic": {
|
|
33
|
+
try {
|
|
34
|
+
// @ts-ignore - Optional dependency, will be checked at runtime
|
|
35
|
+
const { createAnthropic } = await import("@ai-sdk/anthropic");
|
|
36
|
+
const anthropic = createAnthropic({ apiKey });
|
|
37
|
+
return anthropic(modelName);
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e.code === "ERR_MODULE_NOT_FOUND" || e.code === "MODULE_NOT_FOUND") {
|
|
41
|
+
throw ErrorHandler.createError(ErrorCode.AI_PROVIDER_UNAVAILABLE, "Anthropic provider not installed. Run: bun add @ai-sdk/anthropic", {});
|
|
42
|
+
}
|
|
43
|
+
throw e;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
case "openai": {
|
|
47
|
+
try {
|
|
48
|
+
// @ts-ignore - Optional dependency, will be checked at runtime
|
|
49
|
+
const { createOpenAI } = await import("@ai-sdk/openai");
|
|
50
|
+
const openai = createOpenAI({ apiKey });
|
|
51
|
+
return openai(modelName);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
if (e.code === "ERR_MODULE_NOT_FOUND" || e.code === "MODULE_NOT_FOUND") {
|
|
55
|
+
throw ErrorHandler.createError(ErrorCode.AI_PROVIDER_UNAVAILABLE, "OpenAI provider not installed. Run: bun add @ai-sdk/openai", {});
|
|
56
|
+
}
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
throw ErrorHandler.createError(ErrorCode.AI_PROVIDER_UNAVAILABLE, `Unsupported AI provider: "${provider}". Install and configure the @ai-sdk/${provider} package.`, {});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class ModelRouter {
|
|
65
|
+
config;
|
|
66
|
+
constructor(config) {
|
|
67
|
+
this.config = config;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a model instance for a given step, with fallback chain.
|
|
71
|
+
*
|
|
72
|
+
* @param stepProvider Provider override from step config
|
|
73
|
+
* @param stepModel Model override from step config
|
|
74
|
+
* @param stepApiKeyEnvVar Env var name override for API key (from step config)
|
|
75
|
+
* @returns ResolvedModel ready for Vercel AI SDK
|
|
76
|
+
*/
|
|
77
|
+
async resolve(stepProvider, stepModel, stepApiKeyEnvVar) {
|
|
78
|
+
const modelName = stepModel || this.config.model;
|
|
79
|
+
if (!modelName) {
|
|
80
|
+
throw ErrorHandler.createError(ErrorCode.AI_PROVIDER_UNAVAILABLE, "No AI model configured. Set ai.model in hypergen.config.js or specify model in the AI step.", {});
|
|
81
|
+
}
|
|
82
|
+
const provider = stepProvider || this.config.provider || inferProvider(modelName);
|
|
83
|
+
const apiKey = resolveApiKey(stepApiKeyEnvVar || this.config.apiKeyEnvVar, provider);
|
|
84
|
+
// Try primary model
|
|
85
|
+
try {
|
|
86
|
+
const model = await createModelInstance(provider, modelName, apiKey);
|
|
87
|
+
return { model, provider, modelName };
|
|
88
|
+
}
|
|
89
|
+
catch (primaryError) {
|
|
90
|
+
debug("Primary model failed: %s", primaryError.message);
|
|
91
|
+
// Try fallback models
|
|
92
|
+
const fallbacks = this.config.fallbackModels || [];
|
|
93
|
+
for (const fallback of fallbacks) {
|
|
94
|
+
try {
|
|
95
|
+
const fallbackKey = resolveApiKey(fallback.apiKeyEnvVar, fallback.provider);
|
|
96
|
+
const model = await createModelInstance(fallback.provider, fallback.model, fallbackKey);
|
|
97
|
+
debug("Using fallback model: %s/%s", fallback.provider, fallback.model);
|
|
98
|
+
return {
|
|
99
|
+
model,
|
|
100
|
+
provider: fallback.provider,
|
|
101
|
+
modelName: fallback.model,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (fallbackError) {
|
|
105
|
+
debug("Fallback model %s/%s failed: %s", fallback.provider, fallback.model, fallbackError.message);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// All models failed
|
|
109
|
+
throw primaryError;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=model-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/ai/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates AI-generated output for syntax correctness, import safety,
|
|
5
|
+
* and schema compliance. Supports retry-with-feedback.
|
|
6
|
+
*/
|
|
7
|
+
import type { AIGuardrailConfig } from "./ai-config.js";
|
|
8
|
+
/**
|
|
9
|
+
* Validation result from a single validation pass
|
|
10
|
+
*/
|
|
11
|
+
export interface ValidationResult {
|
|
12
|
+
passed: boolean;
|
|
13
|
+
errors: string[];
|
|
14
|
+
warnings: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Validate AI output according to guardrail configuration
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateOutput(output: string, guardrails: AIGuardrailConfig | undefined, projectRoot: string): Promise<ValidationResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Build feedback message from validation errors for retry-with-feedback
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildValidationFeedback(result: ValidationResult): string;
|
|
24
|
+
//# sourceMappingURL=output-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-validator.d.ts","sourceRoot":"","sources":["../../src/ai/output-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AA4PD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAUxE"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates AI-generated output for syntax correctness, import safety,
|
|
5
|
+
* and schema compliance. Supports retry-with-feedback.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import createDebug from "debug";
|
|
10
|
+
const debug = createDebug("hypergen:ai:output-validator");
|
|
11
|
+
/**
|
|
12
|
+
* Validate AI output according to guardrail configuration
|
|
13
|
+
*/
|
|
14
|
+
export async function validateOutput(output, guardrails, projectRoot) {
|
|
15
|
+
if (!guardrails) {
|
|
16
|
+
return { passed: true, errors: [], warnings: [] };
|
|
17
|
+
}
|
|
18
|
+
const errors = [];
|
|
19
|
+
const warnings = [];
|
|
20
|
+
// Syntax validation
|
|
21
|
+
if (guardrails.validateSyntax) {
|
|
22
|
+
const syntaxResult = validateSyntax(output, guardrails.validateSyntax);
|
|
23
|
+
errors.push(...syntaxResult.errors);
|
|
24
|
+
warnings.push(...syntaxResult.warnings);
|
|
25
|
+
}
|
|
26
|
+
// Import validation
|
|
27
|
+
if (guardrails.requireKnownImports || guardrails.allowedImports || guardrails.blockedImports) {
|
|
28
|
+
const importResult = validateImports(output, guardrails, projectRoot);
|
|
29
|
+
errors.push(...importResult.errors);
|
|
30
|
+
warnings.push(...importResult.warnings);
|
|
31
|
+
}
|
|
32
|
+
// Max output length
|
|
33
|
+
if (guardrails.maxOutputLength && output.length > guardrails.maxOutputLength) {
|
|
34
|
+
errors.push(`Output length (${output.length}) exceeds maximum (${guardrails.maxOutputLength})`);
|
|
35
|
+
}
|
|
36
|
+
// Empty/gibberish check
|
|
37
|
+
if (output.trim().length === 0) {
|
|
38
|
+
errors.push("AI returned empty output");
|
|
39
|
+
}
|
|
40
|
+
else if (output.trim().length < 10) {
|
|
41
|
+
warnings.push("AI output is suspiciously short");
|
|
42
|
+
}
|
|
43
|
+
const passed = errors.length === 0;
|
|
44
|
+
debug("Validation %s: %d errors, %d warnings", passed ? "passed" : "failed", errors.length, warnings.length);
|
|
45
|
+
return { passed, errors, warnings };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate syntax for supported languages
|
|
49
|
+
*/
|
|
50
|
+
function validateSyntax(output, lang) {
|
|
51
|
+
const errors = [];
|
|
52
|
+
const warnings = [];
|
|
53
|
+
const language = lang === true ? "javascript" : lang;
|
|
54
|
+
switch (language) {
|
|
55
|
+
case "json": {
|
|
56
|
+
try {
|
|
57
|
+
JSON.parse(output);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
errors.push(`JSON syntax error: ${e.message}`);
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case "yaml": {
|
|
65
|
+
try {
|
|
66
|
+
// Dynamic import to avoid requiring yaml for non-yaml validation
|
|
67
|
+
const yaml = require("js-yaml");
|
|
68
|
+
yaml.load(output);
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
errors.push(`YAML syntax error: ${e.message}`);
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case "typescript":
|
|
76
|
+
case "javascript": {
|
|
77
|
+
// Use TypeScript compiler API for syntax-only check
|
|
78
|
+
try {
|
|
79
|
+
const ts = require("typescript");
|
|
80
|
+
const sourceFile = ts.createSourceFile(language === "typescript" ? "output.ts" : "output.js", output, ts.ScriptTarget.Latest, true, // setParentNodes
|
|
81
|
+
language === "typescript" ? ts.ScriptKind.TS : ts.ScriptKind.JS);
|
|
82
|
+
// Check for syntax diagnostics
|
|
83
|
+
const diagnostics = sourceFile.parseDiagnostics || [];
|
|
84
|
+
for (const diag of diagnostics) {
|
|
85
|
+
const message = ts.flattenDiagnosticMessageText(diag.messageText, "\n");
|
|
86
|
+
const line = diag.start !== undefined
|
|
87
|
+
? sourceFile.getLineAndCharacterOfPosition(diag.start).line + 1
|
|
88
|
+
: "?";
|
|
89
|
+
errors.push(`${language} syntax error at line ${line}: ${message}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
// If TypeScript is not available, fall back to basic check
|
|
94
|
+
if (e.code === "MODULE_NOT_FOUND") {
|
|
95
|
+
debug("TypeScript not available for syntax validation, skipping");
|
|
96
|
+
warnings.push("TypeScript compiler not available for syntax validation");
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
errors.push(`Syntax validation error: ${e.message}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case "css":
|
|
105
|
+
case "html":
|
|
106
|
+
// Basic heuristic checks for CSS/HTML
|
|
107
|
+
debug("Basic validation for %s (no full parser)", language);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
debug("Unknown language for syntax validation: %s", language);
|
|
111
|
+
}
|
|
112
|
+
return { passed: errors.length === 0, errors, warnings };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate imports against package.json and allow/block lists
|
|
116
|
+
*/
|
|
117
|
+
function validateImports(output, guardrails, projectRoot) {
|
|
118
|
+
const errors = [];
|
|
119
|
+
const warnings = [];
|
|
120
|
+
// Extract import statements (ES modules and CommonJS)
|
|
121
|
+
const importRegex = /(?:import\s+(?:[\w{}\s,*]+\s+from\s+)?['"]([^'"]+)['"]|require\s*\(\s*['"]([^'"]+)['"]\s*\))/g;
|
|
122
|
+
const imports = [];
|
|
123
|
+
let match = importRegex.exec(output);
|
|
124
|
+
while (match !== null) {
|
|
125
|
+
const pkg = match[1] || match[2];
|
|
126
|
+
// Only check external packages (not relative paths or built-in modules)
|
|
127
|
+
if (pkg &&
|
|
128
|
+
!pkg.startsWith(".") &&
|
|
129
|
+
!pkg.startsWith("/") &&
|
|
130
|
+
!pkg.startsWith("#") &&
|
|
131
|
+
!isNodeBuiltin(pkg)) {
|
|
132
|
+
// Get the package name (handle scoped packages)
|
|
133
|
+
const packageName = pkg.startsWith("@")
|
|
134
|
+
? pkg.split("/").slice(0, 2).join("/")
|
|
135
|
+
: pkg.split("/")[0];
|
|
136
|
+
imports.push(packageName);
|
|
137
|
+
}
|
|
138
|
+
match = importRegex.exec(output);
|
|
139
|
+
}
|
|
140
|
+
if (imports.length === 0)
|
|
141
|
+
return { passed: true, errors, warnings };
|
|
142
|
+
// Check blocked imports
|
|
143
|
+
if (guardrails.blockedImports) {
|
|
144
|
+
for (const imp of imports) {
|
|
145
|
+
if (guardrails.blockedImports.includes(imp)) {
|
|
146
|
+
errors.push(`Blocked import: "${imp}" is not allowed`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Check allowed imports
|
|
151
|
+
if (guardrails.allowedImports) {
|
|
152
|
+
for (const imp of imports) {
|
|
153
|
+
if (!guardrails.allowedImports.includes(imp)) {
|
|
154
|
+
errors.push(`Import "${imp}" is not in the allowed list: ${guardrails.allowedImports.join(", ")}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Check against package.json
|
|
159
|
+
if (guardrails.requireKnownImports) {
|
|
160
|
+
const packageJsonPath = path.resolve(projectRoot, "package.json");
|
|
161
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
162
|
+
try {
|
|
163
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
164
|
+
const knownPackages = new Set([
|
|
165
|
+
...Object.keys(packageJson.dependencies || {}),
|
|
166
|
+
...Object.keys(packageJson.devDependencies || {}),
|
|
167
|
+
...Object.keys(packageJson.peerDependencies || {}),
|
|
168
|
+
...Object.keys(packageJson.optionalDependencies || {}),
|
|
169
|
+
]);
|
|
170
|
+
for (const imp of imports) {
|
|
171
|
+
if (!knownPackages.has(imp)) {
|
|
172
|
+
errors.push(`Import "${imp}" not found in package.json`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
warnings.push("Could not read package.json for import validation");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
warnings.push("No package.json found for import validation");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { passed: errors.length === 0, errors, warnings };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check if a module name is a Node.js built-in
|
|
188
|
+
*/
|
|
189
|
+
function isNodeBuiltin(name) {
|
|
190
|
+
const builtins = new Set([
|
|
191
|
+
"assert",
|
|
192
|
+
"buffer",
|
|
193
|
+
"child_process",
|
|
194
|
+
"cluster",
|
|
195
|
+
"console",
|
|
196
|
+
"constants",
|
|
197
|
+
"crypto",
|
|
198
|
+
"dgram",
|
|
199
|
+
"dns",
|
|
200
|
+
"domain",
|
|
201
|
+
"events",
|
|
202
|
+
"fs",
|
|
203
|
+
"http",
|
|
204
|
+
"https",
|
|
205
|
+
"module",
|
|
206
|
+
"net",
|
|
207
|
+
"os",
|
|
208
|
+
"path",
|
|
209
|
+
"perf_hooks",
|
|
210
|
+
"process",
|
|
211
|
+
"punycode",
|
|
212
|
+
"querystring",
|
|
213
|
+
"readline",
|
|
214
|
+
"repl",
|
|
215
|
+
"stream",
|
|
216
|
+
"string_decoder",
|
|
217
|
+
"sys",
|
|
218
|
+
"timers",
|
|
219
|
+
"tls",
|
|
220
|
+
"tty",
|
|
221
|
+
"url",
|
|
222
|
+
"util",
|
|
223
|
+
"v8",
|
|
224
|
+
"vm",
|
|
225
|
+
"worker_threads",
|
|
226
|
+
"zlib",
|
|
227
|
+
"node:assert",
|
|
228
|
+
"node:buffer",
|
|
229
|
+
"node:child_process",
|
|
230
|
+
"node:cluster",
|
|
231
|
+
"node:console",
|
|
232
|
+
"node:constants",
|
|
233
|
+
"node:crypto",
|
|
234
|
+
"node:dgram",
|
|
235
|
+
"node:dns",
|
|
236
|
+
"node:domain",
|
|
237
|
+
"node:events",
|
|
238
|
+
"node:fs",
|
|
239
|
+
"node:http",
|
|
240
|
+
"node:https",
|
|
241
|
+
"node:module",
|
|
242
|
+
"node:net",
|
|
243
|
+
"node:os",
|
|
244
|
+
"node:path",
|
|
245
|
+
"node:perf_hooks",
|
|
246
|
+
"node:process",
|
|
247
|
+
"node:punycode",
|
|
248
|
+
"node:querystring",
|
|
249
|
+
"node:readline",
|
|
250
|
+
"node:repl",
|
|
251
|
+
"node:stream",
|
|
252
|
+
"node:string_decoder",
|
|
253
|
+
"node:sys",
|
|
254
|
+
"node:test",
|
|
255
|
+
"node:timers",
|
|
256
|
+
"node:tls",
|
|
257
|
+
"node:tty",
|
|
258
|
+
"node:url",
|
|
259
|
+
"node:util",
|
|
260
|
+
"node:v8",
|
|
261
|
+
"node:vm",
|
|
262
|
+
"node:worker_threads",
|
|
263
|
+
"node:zlib",
|
|
264
|
+
]);
|
|
265
|
+
return builtins.has(name) || name.startsWith("node:");
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Build feedback message from validation errors for retry-with-feedback
|
|
269
|
+
*/
|
|
270
|
+
export function buildValidationFeedback(result) {
|
|
271
|
+
const lines = ["Your previous output had the following errors:"];
|
|
272
|
+
for (const error of result.errors) {
|
|
273
|
+
lines.push(`- ${error}`);
|
|
274
|
+
}
|
|
275
|
+
lines.push("");
|
|
276
|
+
lines.push("Fix these errors and regenerate. Do NOT include any explanation, only the corrected output.");
|
|
277
|
+
return lines.join("\n");
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=output-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-validator.js","sourceRoot":"","sources":["../../src/ai/output-validator.ts"],"names":[],"mappings":"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"}
|