patchwork-os 1.2.0-beta.3.canary.897 → 1.2.0-beta.3.canary.899

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 (36) hide show
  1. package/dist/commands/policyExplain.d.ts +2 -0
  2. package/dist/commands/policyExplain.js +9 -1
  3. package/dist/commands/policyExplain.js.map +1 -1
  4. package/dist/commands/recipe.d.ts +8 -3
  5. package/dist/commands/recipe.js +28 -5
  6. package/dist/commands/recipe.js.map +1 -1
  7. package/dist/commands/recipeInstall.js +16 -2
  8. package/dist/commands/recipeInstall.js.map +1 -1
  9. package/dist/index.js +13 -4
  10. package/dist/index.js.map +1 -1
  11. package/dist/recipeRoutes.js +8 -2
  12. package/dist/recipeRoutes.js.map +1 -1
  13. package/dist/recipes/haltCategory.d.ts +9 -0
  14. package/dist/recipes/haltCategory.js +25 -0
  15. package/dist/recipes/haltCategory.js.map +1 -1
  16. package/dist/recipes/installProvenance.d.ts +101 -0
  17. package/dist/recipes/installProvenance.js +205 -0
  18. package/dist/recipes/installProvenance.js.map +1 -0
  19. package/dist/recipes/installer.d.ts +11 -0
  20. package/dist/recipes/installer.js +20 -1
  21. package/dist/recipes/installer.js.map +1 -1
  22. package/dist/recipes/schemaGenerator.js +33 -8
  23. package/dist/recipes/schemaGenerator.js.map +1 -1
  24. package/dist/recipes/simulation/policyProjection.d.ts +26 -0
  25. package/dist/recipes/simulation/policyProjection.js +62 -0
  26. package/dist/recipes/simulation/policyProjection.js.map +1 -0
  27. package/dist/recipes/simulation/simulate.d.ts +12 -5
  28. package/dist/recipes/simulation/simulate.js +75 -19
  29. package/dist/recipes/simulation/simulate.js.map +1 -1
  30. package/dist/recipes/simulation/types.d.ts +63 -12
  31. package/dist/recipes/simulation/types.js +13 -4
  32. package/dist/recipes/simulation/types.js.map +1 -1
  33. package/dist/recipesHttp.d.ts +8 -0
  34. package/dist/recipesHttp.js +10 -1
  35. package/dist/recipesHttp.js.map +1 -1
  36. package/package.json +1 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * What-If Preview — effective-policy projection.
3
+ *
4
+ * Answers "would the runtime hold this step for a human?" for every step of a
5
+ * simulated recipe, by running the SAME calculation the runners consult per
6
+ * step: `explainRecipePolicy` (the body of `patchwork policy explain`) builds
7
+ * each step's `EffectivePolicyInput` and calls `computeEffectivePolicy`. This
8
+ * module only maps those verdicts onto the dry-run plan's step ids — it holds
9
+ * no rule of its own, because a preview with its own rule drifts from
10
+ * enforcement and the drift is silent.
11
+ */
12
+ /** The stage that decided the final verdict, for a one-line reason. */
13
+ function decidingReason(result) {
14
+ const find = (pred) => result.stages.find(pred)?.reason;
15
+ if (result.final === "REFUSED") {
16
+ return find((s) => s.verdict === "REFUSE") ?? "refused";
17
+ }
18
+ if (!result.consultsApproval) {
19
+ return find((s) => s.stage === "trigger") ?? "approval gate not consulted";
20
+ }
21
+ if (result.final === "HUMAN_APPROVAL_REQUIRED") {
22
+ return (find((s) => (s.stage === "worker_authority" || s.stage === "tool_tier") &&
23
+ s.verdict === "APPROVAL") ?? "approval required");
24
+ }
25
+ return find((s) => s.stage === "tool_tier") ?? "allowed";
26
+ }
27
+ export async function projectRecipePolicy(recipeFile, plan, opts = {}) {
28
+ const { explainRecipePolicy } = await import("../../commands/policyExplain.js");
29
+ const explained = await explainRecipePolicy(recipeFile, {
30
+ ...(opts.config && { config: opts.config }),
31
+ ...(opts.workersDir && { workersDir: opts.workersDir }),
32
+ ...(opts.patchworkDir && { patchworkDir: opts.patchworkDir }),
33
+ });
34
+ const steps = new Map();
35
+ const chained = plan.triggerType === "chained";
36
+ for (const [i, planStep] of plan.steps.entries()) {
37
+ // Chained steps carry a required `id`, which is also explain's step id.
38
+ // Flat plan ids fall back differently (tool id vs `step_N`), so flat
39
+ // steps are matched by their position in `steps:` instead.
40
+ const rawIndex = opts.selectedIndex ?? i;
41
+ const match = chained
42
+ ? explained.steps.find((e) => e.stepId === planStep.id)
43
+ : explained.steps.find((e) => e.index === rawIndex);
44
+ if (!match)
45
+ continue;
46
+ steps.set(planStep.id, {
47
+ final: match.result.final,
48
+ consultsApproval: match.result.consultsApproval,
49
+ reason: decidingReason(match.result),
50
+ });
51
+ }
52
+ // The trigger the verdicts were computed for (explain evaluates a top-level
53
+ // chained run as "manual", as the chained runner does).
54
+ const evaluated = explained.steps[0]?.input.trigger;
55
+ return {
56
+ profile: explained.profileMode === "governed" ? "governed" : "compat",
57
+ trigger: String(evaluated ??
58
+ (explained.trigger === "chained" ? "manual" : explained.trigger)),
59
+ steps,
60
+ };
61
+ }
62
+ //# sourceMappingURL=policyProjection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyProjection.js","sourceRoot":"","sources":["../../../src/recipes/simulation/policyProjection.ts"],"names":[],"mappings":"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"}
@@ -9,9 +9,16 @@
9
9
  */
