@neuroverseos/governance 0.1.6 → 0.2.2

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 (82) hide show
  1. package/README.md +279 -423
  2. package/dist/adapters/express.cjs +242 -2
  3. package/dist/adapters/express.d.cts +1 -1
  4. package/dist/adapters/express.d.ts +1 -1
  5. package/dist/adapters/express.js +5 -3
  6. package/dist/adapters/index.cjs +337 -5
  7. package/dist/adapters/index.d.cts +1 -1
  8. package/dist/adapters/index.d.ts +1 -1
  9. package/dist/adapters/index.js +8 -6
  10. package/dist/adapters/langchain.cjs +297 -3
  11. package/dist/adapters/langchain.d.cts +8 -1
  12. package/dist/adapters/langchain.d.ts +8 -1
  13. package/dist/adapters/langchain.js +5 -3
  14. package/dist/adapters/openai.cjs +297 -3
  15. package/dist/adapters/openai.d.cts +8 -1
  16. package/dist/adapters/openai.d.ts +8 -1
  17. package/dist/adapters/openai.js +5 -3
  18. package/dist/adapters/openclaw.cjs +297 -3
  19. package/dist/adapters/openclaw.d.cts +8 -1
  20. package/dist/adapters/openclaw.d.ts +8 -1
  21. package/dist/adapters/openclaw.js +5 -3
  22. package/dist/{bootstrap-H4HHKQ5G.js → bootstrap-GXVDZNF7.js} +2 -1
  23. package/dist/{build-73KAVHEY.js → build-P42YFKQV.js} +34 -3
  24. package/dist/{chunk-Z2S2HIV5.js → chunk-2NICNKOM.js} +2 -2
  25. package/dist/{chunk-B4NF3OLW.js → chunk-4JRYGIO7.js} +56 -2
  26. package/dist/chunk-4QXB6PEO.js +232 -0
  27. package/dist/chunk-6CZSKEY5.js +164 -0
  28. package/dist/{chunk-O5OMJMIE.js → chunk-7P3S7MAY.js} +502 -2
  29. package/dist/chunk-A5W4GNQO.js +130 -0
  30. package/dist/chunk-AKW5YVCE.js +96 -0
  31. package/dist/chunk-DPVS43ZT.js +608 -0
  32. package/dist/{chunk-EIUHJXBB.js → chunk-GR6DGCZ2.js} +1 -1
  33. package/dist/chunk-KEST3MWO.js +324 -0
  34. package/dist/{chunk-D7BGWV2J.js → chunk-NF5POFCI.js} +5 -3
  35. package/dist/{chunk-FZQCRGUU.js → chunk-OHAC6HJE.js} +27 -3
  36. package/dist/chunk-OT6PXH54.js +61 -0
  37. package/dist/{chunk-ITJ3LCPG.js → chunk-PDOZHZWL.js} +1 -1
  38. package/dist/{chunk-T4X42QXC.js → chunk-Q6O7ZLO2.js} +0 -59
  39. package/dist/{chunk-FYPYZFV5.js → chunk-QPASI2BR.js} +1 -1
  40. package/dist/{chunk-EQXFOKH2.js → chunk-RWXVAH6P.js} +27 -3
  41. package/dist/{chunk-CROPZ75A.js → chunk-SKU3GAPD.js} +27 -3
  42. package/dist/chunk-YZFATT7X.js +9 -0
  43. package/dist/cli/neuroverse.cjs +5343 -732
  44. package/dist/cli/neuroverse.js +69 -13
  45. package/dist/cli/plan.cjs +1599 -0
  46. package/dist/cli/plan.d.cts +20 -0
  47. package/dist/cli/plan.d.ts +20 -0
  48. package/dist/cli/plan.js +361 -0
  49. package/dist/cli/run.cjs +1746 -0
  50. package/dist/cli/run.d.cts +20 -0
  51. package/dist/cli/run.d.ts +20 -0
  52. package/dist/cli/run.js +143 -0
  53. package/dist/{configure-ai-46JVG56I.js → configure-ai-TK67ZWZL.js} +5 -2
  54. package/dist/{derive-6NAEWLM5.js → derive-TLIV4OOU.js} +6 -4
  55. package/dist/doctor-QV6HELS5.js +170 -0
  56. package/dist/{explain-3B3VB6TL.js → explain-IDCRWMPX.js} +2 -1
  57. package/dist/{guard-67Y66P3I.js → guard-GFLQZY6U.js} +20 -6
  58. package/dist/{guard-contract-D_RQz9kt.d.ts → guard-contract-Cm91Kp4j.d.cts} +182 -2
  59. package/dist/{guard-contract-D_RQz9kt.d.cts → guard-contract-Cm91Kp4j.d.ts} +182 -2
  60. package/dist/guard-engine-JLTUARGU.js +10 -0
  61. package/dist/{impact-CHERK3O6.js → impact-XPECYRLH.js} +5 -3
  62. package/dist/{improve-YG6I6ERG.js → improve-GPUBKTEA.js} +4 -3
  63. package/dist/index.cjs +2135 -89
  64. package/dist/index.d.cts +481 -12
  65. package/dist/index.d.ts +481 -12
  66. package/dist/index.js +70 -20
  67. package/dist/{init-Z66T6TDI.js → init-PKPIYHYE.js} +2 -0
  68. package/dist/mcp-server-LZVJHBT5.js +13 -0
  69. package/dist/model-adapter-BB7G4MFI.js +11 -0
  70. package/dist/playground-FGOMASHN.js +550 -0
  71. package/dist/redteam-SK7AMIG3.js +357 -0
  72. package/dist/session-VISISNWJ.js +14 -0
  73. package/dist/{simulate-ETHHINZ4.js → simulate-VDOYQFRO.js} +2 -1
  74. package/dist/test-75AVHC3R.js +217 -0
  75. package/dist/{trace-3YODSSIP.js → trace-JVF67VR3.js} +4 -2
  76. package/dist/{validate-UVE6GKQU.js → validate-LLBWVPGV.js} +15 -6
  77. package/dist/validate-engine-UIABSIHD.js +7 -0
  78. package/dist/{world-WLNHL5XC.js → world-LAXO6DOX.js} +87 -7
  79. package/dist/world-loader-HMPTOEA2.js +9 -0
  80. package/package.json +19 -5
  81. package/dist/validate-engine-657D75OG.js +0 -6
  82. /package/dist/{chunk-M3TZFGHO.js → chunk-JZPQGIKR.js} +0 -0
