@consensus-tools/universal 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +451 -0
  3. package/dist/__tests__/defaults.test.d.ts +2 -0
  4. package/dist/__tests__/defaults.test.d.ts.map +1 -0
  5. package/dist/__tests__/defaults.test.js +55 -0
  6. package/dist/__tests__/defaults.test.js.map +1 -0
  7. package/dist/__tests__/fail-policy.test.d.ts +2 -0
  8. package/dist/__tests__/fail-policy.test.d.ts.map +1 -0
  9. package/dist/__tests__/fail-policy.test.js +80 -0
  10. package/dist/__tests__/fail-policy.test.js.map +1 -0
  11. package/dist/__tests__/frameworks.test.d.ts +2 -0
  12. package/dist/__tests__/frameworks.test.d.ts.map +1 -0
  13. package/dist/__tests__/frameworks.test.js +86 -0
  14. package/dist/__tests__/frameworks.test.js.map +1 -0
  15. package/dist/__tests__/logger.test.d.ts +2 -0
  16. package/dist/__tests__/logger.test.d.ts.map +1 -0
  17. package/dist/__tests__/logger.test.js +77 -0
  18. package/dist/__tests__/logger.test.js.map +1 -0
  19. package/dist/__tests__/resolve.test.d.ts +2 -0
  20. package/dist/__tests__/resolve.test.d.ts.map +1 -0
  21. package/dist/__tests__/resolve.test.js +71 -0
  22. package/dist/__tests__/resolve.test.js.map +1 -0
  23. package/dist/__tests__/wrap.test.d.ts +2 -0
  24. package/dist/__tests__/wrap.test.d.ts.map +1 -0
  25. package/dist/__tests__/wrap.test.js +90 -0
  26. package/dist/__tests__/wrap.test.js.map +1 -0
  27. package/dist/defaults.d.ts +20 -0
  28. package/dist/defaults.d.ts.map +1 -0
  29. package/dist/defaults.js +48 -0
  30. package/dist/defaults.js.map +1 -0
  31. package/dist/errors.d.ts +23 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +31 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/index.d.ts +38 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +239 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/logger.d.ts +12 -0
  40. package/dist/logger.d.ts.map +1 -0
  41. package/dist/logger.js +55 -0
  42. package/dist/logger.js.map +1 -0
  43. package/dist/resolve.d.ts +9 -0
  44. package/dist/resolve.d.ts.map +1 -0
  45. package/dist/resolve.js +25 -0
  46. package/dist/resolve.js.map +1 -0
  47. package/dist/types.d.ts +35 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +2 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +82 -0
  52. package/src/__tests__/defaults.test.ts +71 -0
  53. package/src/__tests__/fail-policy.test.ts +107 -0
  54. package/src/__tests__/frameworks.test.ts +106 -0
  55. package/src/__tests__/logger.test.ts +93 -0
  56. package/src/__tests__/resolve.test.ts +80 -0
  57. package/src/__tests__/wrap.test.ts +110 -0
  58. package/src/consensus-llm.test.ts +260 -0
  59. package/src/defaults.ts +124 -0
  60. package/src/errors.ts +35 -0
  61. package/src/index.ts +386 -0
  62. package/src/logger.ts +65 -0
  63. package/src/persona-reviewer-factory.ts +387 -0
  64. package/src/reputation-manager.test.ts +131 -0
  65. package/src/reputation-manager.ts +168 -0
  66. package/src/resolve.ts +30 -0
  67. package/src/risk-tiers.test.ts +36 -0
  68. package/src/risk-tiers.ts +49 -0
  69. package/src/types.ts +127 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,wEAAwE;AAExE,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAEjB;IACF,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,CAAC,aAAa,CAAC;IACvB,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,wEAAwE;AAExE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAClC,KAAK,eAAe;YAClB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpD,KAAK,WAAW;YACd,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC;YACR,+BAA+B;YAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBAClD,MAAM,IAAI,WAAW,CACnB,sCAAsC,MAAM,uCAAuC,CACpF,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACrD,CAAC;YAED,MAAM,IAAI,WAAW,CACnB,mBAAmB,MAAM,KAAK;gBAC9B,sFAAsF,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Thrown when consensus blocks an action and failPolicy is 'closed'.
