patchwork-os 0.2.0-alpha.34 → 0.2.0-alpha.36
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/README.md +202 -93
- package/deploy/bootstrap-new-vps.sh +12 -12
- package/deploy/bootstrap-vps.sh +6 -3
- package/deploy/deploy-landing.sh +59 -2
- package/dist/activityLog.d.ts +49 -0
- package/dist/activityLog.js +78 -0
- package/dist/activityLog.js.map +1 -1
- package/dist/approvalHttp.d.ts +25 -0
- package/dist/approvalHttp.js +74 -18
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalInsights.d.ts +49 -0
- package/dist/approvalInsights.js +97 -0
- package/dist/approvalInsights.js.map +1 -0
- package/dist/approvalQueue.d.ts +11 -0
- package/dist/approvalQueue.js +80 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/approvalSignals.d.ts +124 -0
- package/dist/approvalSignals.js +512 -0
- package/dist/approvalSignals.js.map +1 -0
- package/dist/automation.d.ts +37 -0
- package/dist/automation.js +105 -61
- package/dist/automation.js.map +1 -1
- package/dist/automationSuggestions.d.ts +79 -0
- package/dist/automationSuggestions.js +150 -0
- package/dist/automationSuggestions.js.map +1 -0
- package/dist/bridge.js +78 -1
- package/dist/bridge.js.map +1 -1
- package/dist/ccPermissions.d.ts +15 -0
- package/dist/ccPermissions.js +15 -0
- package/dist/ccPermissions.js.map +1 -1
- package/dist/claudeDriver.js +74 -16
- package/dist/claudeDriver.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +8 -0
- package/dist/commands/patchworkInit.js +41 -5
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +20 -0
- package/dist/commands/recipe.js +212 -6
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +79 -1
- package/dist/commands/recipeInstall.js +333 -16
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +83 -0
- package/dist/commands/tracesExport.js +269 -0
- package/dist/commands/tracesExport.js.map +1 -0
- package/dist/commands/tracesImport.d.ts +56 -0
- package/dist/commands/tracesImport.js +161 -0
- package/dist/commands/tracesImport.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.d.ts +43 -0
- package/dist/connectorRoutes.js +1023 -0
- package/dist/connectorRoutes.js.map +1 -0
- package/dist/connectors/asana.d.ts +198 -0
- package/dist/connectors/asana.js +679 -0
- package/dist/connectors/asana.js.map +1 -0
- package/dist/connectors/baseConnector.d.ts +36 -0
- package/dist/connectors/baseConnector.js +151 -28
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/discord.d.ts +150 -0
- package/dist/connectors/discord.js +543 -0
- package/dist/connectors/discord.js.map +1 -0
- package/dist/connectors/github.js +11 -4
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.d.ts +180 -0
- package/dist/connectors/gitlab.js +582 -0
- package/dist/connectors/gitlab.js.map +1 -0
- package/dist/connectors/gmail.js +50 -10
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +36 -10
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDrive.d.ts +34 -0
- package/dist/connectors/googleDrive.js +321 -0
- package/dist/connectors/googleDrive.js.map +1 -0
- package/dist/connectors/linear.js +23 -4
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpOAuth.js +26 -2
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/oauthStateStore.d.ts +31 -0
- package/dist/connectors/oauthStateStore.js +52 -0
- package/dist/connectors/oauthStateStore.js.map +1 -0
- package/dist/connectors/pagerduty.d.ts +160 -0
- package/dist/connectors/pagerduty.js +464 -0
- package/dist/connectors/pagerduty.js.map +1 -0
- package/dist/connectors/slack.d.ts +16 -1
- package/dist/connectors/slack.js +57 -5
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/tokenStorage.js +27 -2
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/zendesk.js +19 -1
- package/dist/connectors/zendesk.js.map +1 -1
- package/dist/cors.d.ts +10 -0
- package/dist/cors.js +29 -0
- package/dist/cors.js.map +1 -0
- package/dist/decisionReplay.d.ts +72 -0
- package/dist/decisionReplay.js +92 -0
- package/dist/decisionReplay.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +6 -0
- package/dist/decisionTraceLog.js +54 -2
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/featureFlags.d.ts +17 -11
- package/dist/featureFlags.js +52 -47
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +25 -21
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationState.js +4 -1
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/policyParser.js +4 -1
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/inboxRoutes.d.ts +22 -0
- package/dist/inboxRoutes.js +114 -0
- package/dist/inboxRoutes.js.map +1 -0
- package/dist/index.js +734 -144
- package/dist/index.js.map +1 -1
- package/dist/mcpRoutes.d.ts +37 -0
- package/dist/mcpRoutes.js +76 -0
- package/dist/mcpRoutes.js.map +1 -0
- package/dist/oauth.d.ts +3 -0
- package/dist/oauth.js +151 -26
- package/dist/oauth.js.map +1 -1
- package/dist/oauthRoutes.d.ts +32 -0
- package/dist/oauthRoutes.js +124 -0
- package/dist/oauthRoutes.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.js +2 -2
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +7 -0
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/pluginLoader.d.ts +12 -0
- package/dist/pluginLoader.js +43 -4
- package/dist/pluginLoader.js.map +1 -1
- package/dist/pluginWatcher.js +8 -3
- package/dist/pluginWatcher.js.map +1 -1
- package/dist/preToolUseHook.d.ts +12 -0
- package/dist/preToolUseHook.js +23 -0
- package/dist/preToolUseHook.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +8 -0
- package/dist/recipeOrchestration.js +320 -39
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +154 -0
- package/dist/recipeRoutes.js +1098 -0
- package/dist/recipeRoutes.js.map +1 -0
- package/dist/recipes/captureForRunlog.d.ts +27 -0
- package/dist/recipes/captureForRunlog.js +128 -0
- package/dist/recipes/captureForRunlog.js.map +1 -0
- package/dist/recipes/chainedRunner.d.ts +54 -3
- package/dist/recipes/chainedRunner.js +256 -36
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +3 -3
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/detectSilentFail.d.ts +34 -0
- package/dist/recipes/detectSilentFail.js +105 -0
- package/dist/recipes/detectSilentFail.js.map +1 -0
- package/dist/recipes/installer.js +3 -3
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/manifest.js +21 -6
- package/dist/recipes/manifest.js.map +1 -1
- package/dist/recipes/migrationWarnings.d.ts +12 -0
- package/dist/recipes/migrationWarnings.js +44 -0
- package/dist/recipes/migrationWarnings.js.map +1 -0
- package/dist/recipes/replayRun.d.ts +62 -0
- package/dist/recipes/replayRun.js +97 -0
- package/dist/recipes/replayRun.js.map +1 -0
- package/dist/recipes/resolveRecipePath.d.ts +69 -0
- package/dist/recipes/resolveRecipePath.js +202 -0
- package/dist/recipes/resolveRecipePath.js.map +1 -0
- package/dist/recipes/scheduler.js +102 -11
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schemaGenerator.js +3 -3
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/toolRegistry.d.ts +5 -0
- package/dist/recipes/toolRegistry.js +9 -0
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/asana.d.ts +16 -0
- package/dist/recipes/tools/asana.js +524 -0
- package/dist/recipes/tools/asana.js.map +1 -0
- package/dist/recipes/tools/discord.d.ts +18 -0
- package/dist/recipes/tools/discord.js +254 -0
- package/dist/recipes/tools/discord.js.map +1 -0
- package/dist/recipes/tools/file.d.ts +6 -0
- package/dist/recipes/tools/file.js +12 -8
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +29 -4
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gitlab.d.ts +11 -0
- package/dist/recipes/tools/gitlab.js +285 -0
- package/dist/recipes/tools/gitlab.js.map +1 -0
- package/dist/recipes/tools/gmail.d.ts +1 -1
- package/dist/recipes/tools/gmail.js +230 -6
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/googleDrive.d.ts +1 -0
- package/dist/recipes/tools/googleDrive.js +55 -0
- package/dist/recipes/tools/googleDrive.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +8 -0
- package/dist/recipes/tools/index.js +8 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/jira.d.ts +14 -0
- package/dist/recipes/tools/jira.js +369 -0
- package/dist/recipes/tools/jira.js.map +1 -0
- package/dist/recipes/tools/linear.d.ts +2 -1
- package/dist/recipes/tools/linear.js +227 -3
- package/dist/recipes/tools/linear.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.d.ts +21 -0
- package/dist/recipes/tools/meetingNotes.js +701 -0
- package/dist/recipes/tools/meetingNotes.js.map +1 -0
- package/dist/recipes/tools/pagerduty.d.ts +15 -0
- package/dist/recipes/tools/pagerduty.js +451 -0
- package/dist/recipes/tools/pagerduty.js.map +1 -0
- package/dist/recipes/tools/sentry.d.ts +12 -0
- package/dist/recipes/tools/sentry.js +73 -0
- package/dist/recipes/tools/sentry.js.map +1 -0
- package/dist/recipes/tools/slack.js +15 -5
- package/dist/recipes/tools/slack.js.map +1 -1
- package/dist/recipes/validation.js +83 -14
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +30 -2
- package/dist/recipes/yamlRunner.js +369 -70
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +76 -1
- package/dist/recipesHttp.js +474 -12
- package/dist/recipesHttp.js.map +1 -1
- package/dist/runLog.d.ts +78 -2
- package/dist/runLog.js +204 -6
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/dry-run-plan.v1.json +139 -0
- package/dist/schemas/recipe.v1.json +684 -0
- package/dist/server.d.ts +79 -10
- package/dist/server.js +366 -1384
- package/dist/server.js.map +1 -1
- package/dist/ssrfGuard.d.ts +54 -0
- package/dist/ssrfGuard.js +122 -0
- package/dist/ssrfGuard.js.map +1 -0
- package/dist/streamableHttp.d.ts +39 -1
- package/dist/streamableHttp.js +126 -17
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/getDocumentSymbols.d.ts +24 -0
- package/dist/tools/getDocumentSymbols.js +74 -8
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getSecurityAdvisories.js +10 -1
- package/dist/tools/getSecurityAdvisories.js.map +1 -1
- package/dist/tools/getSessionUsage.d.ts +3 -0
- package/dist/tools/getSessionUsage.js +3 -0
- package/dist/tools/getSessionUsage.js.map +1 -1
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +32 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/slackPostMessage.js +1 -1
- package/dist/tools/slackPostMessage.js.map +1 -1
- package/dist/tools/transaction.d.ts +19 -0
- package/dist/tools/transaction.js +29 -0
- package/dist/tools/transaction.js.map +1 -1
- package/dist/traceEncryption.d.ts +46 -0
- package/dist/traceEncryption.js +124 -0
- package/dist/traceEncryption.js.map +1 -0
- package/dist/transport.d.ts +39 -0
- package/dist/transport.js +88 -8
- package/dist/transport.js.map +1 -1
- package/package.json +22 -5
- package/templates/policies/README.md +72 -0
- package/templates/policies/conservative.json +14 -0
- package/templates/policies/developer.json +14 -0
- package/templates/policies/headless-ci.json +24 -0
- package/templates/policies/personal-assistant.json +15 -0
- package/templates/policies/regulated-industry.json +18 -0
- package/templates/recipes/project-health-check.yaml +1 -1
- package/templates/recipes/webhook/README.md +70 -0
- package/templates/recipes/webhook/capture-thought.yaml +26 -0
- package/templates/recipes/webhook/customer-escalation.yaml +49 -0
- package/templates/recipes/webhook/incident-intake.yaml +46 -0
- package/templates/recipes/webhook/meeting-prep.yaml +48 -0
- package/templates/recipes/webhook/morning-brief.yaml +57 -0
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* RecipeOrchestration — owns recipe-related server fn wiring and YAML recipe
|
|
3
3
|
* dispatch. Extracted from bridge.ts to reduce god-object surface area.
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
import
|
|
5
|
+
import { readFileSync } from "node:fs";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { basename, extname, join } from "node:path";
|
|
8
|
+
import { parse as parseYaml } from "yaml";
|
|
7
9
|
import { recordRecipeRun } from "./activationMetrics.js";
|
|
8
|
-
import { loadConfig as loadPatchworkConfig, saveConfig as savePatchworkConfig, } from "./patchworkConfig.js";
|
|
9
10
|
import { RecipeScheduler } from "./recipes/scheduler.js";
|
|
10
|
-
import { deleteRecipeContent, findWebhookRecipe, findYamlRecipePath, lintRecipeContent, listInstalledRecipes, loadRecipeContent, loadRecipePrompt, renderWebhookPrompt, saveRecipe, saveRecipeContent, } from "./recipesHttp.js";
|
|
11
|
+
import { deleteRecipeContent, duplicateRecipe, findWebhookRecipe, findYamlRecipePath, lintRecipeContent, listInstalledRecipes, loadRecipeContent, loadRecipePrompt, promoteRecipeVariant, renderWebhookPrompt, saveRecipe, saveRecipeContent, setRecipeEnabled, setTrustLevel, } from "./recipesHttp.js";
|
|
11
12
|
// ---------------------------------------------------------------------------
|
|
12
13
|
// Class
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
@@ -38,51 +39,48 @@ export class RecipeOrchestration {
|
|
|
38
39
|
wireServerFns() {
|
|
39
40
|
const { server } = this.deps;
|
|
40
41
|
server.recipesFn = () => {
|
|
41
|
-
const recipesDir =
|
|
42
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
42
43
|
return listInstalledRecipes(recipesDir);
|
|
43
44
|
};
|
|
44
45
|
server.loadRecipeContentFn = (name) => {
|
|
45
|
-
const recipesDir =
|
|
46
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
46
47
|
return loadRecipeContent(recipesDir, name);
|
|
47
48
|
};
|
|
48
49
|
server.saveRecipeContentFn = (name, content) => {
|
|
49
|
-
const recipesDir =
|
|
50
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
50
51
|
return saveRecipeContent(recipesDir, name, content);
|
|
51
52
|
};
|
|
52
53
|
server.deleteRecipeContentFn = (name) => {
|
|
53
|
-
const recipesDir =
|
|
54
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
54
55
|
return deleteRecipeContent(recipesDir, name);
|
|
55
56
|
};
|
|
57
|
+
server.duplicateRecipeFn = (name) => {
|
|
58
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
59
|
+
return duplicateRecipe(recipesDir, name);
|
|
60
|
+
};
|
|
61
|
+
server.promoteRecipeVariantFn = async (variantName, targetName, options) => {
|
|
62
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
63
|
+
return promoteRecipeVariant(recipesDir, variantName, targetName, options);
|
|
64
|
+
};
|
|
56
65
|
server.lintRecipeContentFn = (content) => lintRecipeContent(content);
|
|
66
|
+
server.setRecipeTrustFn = (name, level) => {
|
|
67
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
68
|
+
return setTrustLevel(recipesDir, name, level);
|
|
69
|
+
};
|
|
57
70
|
// biome-ignore lint/suspicious/noExplicitAny: matches Server type
|
|
58
71
|
server.saveRecipeFn = (draft) => {
|
|
59
|
-
const recipesDir =
|
|
72
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
60
73
|
return saveRecipe(recipesDir, draft);
|
|
61
74
|
};
|
|
62
75
|
server.setRecipeEnabledFn = (name, enabled) => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
savePatchworkConfig({
|
|
72
|
-
...cfg,
|
|
73
|
-
recipes: {
|
|
74
|
-
...cfg.recipes,
|
|
75
|
-
disabled: [...disabled],
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
return { ok: true };
|
|
79
|
-
}
|
|
80
|
-
catch (err) {
|
|
81
|
-
return {
|
|
82
|
-
ok: false,
|
|
83
|
-
error: err instanceof Error ? err.message : String(err),
|
|
84
|
-
};
|
|
85
|
-
}
|
|
76
|
+
// Routes through `setRecipeEnabled` (recipesHttp.ts) which writes the
|
|
77
|
+
// per-install `.disabled` marker for marketplace-installed recipes
|
|
78
|
+
// and falls back to the legacy `cfg.recipes.disabled` config list
|
|
79
|
+
// for top-level legacy files. Both surfaces (CLI + dashboard) now
|
|
80
|
+
// converge on the same enable/disable semantics — fixes Bug #2 from
|
|
81
|
+
// the 2026-04-28 audit where the dashboard "Disable" button silently
|
|
82
|
+
// did nothing for install-dir recipes.
|
|
83
|
+
return setRecipeEnabled(name, enabled);
|
|
86
84
|
};
|
|
87
85
|
server.runsFn = (q) => {
|
|
88
86
|
if (!this.deps.recipeRunLog)
|
|
@@ -102,12 +100,99 @@ export class RecipeOrchestration {
|
|
|
102
100
|
server.runDetailFn = (seq) => {
|
|
103
101
|
if (!this.deps.recipeRunLog)
|
|
104
102
|
return null;
|
|
105
|
-
|
|
103
|
+
const run = this.deps.recipeRunLog.getBySeq(seq);
|
|
104
|
+
if (!run)
|
|
105
|
+
return null;
|
|
106
|
+
const childSeqs = this.deps.recipeRunLog.getChildSeqs(seq);
|
|
107
|
+
return {
|
|
108
|
+
...run,
|
|
109
|
+
...(childSeqs.length > 0 && { childSeqs }),
|
|
110
|
+
};
|
|
106
111
|
};
|
|
107
112
|
server.runPlanFn = async (recipeName) => {
|
|
108
113
|
const { runRecipeDryPlan } = await import("./commands/recipe.js");
|
|
109
114
|
return (await runRecipeDryPlan(recipeName));
|
|
110
115
|
};
|
|
116
|
+
// VD-4 mocked replay: load the original run, re-parse its recipe
|
|
117
|
+
// from disk (so a later edit replays against the new logic), and
|
|
118
|
+
// re-fire through chainedRunner with `mockedOutputs` populated from
|
|
119
|
+
// the captured per-step `output` (VD-2). No external IO; no side
|
|
120
|
+
// effects.
|
|
121
|
+
server.runReplayFn = async (seq) => {
|
|
122
|
+
if (!this.deps.recipeRunLog) {
|
|
123
|
+
return { ok: false, error: "run_log_unavailable" };
|
|
124
|
+
}
|
|
125
|
+
const original = this.deps.recipeRunLog.getBySeq(seq);
|
|
126
|
+
if (!original) {
|
|
127
|
+
return { ok: false, error: "run_not_found" };
|
|
128
|
+
}
|
|
129
|
+
// Strip ":agent" suffix that triggerSource may carry.
|
|
130
|
+
const recipeName = original.recipeName.replace(/:agent$/, "");
|
|
131
|
+
try {
|
|
132
|
+
const { findYamlRecipePath } = await import("./recipesHttp.js");
|
|
133
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
134
|
+
const recipePath = findYamlRecipePath(recipesDir, recipeName);
|
|
135
|
+
if (!recipePath) {
|
|
136
|
+
return { ok: false, error: "recipe_file_missing" };
|
|
137
|
+
}
|
|
138
|
+
const { readFileSync } = await import("node:fs");
|
|
139
|
+
const { parse: parseYaml } = await import("yaml");
|
|
140
|
+
const recipeYaml = parseYaml(readFileSync(recipePath, "utf-8"));
|
|
141
|
+
// Only chained recipes have per-step capture today; flag others.
|
|
142
|
+
const triggerType = recipeYaml?.trigger?.type;
|
|
143
|
+
if (triggerType !== "chained") {
|
|
144
|
+
return {
|
|
145
|
+
ok: false,
|
|
146
|
+
error: "replay_only_supported_for_chained_recipes",
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const { replayMockedRun } = await import("./recipes/replayRun.js");
|
|
150
|
+
const { buildChainedDeps } = await import("./recipes/yamlRunner.js");
|
|
151
|
+
// Reuse the orchestrator's claudeCodeFn for any step that falls
|
|
152
|
+
// through to real execution (unmocked steps — caller is told).
|
|
153
|
+
const orch = this.deps.getOrchestrator();
|
|
154
|
+
const claudeCodeFn = async (prompt) => {
|
|
155
|
+
if (!orch)
|
|
156
|
+
return "";
|
|
157
|
+
const task = await orch.runAndWait({
|
|
158
|
+
prompt,
|
|
159
|
+
triggerSource: `replay:${seq}:agent`,
|
|
160
|
+
timeoutMs: 600_000,
|
|
161
|
+
});
|
|
162
|
+
return task.output ?? task.errorMessage ?? "";
|
|
163
|
+
};
|
|
164
|
+
const runnerDeps = { workdir: this.deps.workdir, claudeCodeFn };
|
|
165
|
+
// buildChainedDeps just primes default tool/agent/recipe loaders.
|
|
166
|
+
void buildChainedDeps;
|
|
167
|
+
const result = await replayMockedRun({
|
|
168
|
+
originalRun: original,
|
|
169
|
+
recipe: recipeYaml,
|
|
170
|
+
...(recipePath !== undefined && { sourcePath: recipePath }),
|
|
171
|
+
deps: {
|
|
172
|
+
runLog: this.deps.recipeRunLog,
|
|
173
|
+
...(this.deps.activityLog !== undefined && {
|
|
174
|
+
activityLog: this.deps.activityLog,
|
|
175
|
+
}),
|
|
176
|
+
runnerDeps,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
ok: result.ok,
|
|
181
|
+
...(result.newSeq !== undefined && { newSeq: result.newSeq }),
|
|
182
|
+
...(result.unmockedSteps !== undefined && {
|
|
183
|
+
unmockedSteps: result.unmockedSteps,
|
|
184
|
+
}),
|
|
185
|
+
...(result.error !== undefined && { error: result.error }),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return {
|
|
190
|
+
ok: false,
|
|
191
|
+
error: err instanceof Error ? err.message : String(err),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
this.wireGenerateFn();
|
|
111
196
|
server.webhookFn = async (hookPath, payload) => {
|
|
112
197
|
if (!this.deps.getOrchestrator()) {
|
|
113
198
|
return {
|
|
@@ -116,7 +201,9 @@ export class RecipeOrchestration {
|
|
|
116
201
|
};
|
|
117
202
|
}
|
|
118
203
|
const orchestrator = this.deps.getOrchestrator();
|
|
119
|
-
|
|
204
|
+
if (!orchestrator)
|
|
205
|
+
return { ok: false, error: "orchestrator_unavailable" };
|
|
206
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
120
207
|
const match = findWebhookRecipe(recipesDir, hookPath);
|
|
121
208
|
if (!match) {
|
|
122
209
|
return { ok: false, error: "not_found" };
|
|
@@ -150,7 +237,7 @@ export class RecipeOrchestration {
|
|
|
150
237
|
seedContext,
|
|
151
238
|
});
|
|
152
239
|
}
|
|
153
|
-
const loaded = loadRecipePrompt(recipesDir,
|
|
240
|
+
const loaded = loadRecipePrompt(recipesDir, basename(match.filePath, extname(match.filePath)));
|
|
154
241
|
if (!loaded) {
|
|
155
242
|
return { ok: false, error: "recipe_file_missing" };
|
|
156
243
|
}
|
|
@@ -176,7 +263,9 @@ export class RecipeOrchestration {
|
|
|
176
263
|
};
|
|
177
264
|
}
|
|
178
265
|
const orchestrator = this.deps.getOrchestrator();
|
|
179
|
-
|
|
266
|
+
if (!orchestrator)
|
|
267
|
+
return { ok: false, error: "orchestrator_unavailable" };
|
|
268
|
+
const recipesDir = join(homedir(), ".patchwork", "recipes");
|
|
180
269
|
// Try JSON recipe first (legacy path: enqueue prompt as a task).
|
|
181
270
|
const loaded = loadRecipePrompt(recipesDir, name);
|
|
182
271
|
if (loaded) {
|
|
@@ -209,16 +298,68 @@ export class RecipeOrchestration {
|
|
|
209
298
|
error: `Recipe "${name}" not found in ${recipesDir}`,
|
|
210
299
|
};
|
|
211
300
|
}
|
|
301
|
+
// Merge declared trigger.inputs[].default values with caller-provided vars.
|
|
302
|
+
// Caller-provided vars always win. This lets dashboard "Run" buttons that
|
|
303
|
+
// POST with no body still receive the recipe's declared input defaults
|
|
304
|
+
// (e.g. team=Engineering) instead of empty strings.
|
|
305
|
+
const mergedVars = applyTriggerInputDefaults(ymlPath, vars);
|
|
212
306
|
return this.fireYamlRecipe({
|
|
213
307
|
filePath: ymlPath,
|
|
214
308
|
name,
|
|
215
309
|
taskIdPrefix: `yaml-recipe-${name}`,
|
|
216
310
|
triggerSourceSuffix: `recipe:${name}`,
|
|
217
311
|
logLabel: `"${name}"`,
|
|
312
|
+
seedContext: mergedVars,
|
|
218
313
|
});
|
|
219
314
|
};
|
|
220
315
|
}
|
|
221
316
|
// -------------------------------------------------------------------------
|
|
317
|
+
// AI recipe generation
|
|
318
|
+
// -------------------------------------------------------------------------
|
|
319
|
+
wireGenerateFn() {
|
|
320
|
+
const { server } = this.deps;
|
|
321
|
+
server.generateRecipeFn = async (userPrompt) => {
|
|
322
|
+
const orch = this.deps.getOrchestrator();
|
|
323
|
+
if (!orch) {
|
|
324
|
+
return { ok: false, error: "driver_unavailable", unavailable: true };
|
|
325
|
+
}
|
|
326
|
+
let task;
|
|
327
|
+
try {
|
|
328
|
+
task = await orch.runAndWait({
|
|
329
|
+
prompt: `${RECIPE_GENERATION_SYSTEM_PROMPT}\n\nUser request: ${userPrompt}`,
|
|
330
|
+
triggerSource: "recipe_generate",
|
|
331
|
+
timeoutMs: 60_000,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
return {
|
|
336
|
+
ok: false,
|
|
337
|
+
error: err instanceof Error ? err.message : String(err),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
if (task.status !== "done" || !task.output) {
|
|
341
|
+
return {
|
|
342
|
+
ok: false,
|
|
343
|
+
error: task.errorMessage ?? `Task ended with status: ${task.status}`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
const rawYaml = extractYamlBlock(task.output);
|
|
347
|
+
if (!rawYaml) {
|
|
348
|
+
return { ok: false, error: "no_yaml_in_output" };
|
|
349
|
+
}
|
|
350
|
+
const lint = lintRecipeContent(rawYaml);
|
|
351
|
+
if (!lint.ok) {
|
|
352
|
+
return {
|
|
353
|
+
ok: false,
|
|
354
|
+
yaml: rawYaml,
|
|
355
|
+
warnings: [...lint.errors, ...lint.warnings],
|
|
356
|
+
error: "invalid_yaml_generated",
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
return { ok: true, yaml: rawYaml, warnings: lint.warnings };
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
// -------------------------------------------------------------------------
|
|
222
363
|
// YAML recipe dispatch
|
|
223
364
|
// -------------------------------------------------------------------------
|
|
224
365
|
async fireYamlRecipe(opts) {
|
|
@@ -226,6 +367,9 @@ export class RecipeOrchestration {
|
|
|
226
367
|
return { ok: false, error: "recipe orchestrator unavailable" };
|
|
227
368
|
}
|
|
228
369
|
const orch = this.deps.getOrchestrator();
|
|
370
|
+
if (!orch) {
|
|
371
|
+
return { ok: false, error: "orchestrator_unavailable" };
|
|
372
|
+
}
|
|
229
373
|
const { buildChainedDeps, dispatchRecipe } = await import("./recipes/yamlRunner.js");
|
|
230
374
|
const claudeCodeFn = async (prompt) => {
|
|
231
375
|
const task = await orch.runAndWait({
|
|
@@ -236,11 +380,20 @@ export class RecipeOrchestration {
|
|
|
236
380
|
return task.output ?? task.errorMessage ?? "";
|
|
237
381
|
};
|
|
238
382
|
const runnerDeps = { workdir: this.deps.workdir, claudeCodeFn };
|
|
383
|
+
// Pass the bridge's long-lived RecipeRunLog so chainedRunner can flip the
|
|
384
|
+
// run from `running` → terminal in-place via startRun/completeRun. The
|
|
385
|
+
// dashboard reads the same instance, so /runs surfaces the live entry
|
|
386
|
+
// immediately. CLI invocations don't go through here — they fall back to
|
|
387
|
+
// `runLogDir` + `appendDirect` (pre-VD-1 behavior, no live-tail).
|
|
388
|
+
//
|
|
389
|
+
// The `activityLog` enables VD-1B live-tail: when set, chainedRunner
|
|
390
|
+
// broadcasts `recipe_step_start` / `recipe_step_done` events tagged with
|
|
391
|
+
// `runSeq` so the dashboard's `/runs/[seq]` SSE subscription receives
|
|
392
|
+
// them in real time.
|
|
239
393
|
const chainedOptions = {
|
|
240
394
|
sourcePath: opts.filePath,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
: undefined,
|
|
395
|
+
runLog: this.deps.recipeRunLog ?? undefined,
|
|
396
|
+
activityLog: this.deps.activityLog,
|
|
244
397
|
};
|
|
245
398
|
const fireResult = await this.deps.recipeOrchestrator
|
|
246
399
|
.fire({
|
|
@@ -274,4 +427,132 @@ export class RecipeOrchestration {
|
|
|
274
427
|
return fireResult;
|
|
275
428
|
}
|
|
276
429
|
}
|
|
430
|
+
const RECIPE_GENERATION_SYSTEM_PROMPT = `You are a Patchwork recipe generator. Your ONLY output must be a valid Patchwork recipe in YAML format, fenced in a \`\`\`yaml block. Output nothing else — no explanation, no preamble, no trailing text.
|
|
431
|
+
|
|
432
|
+
SCHEMA:
|
|
433
|
+
apiVersion: patchwork.sh/v1
|
|
434
|
+
name: <slug: lowercase, hyphens, max 64 chars>
|
|
435
|
+
description: <one-line description> # optional
|
|
436
|
+
trigger:
|
|
437
|
+
type: manual | cron | webhook
|
|
438
|
+
at: "<cron expression>" # only when type=cron
|
|
439
|
+
path: "/hooks/<slug>" # only when type=webhook
|
|
440
|
+
vars: # optional
|
|
441
|
+
- name: VAR_NAME
|
|
442
|
+
description: hint for caller
|
|
443
|
+
required: true | false
|
|
444
|
+
default: "value"
|
|
445
|
+
steps:
|
|
446
|
+
- id: step-1
|
|
447
|
+
agent:
|
|
448
|
+
prompt: |
|
|
449
|
+
<what Claude should do in this step>
|
|
450
|
+
into: step_1_output
|
|
451
|
+
|
|
452
|
+
RULES:
|
|
453
|
+
1. Trigger inference: "every morning/daily/weekly/at Nhm" → cron; "webhook" → webhook; otherwise → manual.
|
|
454
|
+
2. Steps: decompose into 1–4 agent steps. Each prompt should be self-contained; reference prior step outputs as {{step_id_output}}.
|
|
455
|
+
3. Name: derive a slug from the description (e.g. "daily github digest" → "daily-github-digest").
|
|
456
|
+
4. Vars: declare caller-supplied values (email, repo, channel) as vars with required: true.
|
|
457
|
+
5. Step prompts are plain natural-language — do NOT invent tool names.
|
|
458
|
+
|
|
459
|
+
EXAMPLES:
|
|
460
|
+
User: every morning, summarize my GitHub notifications and email me a digest
|
|
461
|
+
\`\`\`yaml
|
|
462
|
+
apiVersion: patchwork.sh/v1
|
|
463
|
+
name: morning-github-digest
|
|
464
|
+
description: Daily summary of GitHub notifications delivered by email
|
|
465
|
+
trigger:
|
|
466
|
+
type: cron
|
|
467
|
+
at: "0 8 * * 1-5"
|
|
468
|
+
vars:
|
|
469
|
+
- name: EMAIL
|
|
470
|
+
description: Email address to send the digest to
|
|
471
|
+
required: true
|
|
472
|
+
steps:
|
|
473
|
+
- id: fetch-notifications
|
|
474
|
+
agent:
|
|
475
|
+
prompt: |
|
|
476
|
+
Fetch my unread GitHub notifications from the last 24 hours.
|
|
477
|
+
Summarize them grouped by repository: PR reviews, issues, mentions.
|
|
478
|
+
One line per item.
|
|
479
|
+
into: notifications_summary
|
|
480
|
+
- id: send-digest
|
|
481
|
+
agent:
|
|
482
|
+
prompt: |
|
|
483
|
+
Send an email to {{EMAIL}} with subject "Morning GitHub Digest".
|
|
484
|
+
Body: {{notifications_summary}}
|
|
485
|
+
into: send_result
|
|
486
|
+
\`\`\`
|
|
487
|
+
|
|
488
|
+
User: when a new Sentry issue arrives, create a Linear ticket and post to Slack
|
|
489
|
+
\`\`\`yaml
|
|
490
|
+
apiVersion: patchwork.sh/v1
|
|
491
|
+
name: sentry-to-linear-slack
|
|
492
|
+
description: Triage new Sentry issues to Linear and Slack
|
|
493
|
+
trigger:
|
|
494
|
+
type: webhook
|
|
495
|
+
path: "/hooks/sentry-issues"
|
|
496
|
+
vars:
|
|
497
|
+
- name: SLACK_CHANNEL
|
|
498
|
+
description: Slack channel to notify
|
|
499
|
+
required: false
|
|
500
|
+
default: "#incidents"
|
|
501
|
+
steps:
|
|
502
|
+
- id: create-linear-ticket
|
|
503
|
+
agent:
|
|
504
|
+
prompt: |
|
|
505
|
+
A new Sentry issue arrived. Payload: {{payload}}
|
|
506
|
+
Create a Linear ticket in the Bug triage team with priority High.
|
|
507
|
+
Title: the Sentry issue title. Include the Sentry URL in the description.
|
|
508
|
+
into: linear_ticket
|
|
509
|
+
- id: notify-slack
|
|
510
|
+
agent:
|
|
511
|
+
prompt: |
|
|
512
|
+
Post to {{SLACK_CHANNEL}}: "New Sentry issue triaged → {{linear_ticket}}"
|
|
513
|
+
into: slack_result
|
|
514
|
+
\`\`\``;
|
|
515
|
+
function extractYamlBlock(text) {
|
|
516
|
+
const fenced = /```(?:yaml)?\n([\s\S]*?)```/.exec(text);
|
|
517
|
+
if (fenced?.[1])
|
|
518
|
+
return fenced[1].trim();
|
|
519
|
+
const trimmed = text.trim();
|
|
520
|
+
if (/^(?:apiVersion:|name:|#\s*yaml-language-server)/.test(trimmed))
|
|
521
|
+
return trimmed;
|
|
522
|
+
return null;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Read a YAML recipe's trigger.inputs[] declarations and merge any declared
|
|
526
|
+
* defaults underneath caller-provided vars. Caller vars always win. Tolerates
|
|
527
|
+
* missing files / malformed YAML / non-array inputs by returning the original
|
|
528
|
+
* vars untouched.
|
|
529
|
+
*/
|
|
530
|
+
function applyTriggerInputDefaults(ymlPath, vars) {
|
|
531
|
+
let parsed;
|
|
532
|
+
try {
|
|
533
|
+
parsed = parseYaml(readFileSync(ymlPath, "utf-8"));
|
|
534
|
+
}
|
|
535
|
+
catch {
|
|
536
|
+
return vars;
|
|
537
|
+
}
|
|
538
|
+
const trigger = parsed?.trigger;
|
|
539
|
+
const inputs = trigger?.inputs;
|
|
540
|
+
if (!Array.isArray(inputs))
|
|
541
|
+
return vars;
|
|
542
|
+
const defaults = {};
|
|
543
|
+
for (const item of inputs) {
|
|
544
|
+
if (!item || typeof item !== "object")
|
|
545
|
+
continue;
|
|
546
|
+
const name = item.name;
|
|
547
|
+
const dflt = item.default;
|
|
548
|
+
if (typeof name !== "string" || name.length === 0)
|
|
549
|
+
continue;
|
|
550
|
+
if (dflt === undefined || dflt === null)
|
|
551
|
+
continue;
|
|
552
|
+
defaults[name] = String(dflt);
|
|
553
|
+
}
|
|
554
|
+
if (Object.keys(defaults).length === 0)
|
|
555
|
+
return vars;
|
|
556
|
+
return { ...defaults, ...(vars ?? {}) };
|
|
557
|
+
}
|
|
277
558
|
//# sourceMappingURL=recipeOrchestration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipeOrchestration.js","sourceRoot":"","sources":["../src/recipeOrchestration.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recipeOrchestration.js","sourceRoot":"","sources":["../src/recipeOrchestration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recipe + run-audit route dispatcher — extracted from src/server.ts.
|
|
3
|
+
*
|
|
4
|
+
* Owns 16 routes covering the recipe authoring loop (CRUD + lint + run),
|
|
5
|
+
* the run-audit log (`/runs`, `/runs/:seq`, replay, plan), the public
|
|
6
|
+
* template registry (`/templates`), and recipe installation
|
|
7
|
+
* (`/recipes/install`). Plus the `/activation-metrics` siblings that
|
|
8
|
+
* read the same audit log.
|
|
9
|
+
*
|
|
10
|
+
* DI shape: handlers depend on 12 nullable callbacks the bridge wires
|
|
11
|
+
* onto the Server instance post-construction (`runRecipeFn`,
|
|
12
|
+
* `recipesFn`, etc.). They're passed as a `RecipeRouteDeps` struct
|
|
13
|
+
* matching the pattern from oauthRoutes.ts and mcpRoutes.ts.
|
|
14
|
+
*
|
|
15
|
+
* Module-level state: the `/templates` 5-minute cache used to live as
|
|
16
|
+
* `_templatesCache`/`_templatesCacheTs` instance fields on Server.
|
|
17
|
+
* Lifetime is process-wide either way (Server is a singleton in
|
|
18
|
+
* practice), so hoisting to module scope here is equivalent and avoids
|
|
19
|
+
* threading a mutable holder through `deps`.
|
|
20
|
+
*
|
|
21
|
+
* Mechanical lift: handler bodies are byte-identical save for
|
|
22
|
+
* `deps.<fn>` replacing `this.<fn>` and module-scoped cache vars
|
|
23
|
+
* replacing `this._templatesCache`. A few routes that previously used
|
|
24
|
+
* `await` directly in their async parent closure are wrapped in
|
|
25
|
+
* `void (async () => {...})()` so this module can return boolean
|
|
26
|
+
* synchronously — same micro-task tradeoff documented in
|
|
27
|
+
* connectorRoutes.ts.
|
|
28
|
+
*/
|
|
29
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
30
|
+
import type { RecipeDraft } from "./recipesHttp.js";
|
|
31
|
+
export interface VarsValidationError {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: string;
|
|
34
|
+
field: "key" | "value" | "type";
|
|
35
|
+
offendingKey?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Validate the HTTP-supplied `vars` object. Returns null on success. */
|
|
38
|
+
export declare function validateRecipeVars(vars: unknown): VarsValidationError | null;
|
|
39
|
+
export declare const RECIPE_ROUTE_BODY_CAPS: {
|
|
40
|
+
/** /recipes/install — `{ source: string }` body. */
|
|
41
|
+
readonly install: number;
|
|
42
|
+
/** /recipes/generate — NL prompt. */
|
|
43
|
+
readonly generate: number;
|
|
44
|
+
/** /recipes/:name/run + /recipes/run — vars envelope. */
|
|
45
|
+
readonly run: number;
|
|
46
|
+
/** /recipes (POST), PUT/PATCH /recipes/:name, /recipes/lint — yaml content. */
|
|
47
|
+
readonly content: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Read an HTTP request body up to `max` bytes, parse as JSON, return result.
|
|
51
|
+
*
|
|
52
|
+
* Returns one of three discriminated shapes:
|
|
53
|
+
* - `{ ok: true, value }` — body parsed successfully.
|
|
54
|
+
* - `{ ok: false, code: "too_large" }` — body exceeded `max`; request was
|
|
55
|
+
* destroyed eagerly and the response should be 413.
|
|
56
|
+
* - `{ ok: false, code: "invalid_json" }` — body was valid bytes but failed
|
|
57
|
+
* `JSON.parse`; response should be 400.
|
|
58
|
+
*
|
|
59
|
+
* Bytes are accumulated into a single Buffer so the helper can enforce the
|
|
60
|
+
* cap incrementally — a 1 GB upload is rejected after the first overflowing
|
|
61
|
+
* chunk rather than after the full body lands in memory.
|
|
62
|
+
*/
|
|
63
|
+
export declare function readJsonBody<T = unknown>(req: IncomingMessage, max: number): Promise<{
|
|
64
|
+
ok: true;
|
|
65
|
+
value: T;
|
|
66
|
+
} | {
|
|
67
|
+
ok: false;
|
|
68
|
+
code: "too_large" | "invalid_json";
|
|
69
|
+
}>;
|
|
70
|
+
export interface RecipeRouteDeps {
|
|
71
|
+
setRecipeTrustFn: ((name: string, level: string) => {
|
|
72
|
+
ok: boolean;
|
|
73
|
+
error?: string;
|
|
74
|
+
}) | null;
|
|
75
|
+
generateRecipeFn: ((prompt: string) => Promise<{
|
|
76
|
+
ok: boolean;
|
|
77
|
+
yaml?: string;
|
|
78
|
+
warnings?: string[];
|
|
79
|
+
error?: string;
|
|
80
|
+
unavailable?: boolean;
|
|
81
|
+
}>) | null;
|
|
82
|
+
recipesFn: (() => Record<string, unknown>) | null;
|
|
83
|
+
loadRecipeContentFn: ((name: string) => {
|
|
84
|
+
content: string;
|
|
85
|
+
path: string;
|
|
86
|
+
} | null) | null;
|
|
87
|
+
saveRecipeContentFn: ((name: string, content: string) => {
|
|
88
|
+
ok: boolean;
|
|
89
|
+
path?: string;
|
|
90
|
+
error?: string;
|
|
91
|
+
warnings?: string[];
|
|
92
|
+
}) | null;
|
|
93
|
+
deleteRecipeContentFn: ((name: string) => {
|
|
94
|
+
ok: boolean;
|
|
95
|
+
path?: string;
|
|
96
|
+
error?: string;
|
|
97
|
+
}) | null;
|
|
98
|
+
duplicateRecipeFn: ((name: string) => {
|
|
99
|
+
ok: boolean;
|
|
100
|
+
variantName?: string;
|
|
101
|
+
path?: string;
|
|
102
|
+
error?: string;
|
|
103
|
+
}) | null;
|
|
104
|
+
promoteRecipeVariantFn: ((variantName: string, targetName: string, options?: {
|
|
105
|
+
force?: boolean;
|
|
106
|
+
}) => Promise<{
|
|
107
|
+
ok: boolean;
|
|
108
|
+
path?: string;
|
|
109
|
+
error?: string;
|
|
110
|
+
targetExists?: boolean;
|
|
111
|
+
}>) | null;
|
|
112
|
+
lintRecipeContentFn: ((content: string) => {
|
|
113
|
+
ok: boolean;
|
|
114
|
+
errors: string[];
|
|
115
|
+
warnings: string[];
|
|
116
|
+
}) | null;
|
|
117
|
+
saveRecipeFn: ((draft: RecipeDraft) => {
|
|
118
|
+
ok: boolean;
|
|
119
|
+
path?: string;
|
|
120
|
+
error?: string;
|
|
121
|
+
}) | null;
|
|
122
|
+
setRecipeEnabledFn: ((name: string, enabled: boolean) => {
|
|
123
|
+
ok: boolean;
|
|
124
|
+
error?: string;
|
|
125
|
+
}) | null;
|
|
126
|
+
runsFn: ((q: {
|
|
127
|
+
limit?: number;
|
|
128
|
+
trigger?: string;
|
|
129
|
+
status?: string;
|
|
130
|
+
recipe?: string;
|
|
131
|
+
after?: number;
|
|
132
|
+
}) => Record<string, unknown>[]) | null;
|
|
133
|
+
runDetailFn: ((seq: number) => Record<string, unknown> | null) | null;
|
|
134
|
+
runPlanFn: ((recipeName: string) => Promise<Record<string, unknown>>) | null;
|
|
135
|
+
runReplayFn: ((seq: number) => Promise<{
|
|
136
|
+
ok: boolean;
|
|
137
|
+
newSeq?: number;
|
|
138
|
+
unmockedSteps?: string[];
|
|
139
|
+
error?: string;
|
|
140
|
+
}>) | null;
|
|
141
|
+
runRecipeFn: ((name: string, vars?: Record<string, string>) => Promise<{
|
|
142
|
+
ok: boolean;
|
|
143
|
+
taskId?: string;
|
|
144
|
+
error?: string;
|
|
145
|
+
}>) | null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Try to handle a recipe / run-audit / template route. Returns true if
|
|
149
|
+
* the route was dispatched (caller should `return` from the request
|
|
150
|
+
* handler), false if no route matched.
|
|
151
|
+
*
|
|
152
|
+
* Must be called AFTER bearer-auth — none of these routes are public.
|
|
153
|
+
*/
|
|
154
|
+
export declare function tryHandleRecipeRoute(req: IncomingMessage, res: ServerResponse, parsedUrl: URL, deps: RecipeRouteDeps): boolean;
|