@@ -37,6 +37,232 @@ __export(openai_exports, {
37
37
  });
38
38
  module.exports = __toCommonJS(openai_exports);
39
39
 
40
+ // src/engine/plan-engine.ts
41
+ function keywordMatch(eventText, step) {
42
+ const stepText = [
43
+ step.label,
44
+ step.description ?? "",
45
+ ...step.tags ?? []
46
+ ].join(" ").toLowerCase();
47
+ const keywords = stepText.split(/\s+/).filter((w) => w.length > 3);
48
+ if (keywords.length === 0) return false;
49
+ const matched = keywords.filter((kw) => eventText.includes(kw));
50
+ return matched.length >= Math.ceil(keywords.length * 0.5);
51
+ }
52
+ function tokenSimilarity(a, b) {
53
+ const tokensA = new Set(a.toLowerCase().split(/\s+/).filter((w) => w.length > 2));
54
+ const tokensB = new Set(b.toLowerCase().split(/\s+/).filter((w) => w.length > 2));
55
+ if (tokensA.size === 0 || tokensB.size === 0) return 0;
56
+ let intersection = 0;
57
+ for (const t of tokensA) {
58
+ if (tokensB.has(t)) intersection++;
59
+ }
60
+ const union = (/* @__PURE__ */ new Set([...tokensA, ...tokensB])).size;
61
+ return union > 0 ? intersection / union : 0;
62
+ }
63
+ function findMatchingStep(eventText, event, steps) {
64
+ const pendingOrActive = steps.filter((s) => s.status === "pending" || s.status === "active");
65
+ if (pendingOrActive.length === 0) {
66
+ return { matched: null, closest: null, closestScore: 0 };
67
+ }
68
+ for (const step of pendingOrActive) {
69
+ if (keywordMatch(eventText, step)) {
70
+ if (step.tools && event.tool && !step.tools.includes(event.tool)) {
71
+ continue;
72
+ }
73
+ return { matched: step, closest: step, closestScore: 1 };
74
+ }
75
+ }
76
+ const intentText = [event.intent, event.tool ?? "", event.scope ?? ""].join(" ");
77
+ let bestStep = null;
78
+ let bestScore = 0;
79
+ for (const step of pendingOrActive) {
80
+ const stepText = [step.label, step.description ?? "", ...step.tags ?? []].join(" ");
81
+ const score = tokenSimilarity(intentText, stepText);
82
+ if (score > bestScore) {
83
+ bestScore = score;
84
+ bestStep = step;
85
+ }
86
+ }
87
+ const SIMILARITY_THRESHOLD = 0.35;
88
+ if (bestScore >= SIMILARITY_THRESHOLD && bestStep) {
89
+ if (bestStep.tools && event.tool && !bestStep.tools.includes(event.tool)) {
90
+ return { matched: null, closest: bestStep, closestScore: bestScore };
91
+ }
92
+ return { matched: bestStep, closest: bestStep, closestScore: bestScore };
93
+ }
94
+ return { matched: null, closest: bestStep, closestScore: bestScore };
95
+ }
96
+ function isSequenceValid(step, plan) {
97
+ if (!plan.sequential) return true;
98
+ if (!step.requires || step.requires.length === 0) return true;
99
+ return step.requires.every((reqId) => {
100
+ const reqStep = plan.steps.find((s) => s.id === reqId);
101
+ return reqStep?.status === "completed";
102
+ });
103
+ }
104
+ function checkConstraints(event, eventText, constraints) {
105
+ const checks = [];
106
+ for (const constraint of constraints) {
107
+ if (constraint.type === "approval") {
108
+ if (constraint.trigger && eventText.includes(constraint.trigger.substring(0, 10).toLowerCase())) {
109
+ checks.push({ constraintId: constraint.id, passed: false, reason: constraint.description });
110
+ return { violated: constraint, checks };
111
+ }
112
+ const keywords = constraint.description.toLowerCase().split(/\s+/).filter((w) => w.length > 3);
113
+ const relevant = keywords.some((kw) => eventText.includes(kw));
114
+ if (relevant) {
115
+ checks.push({ constraintId: constraint.id, passed: false, reason: constraint.description });
116
+ return { violated: constraint, checks };
117
+ }
118
+ checks.push({ constraintId: constraint.id, passed: true });
119
+ continue;
120
+ }
121
+ if (constraint.type === "scope" && constraint.trigger) {
122
+ const keywords = constraint.trigger.split(/\s+/).filter((w) => w.length > 3);
123
+ const violated = keywords.length > 0 && keywords.every((kw) => eventText.includes(kw));
124
+ checks.push({
125
+ constraintId: constraint.id,
126
+ passed: !violated,
127
+ reason: violated ? constraint.description : void 0
128
+ });
129
+ if (violated) {
130
+ return { violated: constraint, checks };
131
+ }
132
+ continue;
133
+ }
134
+ checks.push({ constraintId: constraint.id, passed: true });
135
+ }
136
+ return { violated: null, checks };
137
+ }
138
+ function getPlanProgress(plan) {
139
+ const completed = plan.steps.filter((s) => s.status === "completed").length;
140
+ const total = plan.steps.length;
141
+ return {
142
+ completed,
143
+ total,
144
+ percentage: total > 0 ? Math.round(completed / total * 100) : 0
145
+ };
146
+ }
147
+ function advancePlan(plan, stepId, evidence) {
148
+ const step = plan.steps.find((s) => s.id === stepId);
149
+ if (!step) {
150
+ return { success: false, reason: `Step "${stepId}" not found in plan.` };
151
+ }
152
+ if (step.status === "completed") {
153
+ return { success: false, reason: `Step "${stepId}" is already completed.` };
154
+ }
155
+ const mode = plan.completion ?? "trust";
156
+ if (mode === "verified" && step.verify) {
157
+ if (!evidence) {
158
+ return {
159
+ success: false,
160
+ reason: `Step "${step.label}" requires evidence (verify: ${step.verify}). Provide evidence to advance.`
161
+ };
162
+ }
163
+ if (evidence.type !== step.verify) {
164
+ return {
165
+ success: false,
166
+ reason: `Evidence type "${evidence.type}" does not match required verification "${step.verify}".`
167
+ };
168
+ }
169
+ }
170
+ const updatedPlan = {
171
+ ...plan,
172
+ steps: plan.steps.map(
173
+ (s) => s.id === stepId ? { ...s, status: "completed" } : s
174
+ )
175
+ };
176
+ return {
177
+ success: true,
178
+ plan: updatedPlan,
179
+ evidence: evidence ?? void 0
180
+ };
181
+ }
182
+ function evaluatePlan(event, plan) {
183
+ const progress = getPlanProgress(plan);
184
+ if (plan.expires_at) {
185
+ const expiresAt = new Date(plan.expires_at).getTime();
186
+ if (Date.now() > expiresAt) {
187
+ return {
188
+ allowed: true,
189
+ status: "PLAN_COMPLETE",
190
+ reason: "Plan has expired.",
191
+ progress
192
+ };
193
+ }
194
+ }
195
+ if (progress.completed === progress.total) {
196
+ return {
197
+ allowed: true,
198
+ status: "PLAN_COMPLETE",
199
+ reason: "All plan steps are completed.",
200
+ progress
201
+ };
202
+ }
203
+ const eventText = [
204
+ event.intent,
205
+ event.tool ?? "",
206
+ event.scope ?? ""
207
+ ].join(" ").toLowerCase();
208
+ const { matched, closest, closestScore } = findMatchingStep(eventText, event, plan.steps);
209
+ if (!matched) {
210
+ return {
211
+ allowed: false,
212
+ status: "OFF_PLAN",
213
+ reason: "Action does not match any plan step.",
214
+ closestStep: closest?.label,
215
+ similarityScore: closestScore,
216
+ progress
217
+ };
218
+ }
219
+ if (!isSequenceValid(matched, plan)) {
220
+ const pendingDeps = (matched.requires ?? []).filter((reqId) => plan.steps.find((s) => s.id === reqId)?.status !== "completed").join(", ");
221
+ return {
222
+ allowed: false,
223
+ status: "OFF_PLAN",
224
+ reason: `Step "${matched.label}" requires completion of: ${pendingDeps}`,
225
+ matchedStep: matched.id,
226
+ progress
227
+ };
228
+ }
229
+ const { violated } = checkConstraints(event, eventText, plan.constraints);
230
+ if (violated) {
231
+ return {
232
+ allowed: false,
233
+ status: "CONSTRAINT_VIOLATED",
234
+ reason: violated.description,
235
+ matchedStep: matched.id,
236
+ progress
237
+ };
238
+ }
239
+ return {
240
+ allowed: true,
241
+ status: "ON_PLAN",
242
+ reason: `Matches step: ${matched.label}`,
243
+ matchedStep: matched.id,
244
+ progress
245
+ };
246
+ }
247
+ function buildPlanCheck(event, plan, verdict) {
248
+ const eventText = [event.intent, event.tool ?? "", event.scope ?? ""].join(" ").toLowerCase();
249
+ const { matched, closest, closestScore } = findMatchingStep(eventText, event, plan.steps);
250
+ const { checks: constraintChecks } = checkConstraints(event, eventText, plan.constraints);
251
+ const progress = getPlanProgress(plan);
252
+ return {
253
+ planId: plan.plan_id,
254
+ matched: !!matched,
255
+ matchedStepId: matched?.id,
256
+ matchedStepLabel: matched?.label,
257
+ closestStepId: !matched ? closest?.id : void 0,
258
+ closestStepLabel: !matched ? closest?.label : void 0,
259
+ similarityScore: !matched ? closestScore : void 0,
260
+ sequenceValid: matched ? isSequenceValid(matched, plan) : void 0,
261
+ constraintsChecked: constraintChecks,
262
+ progress: { completed: progress.completed, total: progress.total }
263
+ };
264
+ }
265
+
40
266
  // src/engine/guard-engine.ts
