open-multi-agent-kit 0.78.1 → 0.78.3

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 (102) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/MATURITY.md +4 -0
  3. package/README.md +70 -1
  4. package/dist/benchmark/contracts.d.ts +116 -0
  5. package/dist/benchmark/contracts.js +6 -0
  6. package/dist/benchmark/fixtures.d.ts +11 -0
  7. package/dist/benchmark/fixtures.js +121 -0
  8. package/dist/benchmark/harness.d.ts +13 -0
  9. package/dist/benchmark/harness.js +191 -0
  10. package/dist/benchmark/shadow-mode.d.ts +17 -0
  11. package/dist/benchmark/shadow-mode.js +96 -0
  12. package/dist/cli/register-spec-agent-goal-commands.js +45 -0
  13. package/dist/cli/release-promotion-gate.d.ts +14 -0
  14. package/dist/cli/release-promotion-gate.js +71 -0
  15. package/dist/cli/v2/release-commands.d.ts +29 -0
  16. package/dist/cli/v2/release-commands.js +95 -0
  17. package/dist/commands/chat/native-root-loop.js +14 -1
  18. package/dist/commands/chat/slash/commands/session.js +19 -1
  19. package/dist/commands/goal-interview.d.ts +18 -0
  20. package/dist/commands/goal-interview.js +396 -0
  21. package/dist/commands/merge.js +102 -56
  22. package/dist/contracts/interview.d.ts +106 -0
  23. package/dist/contracts/interview.js +9 -0
  24. package/dist/contracts/provider-health.d.ts +37 -0
  25. package/dist/contracts/provider-health.js +49 -1
  26. package/dist/evidence/evidence-trust-score.d.ts +101 -0
  27. package/dist/evidence/evidence-trust-score.js +408 -0
  28. package/dist/evidence/index.d.ts +6 -0
  29. package/dist/evidence/index.js +3 -0
  30. package/dist/evidence/proof-trust-cli.d.ts +8 -0
  31. package/dist/evidence/proof-trust-cli.js +27 -0
  32. package/dist/evidence/proof-trust.d.ts +14 -0
  33. package/dist/evidence/proof-trust.js +381 -0
  34. package/dist/evidence/regression-proof-matrix.d.ts +42 -0
  35. package/dist/evidence/regression-proof-matrix.js +72 -0
  36. package/dist/goal/intent-frame.d.ts +6 -0
  37. package/dist/goal/intent-frame.js +21 -9
  38. package/dist/goal/interview-assimilation.d.ts +13 -0
  39. package/dist/goal/interview-assimilation.js +383 -0
  40. package/dist/goal/interview-question-bank.d.ts +11 -0
  41. package/dist/goal/interview-question-bank.js +225 -0
  42. package/dist/goal/interview-scoring.d.ts +31 -0
  43. package/dist/goal/interview-scoring.js +187 -0
  44. package/dist/goal/interview-session.d.ts +25 -0
  45. package/dist/goal/interview-session.js +116 -0
  46. package/dist/input/input-envelope.d.ts +22 -0
  47. package/dist/input/input-envelope.js +1 -0
  48. package/dist/orchestration/merge-arbiter.d.ts +91 -0
  49. package/dist/orchestration/merge-arbiter.js +376 -0
  50. package/dist/providers/health.d.ts +3 -0
  51. package/dist/providers/health.js +46 -0
  52. package/dist/providers/index.d.ts +1 -0
  53. package/dist/providers/index.js +1 -0
  54. package/dist/providers/provider-health.d.ts +8 -1
  55. package/dist/providers/provider-health.js +39 -0
  56. package/dist/providers/provider-task-runner.js +31 -0
  57. package/dist/providers/provider.d.ts +2 -0
  58. package/dist/providers/router.js +87 -3
  59. package/dist/providers/types.d.ts +4 -0
  60. package/dist/runtime/advanced-control-loop.d.ts +60 -0
  61. package/dist/runtime/advanced-control-loop.js +136 -0
  62. package/dist/runtime/agent-runtime.d.ts +10 -0
  63. package/dist/runtime/blast-radius.d.ts +10 -0
  64. package/dist/runtime/blast-radius.js +14 -0
  65. package/dist/runtime/contracts/evidence.d.ts +87 -0
  66. package/dist/runtime/contracts/evidence.js +7 -0
  67. package/dist/runtime/contracts/router-v2.d.ts +44 -0
  68. package/dist/runtime/contracts/router-v2.js +4 -0
  69. package/dist/runtime/contracts/weakness-remediation.d.ts +67 -0
  70. package/dist/runtime/contracts/weakness-remediation.js +36 -0
  71. package/dist/runtime/kimi-api-runtime.js +59 -1
  72. package/dist/runtime/proof-bundle-trust.d.ts +74 -0
  73. package/dist/runtime/proof-bundle-trust.js +100 -0
  74. package/dist/runtime/provider-maturity-gate.d.ts +43 -0
  75. package/dist/runtime/provider-maturity-gate.js +129 -0
  76. package/dist/runtime/public-surface.d.ts +93 -0
  77. package/dist/runtime/public-surface.js +146 -0
  78. package/dist/runtime/router-v2-scoring.d.ts +11 -0
  79. package/dist/runtime/router-v2-scoring.js +151 -0
  80. package/dist/runtime/tool-dispatch-contracts.d.ts +24 -3
  81. package/dist/runtime/tool-dispatch-contracts.js +42 -2
  82. package/dist/runtime/weakness-remediation-index.d.ts +27 -0
  83. package/dist/runtime/weakness-remediation-index.js +37 -0
  84. package/dist/safety/enforcement-engine.d.ts +89 -0
  85. package/dist/safety/enforcement-engine.js +279 -0
  86. package/dist/safety/tool-authority-gate.d.ts +40 -0
  87. package/dist/safety/tool-authority-gate.js +92 -0
  88. package/dist/schema/evidence.schema.d.ts +2 -2
  89. package/dist/schema/proof-bundle.schema.d.ts +28 -28
  90. package/dist/util/clipboard-image.d.ts +49 -0
  91. package/dist/util/clipboard-image.js +263 -0
  92. package/docs/2026-06-09/critical-issues.md +20 -0
  93. package/docs/2026-06-09/improvements.md +14 -0
  94. package/docs/2026-06-09/init-checklist.md +25 -0
  95. package/docs/2026-06-09/plan.md +20 -0
  96. package/docs/benchmark-design.md +122 -0
  97. package/docs/github-organic-promotion.md +127 -0
  98. package/docs/native-root-runtime-algorithms.md +301 -0
  99. package/package.json +8 -4
  100. package/readmeasset/ASSET_INDEX.md +1 -0
  101. package/templates/skills/agents/omk-agent-reach-websearch/SKILL.md +55 -0
  102. package/templates/skills/kimi/omk-agent-reach-websearch/SKILL.md +55 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Router V2 Scoring Engine — Bayesian-smoothed evidence calibration (Algorithm 6).
