@introspection-ai/recipes 0.13.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 +191 -0
- package/README.md +184 -0
- package/dist/agent-tool.d.ts +42 -0
- package/dist/agent-tool.d.ts.map +1 -0
- package/dist/agent-tool.js +159 -0
- package/dist/agent-tool.js.map +1 -0
- package/dist/child-agent-completions.d.ts +61 -0
- package/dist/child-agent-completions.d.ts.map +1 -0
- package/dist/child-agent-completions.js +135 -0
- package/dist/child-agent-completions.js.map +1 -0
- package/dist/child-agent-store.d.ts +48 -0
- package/dist/child-agent-store.d.ts.map +1 -0
- package/dist/child-agent-store.js +98 -0
- package/dist/child-agent-store.js.map +1 -0
- package/dist/child-agent.d.ts +43 -0
- package/dist/child-agent.d.ts.map +1 -0
- package/dist/child-agent.js +268 -0
- package/dist/child-agent.js.map +1 -0
- package/dist/direct-cli.d.ts +9 -0
- package/dist/direct-cli.d.ts.map +1 -0
- package/dist/direct-cli.js +22 -0
- package/dist/direct-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +26 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +70 -0
- package/dist/inspect.js.map +1 -0
- package/dist/interactions.d.ts +204 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +358 -0
- package/dist/interactions.js.map +1 -0
- package/dist/mcp-catalog.d.ts +8 -0
- package/dist/mcp-catalog.d.ts.map +1 -0
- package/dist/mcp-catalog.js +60 -0
- package/dist/mcp-catalog.js.map +1 -0
- package/dist/mcp-cli-core.d.ts +79 -0
- package/dist/mcp-cli-core.d.ts.map +1 -0
- package/dist/mcp-cli-core.js +1717 -0
- package/dist/mcp-cli-core.js.map +1 -0
- package/dist/mcp-cli-help.d.ts +2 -0
- package/dist/mcp-cli-help.d.ts.map +1 -0
- package/dist/mcp-cli-help.js +36 -0
- package/dist/mcp-cli-help.js.map +1 -0
- package/dist/mcp-cli-policy.d.ts +17 -0
- package/dist/mcp-cli-policy.d.ts.map +1 -0
- package/dist/mcp-cli-policy.js +230 -0
- package/dist/mcp-cli-policy.js.map +1 -0
- package/dist/mcp-cli.d.ts +3 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +33 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/mcp-client.d.ts +3 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +86 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-command-context.d.ts +13 -0
- package/dist/mcp-command-context.d.ts.map +1 -0
- package/dist/mcp-command-context.js +29 -0
- package/dist/mcp-command-context.js.map +1 -0
- package/dist/mcp-contract.d.ts +16 -0
- package/dist/mcp-contract.d.ts.map +1 -0
- package/dist/mcp-contract.js +306 -0
- package/dist/mcp-contract.js.map +1 -0
- package/dist/mcp-daemon-client.d.ts +10 -0
- package/dist/mcp-daemon-client.d.ts.map +1 -0
- package/dist/mcp-daemon-client.js +119 -0
- package/dist/mcp-daemon-client.js.map +1 -0
- package/dist/mcp-daemon-protocol.d.ts +64 -0
- package/dist/mcp-daemon-protocol.d.ts.map +1 -0
- package/dist/mcp-daemon-protocol.js +6 -0
- package/dist/mcp-daemon-protocol.js.map +1 -0
- package/dist/mcp-daemon.d.ts +3 -0
- package/dist/mcp-daemon.d.ts.map +1 -0
- package/dist/mcp-daemon.js +76880 -0
- package/dist/mcp-daemon.js.map +1 -0
- package/dist/mcp-run-worker.d.ts +2 -0
- package/dist/mcp-run-worker.d.ts.map +1 -0
- package/dist/mcp-run-worker.js +76579 -0
- package/dist/mcp-run-worker.js.map +1 -0
- package/dist/mcp.d.ts +168 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +558 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pi-extension.d.ts +30 -0
- package/dist/pi-extension.d.ts.map +1 -0
- package/dist/pi-extension.js +880 -0
- package/dist/pi-extension.js.map +1 -0
- package/dist/provider-env.d.ts +2 -0
- package/dist/provider-env.d.ts.map +1 -0
- package/dist/provider-env.js +21 -0
- package/dist/provider-env.js.map +1 -0
- package/dist/recipe/resolve.d.ts +30 -0
- package/dist/recipe/resolve.d.ts.map +1 -0
- package/dist/recipe/resolve.js +131 -0
- package/dist/recipe/resolve.js.map +1 -0
- package/dist/recipe-agent.d.ts +71 -0
- package/dist/recipe-agent.d.ts.map +1 -0
- package/dist/recipe-agent.js +555 -0
- package/dist/recipe-agent.js.map +1 -0
- package/dist/recipe-extensions.d.ts +9 -0
- package/dist/recipe-extensions.d.ts.map +1 -0
- package/dist/recipe-extensions.js +81 -0
- package/dist/recipe-extensions.js.map +1 -0
- package/dist/recipe-mcp-config.d.ts +15 -0
- package/dist/recipe-mcp-config.d.ts.map +1 -0
- package/dist/recipe-mcp-config.js +82 -0
- package/dist/recipe-mcp-config.js.map +1 -0
- package/dist/recipe-model.d.ts +49 -0
- package/dist/recipe-model.d.ts.map +1 -0
- package/dist/recipe-model.js +299 -0
- package/dist/recipe-model.js.map +1 -0
- package/dist/recipe-package.d.ts +79 -0
- package/dist/recipe-package.d.ts.map +1 -0
- package/dist/recipe-package.js +479 -0
- package/dist/recipe-package.js.map +1 -0
- package/dist/recipe-skills.d.ts +7 -0
- package/dist/recipe-skills.d.ts.map +1 -0
- package/dist/recipe-skills.js +46 -0
- package/dist/recipe-skills.js.map +1 -0
- package/dist/run-controller.d.ts +32 -0
- package/dist/run-controller.d.ts.map +1 -0
- package/dist/run-controller.js +259 -0
- package/dist/run-controller.js.map +1 -0
- package/dist/run.d.ts +28 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +84 -0
- package/dist/run.js.map +1 -0
- package/dist/session.d.ts +140 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +363 -0
- package/dist/session.js.map +1 -0
- package/dist/test-utils.d.ts +32 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +259 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +96 -0
- package/dist/testing.js.map +1 -0
- package/docs/agent-composition.md +196 -0
- package/docs/deployment-configuration.md +65 -0
- package/docs/index.md +49 -0
- package/docs/interactions.md +210 -0
- package/docs/mcp-auth.md +80 -0
- package/docs/mcp-configuration.md +126 -0
- package/docs/migration.md +70 -0
- package/docs/pi-extension.md +97 -0
- package/docs/python-bindings-release.md +47 -0
- package/docs/recipe-evals.md +70 -0
- package/docs/recipe-flow.md +41 -0
- package/docs/recipe-format.md +186 -0
- package/docs/recipe-judges.md +152 -0
- package/docs/runtime-library.md +171 -0
- package/package.json +106 -0
- package/vendor/mcp-client/darwin-arm64/mcp-client +0 -0
- package/vendor/mcp-client/darwin-x64/mcp-client +0 -0
- package/vendor/mcp-client/linux-arm64/mcp-client +0 -0
- package/vendor/mcp-client/linux-x64/mcp-client +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
function resolvePackage(specifier) {
|
|
6
|
+
try {
|
|
7
|
+
return import.meta.resolve(specifier);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// Fall through to CommonJS resolution for packages that do not expose ESM exports.
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
return require.resolve(specifier);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function resolvePackageModuleRoot(packageName) {
|
|
20
|
+
const resolved = resolvePackage(packageName);
|
|
21
|
+
if (!resolved)
|
|
22
|
+
return undefined;
|
|
23
|
+
return dirname(resolved.startsWith("file:") ? fileURLToPath(resolved) : resolved);
|
|
24
|
+
}
|
|
25
|
+
function recipeExtensionAliases() {
|
|
26
|
+
const recipesRoot = resolvePackageModuleRoot("@introspection-ai/recipes");
|
|
27
|
+
return Object.fromEntries([
|
|
28
|
+
// Jiti aliases are package-prefix mappings. They must point at the
|
|
29
|
+
// directory containing a package's resolved modules, not an entry file,
|
|
30
|
+
// so Jiti can append exported subpaths without corrupting the path.
|
|
31
|
+
// The self-alias also keeps recipe interaction imports on this package
|
|
32
|
+
// instance, sharing interrupt state with the child-agent runner.
|
|
33
|
+
["@introspection-ai/recipes", recipesRoot],
|
|
34
|
+
// Recipes authored before the package rename keep sharing this runtime's
|
|
35
|
+
// interaction state instead of loading a second legacy package copy.
|
|
36
|
+
["@introspection-ai/pi-recipes", recipesRoot],
|
|
37
|
+
["@earendil-works/pi-coding-agent", resolvePackageModuleRoot("@earendil-works/pi-coding-agent")],
|
|
38
|
+
["@earendil-works/pi-agent-core", resolvePackageModuleRoot("@earendil-works/pi-agent-core")],
|
|
39
|
+
["@earendil-works/pi-ai", resolvePackageModuleRoot("@earendil-works/pi-ai")],
|
|
40
|
+
["typebox", resolvePackageModuleRoot("typebox")],
|
|
41
|
+
["@sinclair/typebox", resolvePackageModuleRoot("typebox")],
|
|
42
|
+
].filter((entry) => Boolean(entry[1])));
|
|
43
|
+
}
|
|
44
|
+
function loadJiti() {
|
|
45
|
+
try {
|
|
46
|
+
return require("jiti");
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
const piAgentEntry = resolvePackage("@earendil-works/pi-coding-agent");
|
|
50
|
+
if (!piAgentEntry) {
|
|
51
|
+
throw new Error("Unable to resolve @earendil-works/pi-coding-agent for recipe extension loading");
|
|
52
|
+
}
|
|
53
|
+
const piRequire = createRequire(piAgentEntry);
|
|
54
|
+
return piRequire("jiti");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Load a recipe-declared extension module and return its factory. TS sources
|
|
59
|
+
* load through jiti with package aliases pinned to this package's resolved
|
|
60
|
+
* module instances, so recipe extensions share interaction/interrupt state
|
|
61
|
+
* with their host.
|
|
62
|
+
*/
|
|
63
|
+
export async function loadRecipeExtensionFactory(recipeDir, extensionPath) {
|
|
64
|
+
const { createJiti } = loadJiti();
|
|
65
|
+
const recipeLoaderUrl = pathToFileURL(join(recipeDir, ".recipe-extension-loader.js")).href;
|
|
66
|
+
const jiti = createJiti(recipeLoaderUrl, {
|
|
67
|
+
moduleCache: false,
|
|
68
|
+
alias: recipeExtensionAliases(),
|
|
69
|
+
});
|
|
70
|
+
const loaded = await jiti.import(extensionPath, { default: true });
|
|
71
|
+
const factory = typeof loaded === "function"
|
|
72
|
+
? loaded
|
|
73
|
+
: loaded && typeof loaded === "object" && "default" in loaded && typeof loaded.default === "function"
|
|
74
|
+
? loaded.default
|
|
75
|
+
: undefined;
|
|
76
|
+
if (!factory) {
|
|
77
|
+
throw new Error(`Recipe extension does not export a factory function: ${extensionPath}`);
|
|
78
|
+
}
|
|
79
|
+
return factory;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=recipe-extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-extensions.js","sourceRoot":"","sources":["../src/recipe-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGxD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,SAAS,cAAc,CAAC,SAAiB;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,mFAAmF;IACrF,CAAC;IACD,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAmB;IACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,WAAW,GAAG,wBAAwB,CAAC,2BAA2B,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,WAAW,CACvB;QACE,mEAAmE;QACnE,wEAAwE;QACxE,oEAAoE;QACpE,uEAAuE;QACvE,iEAAiE;QACjE,CAAC,2BAA2B,EAAE,WAAW,CAAC;QAC1C,yEAAyE;QACzE,qEAAqE;QACrE,CAAC,8BAA8B,EAAE,WAAW,CAAC;QAC7C,CAAC,iCAAiC,EAAE,wBAAwB,CAAC,iCAAiC,CAAC,CAAC;QAChG,CAAC,+BAA+B,EAAE,wBAAwB,CAAC,+BAA+B,CAAC,CAAC;QAC5F,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;QAC5E,CAAC,SAAS,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAC;KAC3D,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,CAAgC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,YAAY,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;QACpG,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,OAAO,SAAS,CAAC,MAAM,CAAgC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAiB,EACjB,aAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,EAAE;QACvC,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,sBAAsB,EAAE;KAChC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GACX,OAAO,MAAM,KAAK,UAAU;QAC1B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;YACnG,CAAC,CAAC,MAAM,CAAC,OAAO;YAChB,CAAC,CAAC,SAAS,CAAC;IAClB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wDAAwD,aAAa,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,OAA2B,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RecipePackageManifest } from "./recipe-package.js";
|
|
2
|
+
export interface RecipeMcpLocalConfigResult {
|
|
3
|
+
path: string;
|
|
4
|
+
created: boolean;
|
|
5
|
+
source: "example" | "generated" | "existing";
|
|
6
|
+
envVars: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function recipeMcpLocalExamplePath(recipeDir: string): string;
|
|
9
|
+
export declare function recipeMcpLocalConfigPath(recipeDir: string): string;
|
|
10
|
+
export declare function envPrefixForServer(id: string): string;
|
|
11
|
+
/** The generated-binding env var names for a package MCP server id. */
|
|
12
|
+
export declare function generatedBindingEnvVars(serverId: string): string[];
|
|
13
|
+
export declare function placeholderEnvVars(content: string): string[];
|
|
14
|
+
export declare function materializeRecipeMcpLocalConfig(recipeDir: string, manifest: RecipePackageManifest): Promise<RecipeMcpLocalConfigResult | undefined>;
|
|
15
|
+
//# sourceMappingURL=recipe-mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-mcp-config.d.ts","sourceRoot":"","sources":["../src/recipe-mcp-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5D;AAkBD,wBAAsB,+BAA+B,CACnD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CA6CjD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { chmod, copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
export function recipeMcpLocalExamplePath(recipeDir) {
|
|
5
|
+
return join(recipeDir, ".pi", "mcp.local.example.json");
|
|
6
|
+
}
|
|
7
|
+
export function recipeMcpLocalConfigPath(recipeDir) {
|
|
8
|
+
return join(recipeDir, ".pi", "mcp.local.json");
|
|
9
|
+
}
|
|
10
|
+
export function envPrefixForServer(id) {
|
|
11
|
+
const normalized = id
|
|
12
|
+
.replace(/[^a-zA-Z0-9]+/g, "_")
|
|
13
|
+
.replace(/^_+|_+$/g, "")
|
|
14
|
+
.toUpperCase();
|
|
15
|
+
return normalized.replace(/_MCP$/, "") || "MCP";
|
|
16
|
+
}
|
|
17
|
+
/** The generated-binding env var names for a package MCP server id. */
|
|
18
|
+
export function generatedBindingEnvVars(serverId) {
|
|
19
|
+
const prefix = envPrefixForServer(serverId);
|
|
20
|
+
return [`${prefix}_MCP_URL`, `${prefix}_MCP_TOKEN`];
|
|
21
|
+
}
|
|
22
|
+
export function placeholderEnvVars(content) {
|
|
23
|
+
return Array.from(new Set(Array.from(content.matchAll(/\$\{([A-Z_][A-Z0-9_]*)\}/g))
|
|
24
|
+
.map((match) => match[1])
|
|
25
|
+
.sort()));
|
|
26
|
+
}
|
|
27
|
+
function generatedMcpLocalConfig(manifest) {
|
|
28
|
+
const servers = manifest.mcp.servers.map((server) => {
|
|
29
|
+
const prefix = envPrefixForServer(server.id);
|
|
30
|
+
return {
|
|
31
|
+
id: server.id,
|
|
32
|
+
transport: "streamable_http",
|
|
33
|
+
url: `\${${prefix}_MCP_URL}`,
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer \${${prefix}_MCP_TOKEN}`,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
return `${JSON.stringify({ servers }, null, 2)}\n`;
|
|
40
|
+
}
|
|
41
|
+
export async function materializeRecipeMcpLocalConfig(recipeDir, manifest) {
|
|
42
|
+
const target = recipeMcpLocalConfigPath(recipeDir);
|
|
43
|
+
const example = recipeMcpLocalExamplePath(recipeDir);
|
|
44
|
+
const hasExample = existsSync(example);
|
|
45
|
+
const hasMcp = hasExample ||
|
|
46
|
+
manifest.mcp.servers.length > 0 ||
|
|
47
|
+
manifest.mcp.manifests.length > 0;
|
|
48
|
+
if (!hasMcp)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (existsSync(target)) {
|
|
51
|
+
const content = await readFile(target, "utf8");
|
|
52
|
+
return {
|
|
53
|
+
path: target,
|
|
54
|
+
created: false,
|
|
55
|
+
source: "existing",
|
|
56
|
+
envVars: placeholderEnvVars(content),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
await mkdir(dirname(target), { recursive: true });
|
|
60
|
+
if (hasExample) {
|
|
61
|
+
await copyFile(example, target);
|
|
62
|
+
await chmod(target, 0o600);
|
|
63
|
+
const content = await readFile(target, "utf8");
|
|
64
|
+
return {
|
|
65
|
+
path: target,
|
|
66
|
+
created: true,
|
|
67
|
+
source: "example",
|
|
68
|
+
envVars: placeholderEnvVars(content),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (manifest.mcp.servers.length === 0)
|
|
72
|
+
return undefined;
|
|
73
|
+
const content = generatedMcpLocalConfig(manifest);
|
|
74
|
+
await writeFile(target, content, { mode: 0o600 });
|
|
75
|
+
return {
|
|
76
|
+
path: target,
|
|
77
|
+
created: true,
|
|
78
|
+
source: "generated",
|
|
79
|
+
envVars: placeholderEnvVars(content),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=recipe-mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-mcp-config.js","sourceRoot":"","sources":["../src/recipe-mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { CacheRetention, Model, OpenRouterRouting } from "@earendil-works/pi-ai";
|
|
3
|
+
import type { AgentSession } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
export interface RecipeAgentModelStreamOptions {
|
|
5
|
+
temperature?: number;
|
|
6
|
+
maxTokens?: number;
|
|
7
|
+
cacheRetention?: CacheRetention;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
maxRetryDelayMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface RecipeAgentModelAnthropicOptions {
|
|
13
|
+
betas?: string[];
|
|
14
|
+
contextManagement?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface RecipeAgentModelConfig {
|
|
17
|
+
name?: string;
|
|
18
|
+
thinkingLevel?: ThinkingLevel;
|
|
19
|
+
streamOptions?: RecipeAgentModelStreamOptions;
|
|
20
|
+
openrouter?: OpenRouterRouting;
|
|
21
|
+
anthropic?: RecipeAgentModelAnthropicOptions;
|
|
22
|
+
}
|
|
23
|
+
export declare class RecipeModelConfigError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse an agent YAML `model:` block into a validated config.
|
|
28
|
+
*
|
|
29
|
+
* Accepts the documented keys only; unknown keys, malformed values, and
|
|
30
|
+
* conflicting `thinking_level`/`reasoning_effort` throw
|
|
31
|
+
* {@link RecipeModelConfigError} so typos fail loudly instead of silently
|
|
32
|
+
* changing model behavior.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseRecipeAgentModelConfig(context: string, value: unknown): RecipeAgentModelConfig | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Merge a child agent's model config over its `from:` base. Sections
|
|
37
|
+
* (`streamOptions`, `openrouter`, `anthropic`) merge by key so a child can
|
|
38
|
+
* override one option without restating the base's.
|
|
39
|
+
*/
|
|
40
|
+
export declare function mergeRecipeAgentModelConfig(base: RecipeAgentModelConfig | undefined, overlay: RecipeAgentModelConfig | undefined): RecipeAgentModelConfig | undefined;
|
|
41
|
+
/** Apply provider routing and header options onto a pi-ai model instance. */
|
|
42
|
+
export declare function applyRecipeAgentModelConfigToModel<T extends Model<any>>(model: T, config: RecipeAgentModelConfig | undefined): T;
|
|
43
|
+
/**
|
|
44
|
+
* Apply stream options and Anthropic context management onto a live agent
|
|
45
|
+
* session. Wraps the session's stream function and payload hook; safe to call
|
|
46
|
+
* once per session.
|
|
47
|
+
*/
|
|
48
|
+
export declare function applyRecipeAgentModelConfigToSession(session: AgentSession, config: RecipeAgentModelConfig | undefined): void;
|
|
49
|
+
//# sourceMappingURL=recipe-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-model.d.ts","sourceRoot":"","sources":["../src/recipe-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAiDpE,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,6BAA6B,CAAC;IAC9C,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,SAAS,CAAC,EAAE,gCAAgC,CAAC;CAC9C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAqLD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,sBAAsB,GAAG,SAAS,CA2FpC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,sBAAsB,GAAG,SAAS,EACxC,OAAO,EAAE,sBAAsB,GAAG,SAAS,GAC1C,sBAAsB,GAAG,SAAS,CAsBpC;AAED,6EAA6E;AAC7E,wBAAgB,kCAAkC,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EACrE,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,sBAAsB,GAAG,SAAS,GACzC,CAAC,CAsBH;AA4BD;;;;GAIG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,sBAAsB,GAAG,SAAS,GACzC,IAAI,CA2BN"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
const THINKING_LEVELS = new Set([
|
|
2
|
+
"off",
|
|
3
|
+
"minimal",
|
|
4
|
+
"low",
|
|
5
|
+
"medium",
|
|
6
|
+
"high",
|
|
7
|
+
"xhigh",
|
|
8
|
+
]);
|
|
9
|
+
const CACHE_RETENTIONS = new Set(["none", "short", "long"]);
|
|
10
|
+
const MODEL_KEYS = new Set([
|
|
11
|
+
"name",
|
|
12
|
+
"thinking_level",
|
|
13
|
+
"thinkingLevel",
|
|
14
|
+
"reasoning_effort",
|
|
15
|
+
"temperature",
|
|
16
|
+
"max_tokens",
|
|
17
|
+
"cache_retention",
|
|
18
|
+
"timeout_ms",
|
|
19
|
+
"max_retries",
|
|
20
|
+
"max_retry_delay_ms",
|
|
21
|
+
"providers",
|
|
22
|
+
]);
|
|
23
|
+
const PROVIDER_KEYS = new Set(["openrouter", "anthropic"]);
|
|
24
|
+
const OPENROUTER_PROVIDER_KEYS = new Set(["routing"]);
|
|
25
|
+
const OPENROUTER_KEYS = new Set([
|
|
26
|
+
"allow_fallbacks",
|
|
27
|
+
"require_parameters",
|
|
28
|
+
"data_collection",
|
|
29
|
+
"zdr",
|
|
30
|
+
"enforce_distillable_text",
|
|
31
|
+
"order",
|
|
32
|
+
"only",
|
|
33
|
+
"ignore",
|
|
34
|
+
"quantizations",
|
|
35
|
+
"sort",
|
|
36
|
+
"max_price",
|
|
37
|
+
"preferred_min_throughput",
|
|
38
|
+
"preferred_max_latency",
|
|
39
|
+
]);
|
|
40
|
+
const ANTHROPIC_KEYS = new Set(["betas", "context_management"]);
|
|
41
|
+
export class RecipeModelConfigError extends Error {
|
|
42
|
+
constructor(message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.name = "RecipeModelConfigError";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function isRecord(value) {
|
|
48
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
49
|
+
}
|
|
50
|
+
function hasKeys(value) {
|
|
51
|
+
return value !== undefined && Object.keys(value).length > 0;
|
|
52
|
+
}
|
|
53
|
+
function optionalString(context, key, value) {
|
|
54
|
+
if (value === undefined)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (typeof value !== "string") {
|
|
57
|
+
throw new RecipeModelConfigError(`${context} has invalid ${key}: expected string`);
|
|
58
|
+
}
|
|
59
|
+
return value.trim() || undefined;
|
|
60
|
+
}
|
|
61
|
+
function optionalNumber(context, key, value, min) {
|
|
62
|
+
if (value === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < min) {
|
|
65
|
+
throw new RecipeModelConfigError(`${context} has invalid ${key}: expected number >= ${min}`);
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
function optionalInteger(context, key, value, min) {
|
|
70
|
+
const parsed = optionalNumber(context, key, value, min);
|
|
71
|
+
if (parsed === undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
if (!Number.isInteger(parsed)) {
|
|
74
|
+
throw new RecipeModelConfigError(`${context} has invalid ${key}: expected integer`);
|
|
75
|
+
}
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
function optionalStringArray(context, key, value) {
|
|
79
|
+
if (value === undefined)
|
|
80
|
+
return undefined;
|
|
81
|
+
if (!Array.isArray(value) ||
|
|
82
|
+
!value.every((item) => typeof item === "string" && item.trim())) {
|
|
83
|
+
throw new RecipeModelConfigError(`${context} has invalid ${key}: expected string array`);
|
|
84
|
+
}
|
|
85
|
+
return value.map((item) => item.trim());
|
|
86
|
+
}
|
|
87
|
+
function parseThinkingLevel(context, key, value) {
|
|
88
|
+
if (value === undefined)
|
|
89
|
+
return undefined;
|
|
90
|
+
if (typeof value !== "string" || !THINKING_LEVELS.has(value)) {
|
|
91
|
+
throw new RecipeModelConfigError(`${context} has unsupported ${key} "${value}"`);
|
|
92
|
+
}
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
function assertKnownKeys(context, keyPrefix, data, allowed) {
|
|
96
|
+
const unknown = Object.keys(data).filter((key) => !allowed.has(key));
|
|
97
|
+
if (unknown.length > 0) {
|
|
98
|
+
throw new RecipeModelConfigError(`${context} has unsupported ${keyPrefix} key(s): ${unknown.join(", ")}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function parseOpenRouterRouting(context, value) {
|
|
102
|
+
if (value === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (!isRecord(value)) {
|
|
105
|
+
throw new RecipeModelConfigError(`${context} has invalid model.providers.openrouter.routing: expected object`);
|
|
106
|
+
}
|
|
107
|
+
assertKnownKeys(context, "model.providers.openrouter.routing", value, OPENROUTER_KEYS);
|
|
108
|
+
return { ...value };
|
|
109
|
+
}
|
|
110
|
+
function parseOpenRouterProvider(context, value) {
|
|
111
|
+
if (value === undefined)
|
|
112
|
+
return undefined;
|
|
113
|
+
if (!isRecord(value)) {
|
|
114
|
+
throw new RecipeModelConfigError(`${context} has invalid model.providers.openrouter: expected object`);
|
|
115
|
+
}
|
|
116
|
+
assertKnownKeys(context, "model.providers.openrouter", value, OPENROUTER_PROVIDER_KEYS);
|
|
117
|
+
return parseOpenRouterRouting(context, value.routing);
|
|
118
|
+
}
|
|
119
|
+
function parseAnthropic(context, value) {
|
|
120
|
+
if (value === undefined)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (!isRecord(value)) {
|
|
123
|
+
throw new RecipeModelConfigError(`${context} has invalid model.providers.anthropic: expected object`);
|
|
124
|
+
}
|
|
125
|
+
assertKnownKeys(context, "model.providers.anthropic", value, ANTHROPIC_KEYS);
|
|
126
|
+
const betas = optionalStringArray(context, "model.providers.anthropic.betas", value.betas);
|
|
127
|
+
return {
|
|
128
|
+
...(betas ? { betas } : {}),
|
|
129
|
+
...(value.context_management !== undefined
|
|
130
|
+
? { contextManagement: value.context_management }
|
|
131
|
+
: {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function parseProviders(context, value) {
|
|
135
|
+
if (value === undefined)
|
|
136
|
+
return undefined;
|
|
137
|
+
if (!isRecord(value)) {
|
|
138
|
+
throw new RecipeModelConfigError(`${context} has invalid model.providers: expected object`);
|
|
139
|
+
}
|
|
140
|
+
assertKnownKeys(context, "model.providers", value, PROVIDER_KEYS);
|
|
141
|
+
const openrouter = parseOpenRouterProvider(context, value.openrouter);
|
|
142
|
+
const anthropic = parseAnthropic(context, value.anthropic);
|
|
143
|
+
return {
|
|
144
|
+
...(openrouter ? { openrouter } : {}),
|
|
145
|
+
...(anthropic ? { anthropic } : {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Parse an agent YAML `model:` block into a validated config.
|
|
150
|
+
*
|
|
151
|
+
* Accepts the documented keys only; unknown keys, malformed values, and
|
|
152
|
+
* conflicting `thinking_level`/`reasoning_effort` throw
|
|
153
|
+
* {@link RecipeModelConfigError} so typos fail loudly instead of silently
|
|
154
|
+
* changing model behavior.
|
|
155
|
+
*/
|
|
156
|
+
export function parseRecipeAgentModelConfig(context, value) {
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return undefined;
|
|
159
|
+
if (!isRecord(value)) {
|
|
160
|
+
throw new RecipeModelConfigError(`${context} has invalid model: expected object`);
|
|
161
|
+
}
|
|
162
|
+
assertKnownKeys(context, "model", value, MODEL_KEYS);
|
|
163
|
+
const thinkingLevel = parseThinkingLevel(context, "model.thinking_level", value.thinking_level ?? value.thinkingLevel);
|
|
164
|
+
const reasoningEffort = parseThinkingLevel(context, "model.reasoning_effort", value.reasoning_effort);
|
|
165
|
+
if (thinkingLevel !== undefined &&
|
|
166
|
+
reasoningEffort !== undefined &&
|
|
167
|
+
thinkingLevel !== reasoningEffort) {
|
|
168
|
+
throw new RecipeModelConfigError(`${context} sets both model.thinking_level and model.reasoning_effort with different values`);
|
|
169
|
+
}
|
|
170
|
+
const cacheRetention = optionalString(context, "model.cache_retention", value.cache_retention);
|
|
171
|
+
if (cacheRetention !== undefined && !CACHE_RETENTIONS.has(cacheRetention)) {
|
|
172
|
+
throw new RecipeModelConfigError(`${context} has unsupported model.cache_retention "${cacheRetention}"`);
|
|
173
|
+
}
|
|
174
|
+
const temperature = optionalNumber(context, "model.temperature", value.temperature, 0);
|
|
175
|
+
const maxTokens = optionalInteger(context, "model.max_tokens", value.max_tokens, 1);
|
|
176
|
+
const timeoutMs = optionalInteger(context, "model.timeout_ms", value.timeout_ms, 1);
|
|
177
|
+
const maxRetries = optionalInteger(context, "model.max_retries", value.max_retries, 0);
|
|
178
|
+
const maxRetryDelayMs = optionalInteger(context, "model.max_retry_delay_ms", value.max_retry_delay_ms, 0);
|
|
179
|
+
const streamOptions = {
|
|
180
|
+
...(temperature !== undefined ? { temperature } : {}),
|
|
181
|
+
...(maxTokens !== undefined ? { maxTokens } : {}),
|
|
182
|
+
...(cacheRetention
|
|
183
|
+
? { cacheRetention: cacheRetention }
|
|
184
|
+
: {}),
|
|
185
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
186
|
+
...(maxRetries !== undefined ? { maxRetries } : {}),
|
|
187
|
+
...(maxRetryDelayMs !== undefined ? { maxRetryDelayMs } : {}),
|
|
188
|
+
};
|
|
189
|
+
const name = optionalString(context, "model.name", value.name);
|
|
190
|
+
const providers = parseProviders(context, value.providers);
|
|
191
|
+
return {
|
|
192
|
+
...(name ? { name } : {}),
|
|
193
|
+
...((thinkingLevel ?? reasoningEffort)
|
|
194
|
+
? { thinkingLevel: (thinkingLevel ?? reasoningEffort) }
|
|
195
|
+
: {}),
|
|
196
|
+
...(hasKeys(streamOptions) ? { streamOptions } : {}),
|
|
197
|
+
...(providers ?? {}),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Merge a child agent's model config over its `from:` base. Sections
|
|
202
|
+
* (`streamOptions`, `openrouter`, `anthropic`) merge by key so a child can
|
|
203
|
+
* override one option without restating the base's.
|
|
204
|
+
*/
|
|
205
|
+
export function mergeRecipeAgentModelConfig(base, overlay) {
|
|
206
|
+
if (!base)
|
|
207
|
+
return overlay;
|
|
208
|
+
if (!overlay)
|
|
209
|
+
return base;
|
|
210
|
+
const streamOptions = {
|
|
211
|
+
...(base.streamOptions ?? {}),
|
|
212
|
+
...(overlay.streamOptions ?? {}),
|
|
213
|
+
};
|
|
214
|
+
const openrouter = {
|
|
215
|
+
...(base.openrouter ?? {}),
|
|
216
|
+
...(overlay.openrouter ?? {}),
|
|
217
|
+
};
|
|
218
|
+
const anthropic = {
|
|
219
|
+
...(base.anthropic ?? {}),
|
|
220
|
+
...(overlay.anthropic ?? {}),
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
...base,
|
|
224
|
+
...overlay,
|
|
225
|
+
...(hasKeys(streamOptions) ? { streamOptions } : {}),
|
|
226
|
+
...(hasKeys(openrouter) ? { openrouter } : {}),
|
|
227
|
+
...(hasKeys(anthropic) ? { anthropic } : {}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Apply provider routing and header options onto a pi-ai model instance. */
|
|
231
|
+
export function applyRecipeAgentModelConfigToModel(model, config) {
|
|
232
|
+
if (!config)
|
|
233
|
+
return model;
|
|
234
|
+
if (config.openrouter) {
|
|
235
|
+
model.compat = {
|
|
236
|
+
...(model.compat ?? {}),
|
|
237
|
+
openRouterRouting: config.openrouter,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
if (config.anthropic?.betas?.length) {
|
|
241
|
+
const existing = model.headers?.["anthropic-beta"]
|
|
242
|
+
?.split(",")
|
|
243
|
+
.map((item) => item.trim())
|
|
244
|
+
.filter(Boolean);
|
|
245
|
+
const betas = [
|
|
246
|
+
...new Set([...(existing ?? []), ...config.anthropic.betas]),
|
|
247
|
+
];
|
|
248
|
+
model.headers = {
|
|
249
|
+
...(model.headers ?? {}),
|
|
250
|
+
"anthropic-beta": betas.join(","),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return model;
|
|
254
|
+
}
|
|
255
|
+
function mergeStreamOptions(current, configured) {
|
|
256
|
+
if (!configured || Object.keys(configured).length === 0)
|
|
257
|
+
return current;
|
|
258
|
+
return {
|
|
259
|
+
...(current ?? {}),
|
|
260
|
+
...configured,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function withAnthropicContextManagement(payload, model, config) {
|
|
264
|
+
const contextManagement = config.anthropic?.contextManagement;
|
|
265
|
+
if (contextManagement === undefined)
|
|
266
|
+
return payload;
|
|
267
|
+
if (model.api !== "anthropic-messages")
|
|
268
|
+
return payload;
|
|
269
|
+
if (!isRecord(payload))
|
|
270
|
+
return payload;
|
|
271
|
+
return {
|
|
272
|
+
...payload,
|
|
273
|
+
context_management: contextManagement,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Apply stream options and Anthropic context management onto a live agent
|
|
278
|
+
* session. Wraps the session's stream function and payload hook; safe to call
|
|
279
|
+
* once per session.
|
|
280
|
+
*/
|
|
281
|
+
export function applyRecipeAgentModelConfigToSession(session, config) {
|
|
282
|
+
if (!config)
|
|
283
|
+
return;
|
|
284
|
+
if (config.streamOptions) {
|
|
285
|
+
const baseStreamFn = session.agent.streamFunction;
|
|
286
|
+
session.agent.streamFunction = (model, context, options) => baseStreamFn(model, context, mergeStreamOptions(options, config.streamOptions));
|
|
287
|
+
}
|
|
288
|
+
if (config.anthropic?.contextManagement !== undefined) {
|
|
289
|
+
const previousOnPayload = session.agent.onPayload;
|
|
290
|
+
session.agent.onPayload = async (payload, model) => {
|
|
291
|
+
const nextPayload = withAnthropicContextManagement(payload, model, config);
|
|
292
|
+
const previousResult = previousOnPayload
|
|
293
|
+
? await previousOnPayload(nextPayload, model)
|
|
294
|
+
: undefined;
|
|
295
|
+
return previousResult === undefined ? nextPayload : previousResult;
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=recipe-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-model.js","sourceRoot":"","sources":["../src/recipe-model.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,MAAM;IACN,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,YAAY;IACZ,iBAAiB;IACjB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAE3D,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAEtD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,iBAAiB;IACjB,oBAAoB;IACpB,iBAAiB;IACjB,KAAK;IACL,0BAA0B;IAC1B,OAAO;IACP,MAAM;IACN,QAAQ;IACR,eAAe;IACf,MAAM;IACN,WAAW;IACX,0BAA0B;IAC1B,uBAAuB;CACxB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAwBhE,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB;IACxC,OAAO,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CACrB,OAAe,EACf,GAAW,EACX,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,gBAAgB,GAAG,mBAAmB,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CACrB,OAAe,EACf,GAAW,EACX,KAAc,EACd,GAAW;IAEX,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACxE,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,gBAAgB,GAAG,wBAAwB,GAAG,EAAE,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,OAAe,EACf,GAAW,EACX,KAAc,EACd,GAAW;IAEX,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,gBAAgB,GAAG,oBAAoB,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAe,EACf,GAAW,EACX,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAC/D,CAAC;QACD,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,gBAAgB,GAAG,yBAAyB,CACvD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAe,EACf,GAAW,EACX,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,oBAAoB,GAAG,KAAK,KAAK,GAAG,CAC/C,CAAC;IACJ,CAAC;IACD,OAAO,KAAsB,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CACtB,OAAe,EACf,SAAiB,EACjB,IAA6B,EAC7B,OAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,oBAAoB,SAAS,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,OAAe,EACf,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,kEAAkE,CAC7E,CAAC;IACJ,CAAC;IACD,eAAe,CACb,OAAO,EACP,oCAAoC,EACpC,KAAK,EACL,eAAe,CAChB,CAAC;IACF,OAAO,EAAE,GAAG,KAAK,EAAuB,CAAC;AAC3C,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAe,EACf,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,0DAA0D,CACrE,CAAC;IACJ,CAAC;IACD,eAAe,CACb,OAAO,EACP,4BAA4B,EAC5B,KAAK,EACL,wBAAwB,CACzB,CAAC;IACF,OAAO,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CACrB,OAAe,EACf,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,yDAAyD,CACpE,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,OAAO,EAAE,2BAA2B,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,mBAAmB,CAC/B,OAAO,EACP,iCAAiC,EACjC,KAAK,CAAC,KAAK,CACZ,CAAC;IACF,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,kBAAkB,EAAE;YACjD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,OAAe,EACf,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,+CAA+C,CAC1D,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO;QACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,KAAc;IAEd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,qCAAqC,CAChD,CAAC;IACJ,CAAC;IACD,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAErD,MAAM,aAAa,GAAG,kBAAkB,CACtC,OAAO,EACP,sBAAsB,EACtB,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,aAAa,CAC5C,CAAC;IACF,MAAM,eAAe,GAAG,kBAAkB,CACxC,OAAO,EACP,wBAAwB,EACxB,KAAK,CAAC,gBAAgB,CACvB,CAAC;IACF,IACE,aAAa,KAAK,SAAS;QAC3B,eAAe,KAAK,SAAS;QAC7B,aAAa,KAAK,eAAe,EACjC,CAAC;QACD,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,kFAAkF,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,cAAc,CACnC,OAAO,EACP,uBAAuB,EACvB,KAAK,CAAC,eAAe,CACtB,CAAC;IACF,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,2CAA2C,cAAc,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAChC,OAAO,EACP,mBAAmB,EACnB,KAAK,CAAC,WAAW,EACjB,CAAC,CACF,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAC/B,OAAO,EACP,kBAAkB,EAClB,KAAK,CAAC,UAAU,EAChB,CAAC,CACF,CAAC;IACF,MAAM,SAAS,GAAG,eAAe,CAC/B,OAAO,EACP,kBAAkB,EAClB,KAAK,CAAC,UAAU,EAChB,CAAC,CACF,CAAC;IACF,MAAM,UAAU,GAAG,eAAe,CAChC,OAAO,EACP,mBAAmB,EACnB,KAAK,CAAC,WAAW,EACjB,CAAC,CACF,CAAC;IACF,MAAM,eAAe,GAAG,eAAe,CACrC,OAAO,EACP,0BAA0B,EAC1B,KAAK,CAAC,kBAAkB,EACxB,CAAC,CACF,CAAC;IACF,MAAM,aAAa,GAAkC;QACnD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,cAAc;YAChB,CAAC,CAAC,EAAE,cAAc,EAAE,cAAgC,EAAE;YACtD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;IAEF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,CAAC,aAAa,IAAI,eAAe,CAAC;YACpC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,aAAa,IAAI,eAAe,CAAkB,EAAE;YACxE,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;KACrB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAwC,EACxC,OAA2C;IAE3C,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,aAAa,GAAG;QACpB,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;KACjC,CAAC;IACF,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;KAC9B,CAAC;IACF,MAAM,SAAS,GAAG;QAChB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;KAC7B,CAAC;IACF,OAAO;QACL,GAAG,IAAI;QACP,GAAG,OAAO;QACV,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kCAAkC,CAChD,KAAQ,EACR,MAA0C;IAE1C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,GAAG;YACb,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;YACvB,iBAAiB,EAAE,MAAM,CAAC,UAAU;SACrC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAChD,EAAE,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG;YACZ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SAC7D,CAAC;QACF,KAAK,CAAC,OAAO,GAAG;YACd,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACxB,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SAClC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAwC,EACxC,UAAqD;IAErD,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACxE,OAAO;QACL,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAClB,GAAG,UAAU;KACd,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,OAAgB,EAChB,KAAiB,EACjB,MAA8B;IAE9B,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAC9D,IAAI,iBAAiB,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACpD,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB;QAAE,OAAO,OAAO,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO;QACL,GAAG,OAAO;QACV,kBAAkB,EAAE,iBAAiB;KACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oCAAoC,CAClD,OAAqB,EACrB,MAA0C;IAE1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CACzD,YAAY,CACV,KAAK,EACL,OAAO,EACP,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAClD,CAAC;IACN,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACjD,MAAM,WAAW,GAAG,8BAA8B,CAChD,OAAO,EACP,KAAK,EACL,MAAM,CACP,CAAC;YACF,MAAM,cAAc,GAAG,iBAAiB;gBACtC,CAAC,CAAC,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YACd,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;QACrE,CAAC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface RecipePackageResources {
|
|
2
|
+
agents: string[];
|
|
3
|
+
extensions: string[];
|
|
4
|
+
skills: string[];
|
|
5
|
+
prompts: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface RecipePackageMcpServer {
|
|
8
|
+
id: string;
|
|
9
|
+
required: boolean;
|
|
10
|
+
tools: RecipeMcpToolSelection;
|
|
11
|
+
}
|
|
12
|
+
export interface RecipeMcpToolSelection {
|
|
13
|
+
/** Exact tool names or the reserved whole-toolset `*` sentinel. Omission allows no tools. */
|
|
14
|
+
include?: string[];
|
|
15
|
+
/** Exact tool names removed after inclusion. */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** Parse a selection while preserving whether its source shape was malformed. */
|
|
19
|
+
export declare function parseRecipeMcpToolSelection(value: unknown): RecipeMcpToolSelection;
|
|
20
|
+
/** Minimal runtime guard; recipe-check owns detailed authoring diagnostics. */
|
|
21
|
+
export declare function isValidRecipeMcpToolSelection(selection: RecipeMcpToolSelection): boolean;
|
|
22
|
+
export interface RecipePackageMcpConfig {
|
|
23
|
+
manifests: string[];
|
|
24
|
+
servers: RecipePackageMcpServer[];
|
|
25
|
+
}
|
|
26
|
+
export type RecipeEvalSuite = {
|
|
27
|
+
name: string;
|
|
28
|
+
type: "registry";
|
|
29
|
+
dataset: string;
|
|
30
|
+
version: string;
|
|
31
|
+
} | {
|
|
32
|
+
name: string;
|
|
33
|
+
type: "git";
|
|
34
|
+
repo: string;
|
|
35
|
+
rev: string;
|
|
36
|
+
dataset: string;
|
|
37
|
+
};
|
|
38
|
+
export interface RecipeEvalsConfig {
|
|
39
|
+
suites: RecipeEvalSuite[];
|
|
40
|
+
raw?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface RecipePackageManifest {
|
|
43
|
+
name: string;
|
|
44
|
+
version: string;
|
|
45
|
+
description?: string;
|
|
46
|
+
path: string;
|
|
47
|
+
resources: RecipePackageResources;
|
|
48
|
+
mcp: RecipePackageMcpConfig;
|
|
49
|
+
evals: RecipeEvalsConfig;
|
|
50
|
+
}
|
|
51
|
+
export type PiPackageResources = RecipePackageResources;
|
|
52
|
+
export type PiPackageManifest = RecipePackageManifest;
|
|
53
|
+
export type RecipeValidationSeverity = "error" | "warning";
|
|
54
|
+
export interface RecipeValidationFinding {
|
|
55
|
+
severity: RecipeValidationSeverity;
|
|
56
|
+
code: string;
|
|
57
|
+
message: string;
|
|
58
|
+
packageName?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface RecipeValidationReport {
|
|
61
|
+
valid: boolean;
|
|
62
|
+
findings: RecipeValidationFinding[];
|
|
63
|
+
}
|
|
64
|
+
export declare class RecipePackageError extends Error {
|
|
65
|
+
constructor(message: string);
|
|
66
|
+
}
|
|
67
|
+
export declare function parseEvalsConfig(value: unknown, present?: boolean): RecipeEvalsConfig;
|
|
68
|
+
export declare function validateRecipeEvalsConfig(evals: RecipeEvalsConfig, packageName?: string): RecipeValidationReport;
|
|
69
|
+
export declare function readPiPackageManifest(packageDir: string): RecipePackageManifest;
|
|
70
|
+
export declare function resolvePiPackageMcpManifestPaths(pkg: RecipePackageManifest, opts?: {
|
|
71
|
+
allowEmptyGlobMatches?: boolean;
|
|
72
|
+
}): string[];
|
|
73
|
+
export declare function resolvePiPackageResourcePaths(pkg: RecipePackageManifest, key: keyof RecipePackageResources, opts?: {
|
|
74
|
+
allowEmptyGlobMatches?: boolean;
|
|
75
|
+
}): string[];
|
|
76
|
+
export declare function defaultPiPackageResourcePaths(pkg: RecipePackageManifest, key: keyof RecipePackageResources): string[];
|
|
77
|
+
export declare function packageResourcePaths(pkg: RecipePackageManifest, key: keyof RecipePackageResources): string[];
|
|
78
|
+
export declare function validatePiPackageManifest(pkg: RecipePackageManifest): RecipeValidationReport;
|
|
79
|
+
//# sourceMappingURL=recipe-package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-package.d.ts","sourceRoot":"","sources":["../src/recipe-package.ts"],"names":[],"mappings":"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"}
|