@feilunxitong/arkit 0.1.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/README.md +74 -0
- package/dist/achievements.d.ts +79 -0
- package/dist/achievements.js +76 -0
- package/dist/auto.d.ts +19 -0
- package/dist/auto.js +42 -0
- package/dist/benchmarks.d.ts +29 -0
- package/dist/benchmarks.js +145 -0
- package/dist/breaker.d.ts +36 -0
- package/dist/breaker.js +115 -0
- package/dist/dashboard.d.ts +32 -0
- package/dist/dashboard.js +66 -0
- package/dist/guard.d.ts +24 -0
- package/dist/guard.js +106 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +57 -0
- package/dist/langchain.d.ts +72 -0
- package/dist/langchain.js +138 -0
- package/dist/module-kit.d.ts +64 -0
- package/dist/module-kit.js +157 -0
- package/dist/multi-agent.d.ts +59 -0
- package/dist/multi-agent.js +192 -0
- package/dist/proactive.d.ts +45 -0
- package/dist/proactive.js +183 -0
- package/dist/schema-hub.d.ts +64 -0
- package/dist/schema-hub.js +508 -0
- package/dist/schema-registry.d.ts +17 -0
- package/dist/schema-registry.js +142 -0
- package/dist/score.d.ts +47 -0
- package/dist/score.js +97 -0
- package/dist/stateful-breaker.d.ts +45 -0
- package/dist/stateful-breaker.js +231 -0
- package/dist/trace.d.ts +36 -0
- package/dist/trace.js +113 -0
- package/dist/validator.d.ts +25 -0
- package/dist/validator.js +56 -0
- package/package.json +43 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Dashboard — 信任仪表盘
|
|
4
|
+
* Real-time trust monitoring for AI agents.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.Dashboard = void 0;
|
|
8
|
+
class Dashboard {
|
|
9
|
+
guard;
|
|
10
|
+
breaker;
|
|
11
|
+
validator;
|
|
12
|
+
score;
|
|
13
|
+
achievements;
|
|
14
|
+
constructor(guard, breaker, validator, score, achievements) {
|
|
15
|
+
this.guard = guard;
|
|
16
|
+
this.breaker = breaker;
|
|
17
|
+
this.validator = validator;
|
|
18
|
+
this.score = score;
|
|
19
|
+
this.achievements = achievements;
|
|
20
|
+
}
|
|
21
|
+
get trustMonitor() {
|
|
22
|
+
const gs = this.guard.stats;
|
|
23
|
+
const bs = this.breaker.stats;
|
|
24
|
+
const vs = this.validator.stats;
|
|
25
|
+
return {
|
|
26
|
+
guardPasses: gs.passes,
|
|
27
|
+
guardIntercepts: gs.intercepts,
|
|
28
|
+
guardSaveRate: gs.saveRate,
|
|
29
|
+
breakerState: bs.state,
|
|
30
|
+
breakerReliability: bs.reliability,
|
|
31
|
+
validatorPassed: vs.passed,
|
|
32
|
+
validatorBlocked: vs.blocked,
|
|
33
|
+
validatorBlockRate: vs.blockRate,
|
|
34
|
+
score: this.score.score,
|
|
35
|
+
grade: this.score.grade,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Render a text dashboard */
|
|
39
|
+
render() {
|
|
40
|
+
const t = this.trustMonitor;
|
|
41
|
+
const unlocked = this.achievements.unlocked;
|
|
42
|
+
return `
|
|
43
|
+
╔══════════════════════════════════════════════════╗
|
|
44
|
+
║ 🛡 ARK Trust Dashboard ║
|
|
45
|
+
╠══════════════════════════════════════════════════╣
|
|
46
|
+
║ ║
|
|
47
|
+
║ 🛡 Idempotency Guard ║
|
|
48
|
+
║ Passes: ${String(t.guardPasses).padEnd(5)} Intercepts: ${String(t.guardIntercepts).padEnd(5)} ║
|
|
49
|
+
║ Save Rate: ${t.guardSaveRate.padEnd(10)} ║
|
|
50
|
+
║ ║
|
|
51
|
+
║ ⚡ Circuit Breaker ║
|
|
52
|
+
║ State: ${t.breakerState.padEnd(10)} Reliability: ${t.breakerReliability.padEnd(10)} ║
|
|
53
|
+
║ ║
|
|
54
|
+
║ 🔧 Output Validator ║
|
|
55
|
+
║ Passed: ${String(t.validatorPassed).padEnd(5)} Blocked: ${String(t.validatorBlocked).padEnd(5)} ║
|
|
56
|
+
║ Block Rate: ${t.validatorBlockRate.padEnd(10)} ║
|
|
57
|
+
║ ║
|
|
58
|
+
║ 🎯 Reliability Score: ${String(t.score).padEnd(5)} ${t.grade.padEnd(6)} ║
|
|
59
|
+
║ ║
|
|
60
|
+
║ 🏆 Achievements: ${String(unlocked.length).padEnd(2)}/8 unlocked ║
|
|
61
|
+
║ ${unlocked.map((a) => `${a.icon} ${a.name}`).join(' | ') || 'None yet'}${' '.repeat(Math.max(0, 30 - unlocked.map((a) => `${a.icon} ${a.name}`).join(' | ').length))}║
|
|
62
|
+
║ ║
|
|
63
|
+
╚══════════════════════════════════════════════════╝`;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.Dashboard = Dashboard;
|
package/dist/guard.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface GuardStats {
|
|
2
|
+
passes: number;
|
|
3
|
+
intercepts: number;
|
|
4
|
+
entries: number;
|
|
5
|
+
saveRate: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class IdempotencyGuard {
|
|
8
|
+
private ttlMs;
|
|
9
|
+
private executed;
|
|
10
|
+
private passes;
|
|
11
|
+
private intercepts;
|
|
12
|
+
constructor(ttlMs?: number);
|
|
13
|
+
/** Generate a deterministic key from tool + params */
|
|
14
|
+
key(toolName: string, params: Record<string, unknown>): string;
|
|
15
|
+
/** Check if this call has been executed before */
|
|
16
|
+
check(key: string): boolean;
|
|
17
|
+
/** Record a tool execution result */
|
|
18
|
+
record(key: string, result: unknown): void;
|
|
19
|
+
/** Decorator: wrap a function with idempotency */
|
|
20
|
+
wrap<T extends (...args: any[]) => any>(toolName: string, fn: T): T;
|
|
21
|
+
reset(): void;
|
|
22
|
+
get stats(): GuardStats;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
package/dist/guard.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.IdempotencyGuard = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* IdempotencyGuard — 幂等守护
|
|
39
|
+
* Gene source: Stripe payment idempotency
|
|
40
|
+
* Prevents duplicate tool execution via parameter hashing.
|
|
41
|
+
*/
|
|
42
|
+
const crypto = __importStar(require("crypto"));
|
|
43
|
+
class IdempotencyGuard {
|
|
44
|
+
ttlMs;
|
|
45
|
+
executed = new Map();
|
|
46
|
+
passes = 0;
|
|
47
|
+
intercepts = 0;
|
|
48
|
+
constructor(ttlMs = 3_600_000) {
|
|
49
|
+
this.ttlMs = ttlMs;
|
|
50
|
+
}
|
|
51
|
+
/** Generate a deterministic key from tool + params */
|
|
52
|
+
key(toolName, params) {
|
|
53
|
+
const raw = JSON.stringify({ tool: toolName, params });
|
|
54
|
+
return crypto.createHash('sha256').update(raw).digest('hex').slice(0, 16);
|
|
55
|
+
}
|
|
56
|
+
/** Check if this call has been executed before */
|
|
57
|
+
check(key) {
|
|
58
|
+
const entry = this.executed.get(key);
|
|
59
|
+
if (!entry)
|
|
60
|
+
return false;
|
|
61
|
+
if (Date.now() - entry.at > this.ttlMs) {
|
|
62
|
+
this.executed.delete(key);
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/** Record a tool execution result */
|
|
68
|
+
record(key, result) {
|
|
69
|
+
this.executed.set(key, { result, at: Date.now() });
|
|
70
|
+
this.passes++;
|
|
71
|
+
// Cleanup old entries
|
|
72
|
+
const cutoff = Date.now() - this.ttlMs;
|
|
73
|
+
for (const [k, v] of this.executed) {
|
|
74
|
+
if (v.at < cutoff)
|
|
75
|
+
this.executed.delete(k);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Decorator: wrap a function with idempotency */
|
|
79
|
+
wrap(toolName, fn) {
|
|
80
|
+
return ((...args) => {
|
|
81
|
+
const k = this.key(toolName, args.length === 1 ? args[0] : { args });
|
|
82
|
+
if (this.check(k)) {
|
|
83
|
+
this.intercepts++;
|
|
84
|
+
return this.executed.get(k).result;
|
|
85
|
+
}
|
|
86
|
+
const result = fn(...args);
|
|
87
|
+
this.record(k, result);
|
|
88
|
+
return result;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
reset() {
|
|
92
|
+
this.executed.clear();
|
|
93
|
+
this.passes = 0;
|
|
94
|
+
this.intercepts = 0;
|
|
95
|
+
}
|
|
96
|
+
get stats() {
|
|
97
|
+
const total = this.passes + this.intercepts;
|
|
98
|
+
return {
|
|
99
|
+
passes: this.passes,
|
|
100
|
+
intercepts: this.intercepts,
|
|
101
|
+
entries: this.executed.size,
|
|
102
|
+
saveRate: total > 0 ? `${((this.intercepts / total) * 100).toFixed(1)}%` : '0%',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.IdempotencyGuard = IdempotencyGuard;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARK — Agent Reliability Kit
|
|
3
|
+
* Trust infrastructure for AI agents. TypeScript/Node.js edition.
|
|
4
|
+
*
|
|
5
|
+
* 基因重组:
|
|
6
|
+
* 🏦 Stripe → IdempotencyGuard
|
|
7
|
+
* ⚡ Sentinel → CircuitBreaker
|
|
8
|
+
* 👁 OpenTelemetry → Trace
|
|
9
|
+
* 🔧 IDE → OutputValidator
|
|
10
|
+
* 🎮 Gaming → ReliabilityScore + Achievements
|
|
11
|
+
*/
|
|
12
|
+
export { IdempotencyGuard } from './guard.js';
|
|
13
|
+
export { CircuitBreaker, CircuitOpenError } from './breaker.js';
|
|
14
|
+
export { OutputValidator, ValidationResult } from './validator.js';
|
|
15
|
+
export { Trace, Span } from './trace.js';
|
|
16
|
+
export { ReliabilityScore } from './score.js';
|
|
17
|
+
export { SchemaRegistry } from './schema-registry.js';
|
|
18
|
+
export { detectFrameworks, autoInit } from './auto.js';
|
|
19
|
+
export { Achievements, Achievement, definitions } from './achievements.js';
|
|
20
|
+
export { Dashboard, TrustMonitor } from './dashboard.js';
|
|
21
|
+
export { StatefulBreaker } from './stateful-breaker.js';
|
|
22
|
+
export { ModulePipeline, ModuleBlockError, RateLimitModule, LoggingModule } from './module-kit.js';
|
|
23
|
+
export type { Module, ModuleResult } from './module-kit.js';
|
|
24
|
+
export { Benchmarks } from './benchmarks.js';
|
|
25
|
+
export { MultiAgentProtocol } from './multi-agent.js';
|
|
26
|
+
export { ProactiveGuard, ProactiveBlockError } from './proactive.js';
|
|
27
|
+
export { SchemaHub, validateSchema } from './schema-hub.js';
|
|
28
|
+
export type { SchemaMeta } from './schema-hub.js';
|
|
29
|
+
export { BUILTIN_SCHEMAS, BUILTIN_META, CATEGORIES } from './schema-hub.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ARK — Agent Reliability Kit
|
|
4
|
+
* Trust infrastructure for AI agents. TypeScript/Node.js edition.
|
|
5
|
+
*
|
|
6
|
+
* 基因重组:
|
|
7
|
+
* 🏦 Stripe → IdempotencyGuard
|
|
8
|
+
* ⚡ Sentinel → CircuitBreaker
|
|
9
|
+
* 👁 OpenTelemetry → Trace
|
|
10
|
+
* 🔧 IDE → OutputValidator
|
|
11
|
+
* 🎮 Gaming → ReliabilityScore + Achievements
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.CATEGORIES = exports.BUILTIN_META = exports.BUILTIN_SCHEMAS = exports.validateSchema = exports.SchemaHub = exports.ProactiveBlockError = exports.ProactiveGuard = exports.MultiAgentProtocol = exports.Benchmarks = exports.LoggingModule = exports.RateLimitModule = exports.ModuleBlockError = exports.ModulePipeline = exports.StatefulBreaker = exports.Dashboard = exports.definitions = exports.Achievements = exports.autoInit = exports.detectFrameworks = exports.SchemaRegistry = exports.ReliabilityScore = exports.Trace = exports.OutputValidator = exports.CircuitOpenError = exports.CircuitBreaker = exports.IdempotencyGuard = void 0;
|
|
15
|
+
var guard_js_1 = require("./guard.js");
|
|
16
|
+
Object.defineProperty(exports, "IdempotencyGuard", { enumerable: true, get: function () { return guard_js_1.IdempotencyGuard; } });
|
|
17
|
+
var breaker_js_1 = require("./breaker.js");
|
|
18
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return breaker_js_1.CircuitBreaker; } });
|
|
19
|
+
Object.defineProperty(exports, "CircuitOpenError", { enumerable: true, get: function () { return breaker_js_1.CircuitOpenError; } });
|
|
20
|
+
var validator_js_1 = require("./validator.js");
|
|
21
|
+
Object.defineProperty(exports, "OutputValidator", { enumerable: true, get: function () { return validator_js_1.OutputValidator; } });
|
|
22
|
+
var trace_js_1 = require("./trace.js");
|
|
23
|
+
Object.defineProperty(exports, "Trace", { enumerable: true, get: function () { return trace_js_1.Trace; } });
|
|
24
|
+
var score_js_1 = require("./score.js");
|
|
25
|
+
Object.defineProperty(exports, "ReliabilityScore", { enumerable: true, get: function () { return score_js_1.ReliabilityScore; } });
|
|
26
|
+
var schema_registry_js_1 = require("./schema-registry.js");
|
|
27
|
+
Object.defineProperty(exports, "SchemaRegistry", { enumerable: true, get: function () { return schema_registry_js_1.SchemaRegistry; } });
|
|
28
|
+
var auto_js_1 = require("./auto.js");
|
|
29
|
+
Object.defineProperty(exports, "detectFrameworks", { enumerable: true, get: function () { return auto_js_1.detectFrameworks; } });
|
|
30
|
+
Object.defineProperty(exports, "autoInit", { enumerable: true, get: function () { return auto_js_1.autoInit; } });
|
|
31
|
+
var achievements_js_1 = require("./achievements.js");
|
|
32
|
+
Object.defineProperty(exports, "Achievements", { enumerable: true, get: function () { return achievements_js_1.Achievements; } });
|
|
33
|
+
Object.defineProperty(exports, "definitions", { enumerable: true, get: function () { return achievements_js_1.definitions; } });
|
|
34
|
+
var dashboard_js_1 = require("./dashboard.js");
|
|
35
|
+
Object.defineProperty(exports, "Dashboard", { enumerable: true, get: function () { return dashboard_js_1.Dashboard; } });
|
|
36
|
+
// v0.4.1 — New modules
|
|
37
|
+
var stateful_breaker_js_1 = require("./stateful-breaker.js");
|
|
38
|
+
Object.defineProperty(exports, "StatefulBreaker", { enumerable: true, get: function () { return stateful_breaker_js_1.StatefulBreaker; } });
|
|
39
|
+
var module_kit_js_1 = require("./module-kit.js");
|
|
40
|
+
Object.defineProperty(exports, "ModulePipeline", { enumerable: true, get: function () { return module_kit_js_1.ModulePipeline; } });
|
|
41
|
+
Object.defineProperty(exports, "ModuleBlockError", { enumerable: true, get: function () { return module_kit_js_1.ModuleBlockError; } });
|
|
42
|
+
Object.defineProperty(exports, "RateLimitModule", { enumerable: true, get: function () { return module_kit_js_1.RateLimitModule; } });
|
|
43
|
+
Object.defineProperty(exports, "LoggingModule", { enumerable: true, get: function () { return module_kit_js_1.LoggingModule; } });
|
|
44
|
+
var benchmarks_js_1 = require("./benchmarks.js");
|
|
45
|
+
Object.defineProperty(exports, "Benchmarks", { enumerable: true, get: function () { return benchmarks_js_1.Benchmarks; } });
|
|
46
|
+
var multi_agent_js_1 = require("./multi-agent.js");
|
|
47
|
+
Object.defineProperty(exports, "MultiAgentProtocol", { enumerable: true, get: function () { return multi_agent_js_1.MultiAgentProtocol; } });
|
|
48
|
+
var proactive_js_1 = require("./proactive.js");
|
|
49
|
+
Object.defineProperty(exports, "ProactiveGuard", { enumerable: true, get: function () { return proactive_js_1.ProactiveGuard; } });
|
|
50
|
+
Object.defineProperty(exports, "ProactiveBlockError", { enumerable: true, get: function () { return proactive_js_1.ProactiveBlockError; } });
|
|
51
|
+
var schema_hub_js_1 = require("./schema-hub.js");
|
|
52
|
+
Object.defineProperty(exports, "SchemaHub", { enumerable: true, get: function () { return schema_hub_js_1.SchemaHub; } });
|
|
53
|
+
Object.defineProperty(exports, "validateSchema", { enumerable: true, get: function () { return schema_hub_js_1.validateSchema; } });
|
|
54
|
+
var schema_hub_js_2 = require("./schema-hub.js");
|
|
55
|
+
Object.defineProperty(exports, "BUILTIN_SCHEMAS", { enumerable: true, get: function () { return schema_hub_js_2.BUILTIN_SCHEMAS; } });
|
|
56
|
+
Object.defineProperty(exports, "BUILTIN_META", { enumerable: true, get: function () { return schema_hub_js_2.BUILTIN_META; } });
|
|
57
|
+
Object.defineProperty(exports, "CATEGORIES", { enumerable: true, get: function () { return schema_hub_js_2.CATEGORIES; } });
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ARK × LangChain.js Integration
|
|
3
|
+
* Drop-in trust layer for LangChain agents.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* import { ARKCallbackHandler } from 'ark-trust/langchain';
|
|
7
|
+
* const agent = await createOpenAIToolsAgent({ llm, tools, prompt });
|
|
8
|
+
* const executor = new AgentExecutor({ agent, tools, callbacks: [new ARKCallbackHandler()] });
|
|
9
|
+
*/
|
|
10
|
+
import { IdempotencyGuard } from './guard.js';
|
|
11
|
+
import { CircuitBreaker } from './breaker.js';
|
|
12
|
+
import { OutputValidator } from './validator.js';
|
|
13
|
+
import { Trace } from './trace.js';
|
|
14
|
+
interface CallbackInput {
|
|
15
|
+
name: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface LLMResult {
|
|
19
|
+
generations: Array<{
|
|
20
|
+
text: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}>;
|
|
23
|
+
llmOutput?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface ARKReport {
|
|
26
|
+
toolCalls: number;
|
|
27
|
+
intercepted: number;
|
|
28
|
+
blocked: number;
|
|
29
|
+
guard: object;
|
|
30
|
+
breaker: object;
|
|
31
|
+
validator: object;
|
|
32
|
+
trace: object | undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* ARK信任层 × LangChain.js Callback系统
|
|
36
|
+
*
|
|
37
|
+
* 接入方式: 在 AgentExecutor 的 callbacks 中传入
|
|
38
|
+
* callbacks: [new ARKCallbackHandler()]
|
|
39
|
+
*/
|
|
40
|
+
export declare class ARKCallbackHandler {
|
|
41
|
+
guard: IdempotencyGuard;
|
|
42
|
+
breaker: CircuitBreaker;
|
|
43
|
+
validator: OutputValidator;
|
|
44
|
+
trace: Trace | null;
|
|
45
|
+
private intercepted;
|
|
46
|
+
private blocked;
|
|
47
|
+
private toolCalls;
|
|
48
|
+
constructor(opts?: {
|
|
49
|
+
idempotencyTtlMs?: number;
|
|
50
|
+
circuitFailures?: number;
|
|
51
|
+
circuitRecoveryMs?: number;
|
|
52
|
+
});
|
|
53
|
+
handleLLMStart(_llm: unknown, _prompts: string[]): void;
|
|
54
|
+
handleLLMEnd(_output: LLMResult): void;
|
|
55
|
+
handleLLMError(err: Error): void;
|
|
56
|
+
handleToolStart(tool: CallbackInput, input: string): void;
|
|
57
|
+
handleToolEnd(output: string): void;
|
|
58
|
+
handleToolError(err: Error): void;
|
|
59
|
+
handleAgentAction(action: {
|
|
60
|
+
tool: string;
|
|
61
|
+
toolInput: unknown;
|
|
62
|
+
log: string;
|
|
63
|
+
}): void;
|
|
64
|
+
handleAgentFinish(_finish: unknown): void;
|
|
65
|
+
handleChainStart(_chain: unknown): void;
|
|
66
|
+
handleChainEnd(_outputs: unknown): void;
|
|
67
|
+
handleChainError(err: Error): void;
|
|
68
|
+
/** Generate a trust report after the run */
|
|
69
|
+
get report(): string;
|
|
70
|
+
get stats(): ARKReport;
|
|
71
|
+
}
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ARK × LangChain.js Integration
|
|
4
|
+
* Drop-in trust layer for LangChain agents.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* import { ARKCallbackHandler } from 'ark-trust/langchain';
|
|
8
|
+
* const agent = await createOpenAIToolsAgent({ llm, tools, prompt });
|
|
9
|
+
* const executor = new AgentExecutor({ agent, tools, callbacks: [new ARKCallbackHandler()] });
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ARKCallbackHandler = void 0;
|
|
13
|
+
const guard_js_1 = require("./guard.js");
|
|
14
|
+
const breaker_js_1 = require("./breaker.js");
|
|
15
|
+
const validator_js_1 = require("./validator.js");
|
|
16
|
+
const trace_js_1 = require("./trace.js");
|
|
17
|
+
/**
|
|
18
|
+
* ARK信任层 × LangChain.js Callback系统
|
|
19
|
+
*
|
|
20
|
+
* 接入方式: 在 AgentExecutor 的 callbacks 中传入
|
|
21
|
+
* callbacks: [new ARKCallbackHandler()]
|
|
22
|
+
*/
|
|
23
|
+
class ARKCallbackHandler {
|
|
24
|
+
guard;
|
|
25
|
+
breaker;
|
|
26
|
+
validator;
|
|
27
|
+
trace = null;
|
|
28
|
+
intercepted = 0;
|
|
29
|
+
blocked = 0;
|
|
30
|
+
toolCalls = 0;
|
|
31
|
+
constructor(opts) {
|
|
32
|
+
this.guard = new guard_js_1.IdempotencyGuard(opts?.idempotencyTtlMs ?? 3_600_000);
|
|
33
|
+
this.breaker = new breaker_js_1.CircuitBreaker('langchain-agent', opts?.circuitFailures ?? 3, opts?.circuitRecoveryMs ?? 30_000);
|
|
34
|
+
this.validator = new validator_js_1.OutputValidator();
|
|
35
|
+
}
|
|
36
|
+
// ===== LLM Events =====
|
|
37
|
+
handleLLMStart(_llm, _prompts) {
|
|
38
|
+
this.trace = new trace_js_1.Trace('agent-turn');
|
|
39
|
+
this.trace.startSpan('llm_call', { promptCount: String(_prompts?.length ?? 0) });
|
|
40
|
+
}
|
|
41
|
+
handleLLMEnd(_output) {
|
|
42
|
+
if (this.trace) {
|
|
43
|
+
this.trace.endSpan(_output?.generations?.[0]?.text?.slice(0, 200));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
handleLLMError(err) {
|
|
47
|
+
if (this.trace) {
|
|
48
|
+
this.trace.endSpan(undefined, err.message.slice(0, 200));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ===== Tool Events — ARK核心拦截点 =====
|
|
52
|
+
handleToolStart(tool, input) {
|
|
53
|
+
this.toolCalls++;
|
|
54
|
+
const toolName = tool.name || 'unknown_tool';
|
|
55
|
+
// 幂等检查
|
|
56
|
+
const key = this.guard.key(toolName, { input });
|
|
57
|
+
if (this.guard.check(key)) {
|
|
58
|
+
this.intercepted++;
|
|
59
|
+
}
|
|
60
|
+
this.guard.record(key, `result_for_${key}`);
|
|
61
|
+
// 链路追踪
|
|
62
|
+
if (this.trace) {
|
|
63
|
+
this.trace.startSpan('tool_call', { tool: toolName, input: input.slice(0, 100) });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
handleToolEnd(output) {
|
|
67
|
+
if (this.trace) {
|
|
68
|
+
this.trace.endSpan(output?.slice(0, 200));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
handleToolError(err) {
|
|
72
|
+
if (this.trace) {
|
|
73
|
+
this.trace.endSpan(undefined, err.message.slice(0, 200));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ===== Agent Events =====
|
|
77
|
+
handleAgentAction(action) {
|
|
78
|
+
if (this.trace) {
|
|
79
|
+
this.trace.startSpan('agent_action', {
|
|
80
|
+
tool: action.tool,
|
|
81
|
+
log: action.log?.slice(0, 100),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
handleAgentFinish(_finish) {
|
|
86
|
+
if (this.trace) {
|
|
87
|
+
this.trace.endSpan();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// ===== Chain Events (generic fallback) =====
|
|
91
|
+
handleChainStart(_chain) {
|
|
92
|
+
if (!this.trace) {
|
|
93
|
+
this.trace = new trace_js_1.Trace('chain-run');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
handleChainEnd(_outputs) {
|
|
97
|
+
// chain complete
|
|
98
|
+
}
|
|
99
|
+
handleChainError(err) {
|
|
100
|
+
if (this.trace) {
|
|
101
|
+
this.trace.endSpan(undefined, err.message.slice(0, 200));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Generate a trust report after the run */
|
|
105
|
+
get report() {
|
|
106
|
+
const gs = this.guard.stats;
|
|
107
|
+
const bs = this.breaker.stats;
|
|
108
|
+
const vs = this.validator.stats;
|
|
109
|
+
const ts = this.trace?.summary();
|
|
110
|
+
return [
|
|
111
|
+
'╔═══════════════════════════════╗',
|
|
112
|
+
'║ 🛡 ARK × LangChain Report ║',
|
|
113
|
+
'╠═══════════════════════════════╣',
|
|
114
|
+
`║ Tool Calls: ${String(this.toolCalls).padEnd(11)} ║`,
|
|
115
|
+
`║ Intercepted: ${String(this.intercepted).padEnd(11)} ║`,
|
|
116
|
+
`║ Blocked: ${String(this.blocked).padEnd(11)} ║`,
|
|
117
|
+
`║ Save Rate: ${gs.saveRate.padEnd(11)} ║`,
|
|
118
|
+
`║ Breaker: ${bs.state.padEnd(11)} ║`,
|
|
119
|
+
`║ Reliability: ${bs.reliability.padEnd(11)} ║`,
|
|
120
|
+
`║ Path Valid: ${vs.blockRate.padEnd(11)} ║`,
|
|
121
|
+
`║ Spans: ${String(ts?.totalSpans ?? 0).padEnd(11)} ║`,
|
|
122
|
+
`║ Status: ${(ts?.status ?? 'ok').padEnd(11)} ║`,
|
|
123
|
+
'╚═══════════════════════════════╝',
|
|
124
|
+
].join('\n');
|
|
125
|
+
}
|
|
126
|
+
get stats() {
|
|
127
|
+
return {
|
|
128
|
+
toolCalls: this.toolCalls,
|
|
129
|
+
intercepted: this.intercepted,
|
|
130
|
+
blocked: this.blocked,
|
|
131
|
+
guard: this.guard.stats,
|
|
132
|
+
breaker: this.breaker.stats,
|
|
133
|
+
validator: this.validator.stats,
|
|
134
|
+
trace: this.trace?.summary(),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.ARKCallbackHandler = ARKCallbackHandler;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModuleKit — 可组合可靠性模块
|
|
3
|
+
* Gene source: GenericAgent(模块化能力魔方)+ nuwa-skill(认知蒸馏)
|
|
4
|
+
* Stack minimal modules into composable reliability pipelines.
|
|
5
|
+
*/
|
|
6
|
+
export interface ModuleResult {
|
|
7
|
+
action: 'allow' | 'block' | 'warn';
|
|
8
|
+
reason: string;
|
|
9
|
+
context: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface Module {
|
|
12
|
+
name: string;
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
priority: number;
|
|
15
|
+
process(toolName: string, args: Record<string, unknown>, context: Record<string, unknown>): ModuleResult;
|
|
16
|
+
stats: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export declare class ModuleBlockError extends Error {
|
|
19
|
+
constructor(toolName: string, reason: string);
|
|
20
|
+
}
|
|
21
|
+
interface PipelineStats {
|
|
22
|
+
name: string;
|
|
23
|
+
modules: number;
|
|
24
|
+
totalCalls: number;
|
|
25
|
+
blocked: number;
|
|
26
|
+
allowed: number;
|
|
27
|
+
blockRate: string;
|
|
28
|
+
moduleList: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare class ModulePipeline {
|
|
31
|
+
name: string;
|
|
32
|
+
modules: Module[];
|
|
33
|
+
private totalCalls;
|
|
34
|
+
private blockedCalls;
|
|
35
|
+
private allowedCalls;
|
|
36
|
+
constructor(name?: string);
|
|
37
|
+
add(module: Module): this;
|
|
38
|
+
remove(moduleName: string): boolean;
|
|
39
|
+
process(toolName: string, args: Record<string, unknown>): ModuleResult;
|
|
40
|
+
wrap<T extends (...args: unknown[]) => unknown>(toolFunc: T, toolName?: string): (...args: Parameters<T>) => ReturnType<T>;
|
|
41
|
+
get stats(): PipelineStats;
|
|
42
|
+
}
|
|
43
|
+
export declare class RateLimitModule implements Module {
|
|
44
|
+
name: string;
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
priority: number;
|
|
47
|
+
maxCallsPerMinute: number;
|
|
48
|
+
private callTimestamps;
|
|
49
|
+
private blocked;
|
|
50
|
+
private passed;
|
|
51
|
+
constructor(maxCallsPerMinute?: number);
|
|
52
|
+
process(_toolName: string, _args: Record<string, unknown>, context: Record<string, unknown>): ModuleResult;
|
|
53
|
+
get stats(): Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
export declare class LoggingModule implements Module {
|
|
56
|
+
name: string;
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
priority: number;
|
|
59
|
+
private log;
|
|
60
|
+
maxLogSize: number;
|
|
61
|
+
process(toolName: string, args: Record<string, unknown>, context: Record<string, unknown>): ModuleResult;
|
|
62
|
+
get stats(): Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
export {};
|