3
+ *
4
+ * Composite formula:
5
+ * 0.25*E + 0.15*conf + 0.20*cap + 0.15*mat + 0.10*lat + 0.10*cost
6
+ * - 0.15*pen - 0.10*blast
7
+ */
8
+ import { computeBlastRadiusPenalty } from "./blast-radius.js";
9
+ const ALPHA_0 = 1;
10
+ const BETA_0 = 1;
11
+ const INTENT_CAPABILITY_WEIGHTS = {
12
+ research: [["read", 0.35], ["review", 0.2], ["toolCalling", 0.15], ["vision", 0.1]],
13
+ planning: [["read", 0.3], ["review", 0.2], ["toolCalling", 0.15]],
14
+ coding: [["write", 0.3], ["patch", 0.25], ["shell", 0.15], ["toolCalling", 0.1]],
15
+ debugging: [["read", 0.2], ["write", 0.2], ["patch", 0.2], ["shell", 0.15], ["toolCalling", 0.1]],
16
+ refactor: [["write", 0.25], ["patch", 0.25], ["review", 0.15], ["toolCalling", 0.1]],
17
+ review: [["review", 0.35], ["read", 0.25], ["toolCalling", 0.1]],
18
+ "test-generation": [["write", 0.25], ["patch", 0.2], ["review", 0.15], ["toolCalling", 0.1]],
19
+ documentation: [["read", 0.25], ["write", 0.15], ["review", 0.15], ["toolCalling", 0.1]],
20
+ "shell-operation": [["shell", 0.4], ["read", 0.15], ["write", 0.1]],
21
+ };
22
+ function runtimeCapabilityEnabled(capabilities, capability) {
23
+ if (capability === "toolCalling") {
24
+ return capabilities.toolCalling === true || capabilities.supportsToolCalling === true;
25
+ }
26
+ if (capability === "streaming") {
27
+ return capabilities.streaming === true || capabilities.supportsStreaming === true;
28
+ }
29
+ return capabilities[capability] === true;
30
+ }
31
+ function computeCapabilityFit(runtime, intent) {
32
+ const caps = runtime.capabilities;
33
+ if (!caps)
34
+ return 0;
35
+ let score = 0;
36
+ for (const [capability, weight] of INTENT_CAPABILITY_WEIGHTS[intent]) {
37
+ if (runtimeCapabilityEnabled(caps, capability))
38
+ score += weight;
39
+ }
40
+ if (caps.maxTokens != null && caps.maxTokens > 0) {
41
+ score += Math.min(0.1, caps.maxTokens / 1_000_000);
42
+ }
43
+ if (caps.maxContextTokens != null && caps.maxContextTokens > 0) {
44
+ score += Math.min(0.1, caps.maxContextTokens / 1_000_000);
45
+ }
46
+ return score;
47
+ }
48
+ function computeMaturityScore(runtime) {
49
+ const caps = runtime.capabilities;
50
+ if (!caps)
51
+ return 0.5;
52
+ const capabilityCount = [
53
+ caps.read,
54
+ caps.write,
55
+ caps.shell,
56
+ caps.patch,
57
+ caps.review,
58
+ caps.merge,
59
+ caps.vision,
60
+ caps.mcp,
61
+ caps.toolCalling,
62
+ caps.supportsToolCalling,
63
+ ].filter(Boolean).length;
64
+ const breadthScore = Math.min(1, capabilityCount / 8);
65
+ const priorityScore = Math.max(0, Math.min(1, runtime.priority / 100));
66
+ return 0.6 * breadthScore + 0.4 * priorityScore;
67
+ }
68
+ function computeLatencyScore(runtime) {
69
+ return runtime.capabilities?.supportsStreaming === true || runtime.capabilities?.streaming === true
70
+ ? 0.85
71
+ : 0.70;
72
+ }
73
+ function computeCostScore(runtime) {
74
+ return runtime.priority > 50 ? 0.75 : 0.90;
75
+ }
76
+ export function createRouterV2ScoringEngine(options = {}, blastRadiusFn = computeBlastRadiusPenalty) {
77
+ const { enableBlastRadius = false, blastRadiusParams = { downstreamNodeCount: 0, affectedFileCount: 0, hasGlobalSideEffects: false }, } = options;
78
+ function score(runtime, intent, history) {
79
+ const runtimeHistory = history.filter((e) => e.runtime === runtime.id);
80
+ const totalAttempts = runtimeHistory.length;
81
+ const passedAttempts = runtimeHistory.filter((e) => e.passed).length;
82
+ // Bayesian smoothing with α₀=1, β₀=1
83
+ const bayesianEvidenceScore = (ALPHA_0 + passedAttempts) / (ALPHA_0 + BETA_0 + totalAttempts);
84
+ // Confidence increases with sample size (asymptotic toward 1)
85
+ const confidence = Math.min(1, totalAttempts / 10 + 0.1);
86
+ const recentFailures = runtimeHistory
87
+ .filter((e) => !e.passed)
88
+ .sort((a, b) => b.timestamp.localeCompare(a.timestamp))
89
+ .slice(0, 5);
90
+ const recentFailurePenalty = Math.min(0.3, recentFailures.length * 0.06);
91
+ const capabilityFit = computeCapabilityFit(runtime, intent);
92
+ const maturityScore = computeMaturityScore(runtime);
93
+ const latencyScore = computeLatencyScore(runtime);
94
+ const costScore = computeCostScore(runtime);
95
+ const blastRadiusPenalty = enableBlastRadius ? blastRadiusFn(blastRadiusParams) : 0;
96
+ const composite = 0.25 * bayesianEvidenceScore +
97
+ 0.15 * confidence +
98
+ 0.20 * capabilityFit +
99
+ 0.15 * maturityScore +
100
+ 0.10 * latencyScore +
101
+ 0.10 * costScore -
102
+ 0.15 * recentFailurePenalty -
103
+ 0.10 * blastRadiusPenalty;
104
+ return {
105
+ runtimeId: runtime.id,
106
+ bayesianEvidenceScore,
107
+ confidence,
108
+ capabilityFit,
109
+ maturityScore,
110
+ latencyScore,
111
+ costScore,
112
+ recentFailurePenalty,
113
+ blastRadiusPenalty,
114
+ composite,
115
+ };
116
+ }
117
+ function select(candidates, intent, history) {
118
+ const scored = candidates.map((runtime) => ({
119
+ runtime,
120
+ score: score(runtime, intent, history),
121
+ }));
122
+ scored.sort((a, b) => b.score.composite - a.score.composite);
123
+ const primary = scored[0].runtime;
124
+ const fallbacks = scored.slice(1).map((s) => s.runtime);
125
+ const bestScore = scored[0].score;
126
+ const reason = [
127
+ `intent=${intent}`,
128
+ `bayesianE=${bestScore.bayesianEvidenceScore.toFixed(2)}`,
129
+ `confidence=${bestScore.confidence.toFixed(2)}`,
130
+ `capability=${bestScore.capabilityFit.toFixed(2)}`,
131
+ `maturity=${bestScore.maturityScore.toFixed(2)}`,
132
+ `latency=${bestScore.latencyScore.toFixed(2)}`,
133
+ `cost=${bestScore.costScore.toFixed(2)}`,
134
+ `penalty=${bestScore.recentFailurePenalty.toFixed(2)}`,
135
+ `blast=${bestScore.blastRadiusPenalty.toFixed(2)}`,
136
+ `composite=${bestScore.composite.toFixed(3)}`,
137
+ ].join("; ");
138
+ return {
139
+ runtime: primary,
140
+ reason,
141
+ fallbacks,
142
+ intent,
143
+ scores: scored.map((s) => s.score),
144
+ };
145
+ }
146
+ return { score, select };
147
+ }
148
+ export function scoreRuntimes(candidates, intent, history, options = {}) {
149
+ const engine = createRouterV2ScoringEngine(options);
150
+ return candidates.map((runtime) => engine.score(runtime, intent, history));
151
+ }
@@ -1,6 +1,7 @@
1
1
  import type { OmkToolCall, OmkToolDefinition } from "./tool-registry-contract.js";
