@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
@@ -0,0 +1,479 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
3
+ const INVALID_MCP_TOOL_SELECTION = Symbol("invalidMcpToolSelection");
4
+ /** Parse a selection while preserving whether its source shape was malformed. */
5
+ export function parseRecipeMcpToolSelection(value) {
6
+ const validObject = Boolean(value) && typeof value === "object" && !Array.isArray(value);
7
+ const data = asRecord(value);
8
+ const selection = {
9
+ ...(Object.hasOwn(data, "include") ? { include: stringArray(data.include) } : {}),
10
+ ...(Object.hasOwn(data, "exclude") ? { exclude: stringArray(data.exclude) } : {}),
11
+ };
12
+ const malformedArray = ["include", "exclude"].some((key) => Object.hasOwn(data, key) &&
13
+ (!Array.isArray(data[key]) ||
14
+ data[key].some((item) => typeof item !== "string")));
15
+ if (!validObject || malformedArray) {
16
+ Object.defineProperty(selection, INVALID_MCP_TOOL_SELECTION, {
17
+ value: true,
18
+ enumerable: false,
19
+ });
20
+ }
21
+ return selection;
22
+ }
23
+ /** Minimal runtime guard; recipe-check owns detailed authoring diagnostics. */
24
+ export function isValidRecipeMcpToolSelection(selection) {
25
+ if (selection[INVALID_MCP_TOOL_SELECTION]) {
26
+ return false;
27
+ }
28
+ return (selection.include ?? []).every((selector) => {
29
+ const value = selector.trim();
30
+ return Boolean(value) && (value === "*" || !value.includes("*"));
31
+ }) && (selection.exclude ?? []).every((selector) => {
32
+ const value = selector.trim();
33
+ return Boolean(value) && !value.includes("*");
34
+ });
35
+ }
36
+ const RESOURCE_KEYS = [
37
+ "agents",
38
+ "extensions",
39
+ "skills",
40
+ "prompts",
41
+ ];
42
+ function stringArray(value) {
43
+ return Array.isArray(value)
44
+ ? value.filter((item) => typeof item === "string")
45
+ : [];
46
+ }
47
+ function emptyResources() {
48
+ return {
49
+ agents: [],
50
+ extensions: [],
51
+ skills: [],
52
+ prompts: [],
53
+ };
54
+ }
55
+ function emptyMcpConfig() {
56
+ return {
57
+ manifests: [],
58
+ servers: [],
59
+ };
60
+ }
61
+ function emptyEvalsConfig() {
62
+ return {
63
+ suites: [],
64
+ };
65
+ }
66
+ function normalizeResourcePath(path) {
67
+ return path.replace(/\\/g, "/").replace(/^\.\//, "");
68
+ }
69
+ function hasTraversalSegment(path) {
70
+ return normalizeResourcePath(path)
71
+ .split("/")
72
+ .some((segment) => segment === "." || segment === "..");
73
+ }
74
+ function assertPackageResourcePath(pkg, key, resource, resolved) {
75
+ if (isAbsolute(resource) || hasTraversalSegment(resource)) {
76
+ throw new RecipePackageError(`Recipe ${pkg.name} declares ${key} resource outside the package: ${resource}`);
77
+ }
78
+ const relativePath = relative(resolve(pkg.path), resolved);
79
+ if (relativePath === ".." ||
80
+ relativePath.startsWith("../") ||
81
+ relativePath.startsWith("..\\") ||
82
+ isAbsolute(relativePath)) {
83
+ throw new RecipePackageError(`Recipe ${pkg.name} declares ${key} resource outside the package: ${resource}`);
84
+ }
85
+ }
86
+ function hasGlob(value) {
87
+ return /[*?[\]{}]/.test(value);
88
+ }
89
+ function escapeRegExp(value) {
90
+ return value.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
91
+ }
92
+ function globToRegExp(glob) {
93
+ const normalized = normalizeResourcePath(glob);
94
+ let pattern = "^";
95
+ for (let index = 0; index < normalized.length; index += 1) {
96
+ const char = normalized[index];
97
+ const next = normalized[index + 1];
98
+ if (char === "*" && next === "*") {
99
+ const after = normalized[index + 2];
100
+ if (after === "/") {
101
+ pattern += "(?:.*/)?";
102
+ index += 2;
103
+ }
104
+ else {
105
+ pattern += ".*";
106
+ index += 1;
107
+ }
108
+ }
109
+ else if (char === "*") {
110
+ pattern += "[^/]*";
111
+ }
112
+ else if (char === "?") {
113
+ pattern += "[^/]";
114
+ }
115
+ else {
116
+ pattern += escapeRegExp(char);
117
+ }
118
+ }
119
+ pattern += "$";
120
+ return new RegExp(pattern);
121
+ }
122
+ function listPackageEntries(root) {
123
+ const entries = [];
124
+ function visit(dir, relativeDir = "") {
125
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
126
+ const relative = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
127
+ const fullPath = join(dir, entry.name);
128
+ entries.push(relative);
129
+ if (entry.isDirectory())
130
+ visit(fullPath, relative);
131
+ }
132
+ }
133
+ visit(root);
134
+ return entries;
135
+ }
136
+ function finding(severity, code, message, packageName) {
137
+ return {
138
+ severity,
139
+ code,
140
+ message,
141
+ packageName,
142
+ };
143
+ }
144
+ export class RecipePackageError extends Error {
145
+ constructor(message) {
146
+ super(message);
147
+ this.name = "RecipePackageError";
148
+ }
149
+ }
150
+ function asRecord(value) {
151
+ return value && typeof value === "object" && !Array.isArray(value)
152
+ ? value
153
+ : {};
154
+ }
155
+ function readJsonFile(path) {
156
+ try {
157
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
158
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
159
+ ? parsed
160
+ : {};
161
+ }
162
+ catch (err) {
163
+ throw new RecipePackageError(`Recipe package at ${path} has invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
164
+ }
165
+ }
166
+ function stringValue(value) {
167
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
168
+ }
169
+ function parseMcpConfig(value) {
170
+ if (typeof value === "string") {
171
+ return { ...emptyMcpConfig(), manifests: stringArray([value]).map(normalizeResourcePath) };
172
+ }
173
+ if (Array.isArray(value)) {
174
+ return { ...emptyMcpConfig(), manifests: stringArray(value).map(normalizeResourcePath) };
175
+ }
176
+ if (!value || typeof value !== "object" || Array.isArray(value))
177
+ return emptyMcpConfig();
178
+ const data = value;
179
+ const manifests = [
180
+ ...(stringValue(data.manifest) ? [stringValue(data.manifest)] : []),
181
+ ...stringArray(data.manifests),
182
+ ].map(normalizeResourcePath);
183
+ const seen = new Set();
184
+ const servers = [];
185
+ for (const raw of Array.isArray(data.servers) ? data.servers : []) {
186
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
187
+ continue;
188
+ const server = raw;
189
+ const id = stringValue(server.id);
190
+ if (!id || seen.has(id))
191
+ continue;
192
+ const tools = parseRecipeMcpToolSelection(Object.hasOwn(server, "tools") ? server.tools : {});
193
+ seen.add(id);
194
+ servers.push({
195
+ id,
196
+ required: server.required === true,
197
+ tools,
198
+ });
199
+ }
200
+ return { manifests, servers };
201
+ }
202
+ function withRawEvalsConfig(config, raw) {
203
+ Object.defineProperty(config, "raw", {
204
+ value: raw,
205
+ enumerable: false,
206
+ configurable: false,
207
+ });
208
+ return config;
209
+ }
210
+ export function parseEvalsConfig(value, present = value !== undefined) {
211
+ if (!present)
212
+ return emptyEvalsConfig();
213
+ const data = asRecord(value);
214
+ const rawSuites = Array.isArray(data.suites) ? data.suites : [];
215
+ const suites = [];
216
+ for (const raw of rawSuites) {
217
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
218
+ continue;
219
+ const suite = raw;
220
+ const name = stringValue(suite.name);
221
+ const type = stringValue(suite.type);
222
+ if (!name)
223
+ continue;
224
+ if (type === "registry") {
225
+ const dataset = stringValue(suite.dataset);
226
+ const version = stringValue(suite.version);
227
+ if (!dataset || !version)
228
+ continue;
229
+ suites.push({ name, type, dataset, version });
230
+ }
231
+ else if (type === "git") {
232
+ const repo = stringValue(suite.repo);
233
+ const rev = stringValue(suite.rev);
234
+ const dataset = stringValue(suite.dataset);
235
+ if (!repo || !rev || !dataset)
236
+ continue;
237
+ suites.push({
238
+ name,
239
+ type,
240
+ repo,
241
+ rev,
242
+ dataset,
243
+ });
244
+ }
245
+ }
246
+ return withRawEvalsConfig({ suites }, value);
247
+ }
248
+ function fixedRegistryTag(value) {
249
+ const tag = value.trim();
250
+ if (!tag || tag.toLowerCase() === "latest")
251
+ return false;
252
+ if (/\s/.test(tag) || /[\^~<>=*|]/.test(tag))
253
+ return false;
254
+ return !/(^|[._-])x($|[._-])/i.test(tag);
255
+ }
256
+ function fixedGitRev(value) {
257
+ return /^[0-9a-fA-F]{7,40}$/.test(value);
258
+ }
259
+ export function validateRecipeEvalsConfig(evals, packageName) {
260
+ const findings = [];
261
+ const raw = evals.raw;
262
+ const data = raw === undefined ? { suites: evals.suites } : asRecord(raw);
263
+ const rawSuites = Array.isArray(data.suites) ? data.suites : [];
264
+ if (raw !== undefined && (!raw || typeof raw !== "object" || Array.isArray(raw))) {
265
+ findings.push(finding("error", "evals.suite_invalid", "pi.evals must be an object with a suites array", packageName));
266
+ return { valid: false, findings };
267
+ }
268
+ if (data.suites !== undefined && !Array.isArray(data.suites)) {
269
+ findings.push(finding("error", "evals.suite_invalid", "pi.evals.suites must be an array", packageName));
270
+ return { valid: false, findings };
271
+ }
272
+ const seenNames = new Map();
273
+ for (const [index, rawSuite] of rawSuites.entries()) {
274
+ const label = `pi.evals.suites[${index}]`;
275
+ if (!rawSuite || typeof rawSuite !== "object" || Array.isArray(rawSuite)) {
276
+ findings.push(finding("error", "evals.suite_invalid", `${label} must be an object`, packageName));
277
+ continue;
278
+ }
279
+ const suite = rawSuite;
280
+ const name = stringValue(suite.name);
281
+ const type = stringValue(suite.type);
282
+ if (!name) {
283
+ findings.push(finding("error", "evals.suite_invalid", `${label} must declare a non-empty name`, packageName));
284
+ }
285
+ else {
286
+ const firstIndex = seenNames.get(name);
287
+ if (firstIndex !== undefined) {
288
+ findings.push(finding("error", "evals.name_duplicate", `${label} reuses suite name "${name}" already declared at pi.evals.suites[${firstIndex}]`, packageName));
289
+ }
290
+ else {
291
+ seenNames.set(name, index);
292
+ }
293
+ }
294
+ if (type !== "registry" && type !== "git") {
295
+ findings.push(finding("error", "evals.suite_invalid", `${label} must use type "registry" or "git"`, packageName));
296
+ continue;
297
+ }
298
+ if (type === "registry") {
299
+ if (!stringValue(suite.dataset)) {
300
+ findings.push(finding("error", "evals.suite_invalid", `${label} registry suite must declare dataset`, packageName));
301
+ }
302
+ const version = stringValue(suite.version);
303
+ if (!version) {
304
+ findings.push(finding("error", "evals.suite_invalid", `${label} registry suite must declare version`, packageName));
305
+ }
306
+ else if (!fixedRegistryTag(version)) {
307
+ findings.push(finding("error", "evals.pin_mutable", `${label} registry version must be an explicit Harbor registry tag, not a mutable alias or range: ${version}`, packageName));
308
+ }
309
+ }
310
+ else {
311
+ if (!stringValue(suite.repo)) {
312
+ findings.push(finding("error", "evals.suite_invalid", `${label} git suite must declare repo`, packageName));
313
+ }
314
+ const rev = stringValue(suite.rev);
315
+ if (!rev) {
316
+ findings.push(finding("error", "evals.suite_invalid", `${label} git suite must declare rev`, packageName));
317
+ }
318
+ else if (!fixedGitRev(rev)) {
319
+ findings.push(finding("error", "evals.pin_mutable", `${label} git rev must be a 7-40 character hex commit SHA: ${rev}`, packageName));
320
+ }
321
+ if (!stringValue(suite.dataset)) {
322
+ findings.push(finding("error", "evals.suite_invalid", `${label} git suite must declare dataset`, packageName));
323
+ }
324
+ }
325
+ }
326
+ return {
327
+ valid: findings.every((item) => item.severity !== "error"),
328
+ findings,
329
+ };
330
+ }
331
+ function packageJsonPath(packageDir) {
332
+ const packagePath = join(packageDir, "package.json");
333
+ return existsSync(packagePath) ? packagePath : undefined;
334
+ }
335
+ function piPackageManifestBlock(raw) {
336
+ const pi = asRecord(raw.pi);
337
+ return Object.keys(pi).length > 0 ? pi : undefined;
338
+ }
339
+ function piPackageManifestPath(packageDir) {
340
+ const manifestPath = packageJsonPath(packageDir);
341
+ if (!manifestPath)
342
+ return undefined;
343
+ const raw = readJsonFile(manifestPath);
344
+ return piPackageManifestBlock(raw) ? manifestPath : undefined;
345
+ }
346
+ export function readPiPackageManifest(packageDir) {
347
+ const packagePath = packageJsonPath(packageDir);
348
+ if (!packagePath) {
349
+ throw new RecipePackageError(`Recipe package at ${packageDir} is missing package.json with a pi manifest`);
350
+ }
351
+ const raw = readJsonFile(packagePath);
352
+ const pi = piPackageManifestBlock(raw);
353
+ if (!pi) {
354
+ throw new RecipePackageError(`Recipe package at ${packageDir} is missing package.json pi manifest`);
355
+ }
356
+ const resources = emptyResources();
357
+ for (const key of RESOURCE_KEYS) {
358
+ resources[key] = stringArray(pi[key]).map(normalizeResourcePath);
359
+ }
360
+ return {
361
+ name: stringValue(raw.name) ?? "",
362
+ version: stringValue(raw.version) ?? "0.0.0",
363
+ ...(stringValue(raw.description) ? { description: stringValue(raw.description) } : {}),
364
+ path: packageDir,
365
+ resources,
366
+ mcp: parseMcpConfig(pi.mcp),
367
+ evals: parseEvalsConfig(pi.evals, Object.prototype.hasOwnProperty.call(pi, "evals")),
368
+ };
369
+ }
370
+ export function resolvePiPackageMcpManifestPaths(pkg, opts = {}) {
371
+ const globs = pkg.mcp.manifests;
372
+ const resolved = new Set();
373
+ const entries = globs.some(hasGlob) ? listPackageEntries(pkg.path) : [];
374
+ for (const glob of globs) {
375
+ if (!glob.trim())
376
+ continue;
377
+ if (isAbsolute(glob) || hasTraversalSegment(glob)) {
378
+ throw new RecipePackageError(`Recipe ${pkg.name} declares mcp manifest outside the package: ${glob}`);
379
+ }
380
+ const target = resolve(pkg.path, glob);
381
+ const relativePath = relative(resolve(pkg.path), target);
382
+ if (relativePath === ".." ||
383
+ relativePath.startsWith("../") ||
384
+ relativePath.startsWith("..\\") ||
385
+ isAbsolute(relativePath)) {
386
+ throw new RecipePackageError(`Recipe ${pkg.name} declares mcp manifest outside the package: ${glob}`);
387
+ }
388
+ if (!hasGlob(glob)) {
389
+ if (!existsSync(target)) {
390
+ throw new RecipePackageError(`Recipe ${pkg.name} declares missing mcp manifest: ${glob}`);
391
+ }
392
+ resolved.add(target);
393
+ continue;
394
+ }
395
+ const matcher = globToRegExp(glob);
396
+ const matches = entries
397
+ .filter((entry) => matcher.test(normalizeResourcePath(entry)))
398
+ .map((entry) => resolve(pkg.path, entry));
399
+ if (matches.length === 0) {
400
+ if (opts.allowEmptyGlobMatches)
401
+ continue;
402
+ throw new RecipePackageError(`Recipe ${pkg.name} declares mcp manifest glob with no matches: ${glob}`);
403
+ }
404
+ for (const match of matches)
405
+ resolved.add(match);
406
+ }
407
+ return [...resolved].sort();
408
+ }
409
+ export function resolvePiPackageResourcePaths(pkg, key, opts = {}) {
410
+ const globs = pkg.resources[key];
411
+ const resolved = new Set();
412
+ const entries = globs.some(hasGlob) ? listPackageEntries(pkg.path) : [];
413
+ for (const glob of globs) {
414
+ if (!glob.trim())
415
+ continue;
416
+ assertPackageResourcePath(pkg, key, glob, resolve(pkg.path, glob));
417
+ if (!hasGlob(glob)) {
418
+ const direct = resolve(pkg.path, glob);
419
+ if (!existsSync(direct)) {
420
+ throw new RecipePackageError(`Recipe ${pkg.name} declares missing ${key} resource: ${glob}`);
421
+ }
422
+ resolved.add(direct);
423
+ continue;
424
+ }
425
+ const matcher = globToRegExp(glob);
426
+ const matches = entries
427
+ .filter((entry) => matcher.test(normalizeResourcePath(entry)))
428
+ .map((entry) => resolve(pkg.path, entry));
429
+ if (matches.length === 0) {
430
+ if (opts.allowEmptyGlobMatches)
431
+ continue;
432
+ throw new RecipePackageError(`Recipe ${pkg.name} declares ${key} glob with no matches: ${glob}`);
433
+ }
434
+ for (const match of matches)
435
+ resolved.add(match);
436
+ }
437
+ return [...resolved].sort();
438
+ }
439
+ export function defaultPiPackageResourcePaths(pkg, key) {
440
+ const defaults = {
441
+ agents: [join(pkg.path, "agents")],
442
+ skills: [join(pkg.path, "skills")],
443
+ prompts: [join(pkg.path, "prompts")],
444
+ };
445
+ return (defaults[key] ?? []).filter((path) => existsSync(path));
446
+ }
447
+ export function packageResourcePaths(pkg, key) {
448
+ if (pkg.resources[key].length > 0) {
449
+ return resolvePiPackageResourcePaths(pkg, key, {
450
+ allowEmptyGlobMatches: key === "extensions" ||
451
+ key === "skills" ||
452
+ key === "prompts",
453
+ });
454
+ }
455
+ return defaultPiPackageResourcePaths(pkg, key);
456
+ }
457
+ export function validatePiPackageManifest(pkg) {
458
+ const findings = [];
459
+ if (!pkg.name.trim()) {
460
+ findings.push(finding("error", "package.name_missing", "Package is missing name"));
461
+ }
462
+ if (!piPackageManifestPath(pkg.path)) {
463
+ findings.push(finding("error", "package.manifest_missing", "Package is missing package.json with a pi manifest", pkg.name));
464
+ }
465
+ if (pkg.resources.agents.length === 0 &&
466
+ !existsSync(join(pkg.path, "agents"))) {
467
+ findings.push(finding("warning", "package.no_agents", "Package declares no agents and has no agents directory", pkg.name));
468
+ }
469
+ const invalidMcpServer = pkg.mcp.servers.find((server) => !isValidRecipeMcpToolSelection(server.tools));
470
+ if (invalidMcpServer) {
471
+ findings.push(finding("error", "pi.mcp_invalid", `MCP server "${invalidMcpServer.id}" has an invalid tool policy; run introspection check for details`, pkg.name));
472
+ }
473
+ findings.push(...validateRecipeEvalsConfig(pkg.evals, pkg.name).findings);
474
+ return {
475
+ valid: findings.every((item) => item.severity !== "error"),
476
+ findings,
477
+ };
478
+ }
479
+ //# sourceMappingURL=recipe-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-package.js","sourceRoot":"","sources":["../src/recipe-package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve the package's physical skill resources to the subset selected by an
3
+ * agent definition. Selection controls Pi discovery and prompt exposure; it
4
+ * does not remove the remaining recipe files from the shared sandbox.
5
+ */
6
+ export declare function resolveAgentSkillPaths(recipeDir: string, resourcePaths: string[], selectedNames: readonly string[]): string[];
7
+ //# sourceMappingURL=recipe-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-skills.d.ts","sourceRoot":"","sources":["../src/recipe-skills.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,MAAM,EAAE,CA8BV"}
@@ -0,0 +1,46 @@
1
+ import { loadSkills, parseFrontmatter, } from "@earendil-works/pi-coding-agent";
2
+ import { readFileSync } from "node:fs";
3
+ import { basename, dirname } from "node:path";
4
+ function diagnosticSkillName(filePath) {
5
+ try {
6
+ const { frontmatter } = parseFrontmatter(readFileSync(filePath, "utf8"));
7
+ if (typeof frontmatter.name === "string" && frontmatter.name.trim()) {
8
+ return frontmatter.name.trim();
9
+ }
10
+ }
11
+ catch {
12
+ // Pi's resource loader will report the underlying read or parse failure.
13
+ }
14
+ return basename(dirname(filePath));
15
+ }
16
+ /**
17
+ * Resolve the package's physical skill resources to the subset selected by an
18
+ * agent definition. Selection controls Pi discovery and prompt exposure; it
19
+ * does not remove the remaining recipe files from the shared sandbox.
20
+ */
21
+ export function resolveAgentSkillPaths(recipeDir, resourcePaths, selectedNames) {
22
+ if (selectedNames.length === 0 || resourcePaths.length === 0)
23
+ return [];
24
+ const selected = new Set(selectedNames);
25
+ const { skills, diagnostics } = loadSkills({
26
+ cwd: recipeDir,
27
+ agentDir: recipeDir,
28
+ skillPaths: resourcePaths,
29
+ includeDefaults: false,
30
+ });
31
+ const selectedPaths = new Set(skills
32
+ .filter((skill) => selected.has(skill.name))
33
+ .map((skill) => skill.filePath));
34
+ // Keep selected files that Pi could discover but could not load. Passing the
35
+ // physical file to Pi's resource loader preserves its validation diagnostic
36
+ // instead of silently dropping a configured skill. Diagnostics from
37
+ // unselected skills remain outside the active agent's resource scope.
38
+ for (const diagnostic of diagnostics) {
39
+ if (diagnostic.path &&
40
+ selected.has(diagnosticSkillName(diagnostic.path))) {
41
+ selectedPaths.add(diagnostic.path);
42
+ }
43
+ }
44
+ return [...selectedPaths];
45
+ }
46
+ //# sourceMappingURL=recipe-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-skills.js","sourceRoot":"","sources":["../src/recipe-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACpE,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,aAAuB,EACvB,aAAgC;IAEhC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC;QACzC,GAAG,EAAE,SAAS;QACd,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,aAAa;QACzB,eAAe,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,MAAM;SACH,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAClC,CAAC;IAEF,6EAA6E;IAC7E,4EAA4E;IAC5E,oEAAoE;IACpE,sEAAsE;IACtE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IACE,UAAU,CAAC,IAAI;YACf,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAClD,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { CredentialStore } from "@earendil-works/pi-ai";
2
+ import type { AgentRunController } from "./agent-tool.js";
3
+ import type { CreateRecipeSessionOptions, RecipeSessionOtelOptions, RecipeSessionHandle } from "./session.js";
4
+ /** Default in-process child concurrency. */
5
+ export declare const DEFAULT_SUBAGENT_CONCURRENCY = 4;
6
+ export interface InProcessRunControllerOptions {
7
+ recipeDir: string;
8
+ cwd: string;
9
+ env?: NodeJS.ProcessEnv;
10
+ credentials?: CredentialStore;
11
+ /** Concurrent child runs; excess starts queue. Default 4. */
12
+ concurrency?: number;
13
+ /** Root session instrumentation inherited by in-process child sessions. */
14
+ otel?: RecipeSessionOtelOptions;
15
+ /** Child session factory; defaults to `createRecipeSession`. Test/DI seam. */
16
+ sessionFactory?: (options: CreateRecipeSessionOptions) => Promise<RecipeSessionHandle>;
17
+ }
18
+ /**
19
+ * The default rung-3 subagent controller: children are recipe sessions
20
+ * created through `createRecipeSession` in this process, with bounded
21
+ * concurrency and delegation depth.
22
+ *
23
+ * Recovery rule every controller must honor: a child whose agent profile no
24
+ * longer exists errors the parent's `agent` tool call — it never wedges it.
25
+ * Here that falls out of resolution: `createRecipeSession` throws for an
26
+ * unknown agent name, the run settles as `failed`, and `start`/`wait`
27
+ * resolve with that failure.
28
+ */
29
+ export declare function createInProcessRunController(opts: InProcessRunControllerOptions): AgentRunController;
30
+ /** A controller for sessions whose recipe declares no subagents. */
31
+ export declare function inertRunController(): AgentRunController;
32
+ //# sourceMappingURL=run-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-controller.d.ts","sourceRoot":"","sources":["../src/run-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,kBAAkB,EAGnB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AAEtB,4CAA4C;AAC5C,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,8EAA8E;IAC9E,cAAc,CAAC,EAAE,CACf,OAAO,EAAE,0BAA0B,KAChC,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnC;AAiBD;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,6BAA6B,GAClC,kBAAkB,CA4NpB;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,IAAI,kBAAkB,CAoBvD"}