3
+ */
4
+ export declare class ConsensusBlockedError extends Error {
5
+ readonly cause?: Error | undefined;
6
+ name: string;
7
+ constructor(message: string, cause?: Error | undefined);
8
+ }
9
+ /**
10
+ * Thrown when an optional adapter package is not installed.
11
+ */
12
+ export declare class MissingDependencyError extends Error {
13
+ name: string;
14
+ constructor(packageName: string);
15
+ }
16
+ /**
17
+ * Thrown for invalid configuration values.
18
+ */
19
+ export declare class ConfigError extends Error {
20
+ name: string;
21
+ constructor(message: string);
22
+ }
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAGD,KAAK,CAAC,EAAE,KAAK;IAFjD,IAAI,SAA2B;gBAE5B,OAAO,EAAE,MAAM,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAG3D;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IACtC,IAAI,SAA4B;gBAE7B,WAAW,EAAE,MAAM;CAMhC;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAC3B,IAAI,SAAiB;gBAElB,OAAO,EAAE,MAAM;CAG5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Thrown when consensus blocks an action and failPolicy is 'closed'.
3
+ */
4
+ export class ConsensusBlockedError extends Error {
5
+ cause;
6
+ name = "ConsensusBlockedError";
7
+ constructor(message, cause) {
8
+ super(message);
9
+ this.cause = cause;
10
+ }
11
+ }
12
+ /**
13
+ * Thrown when an optional adapter package is not installed.
14
+ */
15
+ export class MissingDependencyError extends Error {
16
+ name = "MissingDependencyError";
17
+ constructor(packageName) {
18
+ super(`Package "${packageName}" is required but not installed. ` +
19
+ `Install it with: pnpm add ${packageName}`);
20
+ }
21
+ }
22
+ /**
23
+ * Thrown for invalid configuration values.
24
+ */
25
+ export class ConfigError extends Error {
26
+ name = "ConfigError";
27
+ constructor(message) {
28
+ super(message);
29
+ }
30
+ }
31
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGD;IAFpC,IAAI,GAAG,uBAAuB,CAAC;IAExC,YAAY,OAAe,EAAkB,KAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,UAAK,GAAL,KAAK,CAAQ;IAE1D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,IAAI,GAAG,wBAAwB,CAAC;IAEzC,YAAY,WAAmB;QAC7B,KAAK,CACH,YAAY,WAAW,mCAAmC;YAC1D,6BAA6B,WAAW,EAAE,CAC3C,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAC;IAE9B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { Wrappable, UniversalConfig, ToolExecutor } from "./types.js";
2
+ export declare const consensus: {
3
+ /**
4
+ * Wrap any tool executor with consensus governance.
5
+ *
6
+ * @param wrappable - A function, or object with .execute/.invoke/.call
7
+ * @param config - Optional configuration overrides
8
+ * @returns A wrapped function that runs consensus deliberation before allowing execution
9
+ */
10
+ wrap(wrappable: Wrappable, config?: Partial<UniversalConfig>): ToolExecutor;
11
+ /**
12
+ * LangChain adapter — dynamically loads @consensus-tools/langchain.
13
+ *
14
+ * Returns a `ConsensusGuardCallbackHandler` that intercepts all tool calls and
15
+ * runs them through consensus deliberation. Attach it to your chain or agent
16
+ * via the `callbacks` option to govern all tool calls:
17
+ *
18
+ * ```ts
19
+ * const handler = await consensus.langchain(null, { policy: "majority" });
20
+ * const result = await agent.invoke({ input: "..." }, { callbacks: [handler] });
21
+ * ```
22
+ */
23
+ langchain(_chain: unknown, config?: Partial<UniversalConfig>): Promise<unknown>;
24
+ /**
25
+ * AI SDK (Vercel) adapter — dynamically loads @consensus-tools/ai-sdk.
26
+ */
27
+ aiSdk(fn: unknown, config?: Partial<UniversalConfig>): Promise<unknown>;
28
+ /**
29
+ * MCP adapter — dynamically loads @consensus-tools/mcp.
30
+ */
31
+ mcp(config?: Partial<UniversalConfig>): Promise<unknown>;
32
+ };
33
+ export { resolveWrappable } from "./resolve.js";
34
+ export { policyToStrategy, DEFAULTS, DEFAULT_GUARD, DEFAULT_POLICY, DEFAULT_PERSONA_TRIO, DEFAULT_PERSONA_COUNT } from "./defaults.js";
35
+ export { createLogger } from "./logger.js";
36
+ export { ConsensusBlockedError, MissingDependencyError, ConfigError } from "./errors.js";
37
+ export type { Wrappable, ToolExecutor, UniversalConfig, FailPolicy, LogEvent } from "./types.js";
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAsF3E,eAAO,MAAM,SAAS;IACpB;;;;;;OAMG;oBAEU,SAAS,WACX,OAAO,CAAC,eAAe,CAAC,GAChC,YAAY;IA6Ff;;;;;;;;;;;OAWG;sBACqB,OAAO,WAAW,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BrF;;OAEG;cACa,OAAO,WAAW,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAa7E;;OAEG;iBACgB,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAY/D,CAAC;AAGF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvI,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,239 @@
1
+ import { consensus as wrapWithConsensus } from "@consensus-tools/wrapper";
2
+ import { createGuardTemplate, GUARD_CONFIGS } from "@consensus-tools/guards";
3
+ import { MemoryStorage } from "@consensus-tools/storage";
4
+ import { resolveWrappable } from "./resolve.js";
5
+ import { DEFAULTS, DEFAULT_PERSONA_TRIO, policyToStrategy } from "./defaults.js";
6
+ import { createLogger } from "./logger.js";
7
+ import { ConsensusBlockedError, MissingDependencyError } from "./errors.js";
8
+ // ── Persona-as-guard templates ───────────────────────────────────────
9
+ // Each "persona" is a lightweight guard template focused on a risk area.
10
+ function createDefaultReviewers() {
11
+ return DEFAULT_PERSONA_TRIO.map((domain) => {
12
+ const config = GUARD_CONFIGS[domain];
13
+ if (!config) {
14
+ throw new Error(`No guard config for default persona domain: ${domain}`);
15
+ }
16
+ return createGuardTemplate(domain, config).asReviewer();
17
+ });
18
+ }
19
+ function createReviewersForGuards(guards) {
20
+ return guards.map((domain) => {
21
+ const config = GUARD_CONFIGS[domain] ?? {
22
+ description: `Custom guard: ${domain}`,
23
+ rules: () => [{ evaluator: domain, vote: "YES", reason: "No rules configured", risk: 0.1 }],
24
+ };
25
+ return createGuardTemplate(domain, config).asReviewer();
26
+ });
27
+ }
28
+ // ── Storage helpers ──────────────────────────────────────────────────
29
+ function resolveStorage(storage) {
30
+ if (storage === "memory") {
31
+ return new MemoryStorage();
32
+ }
33
+ return storage;
34
+ }
35
+ function createStorageHooks(store) {
36
+ return {
37
+ async afterResolve(result) {
38
+ await store.update((state) => {
39
+ state.audit.push({
40
+ id: `audit-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
41
+ at: new Date().toISOString(),
42
+ action: result.action,
43
+ aggregateScore: result.aggregateScore,
44
+ attempt: result.attempt,
45
+ scoresCount: result.scores.length,
46
+ });
47
+ });
48
+ },
49
+ async onBlock(result) {
50
+ await store.update((state) => {
51
+ state.audit.push({
52
+ id: `audit-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
53
+ at: new Date().toISOString(),
54
+ action: "block",
55
+ aggregateScore: result.aggregateScore,
56
+ attempt: result.attempt,
57
+ scoresCount: result.scores.length,
58
+ });
59
+ });
60
+ },
61
+ };
62
+ }
63
+ function mergeHooks(...hookSets) {
64
+ return {
65
+ async beforeSubmit(args) {
66
+ for (const h of hookSets)
67
+ await h.beforeSubmit?.(args);
68
+ },
69
+ async afterResolve(result) {
70
+ for (const h of hookSets)
71
+ await h.afterResolve?.(result);
72
+ },
73
+ async onBlock(result) {
74
+ for (const h of hookSets)
75
+ await h.onBlock?.(result);
76
+ },
77
+ async onEscalate(result) {
78
+ for (const h of hookSets)
79
+ await h.onEscalate?.(result);
80
+ },
81
+ };
82
+ }
83
+ // ── Main Facade ──────────────────────────────────────────────────────
84
+ export const consensus = {
85
+ /**
86
+ * Wrap any tool executor with consensus governance.
87
+ *
88
+ * @param wrappable - A function, or object with .execute/.invoke/.call
89
+ * @param config - Optional configuration overrides
90
+ * @returns A wrapped function that runs consensus deliberation before allowing execution
91
+ */
92
+ wrap(wrappable, config) {
93
+ // 1. Resolve the wrappable to a plain function
94
+ const fn = resolveWrappable(wrappable);
95
+ // 2. Merge config with defaults
96
+ const merged = { ...DEFAULTS, ...config };
97
+ const strategy = policyToStrategy(merged.policy);
98
+ // 3. Production warnings
99
+ const isProduction = typeof process !== "undefined" && process.env?.["NODE_ENV"] === "production";
100
+ if (isProduction && merged.failPolicy === "open") {
101
+ // eslint-disable-next-line no-console
102
+ console.warn("[consensus] WARNING: failPolicy 'open' in production — errors will pass through unchecked");
103
+ }
104
+ if (isProduction && merged.storage === "memory") {
105
+ // eslint-disable-next-line no-console
106
+ console.warn("[consensus] WARNING: storage 'memory' in production — decisions are not persisted");
107
+ }
108
+ // 4. Create guard reviewers — use custom guards if provided and different from default
109
+ const isDefaultGuards = Array.isArray(merged.guards) &&
110
+ merged.guards.length === DEFAULTS.guards.length &&
111
+ merged.guards.every((g, i) => g === DEFAULTS.guards[i]);
112
+ const reviewers = isDefaultGuards
113
+ ? createDefaultReviewers()
114
+ : createReviewersForGuards(merged.guards);
115
+ // 5. Create logger hooks
116
+ const loggerHooks = createLogger({ logger: merged.logger });
117
+ // 6. Wire storage for audit artifacts
118
+ const store = resolveStorage(merged.storage);
119
+ const storageHooks = createStorageHooks(store);
120
+ const hooks = mergeHooks(loggerHooks, storageHooks);
121
+ // 7. Compose with wrapper/consensus<T>()
122
+ const wrapped = wrapWithConsensus({
123
+ name: "universal",
124
+ fn: async (...args) => {
125
+ // The wrapped fn receives (toolName, toolArgs) as its arguments
126
+ const [toolName, toolArgs] = args;
127
+ return fn(toolName, toolArgs);
128
+ },
129
+ reviewers,
130
+ strategy,
131
+ hooks,
132
+ });
133
+ // 8. Return a ToolExecutor that catches errors and applies failPolicy
134
+ return async (toolName, args) => {
135
+ try {
136
+ const result = await wrapped(toolName, args);
137
+ // Fire onDecision callback (await to ensure it completes before throwing)
138
+ if (merged.onDecision) {
139
+ await merged.onDecision(result);
140
+ }
141
+ if (result.action === "allow") {
142
+ return result.output;
143
+ }
144
+ // Blocked, escalated, or retried-out
145
+ if (merged.failPolicy === "closed") {
146
+ throw new ConsensusBlockedError(`Consensus ${result.action}: aggregate score ${result.aggregateScore.toFixed(2)} ` +
147
+ `(${result.scores.map((s) => s.rationale ?? "no rationale").join("; ")})`);
148
+ }
149
+ // failPolicy: 'open' — execute anyway
150
+ return fn(toolName, args);
151
+ }
152
+ catch (err) {
153
+ if (err instanceof ConsensusBlockedError) {
154
+ throw err;
155
+ }
156
+ // Unexpected error during deliberation
157
+ const error = err instanceof Error ? err : new Error(String(err));
158
+ merged.onError?.(error, { toolName, args });
159
+ if (merged.failPolicy === "closed") {
160
+ throw new ConsensusBlockedError("Consensus deliberation failed", error);
161
+ }
162
+ // failPolicy: 'open' — execute despite error
163
+ return fn(toolName, args);
164
+ }
165
+ };
166
+ },
167
+ /**
168
+ * LangChain adapter — dynamically loads @consensus-tools/langchain.
169
+ *
170
+ * Returns a `ConsensusGuardCallbackHandler` that intercepts all tool calls and
171
+ * runs them through consensus deliberation. Attach it to your chain or agent
172
+ * via the `callbacks` option to govern all tool calls:
173
+ *
174
+ * ```ts
175
+ * const handler = await consensus.langchain(null, { policy: "majority" });
176
+ * const result = await agent.invoke({ input: "..." }, { callbacks: [handler] });
177
+ * ```
178
+ */
179
+ async langchain(_chain, config) {
180
+ let mod;
181
+ try {
182
+ mod = await import("@consensus-tools/langchain");
183
+ }
184
+ catch {
185
+ throw new MissingDependencyError("@consensus-tools/langchain");
186
+ }
187
+ // Create a guard callback handler with the user's config
188
+ const HandlerClass = mod["ConsensusGuardCallbackHandler"];
189
+ if (!HandlerClass) {
190
+ throw new Error("@consensus-tools/langchain does not export ConsensusGuardCallbackHandler");
191
+ }
192
+ const handler = new HandlerClass({
193
+ policy: config?.policy ?? "majority",
194
+ guards: config?.guards,
195
+ onDecision: config?.onDecision ? (d) => config.onDecision?.(d) : undefined,
196
+ });
197
+ // Return the handler — the user attaches it to their chain/agent
198
+ // This is the LangChain pattern: you don't wrap the chain, you add callbacks
199
+ return handler;
200
+ },
201
+ /**
202
+ * AI SDK (Vercel) adapter — dynamically loads @consensus-tools/ai-sdk.
203
+ */
204
+ async aiSdk(fn, config) {
205
+ let mod;
206
+ try {
207
+ mod = await import("@consensus-tools/ai-sdk");
208
+ }
209
+ catch {
210
+ throw new MissingDependencyError("@consensus-tools/ai-sdk");
211
+ }
212
+ if (typeof mod["createGuardedGenerate"] === "function") {
213
+ return mod["createGuardedGenerate"](fn, config);
214
+ }
215
+ throw new Error("@consensus-tools/ai-sdk does not export createGuardedGenerate");
216
+ },
217
+ /**
218
+ * MCP adapter — dynamically loads @consensus-tools/mcp.
219
+ */
220
+ async mcp(config) {
221
+ let mod;
222
+ try {
223
+ mod = await import("@consensus-tools/mcp");
224
+ }
225
+ catch {
226
+ throw new MissingDependencyError("@consensus-tools/mcp");
227
+ }
228
+ if (typeof mod["createMcpServer"] === "function") {
229
+ return mod["createMcpServer"](config);
230
+ }
231
+ throw new Error("@consensus-tools/mcp does not export createMcpServer");
232
+ },
233
+ };
234
+ // ── Re-exports ───────────────────────────────────────────────────────
235
+ export { resolveWrappable } from "./resolve.js";
236
+ export { policyToStrategy, DEFAULTS, DEFAULT_GUARD, DEFAULT_POLICY, DEFAULT_PERSONA_TRIO, DEFAULT_PERSONA_COUNT } from "./defaults.js";
237
+ export { createLogger } from "./logger.js";
238
+ export { ConsensusBlockedError, MissingDependencyError, ConfigError } from "./errors.js";
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { LifecycleHooks } from "@consensus-tools/wrapper";
2
+ import type { UniversalConfig } from "./types.js";
3
+ /**
4
+ * Creates wrapper lifecycle hooks that emit structured log events.
5
+ *
6
+ * Events:
7
+ * deliberation.start — before the wrapped function runs
8
+ * deliberation.result — after a decision is reached (allow/block/escalate)
9
+ * deliberation.error — when deliberation throws
10
+ */
11
+ export declare function createLogger(config: Pick<UniversalConfig, "logger">): LifecycleHooks;
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,YAAY,CAAC;AAW5D;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,cAAc,CA4CpF"}
package/dist/logger.js ADDED
@@ -0,0 +1,55 @@
1
+ /** No-op hooks — used when logging is disabled. */
2
+ const NO_OP_HOOKS = {};
3
+ function emit(logFn, event, data) {
4
+ logFn({ event, data, timestamp: Date.now() });
5
+ }
6
+ /**
7
+ * Creates wrapper lifecycle hooks that emit structured log events.
8
+ *
9
+ * Events:
10
+ * deliberation.start — before the wrapped function runs
11
+ * deliberation.result — after a decision is reached (allow/block/escalate)
12
+ * deliberation.error — when deliberation throws
13
+ */
14
+ export function createLogger(config) {
15
+ const { logger } = config;
16
+ if (logger === false) {
17
+ return NO_OP_HOOKS;
18
+ }
19
+ const logFn = typeof logger === "function"
20
+ ? logger
21
+ : (event) => {
22
+ // eslint-disable-next-line no-console
23
+ console.debug(`[consensus] ${event.event}`, event.data);
24
+ };
25
+ return {
26
+ beforeSubmit(args) {
27
+ emit(logFn, "deliberation.start", { args });
28
+ },
29
+ afterResolve(result) {
30
+ emit(logFn, "deliberation.result", {
31
+ action: result.action,
32
+ aggregateScore: result.aggregateScore,
33
+ attempt: result.attempt,
34
+ scoresCount: result.scores.length,
35
+ });
36
+ },
37
+ onBlock(result) {
38
+ emit(logFn, "deliberation.result", {
39
+ action: "block",
40
+ aggregateScore: result.aggregateScore,
41
+ attempt: result.attempt,
42
+ scoresCount: result.scores.length,
43
+ });
44
+ },
45
+ onEscalate(result) {
46
+ emit(logFn, "deliberation.result", {
47
+ action: "escalate",
48
+ aggregateScore: result.aggregateScore,
49
+ attempt: result.attempt,
50
+ scoresCount: result.scores.length,
51
+ });
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAKA,mDAAmD;AACnD,MAAM,WAAW,GAAmB,EAAE,CAAC;AAEvC,SAAS,IAAI,CAAC,KAAY,EAAE,KAAa,EAAE,IAA6B;IACtE,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuC;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,KAAK,GACT,OAAO,MAAM,KAAK,UAAU;QAC1B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,CAAC,KAAe,EAAE,EAAE;YAClB,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC;IAER,OAAO;QACL,YAAY,CAAC,IAAe;YAC1B,IAAI,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,YAAY,CAAC,MAAsB;YACjC,IAAI,CAAC,KAAK,EAAE,qBAAqB,EAAE;gBACjC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;aAClC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAsB;YAC5B,IAAI,CAAC,KAAK,EAAE,qBAAqB,EAAE;gBACjC,MAAM,EAAE,OAAO;gBACf,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;aAClC,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CAAC,MAAsB;YAC/B,IAAI,CAAC,KAAK,EAAE,qBAAqB,EAAE;gBACjC,MAAM,EAAE,UAAU;gBAClB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;aAClC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ToolExecutor, Wrappable } from "./types.js";
2
+ /**
3
+ * Resolves a Wrappable into a plain ToolExecutor function.
4
+ *
5
+ * Resolution order: direct function > .execute > .invoke > .call
6
+ * First match wins.
7
+ */
8
+ export declare function resolveWrappable(wrappable: Wrappable): ToolExecutor;
9
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CAqBnE"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Resolves a Wrappable into a plain ToolExecutor function.
3
+ *
4
+ * Resolution order: direct function > .execute > .invoke > .call
5
+ * First match wins.
6
+ */
7
+ export function resolveWrappable(wrappable) {
8
+ if (typeof wrappable === "function") {
9
+ return wrappable;
10
+ }
11
+ if (typeof wrappable === "object" && wrappable !== null) {
12
+ if ("execute" in wrappable && typeof wrappable.execute === "function") {
13
+ return wrappable.execute.bind(wrappable);
14
+ }
15
+ if ("invoke" in wrappable && typeof wrappable.invoke === "function") {
16
+ return wrappable.invoke.bind(wrappable);
17
+ }
18
+ if ("call" in wrappable && typeof wrappable.call === "function") {
19
+ return wrappable.call.bind(wrappable);
20
+ }
21
+ }
22
+ throw new TypeError("Expected a Wrappable: a function, or an object with .execute(), .invoke(), or .call() method. " +
23
+ `Received: ${typeof wrappable}`);
24
+ }
25
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAoB;IACnD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,IAAI,SAAS,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACtE,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,QAAQ,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACpE,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChE,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,SAAS,CACjB,gGAAgG;QAChG,aAAa,OAAO,SAAS,EAAE,CAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { IStorage } from "@consensus-tools/storage";
2
+ import type { DecisionResult } from "@consensus-tools/wrapper";
3
+ export type ToolExecutor = (toolName: string, args: Record<string, unknown>) => Promise<unknown>;
4
+ export type Wrappable = ToolExecutor | {
5
+ execute: ToolExecutor;
6
+ } | {
7
+ invoke: ToolExecutor;
8
+ } | {
9
+ call: ToolExecutor;
10
+ };
11
+ export type FailPolicy = "closed" | "open";
12
+ export interface LogEvent {
13
+ event: string;
14
+ data: Record<string, unknown>;
15
+ timestamp: number;
16
+ }
17
+ export interface UniversalConfig {
18
+ /** Consensus policy name (maps to wrapper strategy via policyToStrategy). */
19
+ policy?: string;
20
+ /** Guard domain names to use as reviewers. */
21
+ guards?: string[];
22
+ /** Persona pack name (reserved for future use). */
23
+ personas?: string;
24
+ /** Behavior on error: 'closed' blocks, 'open' allows. Default: 'closed'. */
25
+ failPolicy?: FailPolicy;
26
+ /** Storage backend: 'memory' for in-memory, or an IStorage instance. Default: 'memory'. */
27
+ storage?: "memory" | IStorage;
28
+ /** Logging: true for console.debug, false to disable, or a custom function. Default: true. */
29
+ logger?: boolean | ((event: LogEvent) => void);
30
+ /** Called after every consensus decision. */
31
+ onDecision?: (decision: DecisionResult<unknown>) => void | Promise<void>;
32
+ /** Called when an error occurs during deliberation. */
33
+ onError?: (err: Error, action: unknown) => void;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAM/D,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjG,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAI3B,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAI3C,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC/C,6CAA6C;IAC7C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,uDAAuD;IACvD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@consensus-tools/universal",
3
+ "version": "0.9.0",
4
+ "description": "Universal facade — wrap any tool executor with consensus governance in one line",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "@consensus-tools/core": "0.9.0",
16
+ "@consensus-tools/storage": "0.9.0",
17
+ "@consensus-tools/policies": "0.9.0",
18
+ "@consensus-tools/guards": "0.9.0",
19
+ "@consensus-tools/wrapper": "0.9.0",
20
+ "@consensus-tools/personas": "0.9.0",
21
+ "@consensus-tools/schemas": "0.9.0"
22
+ },
23
+ "peerDependencies": {
24
+ "@consensus-tools/mcp": "0.8.0",
25
+ "@consensus-tools/langchain": "0.8.0",
26
+ "@consensus-tools/ai-sdk": "0.8.0"
27
+ },
28
+ "peerDependenciesMeta": {
29
+ "@consensus-tools/langchain": {
30
+ "optional": true
31
+ },
32
+ "@consensus-tools/ai-sdk": {
33
+ "optional": true
34
+ },
35
+ "@consensus-tools/mcp": {
36
+ "optional": true
37
+ }
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^20.0.0",
41
+ "typescript": "^5.7.0",
42
+ "vitest": "^4.0.18"
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "src"
47
+ ],
48
+ "author": "consensus-tools <https://github.com/consensus-tools>",
49
+ "license": "Apache-2.0",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/consensus-tools/consensus-tools.git",
53
+ "directory": "packages/universal"
54
+ },
55
+ "keywords": [
56
+ "consensus",
57
+ "multi-agent",
58
+ "ai-agents",
59
+ "consensus-tools",
60
+ "facade",
61
+ "universal",
62
+ "governance"
63
+ ],
64
+ "engines": {
65
+ "node": ">=20.0.0"
66
+ },
67
+ "sideEffects": false,
68
+ "homepage": "https://github.com/consensus-tools/consensus-tools/tree/main/packages/universal",
69
+ "bugs": {
70
+ "url": "https://github.com/consensus-tools/consensus-tools/issues"
71
+ },
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "scripts": {
76
+ "build": "tsc --project tsconfig.json",
77
+ "typecheck": "tsc --noEmit",
78
+ "clean": "rm -rf dist",
79
+ "test": "vitest run",
80
+ "test:watch": "vitest"
81
+ }
82
+ }