2
- import { type ToolAuthorityDecision, type ToolOp } from "../safety/tool-authority-gate.js";
2
+ import { type ToolAuthorityDecision, type ToolOp, type ToolOpV2 } from "../safety/tool-authority-gate.js";
3
3
  import type { ProviderAuthorityLevel } from "../contracts/provider-health.js";
4
+ import type { EnforcementProof } from "../safety/enforcement-engine.js";
4
5
  export interface ToolDispatchResult<R = unknown> {
5
6
  readonly call: OmkToolCall;
6
7
  readonly status: "fulfilled" | "rejected";
@@ -15,13 +16,15 @@ export type ToolAuthorityMode = "shadow" | "enforce";
15
16
  */
16
17
  export interface ToolAuthorityDecisionRecord {
17
18
  readonly toolName: string;
18
- readonly op: ToolOp;
19
+ readonly op: ToolOp | ToolOpV2;
19
20
  readonly decision: ToolAuthorityDecision;
20
21
  readonly mode: ToolAuthorityMode;
21
22
  /** True only when the verdict actually rejected the call (enforce + block). */
22
23
  readonly enforced: boolean;
23
24
  /** Redacted, human-readable reason. Never includes args or secret values. */
24
25
  readonly reason: string;
26
+ /** v2 enforcement proof hash when available. */
27
+ readonly policyHash?: string;
25
28
  }
26
29
  /**
27
30
  * Authority wiring for one dispatch turn. All inputs are non-secret enum/bool
@@ -42,6 +45,12 @@ export interface ToolAuthorityWiring {
42
45
  readonly enforce?: boolean;
43
46
  /** Optional sink for computed verdicts (invoked in both shadow and enforce). */
44
47
  readonly onDecision?: (record: ToolAuthorityDecisionRecord) => void;
48
+ /**
49
+ * v2 enforcement proof from the adapter / runtime.
50
+ * When present, the gate uses policy-dependent capability resolution.
51
+ * Runtimes without a valid proof cannot enter authority lanes.
52
+ */
53
+ readonly enforcementProof?: EnforcementProof;
45
54
  }
