@opentrust/shared 7.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/dist/constants.d.ts +12 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +51 -0
- package/package.json +29 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const DEFAULT_TENANT_ID = "default";
|
|
2
|
+
export declare const MAX_AGENTS = 10;
|
|
3
|
+
export interface DefaultScanner {
|
|
4
|
+
scannerId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_SCANNERS: DefaultScanner[];
|
|
9
|
+
export declare const SESSION_TOKEN_PREFIX = "og-session-";
|
|
10
|
+
export declare const SESSION_COOKIE_NAME = "og_session";
|
|
11
|
+
export declare const IP_RATE_LIMIT_PER_MIN = 100;
|
|
12
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAG3C,eAAO,MAAM,UAAU,KAAK,CAAC;AAG7B,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAW5C,CAAC;AAGF,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAGhD,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// -- Tenant --
|
|
2
|
+
export const DEFAULT_TENANT_ID = "default";
|
|
3
|
+
// -- Limits --
|
|
4
|
+
export const MAX_AGENTS = 10;
|
|
5
|
+
export const DEFAULT_SCANNERS = [
|
|
6
|
+
{ scannerId: "S01", name: "Prompt Injection", description: "Detect and block attempts to override system instructions or hijack agent behavior through crafted inputs." },
|
|
7
|
+
{ scannerId: "S02", name: "System Override", description: "Prevent attackers from manipulating the agent into ignoring safety boundaries or executing unauthorized actions." },
|
|
8
|
+
{ scannerId: "S03", name: "Web Attacks", description: "Guard against XSS, CSRF, and other web-based exploits targeting agent-powered interfaces and APIs." },
|
|
9
|
+
{ scannerId: "S04", name: "MCP Tool Poisoning", description: "Detect compromised or malicious tool definitions in Model Context Protocol integrations before execution." },
|
|
10
|
+
{ scannerId: "S05", name: "Malicious Code Execution", description: "Block attempts to generate, inject, or execute harmful code through agent code interpreters and sandboxes." },
|
|
11
|
+
{ scannerId: "S06", name: "NSFW Content", description: "Filter unsafe, explicit, or inappropriate content across 12 risk categories with configurable sensitivity." },
|
|
12
|
+
{ scannerId: "S07", name: "PII Exposure", description: "Identify and redact personally identifiable information before it reaches external models or storage." },
|
|
13
|
+
{ scannerId: "S08", name: "Credential Leakage", description: "Detect API keys, tokens, passwords, and secrets in agent inputs and outputs to prevent unauthorized access." },
|
|
14
|
+
{ scannerId: "S09", name: "Confidential Data", description: "Prevent sensitive business data, trade secrets, and proprietary information from leaking through AI interactions." },
|
|
15
|
+
{ scannerId: "S10", name: "Off-Topic Drift", description: "Keep agents focused on their intended purpose and prevent misuse for unrelated or unauthorized tasks." },
|
|
16
|
+
];
|
|
17
|
+
// -- Session --
|
|
18
|
+
export const SESSION_TOKEN_PREFIX = "og-session-";
|
|
19
|
+
export const SESSION_COOKIE_NAME = "og_session";
|
|
20
|
+
// -- Rate Limiting --
|
|
21
|
+
export const IP_RATE_LIMIT_PER_MIN = 100;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export type DashboardMode = "embedded" | "selfhosted" | "saas";
|
|
2
|
+
export type GatewayMode = "embedded" | "selfhosted" | "saas";
|
|
3
|
+
export interface TenantContext {
|
|
4
|
+
tenantId: string;
|
|
5
|
+
mode: DashboardMode;
|
|
6
|
+
}
|
|
7
|
+
export type AgentStatus = "active" | "inactive" | "disconnected";
|
|
8
|
+
export type AgentProvider = "openclaw" | "langchain" | "crewai" | "autogen" | "custom";
|
|
9
|
+
export interface Agent {
|
|
10
|
+
id: string;
|
|
11
|
+
tenantId: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string | null;
|
|
14
|
+
provider: AgentProvider;
|
|
15
|
+
status: AgentStatus;
|
|
16
|
+
lastSeenAt: string | null;
|
|
17
|
+
metadata: Record<string, unknown>;
|
|
18
|
+
createdAt: string;
|
|
19
|
+
updatedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export type PolicyAction = "block" | "alert" | "log";
|
|
22
|
+
export interface Policy {
|
|
23
|
+
id: string;
|
|
24
|
+
tenantId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description: string | null;
|
|
27
|
+
scannerIds: string[];
|
|
28
|
+
action: PolicyAction;
|
|
29
|
+
sensitivityThreshold: number;
|
|
30
|
+
isEnabled: boolean;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface DetectionResult {
|
|
35
|
+
id: string;
|
|
36
|
+
tenantId: string;
|
|
37
|
+
agentId: string | null;
|
|
38
|
+
safe: boolean;
|
|
39
|
+
categories: string[];
|
|
40
|
+
sensitivityScore: number;
|
|
41
|
+
findings: unknown[];
|
|
42
|
+
latencyMs: number;
|
|
43
|
+
requestId: string;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
}
|
|
46
|
+
export interface UsageLog {
|
|
47
|
+
id: string;
|
|
48
|
+
tenantId: string;
|
|
49
|
+
agentId: string | null;
|
|
50
|
+
endpoint: string;
|
|
51
|
+
statusCode: number;
|
|
52
|
+
responseSafe: boolean | null;
|
|
53
|
+
categories: string[];
|
|
54
|
+
latencyMs: number;
|
|
55
|
+
requestId: string;
|
|
56
|
+
createdAt: string;
|
|
57
|
+
}
|
|
58
|
+
export interface UsageSummary {
|
|
59
|
+
totalCalls: number;
|
|
60
|
+
safeCount: number;
|
|
61
|
+
unsafeCount: number;
|
|
62
|
+
}
|
|
63
|
+
export interface ScannerDefinition {
|
|
64
|
+
id: string;
|
|
65
|
+
tenantId: string;
|
|
66
|
+
scannerId: string;
|
|
67
|
+
name: string;
|
|
68
|
+
description: string;
|
|
69
|
+
config: Record<string, unknown>;
|
|
70
|
+
isEnabled: boolean;
|
|
71
|
+
isDefault: boolean;
|
|
72
|
+
}
|
|
73
|
+
export type MessageRole = "system" | "user" | "assistant" | "tool";
|
|
74
|
+
export interface CoreScannerDef {
|
|
75
|
+
scannerId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
description: string;
|
|
78
|
+
isEnabled: boolean;
|
|
79
|
+
}
|
|
80
|
+
export interface CoreDetectRequest {
|
|
81
|
+
messages: unknown[];
|
|
82
|
+
format?: "openai" | "anthropic" | "gemini" | "raw";
|
|
83
|
+
scanners: CoreScannerDef[];
|
|
84
|
+
role?: MessageRole;
|
|
85
|
+
}
|
|
86
|
+
export interface CoreDetectResponse {
|
|
87
|
+
safe: boolean;
|
|
88
|
+
verdict: "safe" | "unsafe";
|
|
89
|
+
categories: string[];
|
|
90
|
+
sensitivity_score: number;
|
|
91
|
+
findings: Array<{
|
|
92
|
+
scanner: string;
|
|
93
|
+
name: string;
|
|
94
|
+
description: string;
|
|
95
|
+
}>;
|
|
96
|
+
latency_ms: number;
|
|
97
|
+
request_id: string;
|
|
98
|
+
}
|
|
99
|
+
export interface ApiResponse<T = unknown> {
|
|
100
|
+
success: boolean;
|
|
101
|
+
data?: T;
|
|
102
|
+
error?: string;
|
|
103
|
+
}
|
|
104
|
+
export type Feature = "discovery" | "detection" | "protection";
|
|
105
|
+
export type TierId = "free" | "starter" | "pro" | "business" | "enterprise";
|
|
106
|
+
export interface TierConfig {
|
|
107
|
+
features: Feature[];
|
|
108
|
+
maxAgents: number;
|
|
109
|
+
}
|
|
110
|
+
export declare const TIERS: Record<TierId, TierConfig>;
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const TIERS = {
|
|
2
|
+
free: { features: ["discovery", "detection"], maxAgents: 1 },
|
|
3
|
+
starter: { features: ["discovery", "detection"], maxAgents: 3 },
|
|
4
|
+
pro: { features: ["discovery", "detection"], maxAgents: 5 },
|
|
5
|
+
business: { features: ["discovery", "detection", "protection"], maxAgents: 10 },
|
|
6
|
+
enterprise: { features: ["discovery", "detection", "protection"], maxAgents: 100 },
|
|
7
|
+
};
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function generateSessionToken(): string;
|
|
2
|
+
export declare function generateId(): string;
|
|
3
|
+
export declare function formatNumber(n: number): string;
|
|
4
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
5
|
+
export declare function maskSecret(value: string): string;
|
|
6
|
+
/** Format relative time (e.g. "2m ago", "3h ago") */
|
|
7
|
+
export declare function formatRelativeTime(dateStr: string | null): string;
|
|
8
|
+
/** Categorize a skill by name */
|
|
9
|
+
export declare function categorizeSkill(name: string): string;
|
|
10
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAWjE;AAED,iCAAiC;AACjC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { randomBytes } from "crypto";
|
|
2
|
+
import { SESSION_TOKEN_PREFIX } from "./constants.js";
|
|
3
|
+
export function generateSessionToken() {
|
|
4
|
+
return `${SESSION_TOKEN_PREFIX}${randomBytes(32).toString("hex")}`;
|
|
5
|
+
}
|
|
6
|
+
export function generateId() {
|
|
7
|
+
return crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
export function formatNumber(n) {
|
|
10
|
+
return n.toLocaleString("en-US");
|
|
11
|
+
}
|
|
12
|
+
export function sleep(ms) {
|
|
13
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
}
|
|
15
|
+
export function maskSecret(value) {
|
|
16
|
+
if (value.length <= 8)
|
|
17
|
+
return "****";
|
|
18
|
+
return "****" + value.slice(-4);
|
|
19
|
+
}
|
|
20
|
+
/** Format relative time (e.g. "2m ago", "3h ago") */
|
|
21
|
+
export function formatRelativeTime(dateStr) {
|
|
22
|
+
if (!dateStr)
|
|
23
|
+
return "never";
|
|
24
|
+
const diff = Date.now() - new Date(dateStr).getTime();
|
|
25
|
+
const seconds = Math.floor(diff / 1000);
|
|
26
|
+
if (seconds < 60)
|
|
27
|
+
return "just now";
|
|
28
|
+
const minutes = Math.floor(seconds / 60);
|
|
29
|
+
if (minutes < 60)
|
|
30
|
+
return `${minutes}m ago`;
|
|
31
|
+
const hours = Math.floor(minutes / 60);
|
|
32
|
+
if (hours < 24)
|
|
33
|
+
return `${hours}h ago`;
|
|
34
|
+
const days = Math.floor(hours / 24);
|
|
35
|
+
return `${days}d ago`;
|
|
36
|
+
}
|
|
37
|
+
/** Categorize a skill by name */
|
|
38
|
+
export function categorizeSkill(name) {
|
|
39
|
+
const n = name.toLowerCase();
|
|
40
|
+
if (n.includes("code") || n.includes("dev") || n.includes("debug"))
|
|
41
|
+
return "Development";
|
|
42
|
+
if (n.includes("write") || n.includes("doc") || n.includes("blog"))
|
|
43
|
+
return "Writing";
|
|
44
|
+
if (n.includes("search") || n.includes("web") || n.includes("browse"))
|
|
45
|
+
return "Research";
|
|
46
|
+
if (n.includes("deploy") || n.includes("ci") || n.includes("build"))
|
|
47
|
+
return "DevOps";
|
|
48
|
+
if (n.includes("data") || n.includes("sql") || n.includes("csv"))
|
|
49
|
+
return "Data";
|
|
50
|
+
return "Other";
|
|
51
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@opentrust/shared",
|
|
3
|
+
"version": "7.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"description": "Shared types and constants for the OpenTrust platform",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@types/node": "^22.0.0",
|
|
13
|
+
"typescript": "^5.7.0"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/opentrust/opentrust.git",
|
|
21
|
+
"directory": "dashboard/packages/shared"
|
|
22
|
+
},
|
|
23
|
+
"author": "OpenTrust",
|
|
24
|
+
"license": "Apache-2.0",
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc",
|
|
27
|
+
"dev": "tsc --watch"
|
|
28
|
+
}
|
|
29
|
+
}
|