@averta-security/sdk-core 0.1.0-beta.0 → 0.1.0-beta.1

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 CHANGED
@@ -40,8 +40,7 @@ The public surface includes:
40
40
  import { AvertaDecisionClient } from "@averta-security/sdk-core";
41
41
 
42
42
  const client = new AvertaDecisionClient({
43
- avertaApiKey: process.env.AVERTA_API_KEY!,
44
- sdk: {
43
+ clientMetadata: {
45
44
  name: "custom-adapter",
46
45
  version: "0.1.0",
47
46
  },
@@ -50,11 +49,11 @@ const client = new AvertaDecisionClient({
50
49
 
51
50
  Options:
52
51
 
53
- - `avertaApiKey`: required Averta API key.
52
+ - `avertaApiKey`: optional Averta API key. Defaults to `process.env.AVERTA_API_KEY`.
54
53
  - `avertaBaseUrl`: optional Averta API base URL. Defaults to `https://api.averta.io`.
55
54
  - `decisionTimeoutMs`: optional decision request timeout in milliseconds. Defaults to `30000`. Set to `0` to disable the SDK-managed timeout.
56
55
  - `fetch`: optional custom `fetch` implementation.
57
- - `sdk`: adapter name and version metadata sent to Averta.
56
+ - `clientMetadata`: adapter name and version metadata. `sdk-core` sends this over the wire as `client: { type: "sdk", ...clientMetadata }`.
58
57
 
59
58
  ## Errors
60
59
 
@@ -1,12 +1,12 @@
1
1
  import type { DecisionClientOptions, DecisionPreflightInput, OutputDecisionInput, DecisionResponse, ToolCallDecisionInput, ToolResultDecisionInput } from "./types.ts";
2
2
  export declare class AvertaDecisionClient {
3
3
  private readonly avertaBaseUrl;
4
+ private readonly clientMetadata;
4
5
  private readonly decisionTimeoutMs;
5
6
  private readonly fetchImpl;
6
- private readonly sdk;
7
7
  constructor(options: DecisionClientOptions);
8
8
  private readonly avertaApiKey;
9
- preflight(input: Omit<DecisionPreflightInput, "sdk">): Promise<DecisionResponse>;
9
+ preflight(input: DecisionPreflightInput): Promise<DecisionResponse>;
10
10
  checkToolCall(input: ToolCallDecisionInput): Promise<DecisionResponse>;
11
11
  checkToolResult(input: ToolResultDecisionInput): Promise<DecisionResponse>;
12
12
  checkOutput(input: OutputDecisionInput): Promise<DecisionResponse>;
@@ -1,4 +1,5 @@
1
1
  import { AvertaSdkError } from "./errors.js";
2
+ import { resolveAvertaApiKey } from "./env.js";
2
3
  import { ensureRequestContext } from "./ids.js";
3
4
  import { isObject } from "./values.js";
4
5
  const DEFAULT_AVERTA_BASE_URL = "https://api.averta.io";
@@ -155,6 +156,18 @@ function toToolsPayload(tools) {
155
156
  type: tool.type,
156
157
  }));
157
158
  }
159
+ function toMediaPayload(media) {
160
+ if (!media) {
161
+ return undefined;
162
+ }
163
+ return media.map((item) => ({
164
+ data_base64: item.dataBase64,
165
+ ...(item.filename ? { filename: item.filename } : {}),
166
+ ...(item.id ? { id: item.id } : {}),
167
+ kind: item.kind,
168
+ mime_type: item.mimeType,
169
+ }));
170
+ }
158
171
  function toToolCallPayload(toolCall) {
159
172
  return {
160
173
  ...(toolCall.arguments && toolCall.arguments.value !== undefined
@@ -204,6 +217,7 @@ function toToolCallContextPayload(context) {
204
217
  function toCheckpointPayload(input) {
205
218
  if (input.checkpointType === "request") {
206
219
  return {
220
+ ...(input.media ? { media: toMediaPayload(input.media) } : {}),
207
221
  payload: input.payload,
208
222
  ...(input.tools ? { tools: toToolsPayload(input.tools) } : {}),
209
223
  };
@@ -299,20 +313,21 @@ function createDecisionAbortState(input) {
299
313
  }
300
314
  export class AvertaDecisionClient {
301
315
  avertaBaseUrl;
316
+ clientMetadata;
302
317
  decisionTimeoutMs;
303
318
  fetchImpl;
304
- sdk;
305
319
  constructor(options) {
306
320
  this.avertaBaseUrl = options.avertaBaseUrl ?? DEFAULT_AVERTA_BASE_URL;
321
+ this.clientMetadata = options.clientMetadata;
307
322
  this.decisionTimeoutMs = normalizeDecisionTimeoutMs(options.decisionTimeoutMs);
308
323
  this.fetchImpl = options.fetch ?? fetch;
309
- this.sdk = options.sdk;
310
- this.avertaApiKey = options.avertaApiKey;
324
+ this.avertaApiKey = resolveAvertaApiKey(options.avertaApiKey);
311
325
  }
312
326
  avertaApiKey;
313
327
  async preflight(input) {
314
328
  const response = await this.sendDecisionRequest({
315
329
  checkpointType: "request",
330
+ ...(input.media ? { media: input.media } : {}),
316
331
  provider: input.provider,
317
332
  payload: input.payload,
318
333
  ...(input.tools ? { tools: input.tools } : {}),
@@ -416,7 +431,10 @@ export class AvertaDecisionClient {
416
431
  ...(abortState.signal ? { signal: abortState.signal } : {}),
417
432
  body: JSON.stringify({
418
433
  checkpoint_type: input.checkpointType,
419
- sdk: this.sdk,
434
+ client: {
435
+ type: "sdk",
436
+ ...this.clientMetadata,
437
+ },
420
438
  provider: toProviderPayload(input.provider),
421
439
  ...toCheckpointPayload(input),
422
440
  request_context: toRequestContextPayload(ensureRequestContext(input.requestContext)),
package/dist/env.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function readAvertaApiKeyFromEnv(): string | undefined;
2
+ export declare function resolveAvertaApiKey(avertaApiKey?: string): string;
package/dist/env.js ADDED
@@ -0,0 +1,14 @@
1
+ import { AvertaSdkError } from "./errors.js";
2
+ export function readAvertaApiKeyFromEnv() {
3
+ const value = globalThis.process?.env?.AVERTA_API_KEY;
4
+ const trimmed = typeof value === "string" ? value.trim() : "";
5
+ return trimmed || undefined;
6
+ }
7
+ export function resolveAvertaApiKey(avertaApiKey) {
8
+ const explicit = typeof avertaApiKey === "string" ? avertaApiKey.trim() : "";
9
+ const resolved = explicit || readAvertaApiKeyFromEnv();
10
+ if (!resolved) {
11
+ throw new AvertaSdkError("Averta API key is required. Pass avertaApiKey or set AVERTA_API_KEY.", "missing_averta_api_key");
12
+ }
13
+ return resolved;
14
+ }
@@ -1,7 +1,8 @@
1
1
  import { AvertaSdkError } from "./errors.ts";
2
- import type { AvertaProviderMetadata, AvertaRequestContext, DecisionPayload, DecisionResponse, NormalizedToolDefinition, OutputDecisionInput, ToolCallContext, ToolCallDecisionInput, ToolCallDecisionCandidate, ToolResultDecisionInput } from "./types.ts";
2
+ import type { AvertaProviderMetadata, AvertaRequestContext, DecisionMediaItem, DecisionPayload, DecisionResponse, NormalizedToolDefinition, OutputDecisionInput, ToolCallContext, ToolCallDecisionInput, ToolCallDecisionCandidate, ToolResultDecisionInput } from "./types.ts";
3
3
  type DecisionClientWithPreflight = {
4
4
  preflight(input: {
5
+ media?: DecisionMediaItem[];
5
6
  provider: AvertaProviderMetadata;
6
7
  payload: DecisionPayload;
7
8
  requestContext?: AvertaRequestContext;
@@ -46,6 +47,7 @@ export declare function prepareGuardedRequest<TTool>(input: {
46
47
  decisionClient: DecisionClientWithPreflight & DecisionClientWithToolResultDecision;
47
48
  filterTools: (tools: readonly TTool[] | undefined, blockedTools: readonly string[] | undefined) => TTool[] | undefined;
48
49
  getPreflightInput: () => {
50
+ media?: DecisionMediaItem[];
49
51
  payload: DecisionPayload;
50
52
  tools?: NormalizedToolDefinition[];
51
53
  };
@@ -91,6 +91,7 @@ export async function prepareGuardedRequest(input) {
91
91
  else {
92
92
  const preflightInput = input.getPreflightInput();
93
93
  const decision = await input.decisionClient.preflight({
94
+ media: preflightInput.media,
94
95
  provider: input.provider,
95
96
  payload: preflightInput.payload,
96
97
  requestContext: input.requestContext,
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export { AvertaDecisionClient } from "./decision-client.ts";
2
+ export { readAvertaApiKeyFromEnv, resolveAvertaApiKey } from "./env.ts";
2
3
  export { AvertaSdkError } from "./errors.ts";
3
4
  export { createRequestId, createTraceId, ensureRequestContext } from "./ids.ts";
4
5
  export { filterToolsByIdentity } from "./filter-tools.ts";
@@ -8,4 +9,4 @@ export { buildForwardedToolInput, omitProviderFields } from "./provider-input.ts
8
9
  export { StreamingOutputGuard } from "./streaming-output-guard.ts";
9
10
  export { isObject, readTrimmedString } from "./values.ts";
10
11
  export type { AvertaSdkErrorOptions, } from "./errors.ts";
11
- export type { AvertaProviderMetadata, AvertaRequestContext, AvertaSdkMetadata, DecisionClientOptions, DecisionPayload, DecisionPreflightInput, DecisionReason, DecisionResponse, DecisionRewriteAction, NormalizedToolDefinition, OutputDecisionInput, PreparedAvertaRequestContext, ToolCallContext, ToolCallContextMessage, ToolCallDecisionCandidate, ToolCallDecisionInput, ToolResultDecisionInput, } from "./types.ts";
12
+ export type { AvertaClientMetadata, AvertaProviderMetadata, AvertaRequestContext, DecisionMediaItem, DecisionClientOptions, DecisionPayload, DecisionPreflightInput, DecisionReason, DecisionResponse, DecisionRewriteAction, NormalizedToolDefinition, OutputDecisionInput, PreparedAvertaRequestContext, ToolCallContext, ToolCallContextMessage, ToolCallDecisionCandidate, ToolCallDecisionInput, ToolResultDecisionInput, } from "./types.ts";
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { AvertaDecisionClient } from "./decision-client.js";
2
+ export { readAvertaApiKeyFromEnv, resolveAvertaApiKey } from "./env.js";
2
3
  export { AvertaSdkError } from "./errors.js";
3
4
  export { createRequestId, createTraceId, ensureRequestContext } from "./ids.js";
4
5
  export { filterToolsByIdentity } from "./filter-tools.js";
package/dist/types.d.ts CHANGED
@@ -7,7 +7,7 @@ export type PreparedAvertaRequestContext = AvertaRequestContext & {
7
7
  requestId: string;
8
8
  traceId: string;
9
9
  };
10
- export type AvertaSdkMetadata = {
10
+ export type AvertaClientMetadata = {
11
11
  name: string;
12
12
  version: string;
13
13
  };
@@ -26,8 +26,15 @@ export type NormalizedToolDefinition = {
26
26
  export type DecisionPayload = {
27
27
  text: string;
28
28
  };
29
+ export type DecisionMediaItem = {
30
+ dataBase64: string;
31
+ filename?: string;
32
+ id?: string;
33
+ kind: "image";
34
+ mimeType: "image/jpeg" | "image/png" | "image/webp";
35
+ };
29
36
  export type DecisionPreflightInput = {
30
- sdk: AvertaSdkMetadata;
37
+ media?: DecisionMediaItem[];
31
38
  provider: AvertaProviderMetadata;
32
39
  payload: unknown;
33
40
  signal?: AbortSignal;
@@ -119,7 +126,7 @@ export type DecisionResponse = {
119
126
  };
120
127
  };
121
128
  export type DecisionClientOptions = {
122
- avertaApiKey: string;
129
+ avertaApiKey?: string;
123
130
  avertaBaseUrl?: string;
124
131
  /**
125
132
  * Maximum time to wait for an Averta decision request. Defaults to 30000.
@@ -127,5 +134,5 @@ export type DecisionClientOptions = {
127
134
  */
128
135
  decisionTimeoutMs?: number;
129
136
  fetch?: typeof fetch;
130
- sdk: AvertaSdkMetadata;
137
+ clientMetadata: AvertaClientMetadata;
131
138
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@averta-security/sdk-core",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.1.0-beta.1",
4
4
  "description": "Shared Averta SDK decision-plane runtime primitives.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "type": "module",