46
55
  /**
47
56
  * Resolve the global enforcement opt-in from the environment. Default OFF means
@@ -52,8 +61,9 @@ export declare function resolveToolAuthorityEnforcement(env?: Record<string, str
52
61
  /** Error used to reject a tool call rejected by the authority gate (enforce mode). */
53
62
  export declare class ToolAuthorityBlockedError extends Error {
54
63
  readonly toolName: string;
55
- readonly op: ToolOp;
64
+ readonly op: ToolOp | ToolOpV2;
56
65
  readonly decision: ToolAuthorityDecision;
66
+ readonly policyHash?: string;
57
67
  constructor(record: ToolAuthorityDecisionRecord);
58
68
  }
59
69
  /** Compute the gate verdict for a single call. Pure (no IO, no env reads). */
@@ -61,4 +71,15 @@ export declare function evaluateToolAuthority(toolName: string, wiring: ToolAuth
61
71
  readonly record: ToolAuthorityDecisionRecord;
62
72
  readonly blocked: boolean;
63
73
  };
74
+ /**
75
+ * Compute the gate verdict for a single call using v2 enforcement proof.
76
+ * Pure (no IO, no env reads).
77
+ *
78
+ * If `enforcementProof` is present, the gate uses policy-dependent capability
79
+ * resolution. Runtimes without a valid proof cannot enter authority lanes.
80
+ */
81
+ export declare function evaluateToolAuthorityV2(toolName: string, wiring: ToolAuthorityWiring): {
82
+ readonly record: ToolAuthorityDecisionRecord;
83
+ readonly blocked: boolean;
84
+ };
64
85
  export declare function dispatchToolCallsByContract<A, R>(calls: readonly OmkToolCall<A>[], registry: ReadonlyMap<string, OmkToolDefinition<A, R>>, dispatchOne: (call: OmkToolCall<A>) => Promise<R>, authority?: ToolAuthorityWiring): Promise<ToolDispatchResult<R>[]>;
