@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.
Files changed (161) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +184 -0
  3. package/dist/agent-tool.d.ts +42 -0
  4. package/dist/agent-tool.d.ts.map +1 -0
  5. package/dist/agent-tool.js +159 -0
  6. package/dist/agent-tool.js.map +1 -0
  7. package/dist/child-agent-completions.d.ts +61 -0
  8. package/dist/child-agent-completions.d.ts.map +1 -0
  9. package/dist/child-agent-completions.js +135 -0
  10. package/dist/child-agent-completions.js.map +1 -0
  11. package/dist/child-agent-store.d.ts +48 -0
  12. package/dist/child-agent-store.d.ts.map +1 -0
  13. package/dist/child-agent-store.js +98 -0
  14. package/dist/child-agent-store.js.map +1 -0
  15. package/dist/child-agent.d.ts +43 -0
  16. package/dist/child-agent.d.ts.map +1 -0
  17. package/dist/child-agent.js +268 -0
  18. package/dist/child-agent.js.map +1 -0
  19. package/dist/direct-cli.d.ts +9 -0
  20. package/dist/direct-cli.d.ts.map +1 -0
  21. package/dist/direct-cli.js +22 -0
  22. package/dist/direct-cli.js.map +1 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +14 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/inspect.d.ts +26 -0
  28. package/dist/inspect.d.ts.map +1 -0
  29. package/dist/inspect.js +70 -0
  30. package/dist/inspect.js.map +1 -0
  31. package/dist/interactions.d.ts +204 -0
  32. package/dist/interactions.d.ts.map +1 -0
  33. package/dist/interactions.js +358 -0
  34. package/dist/interactions.js.map +1 -0
  35. package/dist/mcp-catalog.d.ts +8 -0
  36. package/dist/mcp-catalog.d.ts.map +1 -0
  37. package/dist/mcp-catalog.js +60 -0
  38. package/dist/mcp-catalog.js.map +1 -0
  39. package/dist/mcp-cli-core.d.ts +79 -0
  40. package/dist/mcp-cli-core.d.ts.map +1 -0
  41. package/dist/mcp-cli-core.js +1717 -0
  42. package/dist/mcp-cli-core.js.map +1 -0
  43. package/dist/mcp-cli-help.d.ts +2 -0
  44. package/dist/mcp-cli-help.d.ts.map +1 -0
  45. package/dist/mcp-cli-help.js +36 -0
  46. package/dist/mcp-cli-help.js.map +1 -0
  47. package/dist/mcp-cli-policy.d.ts +17 -0
  48. package/dist/mcp-cli-policy.d.ts.map +1 -0
  49. package/dist/mcp-cli-policy.js +230 -0
  50. package/dist/mcp-cli-policy.js.map +1 -0
  51. package/dist/mcp-cli.d.ts +3 -0
  52. package/dist/mcp-cli.d.ts.map +1 -0
  53. package/dist/mcp-cli.js +33 -0
  54. package/dist/mcp-cli.js.map +1 -0
  55. package/dist/mcp-client.d.ts +3 -0
  56. package/dist/mcp-client.d.ts.map +1 -0
  57. package/dist/mcp-client.js +86 -0
  58. package/dist/mcp-client.js.map +1 -0
  59. package/dist/mcp-command-context.d.ts +13 -0
  60. package/dist/mcp-command-context.d.ts.map +1 -0
  61. package/dist/mcp-command-context.js +29 -0
  62. package/dist/mcp-command-context.js.map +1 -0
  63. package/dist/mcp-contract.d.ts +16 -0
  64. package/dist/mcp-contract.d.ts.map +1 -0
  65. package/dist/mcp-contract.js +306 -0
  66. package/dist/mcp-contract.js.map +1 -0
  67. package/dist/mcp-daemon-client.d.ts +10 -0
  68. package/dist/mcp-daemon-client.d.ts.map +1 -0
  69. package/dist/mcp-daemon-client.js +119 -0
  70. package/dist/mcp-daemon-client.js.map +1 -0
  71. package/dist/mcp-daemon-protocol.d.ts +64 -0
  72. package/dist/mcp-daemon-protocol.d.ts.map +1 -0
  73. package/dist/mcp-daemon-protocol.js +6 -0
  74. package/dist/mcp-daemon-protocol.js.map +1 -0
  75. package/dist/mcp-daemon.d.ts +3 -0
  76. package/dist/mcp-daemon.d.ts.map +1 -0
  77. package/dist/mcp-daemon.js +76880 -0
  78. package/dist/mcp-daemon.js.map +1 -0
  79. package/dist/mcp-run-worker.d.ts +2 -0
  80. package/dist/mcp-run-worker.d.ts.map +1 -0
  81. package/dist/mcp-run-worker.js +76579 -0
  82. package/dist/mcp-run-worker.js.map +1 -0
  83. package/dist/mcp.d.ts +168 -0
  84. package/dist/mcp.d.ts.map +1 -0
  85. package/dist/mcp.js +558 -0
  86. package/dist/mcp.js.map +1 -0
  87. package/dist/pi-extension.d.ts +30 -0
  88. package/dist/pi-extension.d.ts.map +1 -0
  89. package/dist/pi-extension.js +880 -0
  90. package/dist/pi-extension.js.map +1 -0
  91. package/dist/provider-env.d.ts +2 -0
  92. package/dist/provider-env.d.ts.map +1 -0
  93. package/dist/provider-env.js +21 -0
  94. package/dist/provider-env.js.map +1 -0
  95. package/dist/recipe/resolve.d.ts +30 -0
  96. package/dist/recipe/resolve.d.ts.map +1 -0
  97. package/dist/recipe/resolve.js +131 -0
  98. package/dist/recipe/resolve.js.map +1 -0
  99. package/dist/recipe-agent.d.ts +71 -0
  100. package/dist/recipe-agent.d.ts.map +1 -0
  101. package/dist/recipe-agent.js +555 -0
  102. package/dist/recipe-agent.js.map +1 -0
  103. package/dist/recipe-extensions.d.ts +9 -0
  104. package/dist/recipe-extensions.d.ts.map +1 -0
  105. package/dist/recipe-extensions.js +81 -0
  106. package/dist/recipe-extensions.js.map +1 -0
  107. package/dist/recipe-mcp-config.d.ts +15 -0
  108. package/dist/recipe-mcp-config.d.ts.map +1 -0
  109. package/dist/recipe-mcp-config.js +82 -0
  110. package/dist/recipe-mcp-config.js.map +1 -0
  111. package/dist/recipe-model.d.ts +49 -0
  112. package/dist/recipe-model.d.ts.map +1 -0
  113. package/dist/recipe-model.js +299 -0
  114. package/dist/recipe-model.js.map +1 -0
  115. package/dist/recipe-package.d.ts +79 -0
  116. package/dist/recipe-package.d.ts.map +1 -0
  117. package/dist/recipe-package.js +479 -0
  118. package/dist/recipe-package.js.map +1 -0
  119. package/dist/recipe-skills.d.ts +7 -0
  120. package/dist/recipe-skills.d.ts.map +1 -0
  121. package/dist/recipe-skills.js +46 -0
  122. package/dist/recipe-skills.js.map +1 -0
  123. package/dist/run-controller.d.ts +32 -0
  124. package/dist/run-controller.d.ts.map +1 -0
  125. package/dist/run-controller.js +259 -0
  126. package/dist/run-controller.js.map +1 -0
  127. package/dist/run.d.ts +28 -0
  128. package/dist/run.d.ts.map +1 -0
  129. package/dist/run.js +84 -0
  130. package/dist/run.js.map +1 -0
  131. package/dist/session.d.ts +140 -0
  132. package/dist/session.d.ts.map +1 -0
  133. package/dist/session.js +363 -0
  134. package/dist/session.js.map +1 -0
  135. package/dist/test-utils.d.ts +32 -0
  136. package/dist/test-utils.d.ts.map +1 -0
  137. package/dist/test-utils.js +259 -0
  138. package/dist/test-utils.js.map +1 -0
  139. package/dist/testing.d.ts +25 -0
  140. package/dist/testing.d.ts.map +1 -0
  141. package/dist/testing.js +96 -0
  142. package/dist/testing.js.map +1 -0
  143. package/docs/agent-composition.md +196 -0
  144. package/docs/deployment-configuration.md +65 -0
  145. package/docs/index.md +49 -0
  146. package/docs/interactions.md +210 -0
  147. package/docs/mcp-auth.md +80 -0
  148. package/docs/mcp-configuration.md +126 -0
  149. package/docs/migration.md +70 -0
  150. package/docs/pi-extension.md +97 -0
  151. package/docs/python-bindings-release.md +47 -0
  152. package/docs/recipe-evals.md +70 -0
  153. package/docs/recipe-flow.md +41 -0
  154. package/docs/recipe-format.md +186 -0
  155. package/docs/recipe-judges.md +152 -0
  156. package/docs/runtime-library.md +171 -0
  157. package/package.json +106 -0
  158. package/vendor/mcp-client/darwin-arm64/mcp-client +0 -0
  159. package/vendor/mcp-client/darwin-x64/mcp-client +0 -0
  160. package/vendor/mcp-client/linux-arm64/mcp-client +0 -0
  161. package/vendor/mcp-client/linux-x64/mcp-client +0 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,558 @@