41
267
  var PROMPT_INJECTION_PATTERNS = [
42
268
  // Instruction override
@@ -128,6 +354,7 @@ function evaluateGuard(event, world, options = {}) {
128
354
  const eventText = (event.intent + " " + (event.tool ?? "") + " " + (event.scope ?? "")).toLowerCase();
129
355
  const invariantChecks = [];
130
356
  const safetyChecks = [];
357
+ let planCheckResult;
131
358
  const roleChecks = [];
132
359
  const guardChecks = [];
133
360
  const kernelRuleChecks = [];
@@ -155,6 +382,7 @@ function evaluateGuard(event, world, options = {}) {
155
382
  includeTrace ? buildTrace(
156
383
  invariantChecks,
157
384
  safetyChecks,
385
+ planCheckResult,
158
386
  roleChecks,
159
387
  guardChecks,
160
388
  kernelRuleChecks,
@@ -183,6 +411,7 @@ function evaluateGuard(event, world, options = {}) {
183
411
  includeTrace ? buildTrace(
184
412
  invariantChecks,
185
413
  safetyChecks,
414
+ planCheckResult,
186
415
  roleChecks,
187
416
  guardChecks,
188
417
  kernelRuleChecks,
@@ -193,6 +422,42 @@ function evaluateGuard(event, world, options = {}) {
193
422
  ) : void 0
194
423
  );
195
424
  }
425
+ if (options.plan) {
426
+ const planVerdict = evaluatePlan(event, options.plan);
427
+ planCheckResult = buildPlanCheck(event, options.plan, planVerdict);
428
+ if (!planVerdict.allowed && planVerdict.status !== "PLAN_COMPLETE") {
429
+ decidingLayer = "plan-enforcement";
430
+ decidingId = `plan-${options.plan.plan_id}`;
431
+ const planStatus = planVerdict.status === "CONSTRAINT_VIOLATED" ? "PAUSE" : "BLOCK";
432
+ let reason = planVerdict.reason ?? "Action blocked by plan.";
433
+ if (planVerdict.status === "OFF_PLAN" && planVerdict.closestStep) {
434
+ reason += ` Closest step: "${planVerdict.closestStep}" (similarity: ${(planVerdict.similarityScore ?? 0).toFixed(2)})`;
435
+ }
436
+ return buildVerdict(
437
+ planStatus,
438
+ reason,
439
+ `plan-${options.plan.plan_id}`,
440
+ void 0,
441
+ world,
442
+ level,
443
+ invariantChecks,
444
+ guardsMatched,
445
+ rulesMatched,
446
+ includeTrace ? buildTrace(
447
+ invariantChecks,
448
+ safetyChecks,
449
+ planCheckResult,
450
+ roleChecks,
451
+ guardChecks,
452
+ kernelRuleChecks,
453
+ levelChecks,
454
+ decidingLayer,
455
+ decidingId,
456
+ startTime
457
+ ) : void 0
458
+ );
459
+ }
460
+ }
196
461
  const roleVerdict = checkRoleRules(event, eventText, world, roleChecks);
197
462
  if (roleVerdict) {
198
463
  decidingLayer = "role";
@@ -210,6 +475,7 @@ function evaluateGuard(event, world, options = {}) {
210
475
  includeTrace ? buildTrace(
211
476
  invariantChecks,
212
477
  safetyChecks,
478
+ planCheckResult,
213
479
  roleChecks,
214
480
  guardChecks,
215
481
  kernelRuleChecks,
@@ -238,6 +504,7 @@ function evaluateGuard(event, world, options = {}) {
238
504
  includeTrace ? buildTrace(
239
505
  invariantChecks,
240
506
  safetyChecks,
507
+ planCheckResult,
241
508
  roleChecks,
242
509
  guardChecks,
243
510
  kernelRuleChecks,
@@ -266,6 +533,7 @@ function evaluateGuard(event, world, options = {}) {
266
533
  includeTrace ? buildTrace(
267
534
  invariantChecks,
268
535
  safetyChecks,
536
+ planCheckResult,
269
537
  roleChecks,
270
538
  guardChecks,
271
539
  kernelRuleChecks,
@@ -293,6 +561,7 @@ function evaluateGuard(event, world, options = {}) {
293
561
  includeTrace ? buildTrace(
294
562
  invariantChecks,
295
563
  safetyChecks,
564
+ planCheckResult,
296
565
  roleChecks,
297
566
  guardChecks,
298
567
  kernelRuleChecks,
@@ -317,6 +586,7 @@ function evaluateGuard(event, world, options = {}) {
317
586
  includeTrace ? buildTrace(
318
587
  invariantChecks,
319
588
  safetyChecks,
589
+ planCheckResult,
320
590
  roleChecks,
321
591
  guardChecks,
322
592
  kernelRuleChecks,
@@ -654,8 +924,8 @@ function matchesKeywords(eventText, ruleText) {
654
924
  function eventToAllowlistKey(event) {
655
925
  return `${(event.tool ?? "*").toLowerCase()}::${event.intent.toLowerCase().trim()}`;
656
926
  }
657
- function buildTrace(invariantChecks, safetyChecks, roleChecks, guardChecks, kernelRuleChecks, levelChecks, decidingLayer, decidingId, startTime) {
658
- return {
927
+ function buildTrace(invariantChecks, safetyChecks, planCheck, roleChecks, guardChecks, kernelRuleChecks, levelChecks, decidingLayer, decidingId, startTime) {
928
+ const trace = {
659
929
  invariantChecks,
660
930
  safetyChecks,
661
931
  roleChecks,
@@ -673,6 +943,7 @@ function buildTrace(invariantChecks, safetyChecks, roleChecks, guardChecks, kern
673
943
  "safety-scope-escape",
674
944
  "safety-execution-claim",
675
945
  "safety-execution-intent",
946
+ "plan-enforcement",
676
947
  "role-rules",
677
948
  "declarative-guards",
678
949
  "kernel-rules",
@@ -682,6 +953,10 @@ function buildTrace(invariantChecks, safetyChecks, roleChecks, guardChecks, kern
682
953
  },
683
954
  durationMs: performance.now() - startTime
684
955
  };
956
+ if (planCheck) {
957
+ trace.planCheck = planCheck;
958
+ }
959
+ return trace;
685
960
  }
686
961
  function buildVerdict(status, reason, ruleId, warning, world, level, invariantChecks, guardsMatched, rulesMatched, trace) {
687
962
  const evidence = {
@@ -810,12 +1085,15 @@ var GovernedToolExecutor = class {
810
1085
  engineOptions;
811
1086
  mapFn;
812
1087
  blockMsg;
1088
+ activePlan;
813
1089
  constructor(world, options = {}) {
814
1090
  this.world = world;
815
1091
  this.options = options;
1092
+ this.activePlan = options.plan;
816
1093
  this.engineOptions = {
817
1094
  trace: options.trace ?? false,
818
- level: options.level
1095
+ level: options.level,
1096
+ plan: this.activePlan
819
1097
  };
820
1098
  this.mapFn = options.mapFunctionCall ?? defaultMapFunctionCall;
821
1099
  this.blockMsg = options.blockMessage ?? defaultBlockMessage;
@@ -832,8 +1110,24 @@ var GovernedToolExecutor = class {
832
1110
  args = { raw: toolCall.function.arguments };
833
1111
  }
834
1112
  const event = this.mapFn(toolCall.function.name, args);
1113
+ this.engineOptions.plan = this.activePlan;
835
1114
  const verdict = evaluateGuard(event, this.world, this.engineOptions);
836
1115
  this.options.onEvaluate?.(verdict, event);
1116
+ if (verdict.status === "ALLOW" && this.activePlan) {
1117
+ const planVerdict = evaluatePlan(event, this.activePlan);
1118
+ if (planVerdict.matchedStep) {
1119
+ const advResult = advancePlan(this.activePlan, planVerdict.matchedStep);
1120
+ if (advResult.success && advResult.plan) {
1121
+ this.activePlan = advResult.plan;
1122
+ this.engineOptions.plan = this.activePlan;
1123
+ }
1124
+ const progress = getPlanProgress(this.activePlan);
1125
+ this.options.onPlanProgress?.(progress);
1126
+ if (progress.completed === progress.total) {
1127
+ this.options.onPlanComplete?.();
1128
+ }
1129
+ }
1130
+ }
837
1131
  return verdict;
838
1132
  }
839
1133
  /**
@@ -1,4 +1,4 @@
1
- import { G as GuardVerdict, a as GuardEvent, W as WorldDefinition } from '../guard-contract-D_RQz9kt.cjs';
1
+ import { G as GuardVerdict, a as GuardEvent, P as PlanDefinition, b as PlanProgress, W as WorldDefinition } from '../guard-contract-Cm91Kp4j.cjs';
2
2
 
3
3
  /**
4
4
  * NeuroVerse Adapter — OpenAI
@@ -45,6 +45,12 @@ interface GovernedExecutorOptions {
45
45
  mapFunctionCall?: (name: string, args: Record<string, unknown>) => GuardEvent;
46
46
  /** Message returned to the model when a tool call is blocked. */
47
47
  blockMessage?: (verdict: GuardVerdict) => string;
48
+ /** Active plan overlay for task-scoped governance. */
49
+ plan?: PlanDefinition;
50
+ /** Called when plan progress changes. */
51
+ onPlanProgress?: (progress: PlanProgress) => void;
52
+ /** Called when all plan steps are completed. */
53
+ onPlanComplete?: () => void;
48
54
  }
49
55
  declare class GovernanceBlockedError extends Error {
50
56
  readonly verdict: GuardVerdict;
@@ -61,6 +67,7 @@ declare class GovernedToolExecutor {
61
67
  private engineOptions;
62
68
  private mapFn;
63
69
  private blockMsg;
70
+ private activePlan?;
64
71
  constructor(world: WorldDefinition, options?: GovernedExecutorOptions);
65
72
  /**
66
73
  * Evaluate a single tool call against governance rules.
@@ -1,4 +1,4 @@
1
- import { G as GuardVerdict, a as GuardEvent, W as WorldDefinition } from '../guard-contract-D_RQz9kt.js';
1
+ import { G as GuardVerdict, a as GuardEvent, P as PlanDefinition, b as PlanProgress, W as WorldDefinition } from '../guard-contract-Cm91Kp4j.js';
2
2
 
3
3
  /**
4
4
  * NeuroVerse Adapter — OpenAI
@@ -45,6 +45,12 @@ interface GovernedExecutorOptions {
45
45
  mapFunctionCall?: (name: string, args: Record<string, unknown>) => GuardEvent;
46
46
  /** Message returned to the model when a tool call is blocked. */
47
47
  blockMessage?: (verdict: GuardVerdict) => string;
48
+ /** Active plan overlay for task-scoped governance. */
49
+ plan?: PlanDefinition;
50
+ /** Called when plan progress changes. */
51
+ onPlanProgress?: (progress: PlanProgress) => void;
52
+ /** Called when all plan steps are completed. */
53
+ onPlanComplete?: () => void;
48
54
  }
49
55
  declare class GovernanceBlockedError extends Error {
50
56
  readonly verdict: GuardVerdict;
@@ -61,6 +67,7 @@ declare class GovernedToolExecutor {
61
67
  private engineOptions;
62
68
  private mapFn;
63
69
  private blockMsg;
70
+ private activePlan?;
64
71
  constructor(world: WorldDefinition, options?: GovernedExecutorOptions);
65
72
  /**
66
73
  * Evaluate a single tool call against governance rules.
@@ -3,9 +3,11 @@ import {
3
3
  GovernedToolExecutor,
4
4
  createGovernedToolExecutor,
5
5
  createGovernedToolExecutorFromWorld
6
- } from "../chunk-FZQCRGUU.js";
7
- import "../chunk-B4NF3OLW.js";
8
- import "../chunk-M3TZFGHO.js";
6
+ } from "../chunk-OHAC6HJE.js";
7
+ import "../chunk-4JRYGIO7.js";
8
+ import "../chunk-JZPQGIKR.js";
9
+ import "../chunk-4QXB6PEO.js";
10
+ import "../chunk-YZFATT7X.js";
9
11
  export {
10
12
  GovernanceBlockedError,
11
13
  GovernedToolExecutor,