@@ -1,5 +1,5 @@
1
1
  import { createToolExecutionBatches } from "./tool-registry-contract.js";
2
- import { decideToolAuthority, mapToolNameToOp, } from "../safety/tool-authority-gate.js";
2
+ import { decideToolAuthority, decideToolAuthorityV2, mapToolNameToOp, } from "../safety/tool-authority-gate.js";
3
3
  const ENFORCE_PATTERN = /^(1|true|yes|on)$/i;
4
4
  /**
5
5
  * Resolve the global enforcement opt-in from the environment. Default OFF means
@@ -20,12 +20,14 @@ export class ToolAuthorityBlockedError extends Error {
20
20
  toolName;
21
21
  op;
22
22
  decision;
23
+ policyHash;
23
24
  constructor(record) {
24
25
  super(record.reason);
25
26
  this.name = "ToolAuthorityBlockedError";
26
27
  this.toolName = record.toolName;
27
28
  this.op = record.op;
28
29
  this.decision = record.decision;
30
+ this.policyHash = record.policyHash;
29
31
  }
30
32
  }
31
33
  /** Compute the gate verdict for a single call. Pure (no IO, no env reads). */
@@ -57,6 +59,44 @@ export function evaluateToolAuthority(toolName, wiring) {
57
59
  blocked,
58
60
  };
59
61
  }
