@groovysec/whiteout-ai 0.3.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/guard.js ADDED
@@ -0,0 +1,168 @@
1
+ import { WhiteoutBlockedError, WhiteoutConfigError, WhiteoutConnectionError, } from "./exceptions.js";
2
+ import { extractCallMetadata, extractResponseText } from "./extract.js";
3
+ /**
4
+ * WhiteoutGuard wraps AI API calls with policy enforcement.
5
+ *
6
+ * Three integration patterns:
7
+ * 1. await guard.evaluate({ prompt }) — check before you call yourself
8
+ * 2. await guard.wrap(openai.chat.completions.create, options) — wrap an SDK call
9
+ * 3. catch WhiteoutBlockedError to handle policy blocks gracefully
10
+ */
11
+ export class WhiteoutGuard {
12
+ token;
13
+ backendUrl;
14
+ agentName;
15
+ resourceId;
16
+ resourceType;
17
+ mode;
18
+ timeoutMs;
19
+ failOpen;
20
+ agentId = "";
21
+ readyPromise;
22
+ constructor(opts) {
23
+ if (!opts.token)
24
+ throw new WhiteoutConfigError("token is required");
25
+ if (!opts.backendUrl)
26
+ throw new WhiteoutConfigError("backendUrl is required");
27
+ const pid = typeof process !== "undefined" && process.pid ? String(process.pid) : "node";
28
+ this.token = opts.token;
29
+ this.backendUrl = opts.backendUrl.replace(/\/+$/, "");
30
+ this.agentName = opts.agentName ?? `sdk-${pid}`;
31
+ this.resourceId = opts.resourceId ?? `sdk-${pid}`;
32
+ this.resourceType = opts.resourceType ?? "vm";
33
+ this.mode = opts.mode ?? "sdk";
34
+ this.timeoutMs = opts.timeoutMs ?? 10_000;
35
+ this.failOpen = opts.failOpen ?? true;
36
+ if (opts.register === false) {
37
+ this.readyPromise = Promise.resolve();
38
+ }
39
+ else {
40
+ this.readyPromise = this.registerOnce();
41
+ }
42
+ }
43
+ /** Await this before calling evaluate/wrap if you need registration to complete. */
44
+ ready() {
45
+ return this.readyPromise;
46
+ }
47
+ async registerOnce() {
48
+ try {
49
+ const data = await this.post("/infra-agent/register", {
50
+ token: this.token,
51
+ agent_name: this.agentName,
52
+ resource_id: this.resourceId,
53
+ resource_type: this.resourceType,
54
+ mode: this.mode,
55
+ });
56
+ this.agentId = data.agent_id ?? "";
57
+ }
58
+ catch (err) {
59
+ if (!this.failOpen) {
60
+ throw new WhiteoutConnectionError(`Registration failed: ${String(err)}`);
61
+ }
62
+ // fail-open: leave agentId empty; evaluate() will short-circuit.
63
+ }
64
+ }
65
+ async evaluate(input) {
66
+ await this.readyPromise;
67
+ if (!this.agentId) {
68
+ if (this.failOpen) {
69
+ return { decision: "allow", reason: "Not registered (fail-open)" };
70
+ }
71
+ throw new WhiteoutConnectionError("Not registered with backend");
72
+ }
73
+ try {
74
+ const result = await this.post("/infra-agent/evaluate", {
75
+ token: this.token,
76
+ agent_id: this.agentId,
77
+ prompt_text: input.prompt,
78
+ ai_provider: input.aiProvider ?? "unknown",
79
+ model: input.model ?? "",
80
+ endpoint: input.endpoint ?? "",
81
+ token_count_in: input.tokenCountIn,
82
+ });
83
+ if (result.decision === "block") {
84
+ throw new WhiteoutBlockedError({
85
+ reason: result.reason ?? "blocked",
86
+ violatedPolicies: result.violatedPolicies,
87
+ rule: result.rule,
88
+ });
89
+ }
90
+ return result;
91
+ }
92
+ catch (err) {
93
+ if (err instanceof WhiteoutBlockedError)
94
+ throw err;
95
+ if (this.failOpen)
96
+ return { decision: "allow", reason: `Backend error (fail-open): ${String(err)}` };
97
+ throw new WhiteoutConnectionError(`Evaluate failed: ${String(err)}`);
98
+ }
99
+ }
100
+ async evaluateResponse(responseText, evaluationId, opts = {}) {
101
+ if (!this.agentId)
102
+ return { decision: "allow", reason: "Not registered" };
103
+ try {
104
+ return await this.post("/infra-agent/evaluate-response", {
105
+ token: this.token,
106
+ agent_id: this.agentId,
107
+ evaluation_id: evaluationId,
108
+ response_text: responseText,
109
+ ai_provider: opts.aiProvider ?? "unknown",
110
+ model: opts.model ?? "",
111
+ });
112
+ }
113
+ catch (err) {
114
+ return { decision: "allow", reason: `Backend error: ${String(err)}` };
115
+ }
116
+ }
117
+ /**
118
+ * Wrap an AI SDK call. Extracts prompt/model/provider from the call args,
119
+ * evaluates pre-call, runs the call, and asynchronously scans the response.
120
+ *
121
+ * Throws WhiteoutBlockedError if the pre-call evaluation blocks.
122
+ */
123
+ async wrap(fn, ...args) {
124
+ const meta = extractCallMetadata(args);
125
+ let evaluationId;
126
+ if (meta.prompt) {
127
+ const result = await this.evaluate({
128
+ prompt: meta.prompt,
129
+ aiProvider: meta.provider,
130
+ model: meta.model,
131
+ });
132
+ evaluationId = typeof result.evaluationId === "string" ? result.evaluationId : undefined;
133
+ }
134
+ const response = await fn(...args);
135
+ if (evaluationId) {
136
+ const text = extractResponseText(response);
137
+ if (text) {
138
+ // Don't await — response scanning is observation, not a gate.
139
+ void this.evaluateResponse(text, evaluationId, {
140
+ aiProvider: meta.provider,
141
+ model: meta.model,
142
+ });
143
+ }
144
+ }
145
+ return response;
146
+ }
147
+ async post(path, body) {
148
+ const controller = new AbortController();
149
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
150
+ try {
151
+ const resp = await fetch(`${this.backendUrl}${path}`, {
152
+ method: "POST",
153
+ headers: { "Content-Type": "application/json" },
154
+ body: JSON.stringify(body),
155
+ signal: controller.signal,
156
+ });
157
+ if (!resp.ok) {
158
+ const text = await resp.text().catch(() => "");
159
+ throw new Error(`backend ${resp.status}: ${text}`);
160
+ }
161
+ return (await resp.json());
162
+ }
163
+ finally {
164
+ clearTimeout(timer);
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { WhiteoutGuard } from "./guard.js";
2
+ export { AppGuard, normalizeMessages, applyQuarantine, cleanContext, DEFAULT_BASE_URL, SCAN_TARGETS, QUARANTINE_NOTICE, SDK_VERSION, } from "./appGuard.js";
3
+ export { instrument, uninstrument } from "./auto.js";
4
+ export type { AppGuardOptions, CheckInputOptions, CheckOutputOptions, ContextDoc, GuardConfig, GuardDecision, GuardMessage, ScanTarget, StreamMode, WhiteoutCallOptions, } from "./appGuard.js";
5
+ export type { GuardOptions, EvaluateInput, EvaluateResult } from "./guard.js";
6
+ export { WhiteoutError, WhiteoutConfigError, WhiteoutConnectionError, WhiteoutBlockedError, } from "./exceptions.js";
7
+ export { extractCallMetadata, extractResponseText } from "./extract.js";
8
+ export type { CallMetadata } from "./extract.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,GAC3H,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACV,UAAU,EACV,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { WhiteoutGuard } from "./guard.js";
2
+ export { AppGuard, normalizeMessages, applyQuarantine, cleanContext, DEFAULT_BASE_URL, SCAN_TARGETS, QUARANTINE_NOTICE, SDK_VERSION, } from "./appGuard.js";
3
+ export { instrument, uninstrument } from "./auto.js";
4
+ export { WhiteoutError, WhiteoutConfigError, WhiteoutConnectionError, WhiteoutBlockedError, } from "./exceptions.js";
5
+ export { extractCallMetadata, extractResponseText } from "./extract.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,GAC3H,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAcrD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Preload entry: `node --import @groovysec/whiteout-ai/register server.js`
3
+ * (or `NODE_OPTIONS="--import @groovysec/whiteout-ai/register"`). Arms
4
+ * auto-instrumentation before the app's own code runs. Never throws — a
5
+ * failure logs loudly and the app starts ungoverned.
6
+ */
7
+ import { instrument } from "./auto.js";
8
+ try {
9
+ const armed = await instrument();
10
+ if (armed.length)
11
+ console.info(`[Whiteout] auto-instrumentation armed for ${armed.join(", ")}`);
12
+ }
13
+ catch (e) {
14
+ console.error(`[Whiteout] auto-instrumentation failed to start: ${e.message} — calls are NOT governed`);
15
+ }
16
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,IAAI,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,6CAA6C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClG,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,KAAK,CAAC,oDAAqD,CAAW,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACrH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@groovysec/whiteout-ai",
3
+ "version": "0.3.0",
4
+ "description": "Whiteout AI governance SDK for Node.js. Add policy enforcement to any AI workload in three lines.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./auto": {
15
+ "types": "./dist/auto.d.ts",
16
+ "import": "./dist/auto.js"
17
+ },
18
+ "./register": {
19
+ "types": "./dist/register.d.ts",
20
+ "import": "./dist/register.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.build.json",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "lint": "tsc --noEmit"
33
+ },
34
+ "engines": {
35
+ "node": ">=18.19"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^20.0.0",
39
+ "typescript": "^5.4.0",
40
+ "vitest": "^1.6.0"
41
+ },
42
+ "keywords": [
43
+ "ai",
44
+ "governance",
45
+ "compliance",
46
+ "openai",
47
+ "anthropic",
48
+ "bedrock",
49
+ "vertex",
50
+ "whiteout"
51
+ ],
52
+ "author": "Groovy Security"
53
+ }