10
10
  import type { RecipeDryRunPlan } from "../../commands/recipe.js";
11
11
  import type { MockedRunResult } from "./simulateMockedRun.js";
12
- import { type RecipeSimulationReport } from "./types.js";
13
- /** Pure transform: a dry-run plan → a What-If Preview simulation report. */
14
- export declare function simulateFromPlan(plan: RecipeDryRunPlan): RecipeSimulationReport;
12
+ import { type RecipeSimulationReport, type SimulationPolicy } from "./types.js";
13
+ /**
14
+ * Pure transform: a dry-run plan → a What-If Preview simulation report.
15
+ *
16
+ * `policy` carries the per-step `computeEffectivePolicy` verdicts (built by
17
+ * `projectRecipePolicy`). Without it the approval section is reported as
18
+ * UNAVAILABLE — this function never derives a gating verdict itself, because
19
+ * a second derivation is exactly how a preview drifts from enforcement.
20
+ */
21
+ export declare function simulateFromPlan(plan: RecipeDryRunPlan, policy?: SimulationPolicy): RecipeSimulationReport;
15
22
  /**
16
23
  * Extract the step ids a `when:` condition references via `{{ ... }}`
17
24
  * placeholders. Covers the common dotted forms the chained runner exposes
@@ -31,6 +38,6 @@ export declare function extractReferencedStepIds(condition: string): Set<string>
31
38
  * data), else `"undetermined"`.
32
39
  *
33
40
  * Risk / side-effect / cost / approvals sections are carried over unchanged
34
- * from the static report. `gatedOnRecipeSteps` stays false (P0/P4 truth).
41
+ * from the static report, including the effective-policy approval verdicts.
35
42
  */
36
- export declare function simulateMockedFromPlan(plan: RecipeDryRunPlan, mocked: MockedRunResult): RecipeSimulationReport;
43
+ export declare function simulateMockedFromPlan(plan: RecipeDryRunPlan, mocked: MockedRunResult, policy?: SimulationPolicy): RecipeSimulationReport;
@@ -91,11 +91,47 @@ function buildCost(plan) {
91
91
  note: "Low-confidence chars/4 token estimate over agent prompts (input only). USD is not projected at static fidelity — the default driver is a subscription/subprocess driver that is not billed; set an API driver + budget for a cost number.",
92
92
  };
93
93
  }