62
+ /**
63
+ * Compute the gate verdict for a single call using v2 enforcement proof.
64
+ * Pure (no IO, no env reads).
65
+ *
66
+ * If `enforcementProof` is present, the gate uses policy-dependent capability
67
+ * resolution. Runtimes without a valid proof cannot enter authority lanes.
68
+ */
69
+ export function evaluateToolAuthorityV2(toolName, wiring) {
70
+ const op = mapToolNameToOp(toolName);
71
+ if (wiring.enforcementProof) {
72
+ const decision = decideToolAuthorityV2({
73
+ op,
74
+ writeAuthority: wiring.writeAuthority,
75
+ shellAuthority: wiring.shellAuthority,
76
+ approvalPolicy: wiring.approvalPolicy,
77
+ sandboxMode: wiring.sandboxMode,
78
+ tty: wiring.tty,
79
+ enforcementProof: wiring.enforcementProof,
80
+ });
81
+ const enforce = wiring.enforce === true;
82
+ const wouldBlock = decision === "block" || (decision === "ask" && !wiring.tty);
83
+ const blocked = enforce && wouldBlock;
84
+ return {
85
+ record: {
86
+ toolName,
87
+ op,
88
+ decision,
89
+ mode: enforce ? "enforce" : "shadow",
90
+ enforced: blocked,
91
+ reason: redactedAuthorityReason(op, decision, wiring),
92
+ policyHash: wiring.enforcementProof.policyHash,
93
+ },
94
+ blocked,
95
+ };
96
+ }
97
+ // Fall back to legacy evaluation when no proof is present.
98
+ return evaluateToolAuthority(toolName, wiring);
99
+ }
60
100
  /**
61
101
  * Wrap a dispatch function with the authority checkpoint. In shadow mode the
62
102
  * wrapper records the verdict and always delegates to `dispatchOne`. In enforce
@@ -64,7 +104,7 @@ export function evaluateToolAuthority(toolName, wiring) {
64
104
  */