1
+ import { createHash, randomBytes, randomUUID } from "node:crypto";
2
+ import { constants, existsSync, readFileSync } from "node:fs";
3
+ import { access, chmod, mkdir, rm, writeFile } from "node:fs/promises";
4
+ import { createConnection } from "node:net";
5
+ import { delimiter, dirname, join, resolve } from "node:path";
6
+ import { tmpdir } from "node:os";
7
+ import { fileURLToPath } from "node:url";
8
+ import { MCP_DAEMON_FINGERPRINT_ENV, MCP_DAEMON_PARENT_PID_ENV, MCP_DAEMON_SOCKET_ENV, MCP_DAEMON_TOKEN_ENV, MCP_SESSION_ROOT_ENV, } from "./mcp-daemon-protocol.js";
9
+ import { resolvePiPackageMcpManifestPaths, } from "./recipe-package.js";
10
+ import { generatedBindingEnvVars } from "./recipe-mcp-config.js";
11
+ /**
12
+ * A `required: true` package MCP server has no endpoint binding. Thrown by
13
+ * `materializeMcpSession` before any server is materialized (fail-closed).
14
+ */
15
+ export class McpBindingError extends Error {
16
+ servers;
17
+ expectedEnvVars;
18
+ name = "McpBindingError";
19
+ constructor(
20
+ /** Missing required server ids, in manifest order. */
21
+ servers,
22
+ /** The `${VAR}` names a generated binding for those servers would use. */
23
+ expectedEnvVars) {
24
+ super(`Required MCP server binding(s) missing: ${servers.join(", ")}` +
25
+ (expectedEnvVars.length > 0
26
+ ? ` (bind via .pi/mcp.local.json or env: ${expectedEnvVars.join(", ")})`
27
+ : ""));
28
+ this.servers = servers;
29
+ this.expectedEnvVars = expectedEnvVars;
30
+ }
31
+ }
32
+ const RECIPE_ENV_PREFIX = "PI_RECIPES_";
33
+ const MCP_SESSION_ENV = `${RECIPE_ENV_PREFIX}MCP_SESSION`;
34
+ // mcporter's own config env var — the sandbox `mcp` CLI is mcporter, and the
35
+ // generated config referenced here is the only server catalog it may read.
36
+ const MCPORTER_CONFIG_ENV = "MCPORTER_CONFIG";
37
+ const MCP_LOCAL_CONFIG_ENV = `${RECIPE_ENV_PREFIX}MCP_LOCAL_CONFIG`;
38
+ const MCP_BIN_DIR_ENV = `${RECIPE_ENV_PREFIX}MCP_BIN_DIR`;
39
+ const MCP_RUNTIME_ENV_KEYS = [
40
+ MCP_SESSION_ENV,
41
+ MCPORTER_CONFIG_ENV,
42
+ MCP_LOCAL_CONFIG_ENV,
43
+ MCP_BIN_DIR_ENV,
44
+ MCP_DAEMON_FINGERPRINT_ENV,
45
+ MCP_DAEMON_PARENT_PID_ENV,
46
+ MCP_DAEMON_SOCKET_ENV,
47
+ MCP_DAEMON_TOKEN_ENV,
48
+ MCP_SESSION_ROOT_ENV,
49
+ ];
50
+ /** Capture every environment entry Recipes may mutate while materializing MCP. */
51
+ export function snapshotMcpEnvironment(env) {
52
+ const currentPathKey = pathKey(env);
53
+ return {
54
+ pathKey: currentPathKey,
55
+ values: Object.fromEntries([...MCP_RUNTIME_ENV_KEYS, currentPathKey].map((key) => [key, env[key]])),
56
+ };
57
+ }
58
+ /** Restore a previously captured MCP environment exactly. */
59
+ export function restoreMcpEnvironment(env, snapshot) {
60
+ for (const [key, value] of Object.entries(snapshot.values)) {
61
+ if (value === undefined) {
62
+ delete env[key];
63
+ }
64
+ else {
65
+ env[key] = value;
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Hide host-owned runtime state before materializing a leased session. The
71
+ * local binding selector remains visible by design; session files, daemon
72
+ * coordinates, and generated CLI state do not.
73
+ */
74
+ export function isolateMcpEnvironment(env) {
75
+ for (const key of MCP_RUNTIME_ENV_KEYS) {
76
+ if (key !== MCP_LOCAL_CONFIG_ENV)
77
+ delete env[key];
78
+ }
79
+ }
80
+ export function defaultMcpSessionPath(cwd) {
81
+ return join(cwd, ".pi", "mcp-session.json");
82
+ }
83
+ export function fallbackMcpSessionPath() {
84
+ return join(tmpdir(), "pi-recipes", "mcp-session.json");
85
+ }
86
+ export function defaultMcporterConfigPath(cwd) {
87
+ return join(cwd, ".pi", "mcporter.json");
88
+ }
89
+ export function fallbackMcporterConfigPath() {
90
+ return join(tmpdir(), "pi-recipes", "mcporter.json");
91
+ }
92
+ export function defaultMcpLocalConfigPath(cwd) {
93
+ return join(cwd, ".pi", "mcp.local.json");
94
+ }
95
+ export function resolveMcpLocalConfigPath(opts) {
96
+ const env = opts.env ?? process.env;
97
+ const configured = env[MCP_LOCAL_CONFIG_ENV];
98
+ if (configured)
99
+ return configured;
100
+ const workspaceConfig = defaultMcpLocalConfigPath(opts.cwd);
101
+ if (existsSync(workspaceConfig))
102
+ return workspaceConfig;
103
+ const recipeConfig = defaultMcpLocalConfigPath(opts.recipeDir);
104
+ return existsSync(recipeConfig) ? recipeConfig : undefined;
105
+ }
106
+ export function configureMcpLocalConfigPath(opts) {
107
+ const env = opts.env ?? process.env;
108
+ const path = resolveMcpLocalConfigPath({ ...opts, env });
109
+ if (!path)
110
+ return undefined;
111
+ env[MCP_LOCAL_CONFIG_ENV] = path;
112
+ return path;
113
+ }
114
+ export function defaultMcpBinDir(cwd) {
115
+ return join(cwd, ".pi", "bin");
116
+ }
117
+ export function mcporterCliEntrypointPath() {
118
+ return fileURLToPath(import.meta.resolve("mcporter/cli"));
119
+ }
120
+ function compiledEntrypoint(name) {
121
+ const adjacent = fileURLToPath(new URL(`./${name}`, import.meta.url));
122
+ if (existsSync(adjacent))
123
+ return adjacent;
124
+ return fileURLToPath(new URL(`../dist/${name}`, import.meta.url));
125
+ }
126
+ export function mcpCliEntrypointPath() {
127
+ return compiledEntrypoint("mcp-cli.js");
128
+ }
129
+ export function mcpClientEntrypointPath() {
130
+ return compiledEntrypoint("mcp-client.js");
131
+ }
132
+ export function nativeMcpClientPath(platform = process.platform, arch = process.arch) {
133
+ const executable = platform === "win32" ? "mcp-client.exe" : "mcp-client";
134
+ const packageEntrypoint = fileURLToPath(import.meta.resolve("@introspection-ai/recipes"));
135
+ const candidate = resolve(dirname(packageEntrypoint), "..", "vendor", "mcp-client", `${platform}-${arch}`, executable);
136
+ return existsSync(candidate) ? candidate : undefined;
137
+ }
138
+ function shellQuote(value) {
139
+ return `'${value.replace(/'/g, "'\\''")}'`;
140
+ }
141
+ function doubleQuoteEscape(value) {
142
+ return value.replace(/[\\"$`]/g, "\\$&");
143
+ }
144
+ function pathKey(env) {
145
+ return Object.keys(env).find((key) => key.toLowerCase() === "path") ?? "PATH";
146
+ }
147
+ function prependPath(env, dir) {
148
+ const key = pathKey(env);
149
+ const current = env[key] ?? "";
150
+ const entries = current.split(delimiter).filter(Boolean);
151
+ if (entries.includes(dir))
152
+ return;
153
+ env[key] = [dir, current].filter(Boolean).join(delimiter);
154
+ }
155
+ export async function materializeSessionMcpCli(opts) {
156
+ const env = opts.env ?? process.env;
157
+ env[MCP_SESSION_ROOT_ENV] = opts.cwd;
158
+ const binDir = defaultMcpBinDir(opts.cwd);
159
+ const shimPath = join(binDir, "mcp");
160
+ const nativeClient = nativeMcpClientPath();
161
+ if (process.platform !== "win32" && !nativeClient) {
162
+ throw new Error(`Native MCP client is unavailable for ${process.platform}-${process.arch}.`);
163
+ }
164
+ if (nativeClient && process.platform !== "win32") {
165
+ await access(nativeClient, constants.X_OK).catch(async () => {
166
+ await chmod(nativeClient, 0o755);
167
+ await access(nativeClient, constants.X_OK);
168
+ });
169
+ }
170
+ // The shim pins MCPORTER_CONFIG to the session-generated config (the
171
+ // session env normally sets it; the default covers shells that lost the
172
+ // env). mcporter must never fall through to its own config resolution —
173
+ // that would import the developer's personal MCP servers (~/.mcporter,
174
+ // Cursor/Claude/VS Code configs) into a recipe session.
175
+ const script = [
176
+ "#!/bin/sh",
177
+ `PI_RECIPES_MCP_SESSION_ROOT=${shellQuote(opts.cwd)}`,
178
+ "export PI_RECIPES_MCP_SESSION_ROOT",
179
+ `: "\${${MCPORTER_CONFIG_ENV}:=${doubleQuoteEscape(defaultMcporterConfigPath(opts.cwd))}}"`,
180
+ `export ${MCPORTER_CONFIG_ENV}`,
181
+ `if [ -n "\${${MCP_DAEMON_SOCKET_ENV}:-}" ]; then`,
182
+ ...(nativeClient
183
+ ? [
184
+ ` ${shellQuote(nativeClient)} "$@"`,
185
+ " native_status=$?",
186
+ " if [ \"$native_status\" -ne 75 ]; then exit \"$native_status\"; fi",
187
+ ` ${shellQuote(process.execPath)} ${shellQuote(mcpClientEntrypointPath())} --start-daemon`,
188
+ " supervisor_status=$?",
189
+ " if [ \"$supervisor_status\" -ne 0 ]; then exit \"$supervisor_status\"; fi",
190
+ ` exec ${shellQuote(nativeClient)} "$@"`,
191
+ ]
192
+ : [
193
+ ` exec ${shellQuote(process.execPath)} ${shellQuote(mcpClientEntrypointPath())} "$@"`,
194
+ ]),
195
+ "fi",
196
+ `exec ${shellQuote(process.execPath)} ${shellQuote(mcpCliEntrypointPath())} "$@"`,
197
+ "",
198
+ ].join("\n");
199
+ await mkdir(binDir, { recursive: true });
200
+ await writeFile(shimPath, script);
201
+ await chmod(shimPath, 0o755);
202
+ env[MCP_BIN_DIR_ENV] = binDir;
203
+ prependPath(env, binDir);
204
+ return { binDir, shimPath };
205
+ }
206
+ function sessionPath(env, cwd = process.cwd()) {
207
+ return env[MCP_SESSION_ENV] || defaultMcpSessionPath(cwd);
208
+ }
209
+ function localMcpConfigPath(env, cwd = process.cwd()) {
210
+ return env[MCP_LOCAL_CONFIG_ENV] || defaultMcpLocalConfigPath(cwd);
211
+ }
212
+ function safeServerId(value) {
213
+ const id = value
214
+ .trim()
215
+ .toLowerCase()
216
+ .replace(/[^a-z0-9_-]+/g, "-")
217
+ .replace(/^-+|-+$/g, "");
218
+ return id || "mcp";
219
+ }
220
+ export function normalizeMcpServerId(value) {
221
+ return safeServerId(value);
222
+ }
223
+ function hostForUrl(value) {
224
+ try {
225
+ return new URL(value).hostname.toLowerCase();
226
+ }
227
+ catch {
228
+ return "";
229
+ }
230
+ }
231
+ function interpolateEnv(value, env) {
232
+ return value.replace(/\$\{([A-Z0-9_]+)\}/gi, (_match, name) => env[name] ?? "");
233
+ }
234
+ function readJson(path) {
235
+ return JSON.parse(readFileSync(path, "utf8"));
236
+ }
237
+ function readLocalMcpServers(env, cwd, localConfig) {
238
+ if (localConfig) {
239
+ return Array.isArray(localConfig.servers) ? localConfig.servers : [];
240
+ }
241
+ const path = localMcpConfigPath(env, cwd);
242
+ if (!existsSync(path))
243
+ return [];
244
+ try {
245
+ const parsed = readJson(path);
246
+ return Array.isArray(parsed.servers) ? parsed.servers : [];
247
+ }
248
+ catch {
249
+ return [];
250
+ }
251
+ }
252
+ function localBindings(env, cwd, localConfig) {
253
+ return readLocalMcpServers(env, cwd, localConfig).flatMap((server) => {
254
+ if (server.transport && server.transport !== "streamable_http")
255
+ return [];
256
+ const baseUrl = server.url ? interpolateEnv(server.url, env) : "";
257
+ if (!baseUrl)
258
+ return [];
259
+ const label = (server.name ?? server.id ?? hostForUrl(baseUrl)) || "mcp";
260
+ const rawHeaders = server.headers ?? {};
261
+ const localOAuth = server.auth === "oauth"
262
+ ? {
263
+ auth: "oauth",
264
+ ...(server.tokenCacheDir ? { tokenCacheDir: server.tokenCacheDir } : {}),
265
+ ...(server.clientName ? { clientName: server.clientName } : {}),
266
+ ...(server.oauthClientId ? { oauthClientId: server.oauthClientId } : {}),
267
+ ...(server.oauthClientSecretEnv
268
+ ? { oauthClientSecretEnv: server.oauthClientSecretEnv }
269
+ : {}),
270
+ ...(server.oauthTokenEndpointAuthMethod
271
+ ? { oauthTokenEndpointAuthMethod: server.oauthTokenEndpointAuthMethod }
272
+ : {}),
273
+ ...(server.oauthRedirectUrl
274
+ ? { oauthRedirectUrl: server.oauthRedirectUrl }
275
+ : {}),
276
+ ...(server.oauthScope ? { oauthScope: server.oauthScope } : {}),
277
+ ...(server.httpFetch ? { httpFetch: server.httpFetch } : {}),
278
+ }
279
+ : undefined;
280
+ return [{
281
+ id: safeServerId(server.id ?? label),
282
+ name: label,
283
+ baseUrl,
284
+ rawHeaders,
285
+ ...(localOAuth ? { localOAuth } : {}),
286
+ }];
287
+ });
288
+ }
289
+ function endpointBindings(env, cwd, localConfig) {
290
+ const candidates = localBindings(env, cwd, localConfig);
291
+ const seen = new Set();
292
+ const bindings = [];
293
+ for (const binding of candidates) {
294
+ const key = `${binding.id}:${binding.baseUrl}`;
295
+ if (seen.has(key))
296
+ continue;
297
+ seen.add(key);
298
+ bindings.push(binding);
299
+ }
300
+ return bindings;
301
+ }
302
+ export function resolveAgentMcpSelections(mcp) {
303
+ return Object.entries(mcp ?? {}).map(([serverId, selection]) => ({
304
+ serverId: safeServerId(serverId),
305
+ tools: selection,
306
+ }));
307
+ }
308
+ export function executableRecipeToolNames(tools) {
309
+ return [...tools];
310
+ }
311
+ export function formatMcpConfigurationDiagnostics(diagnostics, limit = 3) {
312
+ const selected = diagnostics.slice(0, limit);
313
+ const lines = selected.map((diagnostic) => {
314
+ return `${diagnostic.serverId} ${diagnostic.stage} [${diagnostic.code}]: ${diagnostic.message}`;
315
+ });
316
+ const remaining = diagnostics.length - selected.length;
317
+ if (remaining > 0)
318
+ lines.push(`${remaining} more MCP configuration issue(s).`);
319
+ return lines.join("\n");
320
+ }
321
+ function recipeMcpPolicy(mcp) {
322
+ return {
323
+ required: new Set(mcp.servers
324
+ .filter((server) => server.required)
325
+ .map((server) => safeServerId(server.id))),
326
+ tools: new Map(mcp.servers.map((server) => [safeServerId(server.id), server.tools])),
327
+ };
328
+ }
329
+ export function mcpSelectionAllowsTool(selection, toolName) {
330
+ const included = selection.include?.some((selector) => {
331
+ const trimmed = selector.trim();
332
+ return trimmed === "*" || trimmed === toolName;
333
+ }) ?? false;
334
+ if (!included)
335
+ return false;
336
+ return !(selection.exclude ?? []).some((selector) => selector.trim() === toolName);
337
+ }
338
+ export function mcpSessionAllowsTool(server, toolName) {
339
+ return (mcpSelectionAllowsTool(server.package_tools, toolName) &&
340
+ server.agent_tools.some((selection) => mcpSelectionAllowsTool(selection, toolName)));
341
+ }
342
+ function escapeRegExp(value) {
343
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
344
+ }
345
+ export function filterMcpCatalog(server, catalog) {
346
+ const allowed = catalog.filter((tool) => mcpSessionAllowsTool(server, tool.name));
347
+ const hiddenNames = catalog
348
+ .filter((tool) => !mcpSessionAllowsTool(server, tool.name))
349
+ .map((tool) => tool.name)
350
+ .filter(Boolean)
351
+ .sort((left, right) => right.length - left.length);
352
+ if (hiddenNames.length === 0)
353
+ return allowed;
354
+ return allowed.map((tool) => ({
355
+ ...tool,
356
+ ...(tool.description
357
+ ? {
358
+ description: hiddenNames.reduce((description, name) => description.replace(new RegExp(`(^|[^A-Za-z0-9_-])${escapeRegExp(name)}(?=$|[^A-Za-z0-9_-])`, "g"), "$1[unavailable MCP tool]"), tool.description),
359
+ }
360
+ : {}),
361
+ }));
362
+ }
363
+ function readConfiguredManifests(manifest) {
364
+ const servers = [];
365
+ for (const path of resolvePiPackageMcpManifestPaths(manifest)) {
366
+ const parsed = readJson(path);
367
+ servers.push(...(parsed.servers ?? []));
368
+ }
369
+ return servers;
370
+ }
371
+ function explicitAllowedTools(server) {
372
+ const packageIncludes = server.package_tools.include ?? [];
373
+ const agentIncludes = server.agent_tools.flatMap((selection) => selection.include ?? []);
374
+ const candidates = !packageIncludes.includes("*")
375
+ ? packageIncludes
376
+ : !agentIncludes.includes("*")
377
+ ? agentIncludes
378
+ : undefined;
379
+ if (!candidates)
380
+ return undefined;
381
+ return [...new Set(candidates)].filter((name) => mcpSessionAllowsTool(server, name));
382
+ }
383
+ async function writeWithFallback(path, serialized, defaultPath, fallbackPath) {
384
+ try {
385
+ await mkdir(dirname(path), { recursive: true });
386
+ await writeFile(path, serialized);
387
+ return path;
388
+ }
389
+ catch (err) {
390
+ if (path !== defaultPath)
391
+ throw err;
392
+ await mkdir(dirname(fallbackPath), { recursive: true });
393
+ await writeFile(fallbackPath, serialized);
394
+ return fallbackPath;
395
+ }
396
+ }
397
+ /**
398
+ * Project the static session policy into the config the `mcp` CLI (mcporter)
399
+ * reads. Header values stay `${VAR}` references — mcporter interpolates them
400
+ * at config load — so neither session tokens nor local dev secrets are
401
+ * persisted. `allowedTools` re-applies the recipe/agent tool filter inside
402
+ * mcporter, and `imports: []` keeps mcporter from discovering host-level
403
+ * configs (Cursor/Claude/VS Code) in a recipe session.
404
+ */
405
+ export function buildMcporterConfig(session, opts = {}) {
406
+ const env = opts.env ?? process.env;
407
+ const cwd = opts.cwd ?? process.cwd();
408
+ return projectMcporterConfig(session, localBindings(env, cwd));
409
+ }
410
+ function projectMcporterConfig(session, bindings) {
411
+ const mcpServers = {};
412
+ for (const server of session.servers) {
413
+ const binding = bindings.find((candidate) => candidate.id === server.id && candidate.baseUrl === server.base_url);
414
+ const allowedTools = explicitAllowedTools(server);
415
+ mcpServers[server.id] = {
416
+ baseUrl: server.base_url,
417
+ headers: binding?.rawHeaders ?? {},
418
+ ...(allowedTools ? { allowedTools } : {}),
419
+ ...(binding?.localOAuth ?? {}),
420
+ };
421
+ }
422
+ return { imports: [], mcpServers };
423
+ }
424
+ async function writeMcporterConfig(env, cwd, session, bindings) {
425
+ const config = bindings
426
+ ? projectMcporterConfig(session, bindings)
427
+ : buildMcporterConfig(session, { env, cwd });
428
+ const writtenPath = await writeWithFallback(defaultMcporterConfigPath(cwd), `${JSON.stringify(config, null, 2)}\n`, defaultMcporterConfigPath(cwd), fallbackMcporterConfigPath());
429
+ env[MCPORTER_CONFIG_ENV] = writtenPath;
430
+ return writtenPath;
431
+ }
432
+ export async function clearMcpSession(env, cwd) {
433
+ await stopMcpDaemon(env);
434
+ const configuredPath = sessionPath(env, cwd);
435
+ delete env[MCP_SESSION_ENV];
436
+ await rm(configuredPath, { force: true });
437
+ if (configuredPath !== defaultMcpSessionPath(cwd)) {
438
+ await rm(defaultMcpSessionPath(cwd), { force: true });
439
+ }
440
+ // Keep an empty mcporter config (rather than none): a stale `.pi/bin/mcp`
441
+ // shim from an earlier session must resolve to "no servers", never to
442
+ // mcporter's host-level config discovery.
443
+ await writeMcporterConfig(env, cwd, { version: 1, servers: [] });
444
+ }
445
+ export async function materializeMcpSession(opts) {
446
+ const env = opts.env ?? process.env;
447
+ const agentSelections = opts.agentMcp ?? [];
448
+ const endpointBindingList = endpointBindings(env, opts.cwd, opts.localConfig);
449
+ const bindings = new Map(endpointBindingList.map((binding) => [binding.id, binding]));
450
+ const configured = new Map(readConfiguredManifests(opts.manifest).map((server) => [
451
+ safeServerId(server.id),
452
+ server,
453
+ ]));
454
+ const policy = recipeMcpPolicy(opts.manifest.mcp);
455
+ const available = new Set([...bindings.keys(), ...configured.keys()]);
456
+ const missingRequired = [...policy.required].filter((serverId) => !available.has(serverId));
457
+ if (missingRequired.length > 0) {
458
+ throw new McpBindingError(missingRequired, missingRequired.flatMap((serverId) => generatedBindingEnvVars(serverId)));
459
+ }
460
+ const diagnostics = [];
461
+ const servers = [];
462
+ for (const packageServer of opts.manifest.mcp.servers) {
463
+ const id = safeServerId(packageServer.id);
464
+ const selected = agentSelections
465
+ .filter((selection) => selection.serverId === id)
466
+ .map((selection) => selection.tools);
467
+ if (selected.length === 0 || selected.every((entry) => entry.include?.length === 0)) {
468
+ continue;
469
+ }
470
+ const binding = bindings.get(id);
471
+ const declared = configured.get(id);
472
+ if (!binding && !declared)
473
+ continue;
474
+ const baseUrl = binding?.baseUrl ?? declared.base_url;
475
+ const catalogPolicy = {
476
+ package_tools: packageServer.tools,
477
+ agent_tools: selected,
478
+ };
479
+ const catalog = filterMcpCatalog(catalogPolicy, declared?.tools ?? []);
480
+ if (declared?.tools && catalog.length === 0) {
481
+ diagnostics.push({
482
+ code: "mcp.tools_filtered",
483
+ serverId: id,
484
+ url: baseUrl,
485
+ stage: "filter",
486
+ message: "The configured catalog contains no tools allowed by both package and agent policy.",
487
+ });
488
+ continue;
489
+ }
490
+ servers.push({
491
+ id,
492
+ name: binding?.name ?? declared?.name ?? id,
493
+ base_url: baseUrl,
494
+ package_tools: packageServer.tools,
495
+ agent_tools: selected,
496
+ ...(declared?.tools ? { catalog } : {}),
497
+ });
498
+ }
499
+ const session = {
500
+ version: 1,
501
+ servers,
502
+ };
503
+ const defaultPath = defaultMcpSessionPath(opts.cwd);
504
+ const target = sessionPath(env, opts.cwd);
505
+ const serialized = `${JSON.stringify(session, null, 2)}\n`;
506
+ const fingerprint = createHash("sha256").update(serialized).digest("hex").slice(0, 20);
507
+ const previousFingerprint = env[MCP_DAEMON_FINGERPRINT_ENV];
508
+ const previousToken = env[MCP_DAEMON_TOKEN_ENV];
509
+ if (previousFingerprint &&
510
+ previousFingerprint !== fingerprint) {
511
+ await stopMcpDaemon(env);
512
+ }
513
+ const writtenPath = await writeWithFallback(target, serialized, defaultPath, fallbackMcpSessionPath());
514
+ env[MCP_SESSION_ENV] = writtenPath;
515
+ env[MCP_DAEMON_FINGERPRINT_ENV] = fingerprint;
516
+ env[MCP_DAEMON_PARENT_PID_ENV] = String(process.pid);
517
+ const socketKey = createHash("sha256")
518
+ .update(`${opts.cwd}\0${fingerprint}`)
519
+ .digest("hex")
520
+ .slice(0, 20);
521
+ env[MCP_DAEMON_SOCKET_ENV] =
522
+ process.platform === "win32"
523
+ ? `\\\\.\\pipe\\pi-recipes-mcp-${socketKey}`
524
+ : join(tmpdir(), `pi-recipes-mcp-${socketKey}.sock`);
525
+ // Re-materialization with identical policy must not strand a running daemon
526
+ // behind a newly rotated client token. Rotate only when the session changes.
527
+ env[MCP_DAEMON_TOKEN_ENV] =
528
+ previousFingerprint === fingerprint && previousToken
529
+ ? previousToken
530
+ : randomBytes(32).toString("hex");
531
+ await writeMcporterConfig(env, opts.cwd, session, endpointBindingList);
532
+ return { ...session, diagnostics };
533
+ }
534
+ export async function stopMcpDaemon(env) {
535
+ const socketPath = env[MCP_DAEMON_SOCKET_ENV];
536
+ const token = env[MCP_DAEMON_TOKEN_ENV];
537
+ if (socketPath && token) {
538
+ await new Promise((resolve) => {
539
+ const socket = createConnection(socketPath);
540
+ const finish = () => {
541
+ socket.destroy();
542
+ resolve();
543
+ };
544
+ socket.setTimeout(500, finish);
545
+ socket.once("connect", () => {
546
+ socket.end(`${JSON.stringify({ type: "stop", id: randomUUID(), token })}\n`);
547
+ });
548
+ socket.once("end", finish);
549
+ socket.once("error", finish);
550
+ });
551
+ }
552
+ delete env[MCP_DAEMON_SOCKET_ENV];
553
+ delete env[MCP_DAEMON_TOKEN_ENV];
554
+ delete env[MCP_DAEMON_FINGERPRINT_ENV];
555
+ delete env[MCP_DAEMON_PARENT_PID_ENV];
556
+ delete env[MCP_SESSION_ROOT_ENV];
557
+ }
558
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type ExtensionFactory, type ModelRegistry } from "@earendil-works/pi-coding-agent";
2
+ import { type RecipeChildToolEvent } from "./child-agent.js";
3
+ export interface RecipesExtensionOptions {
4
+ env?: NodeJS.ProcessEnv;
5
+ createChildAgentRunner?: CreateRecipeChildAgentRunner;
6
+ }
7
+ /** @deprecated Use `RecipesExtensionOptions`. */
8
+ export type PiRecipesExtensionOptions = RecipesExtensionOptions;
9
+ interface RecipeChildAgentRunner {
10
+ start(): Promise<void>;
11
+ prompt(prompt: string): Promise<unknown>;
12
+ steer(message: string): Promise<void>;
13
+ cancel(): Promise<void>;
14
+ shutdown(): Promise<void>;
15
+ }
16
+ type CreateRecipeChildAgentRunner = (opts: {
17
+ recipeDir: string;
18
+ workspaceDir: string;
19
+ agentName: string;
20
+ env?: NodeJS.ProcessEnv;
21
+ modelRegistry?: ModelRegistry;
22
+ onAssistantMessage?: (text: string, stream: "delta" | "final") => void;
23
+ onToolEvent?: (event: RecipeChildToolEvent) => void;
24
+ }) => RecipeChildAgentRunner;
25
+ export declare function createRecipesExtension(opts?: RecipesExtensionOptions): ExtensionFactory;
26
+ /** @deprecated Use `createRecipesExtension`. */
27
+ export declare const createPiRecipesExtension: typeof createRecipesExtension;
28
+ declare const _default: ExtensionFactory;
29
+ export default _default;
30
+ //# sourceMappingURL=pi-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-extension.d.ts","sourceRoot":"","sources":["../src/pi-extension.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAsC1B,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;CACvD;AAED,iDAAiD;AACjD,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,UAAU,sBAAsB;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,KAAK,4BAA4B,GAAG,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC;IACvE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACrD,KAAK,sBAAsB,CAAC;AA0U7B,wBAAgB,sBAAsB,CACpC,IAAI,GAAE,uBAA4B,GACjC,gBAAgB,CA2rBlB;AAED,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,+BAAyB,CAAC;;AAE/D,wBAAwC"}