94
- /** Pure transform: a dry-run plan → a What-If Preview simulation report. */
95
- export function simulateFromPlan(plan) {
94
+ /**
95
+ * Is any step of this recipe put in front of the approval gate? Read off the
96
+ * effective-policy verdicts — never assumed. `null` when there is no policy
97
+ * input, or when not one step could be evaluated: "we did not look" must not
98
+ * read as "not gated".
99
+ */
100
+ function computeGated(steps, policy) {
101
+ if (!policy)
102
+ return null;
103
+ const evaluated = steps
104
+ .map((s) => policy.steps.get(s.id))
105
+ .filter((v) => v !== undefined);
106
+ if (evaluated.length === 0)
107
+ return null;
108
+ return evaluated.some((v) => v.consultsApproval);
109
+ }
110
+ /** The one approval caveat, shared by the static and mocked reports. */
111
+ function approvalNote(gated, policy, projected) {
112
+ if (!policy || gated === null) {
113
+ return "Approval projection unavailable: the effective policy could not be evaluated, so this report claims nothing about whether steps would wait for approval.";
114
+ }
115
+ const scope = `the runtime's effective policy (${policy.profile} profile, ${policy.trigger} run)`;
116
+ if (!gated) {
117
+ return `Approval projection comes from ${scope}: the approval gate is not consulted for any step of this recipe, so no step would wait for a human.`;
118
+ }
119
+ const waiting = projected.filter((p) => p.wouldRequireApproval === true);
120
+ const refused = projected.filter((p) => p.verdict === "REFUSED");
121
+ return `Approval projection comes from ${scope}: ${waiting.length} step(s) would wait for a human${refused.length > 0 ? `, ${refused.length} would be refused` : ""}.`;
122
+ }
123
+ /**
124
+ * Pure transform: a dry-run plan → a What-If Preview simulation report.
125
+ *
126
+ * `policy` carries the per-step `computeEffectivePolicy` verdicts (built by
127
+ * `projectRecipePolicy`). Without it the approval section is reported as
128
+ * UNAVAILABLE — this function never derives a gating verdict itself, because
129
+ * a second derivation is exactly how a preview drifts from enforcement.
130
+ */
131
+ export function simulateFromPlan(plan, policy) {
96
132
  const topology = plan.triggerType === "chained" ? "chained" : "flat";
97
- const gatedOnRecipeSteps = false; // P0/P4 truth: recipe steps are not gated today.
98
133
  const steps = buildSteps(plan, topology);
134
+ const gatedOnRecipeSteps = computeGated(steps, policy);
99
135
  const sideEffectCounts = emptySideEffectCounts();
100
136
  for (const s of steps)
101
137
  sideEffectCounts[s.sideEffect] += 1;
@@ -113,17 +149,33 @@ export function simulateFromPlan(plan) {
113
149
  sideEffect: s.sideEffect,
114
150
  resolved: s.resolved,
115
151
  })));
152
+ // Every risky or writing step is listed, plus any step the policy would
153
+ // hold or refuse whatever its tier (e.g. `approvalGate: all`, or an agent
154
+ // step that widened its containment).
116
155
  const projected = steps
117
- .filter((s) => s.baseRisk !== "low" || s.isWrite)
118
- .map((s) => ({
119
- stepId: s.id,
120
- ...(s.tool !== undefined ? { tool: s.tool } : {}),
121
- tier: s.baseRisk,
122
- wouldRequireApproval: s.baseRisk !== "low",
123
- reason: s.baseRisk !== "low"
124
- ? `${s.baseRisk}-risk ${s.sideEffect}`
125
- : `write step (${s.sideEffect}), low tier`,
126
- }));
156
+ .filter((s) => {
157
+ const v = policy?.steps.get(s.id);
158
+ return (s.baseRisk !== "low" ||
159
+ s.isWrite ||
160
+ (v !== undefined && v.final !== "ALLOW"));
161
+ })
162
+ .map((s) => {
163
+ const v = policy?.steps.get(s.id);
164
+ return {
165
+ stepId: s.id,
166
+ ...(s.tool !== undefined ? { tool: s.tool } : {}),
167
+ tier: s.baseRisk,
168
+ wouldRequireApproval: v ? v.final === "HUMAN_APPROVAL_REQUIRED" : null,
169
+ verdict: v ? v.final : "unknown",
170
+ ...(v ? { consultsApproval: v.consultsApproval } : {}),
171
+ reason: v
172
+ ? v.reason
173
+ : policy
174
+ ? `not evaluated (${s.type === "recipe" ? "nested recipe — governed by its own steps" : "no tool or agent to evaluate"})`
175
+ : "effective policy unavailable",
176
+ };
177
+ });
178
+ const approvalsNote = approvalNote(gatedOnRecipeSteps, policy, projected);
127
179
  const branches = steps
128
180
  .filter((s) => typeof s.condition === "string" && s.condition.length > 0)
