@farmslot/recipe-cli 0.1.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/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/bin/farmslot-recipe.mjs +10 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +13 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +393 -0
- package/dist/commands.js.map +1 -0
- package/dist/composition.d.ts +21 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js +232 -0
- package/dist/composition.js.map +1 -0
- package/dist/discovery-error.d.ts +8 -0
- package/dist/discovery-error.d.ts.map +1 -0
- package/dist/discovery-error.js +10 -0
- package/dist/discovery-error.js.map +1 -0
- package/dist/discovery-index.d.ts +63 -0
- package/dist/discovery-index.d.ts.map +1 -0
- package/dist/discovery-index.js +407 -0
- package/dist/discovery-index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/libraries.d.ts +18 -0
- package/dist/libraries.d.ts.map +1 -0
- package/dist/libraries.js +102 -0
- package/dist/libraries.js.map +1 -0
- package/dist/render.d.ts +9 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +165 -0
- package/dist/render.js.map +1 -0
- package/dist/search.d.ts +8 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +90 -0
- package/dist/search.js.map +1 -0
- package/dist/template.d.ts +12 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +74 -0
- package/dist/template.js.map +1 -0
- package/dist/types.d.ts +262 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ResolvedLibraryRecipe } from '@farmslot/recipe-harness';
|
|
2
|
+
import type { RecipeDiscoveryIndex } from './discovery-index.js';
|
|
3
|
+
import type { ExplainEnvelope } from './types.js';
|
|
4
|
+
export interface RecipeComposition {
|
|
5
|
+
actions: string[];
|
|
6
|
+
nestedRecipes: string[];
|
|
7
|
+
unresolvedRecipes: string[];
|
|
8
|
+
}
|
|
9
|
+
/** Actions and recipe calls reachable from a recipe's workflow nodes, following resolved calls. */
|
|
10
|
+
export declare function recipeComposition(document: Record<string, unknown>, recipes: ReadonlyMap<string, {
|
|
11
|
+
document: Record<string, unknown>;
|
|
12
|
+
}>): RecipeComposition;
|
|
13
|
+
/** Recipes in the view whose workflow calls `ref` directly. */
|
|
14
|
+
export declare function recipeCallers(index: RecipeDiscoveryIndex, ref: string): string[];
|
|
15
|
+
/** Recipes in the view whose workflow uses `action` directly. */
|
|
16
|
+
export declare function actionCallers(index: RecipeDiscoveryIndex, action: string): string[];
|
|
17
|
+
type ExplainResult = Omit<ExplainEnvelope, 'schemaVersion' | 'command' | 'status' | 'libraries'>;
|
|
18
|
+
/** Resolve the static composition graph of a recipe for the given root parameters. */
|
|
19
|
+
export declare function explainRecipe(index: RecipeDiscoveryIndex, root: ResolvedLibraryRecipe, input: Record<string, unknown>): ExplainResult;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=composition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,qBAAqB,EAG3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAGV,eAAe,EAIhB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GAClE,iBAAiB,CA8BnB;AAQD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAShF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKnF;AAED,KAAK,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAC;AAEjG,sFAAsF;AACtF,wBAAgB,aAAa,CAC3B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,aAAa,CAqIf"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { applyRecipeParamDefaults, isRecord, normalizeRecipeRef, validateRecipeParams, } from '@farmslot/protocol';
|
|
2
|
+
import { extractWorkflowGraph, RecipeResolutionError, resolveRecipeDependencies, resolveRecipeValue, } from '@farmslot/recipe-harness';
|
|
3
|
+
const MAX_EXPLAIN_DEPTH = 16;
|
|
4
|
+
/** Actions and recipe calls reachable from a recipe's workflow nodes, following resolved calls. */
|
|
5
|
+
export function recipeComposition(document, recipes) {
|
|
6
|
+
const actions = new Set();
|
|
7
|
+
const nested = new Set();
|
|
8
|
+
const unresolved = new Set();
|
|
9
|
+
const visited = new Set();
|
|
10
|
+
const visit = (recipe) => {
|
|
11
|
+
for (const node of workflowNodes(recipe)) {
|
|
12
|
+
if (typeof node.action !== 'string')
|
|
13
|
+
continue;
|
|
14
|
+
if (node.action !== 'call') {
|
|
15
|
+
actions.add(node.action);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (typeof node.ref !== 'string')
|
|
19
|
+
continue;
|
|
20
|
+
nested.add(node.ref);
|
|
21
|
+
const dependency = recipes.get(node.ref);
|
|
22
|
+
if (!dependency) {
|
|
23
|
+
unresolved.add(node.ref);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (visited.has(node.ref))
|
|
27
|
+
continue;
|
|
28
|
+
visited.add(node.ref);
|
|
29
|
+
visit(dependency.document);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
visit(document);
|
|
33
|
+
return {
|
|
34
|
+
actions: [...actions].sort(),
|
|
35
|
+
nestedRecipes: [...nested].sort(),
|
|
36
|
+
unresolvedRecipes: [...unresolved].sort(),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function workflowNodes(document) {
|
|
40
|
+
const workflow = isRecord(document.workflow) ? document.workflow : {};
|
|
41
|
+
const nodes = isRecord(workflow.nodes) ? workflow.nodes : {};
|
|
42
|
+
return Object.values(nodes).filter(isRecord);
|
|
43
|
+
}
|
|
44
|
+
/** Recipes in the view whose workflow calls `ref` directly. */
|
|
45
|
+
export function recipeCallers(index, ref) {
|
|
46
|
+
return [...index.documents.values()]
|
|
47
|
+
.filter((recipe) => workflowNodes(recipe.document).some((node) => node.action === 'call' && typeof node.ref === 'string' && node.ref === ref))
|
|
48
|
+
.map((recipe) => recipe.ref)
|
|
49
|
+
.sort();
|
|
50
|
+
}
|
|
51
|
+
/** Recipes in the view whose workflow uses `action` directly. */
|
|
52
|
+
export function actionCallers(index, action) {
|
|
53
|
+
return [...index.documents.values()]
|
|
54
|
+
.filter((recipe) => workflowNodes(recipe.document).some((node) => node.action === action))
|
|
55
|
+
.map((recipe) => recipe.ref)
|
|
56
|
+
.sort();
|
|
57
|
+
}
|
|
58
|
+
/** Resolve the static composition graph of a recipe for the given root parameters. */
|
|
59
|
+
export function explainRecipe(index, root, input) {
|
|
60
|
+
const usage = new Map();
|
|
61
|
+
const missingParameters = [];
|
|
62
|
+
const missingRecipes = [];
|
|
63
|
+
const problems = [];
|
|
64
|
+
const visit = (recipe, callerParams, templates, stack) => {
|
|
65
|
+
const { parameters, values } = explainParameters(recipe, callerParams, templates);
|
|
66
|
+
// The same parameter check `run` applies; nested values may still hold caller templates.
|
|
67
|
+
const validation = validateRecipeParams(values, recipe.document.paramsSchema, {
|
|
68
|
+
allowTemplates: stack.length > 1,
|
|
69
|
+
});
|
|
70
|
+
for (const finding of validation.findings) {
|
|
71
|
+
if (finding.severity !== 'error' || finding.code === 'recipe.missing_param')
|
|
72
|
+
continue;
|
|
73
|
+
problems.push({
|
|
74
|
+
code: 'RECIPE_PARAMS_INVALID',
|
|
75
|
+
message: `Recipe ${recipe.ref}: ${finding.message}`,
|
|
76
|
+
path: finding.path,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
for (const parameter of parameters) {
|
|
80
|
+
if (parameter.from === 'missing')
|
|
81
|
+
missingParameters.push({ recipe: recipe.ref, name: parameter.name });
|
|
82
|
+
}
|
|
83
|
+
const graph = extractWorkflowGraph(recipe.document);
|
|
84
|
+
const teardown = graph.teardownEntry
|
|
85
|
+
? reachable(graph.nodes, graph.teardownEntry)
|
|
86
|
+
: new Set();
|
|
87
|
+
const nodes = [];
|
|
88
|
+
for (const [nodeId, node] of Object.entries(graph.nodes)) {
|
|
89
|
+
const phase = graph.mainNodeIds.has(nodeId)
|
|
90
|
+
? 'main'
|
|
91
|
+
: teardown.has(nodeId)
|
|
92
|
+
? 'teardown'
|
|
93
|
+
: 'unreachable';
|
|
94
|
+
if (typeof node.action !== 'string')
|
|
95
|
+
continue;
|
|
96
|
+
if (node.action !== 'call') {
|
|
97
|
+
usage.set(node.action, [...(usage.get(node.action) ?? []), `${recipe.ref}#${nodeId}`]);
|
|
98
|
+
nodes.push({ nodeId, kind: 'action', action: node.action, phase });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const rawRef = typeof node.ref === 'string' ? node.ref : '';
|
|
102
|
+
const ref = normalizeRecipeRef(String(safeResolve(rawRef, values)));
|
|
103
|
+
const call = { nodeId, kind: 'call', ref, phase, recipe: null };
|
|
104
|
+
nodes.push(call);
|
|
105
|
+
const dependency = index.resolution.recipes.get(ref);
|
|
106
|
+
if (!dependency) {
|
|
107
|
+
missingRecipes.push({ from: `${recipe.ref}#${nodeId}`, ref });
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (stack.includes(ref) || stack.length >= MAX_EXPLAIN_DEPTH) {
|
|
111
|
+
problems.push({
|
|
112
|
+
code: stack.includes(ref) ? 'RECIPE_CALL_CYCLE' : 'RECIPE_CALL_DEPTH_EXCEEDED',
|
|
113
|
+
message: `Call ${recipe.ref}#${nodeId} -> ${ref} is not expanded: ${[...stack, ref].join(' -> ')}.`,
|
|
114
|
+
});
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const rawParams = isRecord(node.params) ? node.params : {};
|
|
118
|
+
const childTemplates = Object.fromEntries(Object.entries(rawParams).flatMap(([key, value]) => typeof value === 'string' && value.includes('{{') ? [[key, value]] : []));
|
|
119
|
+
const childParams = Object.fromEntries(Object.entries(rawParams).map(([key, value]) => [key, safeResolve(value, values)]));
|
|
120
|
+
call.recipe = visit(dependency, childParams, childTemplates, [...stack, ref]);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
ref: recipe.ref,
|
|
124
|
+
source: recipe.source,
|
|
125
|
+
file: recipe.file,
|
|
126
|
+
variant: recipe.adapter ?? null,
|
|
127
|
+
parameters,
|
|
128
|
+
nodes,
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
const tree = visit(root, input, {}, [root.ref]);
|
|
132
|
+
const requiredActions = [...usage.entries()]
|
|
133
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
134
|
+
.map(([name, usedBy]) => {
|
|
135
|
+
const action = index.actions.get(name);
|
|
136
|
+
const declared = Object.hasOwn(index.manifest.actions, name) || action?.handler === 'runner';
|
|
137
|
+
return {
|
|
138
|
+
name,
|
|
139
|
+
declared,
|
|
140
|
+
source: declared ? (action?.source ?? null) : null,
|
|
141
|
+
handler: action?.handler ?? null,
|
|
142
|
+
capabilities: action?.capabilities ?? [],
|
|
143
|
+
usedBy,
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
const capabilities = [
|
|
147
|
+
...new Set(requiredActions.flatMap((action) => action.capabilities)),
|
|
148
|
+
].sort();
|
|
149
|
+
let resolution = null;
|
|
150
|
+
try {
|
|
151
|
+
resolution = resolveRecipeDependencies({
|
|
152
|
+
rootRef: root.ref,
|
|
153
|
+
root: root.document,
|
|
154
|
+
rootSource: root.provenance,
|
|
155
|
+
recipes: index.resolution.recipes,
|
|
156
|
+
}).document;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (!(error instanceof RecipeResolutionError))
|
|
160
|
+
throw error;
|
|
161
|
+
problems.push({ code: error.code, message: error.message });
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
platform: index.platform,
|
|
165
|
+
recipe: tree,
|
|
166
|
+
requiredActions,
|
|
167
|
+
capabilities,
|
|
168
|
+
missing: {
|
|
169
|
+
parameters: missingParameters,
|
|
170
|
+
recipes: missingRecipes,
|
|
171
|
+
actions: requiredActions
|
|
172
|
+
.filter((action) => !action.declared)
|
|
173
|
+
.map((action) => ({ name: action.name, usedBy: action.usedBy })),
|
|
174
|
+
handlers: requiredActions
|
|
175
|
+
.filter((action) => action.declared && action.handler === 'adapter')
|
|
176
|
+
.map((action) => action.name),
|
|
177
|
+
problems,
|
|
178
|
+
},
|
|
179
|
+
resolution,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function explainParameters(recipe, input, templates) {
|
|
183
|
+
const schema = recipe.document.paramsSchema;
|
|
184
|
+
const values = applyRecipeParamDefaults(input, schema);
|
|
185
|
+
const properties = isRecord(schema) && isRecord(schema.properties) ? Object.keys(schema.properties) : [];
|
|
186
|
+
const required = new Set(isRecord(schema) && Array.isArray(schema.required)
|
|
187
|
+
? schema.required.filter((entry) => typeof entry === 'string')
|
|
188
|
+
: []);
|
|
189
|
+
const names = [...new Set([...properties, ...Object.keys(input)])];
|
|
190
|
+
const parameters = names.map((name) => {
|
|
191
|
+
const template = templates[name] ? { template: templates[name] } : {};
|
|
192
|
+
if (Object.hasOwn(input, name))
|
|
193
|
+
return { name, value: input[name], from: 'input', ...template };
|
|
194
|
+
if (Object.hasOwn(values, name))
|
|
195
|
+
return { name, value: values[name], from: 'default' };
|
|
196
|
+
return required.has(name) ? { name, from: 'missing' } : { name, from: 'default' };
|
|
197
|
+
});
|
|
198
|
+
return { parameters, values };
|
|
199
|
+
}
|
|
200
|
+
/** Substitute `{{params.*}}` where the value is known; keep the template otherwise. */
|
|
201
|
+
function safeResolve(value, params) {
|
|
202
|
+
try {
|
|
203
|
+
return resolveRecipeValue(value, params);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
// A parameter the caller did not supply stays a visible template; explain reports it as missing.
|
|
207
|
+
if (error instanceof RecipeResolutionError)
|
|
208
|
+
return value;
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function reachable(nodes, entry) {
|
|
213
|
+
const seen = new Set();
|
|
214
|
+
const queue = [entry];
|
|
215
|
+
while (queue.length > 0) {
|
|
216
|
+
const nodeId = queue.shift();
|
|
217
|
+
const node = nodes[nodeId];
|
|
218
|
+
if (seen.has(nodeId) || !node)
|
|
219
|
+
continue;
|
|
220
|
+
seen.add(nodeId);
|
|
221
|
+
for (const next of [
|
|
222
|
+
node.next,
|
|
223
|
+
node.default,
|
|
224
|
+
...(isRecord(node.cases) ? Object.values(node.cases) : []),
|
|
225
|
+
]) {
|
|
226
|
+
if (typeof next === 'string')
|
|
227
|
+
queue.push(next);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return seen;
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type DiscoveryErrorCode = 'ACTION_MANIFEST_INVALID' | 'DISCOVERY_NAME_AMBIGUOUS' | 'DISCOVERY_NOT_FOUND' | 'DISCOVERY_USAGE' | 'RECIPE_PLATFORM_REQUIRED' | 'RECIPE_SHADOWED';
|
|
2
|
+
/** A discovery failure with the next command the caller should run. */
|
|
3
|
+
export declare class DiscoveryError extends Error {
|
|
4
|
+
readonly code: DiscoveryErrorCode;
|
|
5
|
+
readonly userAction: string;
|
|
6
|
+
constructor(code: DiscoveryErrorCode, message: string, userAction: string);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=discovery-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-error.d.ts","sourceRoot":"","sources":["../src/discovery-error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,0BAA0B,GAC1B,qBAAqB,GACrB,iBAAiB,GACjB,0BAA0B,GAC1B,iBAAiB,CAAC;AAEtB,uEAAuE;AACvE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAM1E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A discovery failure with the next command the caller should run. */
|
|
2
|
+
export class DiscoveryError extends Error {
|
|
3
|
+
constructor(code, message, userAction) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'DiscoveryError';
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.userAction = userAction;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=discovery-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-error.js","sourceRoot":"","sources":["../src/discovery-error.ts"],"names":[],"mappings":"AAQA,uEAAuE;AACvE,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIvC,YAAY,IAAwB,EAAE,OAAe,EAAE,UAAkB;QACvE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type RecipeActionManifestDocument } from '@farmslot/protocol';
|
|
2
|
+
import { type LibraryRecipeMatch, loadRecipeLibraries, type RecipeLibraryEnv, type RecipeLibraryLoadOptions, type RecipeLibraryResolution, type RecipeLibrarySource, type RecipePackageVersions, type ResolvedLibraryRecipe } from '@farmslot/recipe-harness';
|
|
3
|
+
import { type ResolvedDiscoveryLibrary } from './libraries.js';
|
|
4
|
+
import type { DiscoveryAction, DiscoveryLibrary, DiscoveryParameter, DiscoveryProblem, DiscoveryRecipe } from './types.js';
|
|
5
|
+
export interface DiscoveryOptions {
|
|
6
|
+
/** `--library` entries, `name=path` or `path`. */
|
|
7
|
+
libraries?: readonly string[];
|
|
8
|
+
/** Platform view: selects platform variants and platform action manifests. */
|
|
9
|
+
platform?: string;
|
|
10
|
+
env?: RecipeLibraryEnv;
|
|
11
|
+
/** Actions with a handler registered by the host CLI. Defaults to the standard core handlers. */
|
|
12
|
+
handlers?: readonly string[];
|
|
13
|
+
/** Package versions the host provides for checking each library's `requires`. */
|
|
14
|
+
packageVersions?: RecipePackageVersions;
|
|
15
|
+
/** Library loader; defaults to the runner's. Every load an index needs goes through it once. */
|
|
16
|
+
loadLibraries?: typeof loadRecipeLibraries;
|
|
17
|
+
}
|
|
18
|
+
/** Internal action record: the public summary plus its schema and examples. */
|
|
19
|
+
export interface IndexedAction extends DiscoveryAction {
|
|
20
|
+
schema: unknown;
|
|
21
|
+
examples: unknown[];
|
|
22
|
+
}
|
|
23
|
+
/** Recipes, actions and libraries visible from one platform view. */
|
|
24
|
+
export interface RecipeDiscoveryIndex {
|
|
25
|
+
platform: string | null;
|
|
26
|
+
platforms: string[];
|
|
27
|
+
libraries: ResolvedDiscoveryLibrary[];
|
|
28
|
+
/** Load options for this view, shared with `run` resolution. */
|
|
29
|
+
loadOptions: RecipeLibraryLoadOptions;
|
|
30
|
+
/** Memoized loader for one or more of this index's libraries; each set loads once. */
|
|
31
|
+
load: (sources: readonly RecipeLibrarySource[], adapter: string | null) => Promise<RecipeLibraryResolution>;
|
|
32
|
+
/** Resolution used by `run` for this view: precedence winners, keyed by ref. */
|
|
33
|
+
resolution: RecipeLibraryResolution;
|
|
34
|
+
/** Every declared action for this view, merged by precedence, as a runner manifest. */
|
|
35
|
+
manifest: RecipeActionManifestDocument;
|
|
36
|
+
actions: ReadonlyMap<string, IndexedAction>;
|
|
37
|
+
recipes: ReadonlyMap<string, DiscoveryRecipe>;
|
|
38
|
+
/** Full recipe records for this view, keyed by ref, aliases excluded. */
|
|
39
|
+
documents: ReadonlyMap<string, ResolvedLibraryRecipe>;
|
|
40
|
+
}
|
|
41
|
+
export declare function buildDiscoveryIndex(options?: DiscoveryOptions): Promise<RecipeDiscoveryIndex>;
|
|
42
|
+
export declare function libraryInfos(index: RecipeDiscoveryIndex): DiscoveryLibrary[];
|
|
43
|
+
/** Parameters of a JSON schema object, in declaration order. */
|
|
44
|
+
export declare function schemaParameters(schema: unknown, exclude?: readonly string[]): DiscoveryParameter[];
|
|
45
|
+
export declare function recipeSummary(recipe: ResolvedLibraryRecipe): Omit<DiscoveryRecipe, 'variants' | 'runnable' | 'problems'>;
|
|
46
|
+
/**
|
|
47
|
+
* What readiness needs: a host can pass a recipe-cli index, or its own single-platform resolution
|
|
48
|
+
* (`loadRecipeLibraries(sources, { adapter })`) with the manifest its runner will execute against.
|
|
49
|
+
*/
|
|
50
|
+
export interface RecipeReadinessView {
|
|
51
|
+
resolution: RecipeLibraryResolution;
|
|
52
|
+
manifest: RecipeActionManifestDocument;
|
|
53
|
+
}
|
|
54
|
+
/** Readiness of any one recipe in this view: a precedence winner, a qualified alias, or a shadowed recipe selected by id. */
|
|
55
|
+
export declare function assessRecipe(index: RecipeReadinessView, recipe: ResolvedLibraryRecipe): DiscoveryProblem[];
|
|
56
|
+
/** Resolve a recipe name exactly as `run` does: ref, platform alias, or `<library>.<ref>` id. */
|
|
57
|
+
export declare function findRecipe(index: RecipeDiscoveryIndex, name: string): Promise<LibraryRecipeMatch | undefined>;
|
|
58
|
+
/** Recipes that lower-ranked libraries declare under a ref another library wins. */
|
|
59
|
+
export declare function shadowedRecipes(index: RecipeDiscoveryIndex): Promise<ResolvedLibraryRecipe[]>;
|
|
60
|
+
/** Closest known names, for not-found guidance. */
|
|
61
|
+
export declare function suggestNames(name: string, candidates: Iterable<string>, limit?: number): string[];
|
|
62
|
+
export declare function levenshtein(left: string, right: string): number;
|
|
63
|
+
//# sourceMappingURL=discovery-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-index.d.ts","sourceRoot":"","sources":["../src/discovery-index.ts"],"names":[],"mappings":"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"}
|