@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.
- package/LICENSE +201 -0
- package/README.md +451 -0
- package/dist/__tests__/defaults.test.d.ts +2 -0
- package/dist/__tests__/defaults.test.d.ts.map +1 -0
- package/dist/__tests__/defaults.test.js +55 -0
- package/dist/__tests__/defaults.test.js.map +1 -0
- package/dist/__tests__/fail-policy.test.d.ts +2 -0
- package/dist/__tests__/fail-policy.test.d.ts.map +1 -0
- package/dist/__tests__/fail-policy.test.js +80 -0
- package/dist/__tests__/fail-policy.test.js.map +1 -0
- package/dist/__tests__/frameworks.test.d.ts +2 -0
- package/dist/__tests__/frameworks.test.d.ts.map +1 -0
- package/dist/__tests__/frameworks.test.js +86 -0
- package/dist/__tests__/frameworks.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +77 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/resolve.test.d.ts +2 -0
- package/dist/__tests__/resolve.test.d.ts.map +1 -0
- package/dist/__tests__/resolve.test.js +71 -0
- package/dist/__tests__/resolve.test.js.map +1 -0
- package/dist/__tests__/wrap.test.d.ts +2 -0
- package/dist/__tests__/wrap.test.d.ts.map +1 -0
- package/dist/__tests__/wrap.test.js +90 -0
- package/dist/__tests__/wrap.test.js.map +1 -0
- package/dist/defaults.d.ts +20 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +48 -0
- package/dist/defaults.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +31 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +239 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +55 -0
- package/dist/logger.js.map +1 -0
- package/dist/resolve.d.ts +9 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +25 -0
- package/dist/resolve.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +82 -0
- package/src/__tests__/defaults.test.ts +71 -0
- package/src/__tests__/fail-policy.test.ts +107 -0
- package/src/__tests__/frameworks.test.ts +106 -0
- package/src/__tests__/logger.test.ts +93 -0
- package/src/__tests__/resolve.test.ts +80 -0
- package/src/__tests__/wrap.test.ts +110 -0
- package/src/consensus-llm.test.ts +260 -0
- package/src/defaults.ts +124 -0
- package/src/errors.ts +35 -0
- package/src/index.ts +386 -0
- package/src/logger.ts +65 -0
- package/src/persona-reviewer-factory.ts +387 -0
- package/src/reputation-manager.test.ts +131 -0
- package/src/reputation-manager.ts +168 -0
- package/src/resolve.ts +30 -0
- package/src/risk-tiers.test.ts +36 -0
- package/src/risk-tiers.ts +49 -0
- 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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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"}
|
package/dist/resolve.js
ADDED
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|