65
105
  function buildGatedDispatch(wiring, dispatchOne) {
66
106
  return async (call) => {
67
- const { record, blocked } = evaluateToolAuthority(call.toolName, wiring);
107
+ const { record, blocked } = evaluateToolAuthorityV2(call.toolName, wiring);
68
108
  wiring.onDecision?.(record);
69
109
  if (blocked) {
70
110
  throw new ToolAuthorityBlockedError(record);
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Weakness Remediation Index — Public factory that instantiates all
3
+ * Phase 1–6 engines with sensible defaults.
4
+ */
5
+ export { type IntegrationResultKind, type WeaknessRemediationState, type AdvancedControlLoopInput, type AdvancedControlLoopResult, type AdvancedControlLoop, type AdvancedControlLoopOptions, createAdvancedControlLoop, } from "./advanced-control-loop.js";
6
+ export { type SurfaceItem, type ScoredSurfaceItem, type MandatoryAnchor, type CompressionResult, type PublicSurfaceCompressorOptions, computeSurfaceScore, enforceFlowInvariant, PublicSurfaceCompressor, } from "./public-surface.js";
7
+ export { type ProofBundleScores, type TrustScoreResult, type ProofBundleTrustEngine, type DeriveScoresOptions, createProofBundleTrustEngine, } from "./proof-bundle-trust.js";
8
+ export { type MaturityResult, type ProviderMaturityGate, createProviderMaturityGate, evaluateProviderFromVector, } from "./provider-maturity-gate.js";
9
+ export { type RuntimeScoreV2, type RuntimeRouterDecisionV2, type RouterV2Options, type RouterV2ScoringEngine, type BlastRadiusParams, type EvidenceHistoryEntry, type NodeIntent, } from "./contracts/router-v2.js";
10
+ export { createRouterV2ScoringEngine, } from "./router-v2-scoring.js";
11
+ export { type ReleasePromotionInputs, type ReleasePromotionResult, type ReleaseVerdict, RELEASE_GATE_WEIGHTS, TAU_EVIDENCE, TAU_EVIDENCE_HIGH, TAU_PROOF, TAU_STABLE, BETA_PRIOR_ALPHA0, BETA_PRIOR_BETA0, SURFACE_BUDGET_K, } from "./contracts/weakness-remediation.js";
12
+ export { createReleasePromotionGate, type ReleasePromotionGate, } from "../cli/release-promotion-gate.js";
13
+ import { PublicSurfaceCompressor } from "./public-surface.js";
14
+ import { createProofBundleTrustEngine } from "./proof-bundle-trust.js";
15
+ import { createProviderMaturityGate } from "./provider-maturity-gate.js";
16
+ import { createRouterV2ScoringEngine } from "./router-v2-scoring.js";
17
+ import { createReleasePromotionGate } from "../cli/release-promotion-gate.js";
18
+ import { createAdvancedControlLoop } from "./advanced-control-loop.js";
19
+ export interface WeaknessRemediationIndex {
20
+ readonly publicSurfaceCompressor: PublicSurfaceCompressor;
21
+ readonly proofBundleTrustEngine: ReturnType<typeof createProofBundleTrustEngine>;
22
+ readonly providerMaturityGate: ReturnType<typeof createProviderMaturityGate>;
23
+ readonly routerV2ScoringEngine: ReturnType<typeof createRouterV2ScoringEngine>;
24
+ readonly releasePromotionGate: ReturnType<typeof createReleasePromotionGate>;
25
+ readonly advancedControlLoop: ReturnType<typeof createAdvancedControlLoop>;
26
+ }
27
+ export declare function createWeaknessRemediationIndex(): WeaknessRemediationIndex;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Weakness Remediation Index — Public factory that instantiates all
3
+ * Phase 1–6 engines with sensible defaults.
4
+ */
5
+ export { createAdvancedControlLoop, } from "./advanced-control-loop.js";
6
+ export { computeSurfaceScore, enforceFlowInvariant, PublicSurfaceCompressor, } from "./public-surface.js";
7
+ export { createProofBundleTrustEngine, } from "./proof-bundle-trust.js";
8
+ export { createProviderMaturityGate, evaluateProviderFromVector, } from "./provider-maturity-gate.js";
9
+ export { createRouterV2ScoringEngine, } from "./router-v2-scoring.js";
10
+ export { RELEASE_GATE_WEIGHTS, TAU_EVIDENCE, TAU_EVIDENCE_HIGH, TAU_PROOF, TAU_STABLE, BETA_PRIOR_ALPHA0, BETA_PRIOR_BETA0, SURFACE_BUDGET_K, } from "./contracts/weakness-remediation.js";
11
+ export { createReleasePromotionGate, } from "../cli/release-promotion-gate.js";
12
+ // ─── Convenience factory ─────────────────────────────────────────────────────
13
+ import { PublicSurfaceCompressor } from "./public-surface.js";
14
+ import { createProofBundleTrustEngine } from "./proof-bundle-trust.js";
15
+ import { createProviderMaturityGate } from "./provider-maturity-gate.js";
16
+ import { createRouterV2ScoringEngine } from "./router-v2-scoring.js";
17
+ import { createReleasePromotionGate } from "../cli/release-promotion-gate.js";
18
+ import { createAdvancedControlLoop } from "./advanced-control-loop.js";
19
+ export function createWeaknessRemediationIndex() {
20
+ const publicSurfaceCompressor = new PublicSurfaceCompressor();
21
+ const proofBundleTrustEngine = createProofBundleTrustEngine();
22
+ const providerMaturityGate = createProviderMaturityGate();
23
+ const routerV2ScoringEngine = createRouterV2ScoringEngine();
24
+ const releasePromotionGate = createReleasePromotionGate();
25
+ const advancedControlLoop = createAdvancedControlLoop({
26
+ releaseGate: releasePromotionGate,
27
+ releaseGateEnabled: true,
28
+ });
29
+ return {
30
+ publicSurfaceCompressor,
31
+ proofBundleTrustEngine,
32
+ providerMaturityGate,
33
+ routerV2ScoringEngine,
34
+ releasePromotionGate,
35
+ advancedControlLoop,
36
+ };
37
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Policy / Sandbox Enforcement Engine v2
3
+ *
4
+ * Capability lattice with conservative policy combination.
5
+ * effectivePolicy = minByAuthority(userPolicy, repoPolicy, providerPolicy, adapterPolicy, riskPolicy)
6
+ *
7
+ * Conservative by default. Any ambiguity → block.
8
+ */
9
+ export type SandboxCapability = "read" | "write" | "shell" | "network" | "secret_read" | "secret_write" | "merge" | "publish";
10
+ export declare const ALL_CAPABILITIES: readonly SandboxCapability[];
11
+ export type CapabilityLevel = "none" | "advisory" | "direct" | "full";
12
+ export interface CapabilityLattice {
13
+ read: CapabilityLevel;
14
+ write: CapabilityLevel;
15
+ shell: CapabilityLevel;
16
+ network: CapabilityLevel;
17
+ secret_read: CapabilityLevel;
18
+ secret_write: CapabilityLevel;
19
+ merge: CapabilityLevel;
20
+ publish: CapabilityLevel;
21
+ }
22
+ export type SandboxMode = "read-only" | "workspace-write" | "network-isolated" | "unrestricted";
23
+ export type ApprovalPolicy = "interactive" | "auto" | "yolo" | "block";
24
+ export interface PolicyLayer {
25
+ readonly source: "user" | "repo" | "provider" | "adapter" | "risk";
26
+ /** Partial lattice — omitted capabilities mean "no opinion" (inherit from other layers). */
27
+ readonly lattice: Partial<CapabilityLattice>;
28
+ readonly sandboxMode?: SandboxMode;
29
+ readonly approvalPolicy?: ApprovalPolicy;
30
+ }
31
+ export interface CombinedPolicy {
32
+ readonly lattice: Readonly<CapabilityLattice>;
33
+ readonly sandboxMode: SandboxMode;
34
+ readonly approvalPolicy: ApprovalPolicy;
35
+ /** Ordered list of sources that contributed to the combination. */
36
+ readonly sources: readonly PolicyLayer["source"][];
37
+ }
38
+ export interface EnforcementProof {
39
+ readonly sandboxMode: SandboxMode;
40
+ /** Which policy layers were active in the final combination. */
41
+ readonly enforcedBy: readonly string[];
42
+ /** Capabilities fully blocked (level === "none" or sandbox hard floor). */
43
+ readonly blockedCapabilities: readonly SandboxCapability[];
44
+ /** Capabilities that require explicit approval (level === "advisory" or interactive policy). */
45
+ readonly approvalRequired: readonly SandboxCapability[];
46
+ /** Deterministic hash of the combined policy for audit / replay. */
47
+ readonly policyHash: string;
48
+ }
49
+ export declare function rankOf(level: CapabilityLevel): number;
50
+ export declare function defaultLattice(): CapabilityLattice;
51
+ /**
52
+ * Combine multiple policy layers by taking the **most restrictive**
53
+ * (minimum) authority level for each capability.
54
+ *
55
+ * If no layer expresses an opinion on a capability, it defaults to "full".
56
+ * If any layer expresses a sandbox mode, the most restrictive mode wins.
57
+ * If any layer expresses an approval policy, the most restrictive wins.
58
+ */
59
+ export declare function combinePoliciesByMinAuthority(layers: readonly PolicyLayer[]): CombinedPolicy;
60
+ /**
61
+ * Compute the enforcement proof from a combined policy.
62
+ *
63
+ * Rules:
64
+ * 1. read-only sandbox blocks write, shell, network, merge, publish.
65
+ * 2. network-isolated sandbox blocks network.
66
+ * 3. Any capability with level "none" is blocked.
67
+ * 4. Any capability with level "advisory" requires approval.
68
+ * 5. interactive policy requires approval for non-read capabilities.
69
+ * 6. block policy blocks everything except read.
70
+ */
71
+ export declare function computeEnforcementProof(combined: CombinedPolicy): EnforcementProof;
72
+ /**
73
+ * Returns true when the runtime/adapter has provided a valid enforcement proof.
74
+ * Runtimes without enforcement proof cannot enter authority lanes.
75
+ */
76
+ export declare function hasValidEnforcementProof(proof: unknown): proof is EnforcementProof;
77
+ export declare function policyLayerFromLegacyAuthorities(source: PolicyLayer["source"], options: {
78
+ writeAuthority?: "none" | "advisory" | "direct" | "full";
79
+ shellAuthority?: "none" | "advisory" | "direct" | "full";
80
+ sandboxMode?: SandboxMode;
81
+ approvalPolicy?: ApprovalPolicy;
82
+ }): PolicyLayer;
83
+ export type ToolOpV2 = "read" | "write" | "shell" | "merge" | "network" | "secret";
84
+ /**
85
+ * Map a capability-lattice capability to the coarse ToolOp used by the gate.
86
+ * This preserves backward compatibility with the existing 4-class gate while
87
+ * allowing the new lattice to express finer-grained restrictions.
88
+ */
89
+ export declare function capabilityToToolOp(cap: SandboxCapability): ToolOpV2;