129
181
  .map((s) => ({
@@ -135,7 +187,7 @@ export function simulateFromPlan(plan) {
135
187
  const cost = buildCost(plan);
136
188
  const notes = [
137
189
  "Static fidelity: no step is executed. Agent/LLM outputs and data-dependent branches are not resolved.",
138
- "Approval projection shows the tier that WOULD apply if recipe steps were gated — they are NOT gated on the execution path today (gatedOnRecipeSteps=false).",
190
+ approvalsNote,
139
191
  "Cost is a low-confidence estimate; USD is not projected at this phase.",
140
192
  ];
141
193
  if (topology === "flat") {
@@ -161,8 +213,12 @@ export function simulateFromPlan(plan) {
161
213
  risk,
162
214
  approvals: {
163
215
  gatedOnRecipeSteps,
216
+ basis: policy && gatedOnRecipeSteps !== null
217
+ ? "effective-policy"
218
+ : "unavailable",
219
+ ...(policy ? { profile: policy.profile, trigger: policy.trigger } : {}),
164
220
  projected,
165
- note: "Recipe-runner steps are NOT gated by the approval queue today; this column is the tier that would apply if they were.",
221
+ note: approvalsNote,
166
222
  },
167
223
  cost,
168
224
  branches,
@@ -212,10 +268,10 @@ export function extractReferencedStepIds(condition) {
212
268
  * data), else `"undetermined"`.
213
269
  *
214
270
  * Risk / side-effect / cost / approvals sections are carried over unchanged
215
- * from the static report. `gatedOnRecipeSteps` stays false (P0/P4 truth).
271
+ * from the static report, including the effective-policy approval verdicts.
216
272
  */
217
- export function simulateMockedFromPlan(plan, mocked) {
218
- const base = simulateFromPlan(plan);
273
+ export function simulateMockedFromPlan(plan, mocked, policy) {
274
+ const base = simulateFromPlan(plan, policy);
219
275
  const steps = base.steps.map((s) => {
220
276
  const state = mocked.stepData.get(s.id);
221
277
  const mockedFrom = state?.mockedFrom ??
@@ -245,7 +301,7 @@ export function simulateMockedFromPlan(plan, mocked) {
245
301
  const notes = [
246
302
  `Mocked fidelity: downstream templates and conditions were resolved by driving the chained runner with ${mocked.sampleRuns} prior run(s) of history. No step executed for real (stubbed deps, no persistence).`,
247
303
  "Steps without run history were fed synthesized placeholders; their downstream effects are approximate.",
248
- "Approval projection shows the tier that WOULD apply if recipe steps were gated — they are NOT gated on the execution path today (gatedOnRecipeSteps=false).",
304
+ base.approvals.note,
249
305
  "Cost remains a static estimate at this phase; USD is not projected (P3).",
250
306
  ];
251
307
  if (base.summary.unresolvedSteps > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/recipes/simulation/simulate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../../src/recipes/simulation/simulate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAKL,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AAEpB,sFAAsF;AACtF,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,MAAM,GAAG,CAAC,CAAU,EAAiB,EAAE,CAC3C,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,CAAC;AAEhD,iFAAiF;AACjF,SAAS,YAAY,CAAC,IAA0B;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CACjB,IAAsB,EACtB,QAA4B;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAC9B,CAAC,CAAC,EAA+D,EAAE,CAAC,CAAC;QACnE,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QACzC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC,CACH,CAAC;IACF,MAAM,SAAS,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAkB,EAAE;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;QACnC,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,MAAM,UAAU,GAAG,sBAAsB,CAAC;YACxC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,QAAQ;YACR,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,QAAQ;YACR,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,QAAQ;YACR,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,QAAQ;YAC9C,UAAU;YACV,OAAO;YACP,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAsB;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC;IACzC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAC3D,CAAC;IACF,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC;IAE9C,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,UAAU,EAAE,CAAC;YACb,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,IAAI;YACrB,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,uDAAuD;SAC9D,CAAC;IACJ,CAAC;IAED,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,KAAK,EAAE,aAAa;YACpB,UAAU;YACV,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,IAAI;YACrB,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,0IAA0I;SACjJ,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC,MAAiB,CAAC,MAAM,GAAG,eAAe,CAAC,EAC1E,CAAC,CACF,CAAC;IACF,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,UAAU;QACV,mBAAmB;QACnB,eAAe;QACf,GAAG,EAAE,IAAI;QACT,IAAI,EAAE,2OAA2O;KAClP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CACnB,KAAuB,EACvB,MAAoC;IAEpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,SAAS,GAAG,KAAK;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAClC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACnD,CAAC;AAED,wEAAwE;AACxE,SAAS,YAAY,CACnB,KAAqB,EACrB,MAAoC,EACpC,SAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,0JAA0J,CAAC;IACpK,CAAC;IACD,MAAM,KAAK,GAAG,mCAAmC,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,OAAO,CAAC;IAClG,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,kCAAkC,KAAK,sGAAsG,CAAC;IACvJ,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,IAAI,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IACjE,OAAO,kCAAkC,KAAK,KAAK,OAAO,CAAC,MAAM,kCAAkC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AACzK,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAsB,EACtB,MAAyB;IAEzB,MAAM,QAAQ,GACZ,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAEtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,kBAAkB,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,qBAAqB,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;QACjD,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM;QACzD,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,MAAM;QAC1D,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;QACxD,gBAAgB;QAChB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,EAAE;KACpD,CAAC;IAEF,MAAM,IAAI,GAAG,gBAAgB,CAC3B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;KACrB,CAAC,CAAC,CACJ,CAAC;IAEF,wEAAwE;IACxE,0EAA0E;IAC1E,sCAAsC;IACtC,MAAM,SAAS,GAAyB,KAAK;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACZ,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,CACL,CAAC,CAAC,QAAQ,KAAK,KAAK;YACpB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CACzC,CAAC;IACJ,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAsB,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,CAAC,CAAC,EAAE;YACZ,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,yBAAyB,CAAC,CAAC,CAAC,IAAI;YACtE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAChC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,EAAE,CAAC;gBACP,CAAC,CAAC,CAAC,CAAC,MAAM;gBACV,CAAC,CAAC,MAAM;oBACN,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,8BAA8B,GAAG;oBACzH,CAAC,CAAC,8BAA8B;SACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,aAAa,GAAG,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAE1E,MAAM,QAAQ,GAAuB,KAAK;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;SACxE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,EAAE;QACZ,SAAS,EAAE,CAAC,CAAC,SAAmB;QAChC,OAAO,EAAE,cAAuB;QAChC,MAAM,EACJ,6GAA6G;KAChH,CAAC,CAAC,CAAC;IAEN,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,MAAM,KAAK,GAAa;QACtB,uGAAuG;QACvG,aAAa;QACb,wEAAwE;KACzE,CAAC;IACF,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,wGAAwG,CACzG,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CACR,GAAG,OAAO,CAAC,eAAe,gGAAgG,CAC3H,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,GAAG,QAAQ,CAAC,MAAM,kGAAkG,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,aAAa,EAAE,yBAAyB;QACxC,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,QAAQ;QAClB,QAAQ;QACR,kBAAkB;QAClB,KAAK;QACL,OAAO;QACP,IAAI;QACJ,SAAS,EAAE;YACT,kBAAkB;YAClB,KAAK,EACH,MAAM,IAAI,kBAAkB,KAAK,IAAI;gBACnC,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,aAAa;YACnB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,SAAS;YACT,IAAI,EAAE,aAAa;SACpB;QACD,IAAI;QACJ,QAAQ;QACR,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC9C,IAAI,CAAC,GAA2B,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,gDAAgD;QAChD,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnE,iCAAiC;gBACjC,MAAM,GAAG,GAAG,wCAAwC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,GAAG;oBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;iBAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,wCAAwC;gBACxC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAsB,EACtB,MAAuB,EACvB,MAAyB;IAEzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAqB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,UAAU,GACd,KAAK,EAAE,UAAU;YACjB,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAChE,OAAO,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAuB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,YAAY,GAChB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,GAAG,CAAC;gBACJ,OAAO,EAAE,cAAuB;gBAChC,MAAM,EACJ,IAAI,CAAC,IAAI,KAAK,CAAC;oBACb,CAAC,CAAC,qEAAqE;oBACvE,CAAC,CAAC,yGAAyG;aAChH,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAwB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1E,OAAO;YACL,GAAG,CAAC;YACJ,OAAO;YACP,MAAM,EAAE,oDAAoD,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACpF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAa;QACtB,yGAAyG,MAAM,CAAC,UAAU,qFAAqF;QAC/M,wGAAwG;QACxG,IAAI,CAAC,SAAS,CAAC,IAAI;QACnB,0EAA0E;KAC3E,CAAC;IACF,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,gGAAgG,CAChI,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,IAAI;QACP,aAAa,EAAE,yBAAyB;QACxC,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK;QACL,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -8,9 +8,11 @@
8
8
  *
9
9
  * Design constraints baked into the shape (from the 2026-06-04 investigation,
10
10
  * `docs/counterfactual-sim-engine-investigation.md`):
11
- * - `gatedOnRecipeSteps` is a first-class boolean so a consumer can NEVER
12
- * imply an approval gate that does not exist on the recipe execution path
13
- * today (the live gate in transport.ts only gates MCP bridge calls).
11
+ * - `gatedOnRecipeSteps` is a first-class field so a consumer can never
12
+ * imply an approval gate that the runtime would not apply — nor hide one
13
+ * it would. Since v3 it is COMPUTED from the effective policy (the same
14
+ * `computeEffectivePolicy` both runners consult per step), never a
15
+ * constant; `null` when the policy could not be evaluated.
14
16
  * - cost carries an explicit `basis` and is never a precise dollar figure or
15
17
  * `$0` — at static fidelity USD is genuinely not projectable.
16
18
  * - conditional branches resolve to `"undetermined"`, never a faked
@@ -25,8 +27,15 @@
25
27
  * and the `taken`/`skipped` branch outcomes (alongside the existing
26
28
  * `undetermined`). All additions are additive/back-compatible — a static report
27
29
  * is still a valid v2 report.
30
+ *
31
+ * v3: the approval projection is the RUNTIME's verdict, not a tier guess.
32
+ * `gatedOnRecipeSteps` becomes `boolean | null` and is computed;
33
+ * `ApprovalProjection` gains `verdict` / `consultsApproval` and its
34
+ * `wouldRequireApproval` now means "the runner would hold this step for a
35
+ * human" (`null` when unknown); `approvals` gains `basis`, `profile` and
36
+ * `trigger`. A meaning change, hence the bump.
28
37
  */
29
- export declare const SIMULATION_SCHEMA_VERSION = 2;
38
+ export declare const SIMULATION_SCHEMA_VERSION = 3;
30
39
  export type RiskTier = "low" | "medium" | "high";
31
40
  /**
32
41
  * Side-effect class for a single step, derived from registry metadata
@@ -64,15 +73,45 @@ export interface SimulationStep {
64
73
  */
65
74
  mockedFrom?: "history" | "synthesized";
66
75
  }
67
- /** Per-step approval projection — "what WOULD gate, if recipe steps were gated". */
76
+ /**
77
+ * The effective-policy verdict for one step, as `computeEffectivePolicy`
78
+ * returns it, or `"unknown"` when it was not evaluated (a nested-recipe or
79
+ * compound step, or a report built with no policy input).
80
+ */
81
+ export type StepPolicyVerdict = "ALLOW" | "HUMAN_APPROVAL_REQUIRED" | "REFUSED" | "unknown";
82
+ /** Per-step approval projection — what the runtime WOULD do with this step. */
68
83
  export interface ApprovalProjection {
69
84
  stepId: string;
70
85
  tool?: string;
71
86
  tier: RiskTier;
72
- /** True if this step's tier would trip an approval gate (tier !== "low"). */
73
- wouldRequireApproval: boolean;
87
+ /**
88
+ * True when the runner would hold this step for a human
89
+ * (`verdict === "HUMAN_APPROVAL_REQUIRED"`); false when it would not;
90
+ * `null` when the verdict is unknown.
91
+ */
92
+ wouldRequireApproval: boolean | null;
93
+ /** The effective-policy verdict for this step. */
94
+ verdict: StepPolicyVerdict;
95
+ /** True when the runner consults the approval gate for this step at all. */
96
+ consultsApproval?: boolean;
74
97
  reason: string;
75
98
  }
99
+ /**
100
+ * Per-step effective-policy facts handed to the pure transform. Built by
101
+ * `projectRecipePolicy` from `computeEffectivePolicy` — the transform never
102
+ * derives a verdict itself.
103
+ */
104
+ export interface SimulationPolicy {
105
+ profile: "governed" | "compat";
106
+ /** The trigger the runtime evaluates (a top-level chained run is "manual"). */
107
+ trigger: string;
108
+ /** Keyed by plan step id. A step absent here was not evaluated. */
109
+ steps: Map<string, {
110
+ final: Exclude<StepPolicyVerdict, "unknown">;
111
+ consultsApproval: boolean;
112
+ reason: string;
113
+ }>;
114
+ }
76
115
  /** A conditional branch surfaced by the engine. */
77
116
  export interface BranchProjection {
78
117
  stepId: string;
@@ -173,16 +212,28 @@ export interface RecipeSimulationReport {
173
212
  /** "chained" recipes have a real DAG; "flat" recipes are a linear list. */
174
213
  topology: "chained" | "flat";
175
214
  /**
176
- * CRITICAL honesty field. False today: the approval queue does NOT gate
177
- * recipe-runner steps. Consumers MUST surface this so the approval
178
- * projection is never read as live gate behaviour.
215
+ * CRITICAL honesty field. True when the runtime consults the approval gate
216
+ * for at least one of this recipe's steps under the current profile,
217
+ * approval-gate setting and trigger; false when it consults it for none;
218
+ * `null` when the effective policy could not be evaluated. Computed from
219
+ * `computeEffectivePolicy`, never a constant.
179
220
  */
180
- gatedOnRecipeSteps: boolean;
221
+ gatedOnRecipeSteps: boolean | null;
181
222
  steps: SimulationStep[];
182
223
  summary: SimulationSummary;
183
224
  risk: RunRiskSummary;
184
225
  approvals: {
185
- gatedOnRecipeSteps: boolean;
226
+ gatedOnRecipeSteps: boolean | null;
227
+ /**
228
+ * `"effective-policy"`: verdicts come from `computeEffectivePolicy`.
229
+ * `"unavailable"`: the policy could not be evaluated; verdicts are
230
+ * `"unknown"` and nothing is claimed either way.
231
+ */
232
+ basis: "effective-policy" | "unavailable";
233
+ /** Governance profile the verdicts were computed under. */
234
+ profile?: "governed" | "compat";
235
+ /** Trigger the verdicts were computed for. */
236
+ trigger?: string;
186
237
  projected: ApprovalProjection[];
187
238
  note: string;
188
239
  };
@@ -8,9 +8,11 @@
8
8
  *
9
9
  * Design constraints baked into the shape (from the 2026-06-04 investigation,
10
10
  * `docs/counterfactual-sim-engine-investigation.md`):
11
- * - `gatedOnRecipeSteps` is a first-class boolean so a consumer can NEVER
12
- * imply an approval gate that does not exist on the recipe execution path
13
- * today (the live gate in transport.ts only gates MCP bridge calls).
11
+ * - `gatedOnRecipeSteps` is a first-class field so a consumer can never
12
+ * imply an approval gate that the runtime would not apply — nor hide one
13
+ * it would. Since v3 it is COMPUTED from the effective policy (the same
14
+ * `computeEffectivePolicy` both runners consult per step), never a
15
+ * constant; `null` when the policy could not be evaluated.
14
16
  * - cost carries an explicit `basis` and is never a precise dollar figure or
15
17
  * `$0` — at static fidelity USD is genuinely not projectable.
16
18
  * - conditional branches resolve to `"undetermined"`, never a faked
@@ -25,6 +27,13 @@
25
27
  * and the `taken`/`skipped` branch outcomes (alongside the existing
26
28
  * `undetermined`). All additions are additive/back-compatible — a static report
27
29
  * is still a valid v2 report.
30
+ *
31
+ * v3: the approval projection is the RUNTIME's verdict, not a tier guess.
32
+ * `gatedOnRecipeSteps` becomes `boolean | null` and is computed;
33
+ * `ApprovalProjection` gains `verdict` / `consultsApproval` and its
34
+ * `wouldRequireApproval` now means "the runner would hold this step for a
35
+ * human" (`null` when unknown); `approvals` gains `basis`, `profile` and
36
+ * `trigger`. A meaning change, hence the bump.
28
37
  */
29
- export const SIMULATION_SCHEMA_VERSION = 2;
38
+ export const SIMULATION_SCHEMA_VERSION = 3;
30
39
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/recipes/simulation/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/recipes/simulation/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC"}
@@ -210,6 +210,14 @@ export interface RecipeSummary {
210
210
  path: string;
211
211
  installedAt: number;
212
212
  source: "user" | "project" | "unknown";
213
+ /**
214
+ * The install source recorded at install time, exactly as given: an
215
+ * install dir's `.install.json` (`recipe install`), or a top-level file's
216
+ * `.install/<file>.json` sidecar (`POST /recipes/install`), the latter only
217
+ * while the file still has the bytes it was installed with. Absent when no
218
+ * valid record exists — never inferred.
219
+ */
220
+ installedFrom?: string;
213
221
  enabled: boolean;
214
222
  trustLevel?: TrustLevel;
215
223
  vars?: Array<{
@@ -5,6 +5,7 @@ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
5
5
  import { loadConfig, saveConfig as savePatchworkConfig, } from "./patchworkConfig.js";
6
6
  import { patchworkPath } from "./patchworkHome.js";
7
7
  import { disabledMarkerPath, getConfigDisabledNames, isInstallDirDisabled, } from "./recipes/disabledMarkers.js";
8
+ import { moveTopLevelProvenance, readInstallProvenance, readTopLevelProvenance, removeTopLevelProvenance, } from "./recipes/installProvenance.js";
8
9
  import { RECIPE_NAME_RE } from "./recipes/names.js";
9
10
  import { validateRecipeDefinition, } from "./recipes/validation.js";
10
11
  import { enrichIssuesWithPositions } from "./recipes/yamlPositions.js";
@@ -618,6 +619,8 @@ export function deleteRecipeContent(recipesDir, name) {
618
619
  }
619
620
  try {
620
621
  rmSync(resolved, { force: true });
622
+ // Install provenance: a later file with this name must not inherit it.
623
+ removeTopLevelProvenance(resolved);
621
624
  const sidecar = `${resolved}.permissions.json`;
622
625
  if (existsSync(sidecar)) {
623
626
  try {
@@ -672,6 +675,8 @@ export function archiveRecipe(recipesDir, name) {
672
675
  dest = path.join(archiveDir, `${stem}.${stamp}${ext}`);
673
676
  }
674
677
  renameSync(resolved, dest);
678
+ // Install provenance moves with the file, out of the live recipes dir.
679
+ moveTopLevelProvenance(resolved, dest);
675
680
  const sidecar = `${resolved}.permissions.json`;
676
681
  if (existsSync(sidecar)) {
677
682
  try {
@@ -1025,6 +1030,8 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
1025
1030
  // Cron/schedule expression for the trigger column. Surfaces `0 9 * * *`
1026
1031
  // in the UI without forcing a YAML fetch.
1027
1032
  const schedule = scheduleExpressionOf(parsed.trigger);
1033
+ // Sidecar under `.install/`, bound to these exact bytes (sha256).
1034
+ const provenance = readTopLevelProvenance(fullPath, raw);
1028
1035
  recipes.push({
1029
1036
  name: parsedName,
1030
1037
  description: parsed.description,
@@ -1035,6 +1042,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
1035
1042
  path: fullPath,
1036
1043
  installedAt: stat.mtimeMs,
1037
1044
  source,
1045
+ ...(provenance ? { installedFrom: provenance.source } : {}),
1038
1046
  // Top-level legacy recipes don't have install dirs to put a marker
1039
1047
  // in, so the `enabled` field still comes from the legacy config list.
1040
1048
  enabled: !disabledSet.has(parsedName),
@@ -1091,6 +1099,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
1091
1099
  // Cron/schedule expression for the trigger column. Surfaces `0 9 * * *`
1092
1100
  // in the UI without forcing a YAML fetch.
1093
1101
  const schedule = scheduleExpressionOf(parsed.trigger);
1102
+ const provenance = readInstallProvenance(installDir);
1094
1103
  recipes.push({
1095
1104
  name: parsedName,
1096
1105
  description: parsed.description,
@@ -1101,6 +1110,7 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
1101
1110
  path: entrypointPath,
1102
1111
  installedAt: stat.mtimeMs,
1103
1112
  source: "user",
1113
+ ...(provenance ? { installedFrom: provenance.source } : {}),
1104
1114
  // Disabled if EITHER the install marker is set OR the legacy config
1105
1115
  // names this recipe — defence-in-depth so a stale config entry can't
1106
1116
  // accidentally re-enable a recipe the user explicitly disabled, and
@@ -1118,7 +1128,6 @@ export function listInstalledRecipes(recipesDir, opts = {}) {
1118
1128
  ...(firstError ? { firstError } : {}),
1119
1129
  },
1120
1130
  });
1121
- void installDir;
1122
1131
  }
1123
1132
  catch {
1124
1133
  // skip malformed install dir