agentid-sdk 0.1.24 → 0.1.26

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/index.mjs CHANGED
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  AgentID,
3
+ DependencyError,
3
4
  InjectionScanner,
4
5
  OpenAIAdapter,
5
6
  PIIManager,
6
7
  SecurityBlockError,
7
8
  getInjectionScanner,
8
9
  scanWithRegex
9
- } from "./chunk-JLHAS2EE.mjs";
10
+ } from "./chunk-JIQGHFHI.mjs";
10
11
 
11
12
  // src/transparency-badge.tsx
12
13
  import * as React from "react";
@@ -169,6 +170,7 @@ function AgentIDTransparencyBadge(props) {
169
170
  export {
170
171
  AgentID,
171
172
  AgentIDTransparencyBadge,
173
+ DependencyError,
172
174
  InjectionScanner,
173
175
  OpenAIAdapter,
174
176
  PIIManager,
@@ -1,5 +1,5 @@
1
1
  import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
2
- import { A as AgentID } from './agentid-BGCUoYV7.mjs';
2
+ import { A as AgentID } from './agentid-DviYzyAM.mjs';
3
3
 
4
4
  /**
5
5
  * LangChainJS callback handler (dependency-free shape).
@@ -12,9 +12,12 @@ declare class AgentIDCallbackHandler extends BaseCallbackHandler {
12
12
  private agent;
13
13
  private systemId;
14
14
  private apiKeyOverride?;
15
+ private expectedLanguages?;
15
16
  private runs;
16
17
  constructor(agent: AgentID, options: {
17
18
  system_id: string;
19
+ expected_languages?: string[];
20
+ expectedLanguages?: string[];
18
21
  apiKey?: string;
19
22
  api_key?: string;
20
23
  });
@@ -1,5 +1,5 @@
1
1
  import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
2
- import { A as AgentID } from './agentid-BGCUoYV7.js';
2
+ import { A as AgentID } from './agentid-DviYzyAM.js';
3
3
 
4
4
  /**
5
5
  * LangChainJS callback handler (dependency-free shape).
@@ -12,9 +12,12 @@ declare class AgentIDCallbackHandler extends BaseCallbackHandler {
12
12
  private agent;
13
13
  private systemId;
14
14
  private apiKeyOverride?;
15
+ private expectedLanguages?;
15
16
  private runs;
16
17
  constructor(agent: AgentID, options: {
17
18
  system_id: string;
19
+ expected_languages?: string[];
20
+ expectedLanguages?: string[];
18
21
  apiKey?: string;
19
22
  api_key?: string;
20
23
  });
package/dist/langchain.js CHANGED
@@ -27,7 +27,7 @@ var import_base = require("@langchain/core/callbacks/base");
27
27
 
28
28
  // src/sdk-version.ts
29
29
  var FALLBACK_SDK_VERSION = "js-0.0.0-dev";
30
- var AGENTID_SDK_VERSION_HEADER = "js-0.1.24".trim().length > 0 ? "js-0.1.24" : FALLBACK_SDK_VERSION;
30
+ var AGENTID_SDK_VERSION_HEADER = "js-0.1.26".trim().length > 0 ? "js-0.1.26" : FALLBACK_SDK_VERSION;
31
31
 
32
32
  // src/pii-national-identifiers.ts
33
33
  var REGION_ANCHORS = {
@@ -215,6 +215,15 @@ var SecurityBlockError = class extends Error {
215
215
  function safeString(val) {
216
216
  return typeof val === "string" ? val : "";
217
217
  }
218
+ function normalizeExpectedLanguages(value) {
219
+ if (!Array.isArray(value)) {
220
+ return void 0;
221
+ }
222
+ const normalized = [...new Set(
223
+ value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0)
224
+ )];
225
+ return normalized.length > 0 ? normalized : void 0;
226
+ }
218
227
  function coerceTransparencyMetadata(value) {
219
228
  if (!value || typeof value !== "object" || Array.isArray(value)) {
220
229
  return void 0;
@@ -245,6 +254,14 @@ function logCallbackDebug(message, details) {
245
254
  }
246
255
  console.log(`[AgentID][LC] ${message}`);
247
256
  }
257
+ function setFiniteDurationMetadata(metadata, key, value) {
258
+ if (typeof value === "number" && Number.isFinite(value)) {
259
+ metadata[key] = Math.max(0, Math.trunc(value));
260
+ }
261
+ }
262
+ function isGuardFailureEligibleForLocalFallback(reason) {
263
+ return reason === "network_error_strict_mode" || reason === "server_error" || reason === "system_failure" || reason === "system_failure_db_unavailable" || reason === "logging_failed" || reason === "guard_unreachable" || reason === "api_key_pepper_missing" || reason === "encryption_key_missing";
264
+ }
248
265
  function extractTextFromContent(content) {
249
266
  if (typeof content === "string") {
250
267
  return content;
@@ -452,15 +469,16 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
452
469
  this.runs = /* @__PURE__ */ new Map();
453
470
  this.agent = agent;
454
471
  this.systemId = options.system_id;
472
+ this.expectedLanguages = normalizeExpectedLanguages(
473
+ options.expected_languages ?? options.expectedLanguages
474
+ );
455
475
  this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
456
476
  }
457
477
  get requestOptions() {
458
478
  return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
459
479
  }
460
480
  getLangchainCapabilities() {
461
- const piiMaskingEnabled = Boolean(
462
- this.agent.piiMasking
463
- );
481
+ const piiMaskingEnabled = this.agent.getEffectivePiiMasking(this.requestOptions);
464
482
  return {
465
483
  capabilities: {
466
484
  has_feedback_handler: true,
@@ -469,15 +487,14 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
469
487
  }
470
488
  };
471
489
  }
472
- async preflight(input, stream) {
473
- await this.agent.scanPromptInjection(input, this.requestOptions);
490
+ async preflight(input, stream, clientEventId) {
474
491
  const prepared = await this.agent.prepareInputForDispatch({
475
492
  input,
476
493
  systemId: this.systemId,
477
494
  stream,
478
- skipInjectionScan: true
495
+ clientEventId
479
496
  }, this.requestOptions);
480
- return prepared.sanitizedInput;
497
+ return prepared;
481
498
  }
482
499
  async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
483
500
  const input = extractPromptFromPrompts(prompts);
@@ -486,8 +503,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
486
503
  if (!input) {
487
504
  return;
488
505
  }
506
+ const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
489
507
  const stream = extractStreamFlag(serialized, extraParams);
490
- const sanitizedInput = await this.preflight(input, stream);
508
+ const prepared = await this.preflight(input, stream, requestedClientEventId);
509
+ const sanitizedInput = prepared.sanitizedInput;
491
510
  if (sanitizedInput !== input) {
492
511
  const mutated = setPromptInPrompts(prompts, sanitizedInput);
493
512
  if (!mutated) {
@@ -496,7 +515,6 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
496
515
  );
497
516
  }
498
517
  }
499
- const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
500
518
  const modelName = extractModel(serialized, extraParams);
501
519
  const pipelineStartedAtMs = Date.now();
502
520
  const verdict = await this.agent.guard({
@@ -504,20 +522,47 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
504
522
  system_id: this.systemId,
505
523
  model: modelName,
506
524
  client_event_id: requestedClientEventId,
525
+ expected_languages: this.expectedLanguages,
507
526
  client_capabilities: this.getLangchainCapabilities()
508
527
  }, this.requestOptions);
528
+ let transformedForRun = sanitizedInput;
529
+ let sdkLocalScanMs = prepared.sdkLocalScanMs;
530
+ let localFallbackApplied = false;
531
+ let localFallbackReason = null;
509
532
  if (!verdict.allowed) {
510
- throw new SecurityBlockError(verdict.reason ?? "guard_denied");
533
+ const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
534
+ if (fallbackEligible) {
535
+ const fallback = await this.agent.applyLocalFallbackForGuardFailure({
536
+ input: sanitizedInput,
537
+ systemId: this.systemId,
538
+ stream,
539
+ clientEventId: requestedClientEventId,
540
+ capabilityConfig: prepared.capabilityConfig,
541
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs
542
+ }, this.requestOptions);
543
+ transformedForRun = fallback.sanitizedInput;
544
+ sdkLocalScanMs = fallback.sdkLocalScanMs;
545
+ localFallbackApplied = true;
546
+ localFallbackReason = verdict.reason ?? "guard_unreachable";
547
+ } else {
548
+ throw new SecurityBlockError(verdict.reason ?? "guard_denied");
549
+ }
550
+ }
551
+ if (transformedForRun !== sanitizedInput) {
552
+ const mutated = setPromptInPrompts(prompts, transformedForRun);
553
+ if (!mutated) {
554
+ transformedForRun = sanitizedInput;
555
+ }
511
556
  }
512
557
  const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
513
558
  const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
514
559
  const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
515
560
  const transparency = coerceTransparencyMetadata(verdict.transparency);
516
- let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : sanitizedInput;
517
- if (transformedInput !== sanitizedInput) {
561
+ let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
562
+ if (transformedInput !== transformedForRun) {
518
563
  const mutated = setPromptInPrompts(prompts, transformedInput);
519
564
  if (!mutated) {
520
- transformedInput = sanitizedInput;
565
+ transformedInput = transformedForRun;
521
566
  }
522
567
  }
523
568
  this.runs.set(id, {
@@ -525,6 +570,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
525
570
  startedAtMs: Date.now(),
526
571
  pipelineStartedAtMs,
527
572
  guardLatencyMs,
573
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
574
+ sdkLocalScanMs,
575
+ localFallbackApplied,
576
+ localFallbackReason,
528
577
  model: modelName,
529
578
  clientEventId: canonicalClientEventId,
530
579
  guardEventId,
@@ -543,8 +592,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
543
592
  if (!input) {
544
593
  return;
545
594
  }
595
+ const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
546
596
  const stream = extractStreamFlag(serialized, extraParams);
547
- const sanitizedInput = await this.preflight(input, stream);
597
+ const prepared = await this.preflight(input, stream, requestedClientEventId);
598
+ const sanitizedInput = prepared.sanitizedInput;
548
599
  if (sanitizedInput !== input) {
549
600
  const mutated = setPromptInMessages(messages, sanitizedInput);
550
601
  if (!mutated) {
@@ -553,7 +604,6 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
553
604
  );
554
605
  }
555
606
  }
556
- const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
557
607
  const modelName = extractModel(serialized, extraParams);
558
608
  const pipelineStartedAtMs = Date.now();
559
609
  const verdict = await this.agent.guard({
@@ -561,20 +611,47 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
561
611
  system_id: this.systemId,
562
612
  model: modelName,
563
613
  client_event_id: requestedClientEventId,
614
+ expected_languages: this.expectedLanguages,
564
615
  client_capabilities: this.getLangchainCapabilities()
565
616
  }, this.requestOptions);
617
+ let transformedForRun = sanitizedInput;
618
+ let sdkLocalScanMs = prepared.sdkLocalScanMs;
619
+ let localFallbackApplied = false;
620
+ let localFallbackReason = null;
566
621
  if (!verdict.allowed) {
567
- throw new SecurityBlockError(verdict.reason ?? "guard_denied");
622
+ const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
623
+ if (fallbackEligible) {
624
+ const fallback = await this.agent.applyLocalFallbackForGuardFailure({
625
+ input: sanitizedInput,
626
+ systemId: this.systemId,
627
+ stream,
628
+ clientEventId: requestedClientEventId,
629
+ capabilityConfig: prepared.capabilityConfig,
630
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs
631
+ }, this.requestOptions);
632
+ transformedForRun = fallback.sanitizedInput;
633
+ sdkLocalScanMs = fallback.sdkLocalScanMs;
634
+ localFallbackApplied = true;
635
+ localFallbackReason = verdict.reason ?? "guard_unreachable";
636
+ } else {
637
+ throw new SecurityBlockError(verdict.reason ?? "guard_denied");
638
+ }
639
+ }
640
+ if (transformedForRun !== sanitizedInput) {
641
+ const mutated = setPromptInMessages(messages, transformedForRun);
642
+ if (!mutated) {
643
+ transformedForRun = sanitizedInput;
644
+ }
568
645
  }
569
646
  const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
570
647
  const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
571
648
  const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
572
649
  const transparency = coerceTransparencyMetadata(verdict.transparency);
573
- let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : sanitizedInput;
574
- if (transformedInput !== sanitizedInput) {
650
+ let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
651
+ if (transformedInput !== transformedForRun) {
575
652
  const mutated = setPromptInMessages(messages, transformedInput);
576
653
  if (!mutated) {
577
- transformedInput = sanitizedInput;
654
+ transformedInput = transformedForRun;
578
655
  }
579
656
  }
580
657
  this.runs.set(id, {
@@ -582,6 +659,10 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
582
659
  startedAtMs: Date.now(),
583
660
  pipelineStartedAtMs,
584
661
  guardLatencyMs,
662
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
663
+ sdkLocalScanMs,
664
+ localFallbackApplied,
665
+ localFallbackReason,
585
666
  model: modelName,
586
667
  clientEventId: canonicalClientEventId,
587
668
  guardEventId,
@@ -618,7 +699,12 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
618
699
  }
619
700
  if (typeof state.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
620
701
  metadata.guard_latency_ms = state.guardLatencyMs;
702
+ metadata.sdk_guard_ms = state.guardLatencyMs;
621
703
  }
704
+ setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state.sdkConfigFetchMs);
705
+ setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state.sdkLocalScanMs);
706
+ metadata.sdk_local_fallback_applied = state.localFallbackApplied === true;
707
+ metadata.sdk_local_fallback_reason = state.localFallbackReason ?? null;
622
708
  if (state.transparency) {
623
709
  metadata.transparency = state.transparency;
624
710
  }
@@ -658,7 +744,12 @@ var AgentIDCallbackHandler = class extends import_base.BaseCallbackHandler {
658
744
  }
659
745
  if (typeof state?.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
660
746
  metadata.guard_latency_ms = state.guardLatencyMs;
747
+ metadata.sdk_guard_ms = state.guardLatencyMs;
661
748
  }
749
+ setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state?.sdkConfigFetchMs);
750
+ setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state?.sdkLocalScanMs);
751
+ metadata.sdk_local_fallback_applied = state?.localFallbackApplied === true;
752
+ metadata.sdk_local_fallback_reason = state?.localFallbackReason ?? null;
662
753
  if (state?.transparency) {
663
754
  metadata.transparency = state.transparency;
664
755
  }
@@ -1,12 +1,21 @@
1
1
  import {
2
2
  SecurityBlockError
3
- } from "./chunk-JLHAS2EE.mjs";
3
+ } from "./chunk-JIQGHFHI.mjs";
4
4
 
5
5
  // src/langchain.ts
6
6
  import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
7
7
  function safeString(val) {
8
8
  return typeof val === "string" ? val : "";
9
9
  }
10
+ function normalizeExpectedLanguages(value) {
11
+ if (!Array.isArray(value)) {
12
+ return void 0;
13
+ }
14
+ const normalized = [...new Set(
15
+ value.map((entry) => typeof entry === "string" ? entry.trim() : "").filter((entry) => entry.length > 0)
16
+ )];
17
+ return normalized.length > 0 ? normalized : void 0;
18
+ }
10
19
  function coerceTransparencyMetadata(value) {
11
20
  if (!value || typeof value !== "object" || Array.isArray(value)) {
12
21
  return void 0;
@@ -37,6 +46,14 @@ function logCallbackDebug(message, details) {
37
46
  }
38
47
  console.log(`[AgentID][LC] ${message}`);
39
48
  }
49
+ function setFiniteDurationMetadata(metadata, key, value) {
50
+ if (typeof value === "number" && Number.isFinite(value)) {
51
+ metadata[key] = Math.max(0, Math.trunc(value));
52
+ }
53
+ }
54
+ function isGuardFailureEligibleForLocalFallback(reason) {
55
+ return reason === "network_error_strict_mode" || reason === "server_error" || reason === "system_failure" || reason === "system_failure_db_unavailable" || reason === "logging_failed" || reason === "guard_unreachable" || reason === "api_key_pepper_missing" || reason === "encryption_key_missing";
56
+ }
40
57
  function extractTextFromContent(content) {
41
58
  if (typeof content === "string") {
42
59
  return content;
@@ -244,15 +261,16 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
244
261
  this.runs = /* @__PURE__ */ new Map();
245
262
  this.agent = agent;
246
263
  this.systemId = options.system_id;
264
+ this.expectedLanguages = normalizeExpectedLanguages(
265
+ options.expected_languages ?? options.expectedLanguages
266
+ );
247
267
  this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
248
268
  }
249
269
  get requestOptions() {
250
270
  return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
251
271
  }
252
272
  getLangchainCapabilities() {
253
- const piiMaskingEnabled = Boolean(
254
- this.agent.piiMasking
255
- );
273
+ const piiMaskingEnabled = this.agent.getEffectivePiiMasking(this.requestOptions);
256
274
  return {
257
275
  capabilities: {
258
276
  has_feedback_handler: true,
@@ -261,15 +279,14 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
261
279
  }
262
280
  };
263
281
  }
264
- async preflight(input, stream) {
265
- await this.agent.scanPromptInjection(input, this.requestOptions);
282
+ async preflight(input, stream, clientEventId) {
266
283
  const prepared = await this.agent.prepareInputForDispatch({
267
284
  input,
268
285
  systemId: this.systemId,
269
286
  stream,
270
- skipInjectionScan: true
287
+ clientEventId
271
288
  }, this.requestOptions);
272
- return prepared.sanitizedInput;
289
+ return prepared;
273
290
  }
274
291
  async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
275
292
  const input = extractPromptFromPrompts(prompts);
@@ -278,8 +295,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
278
295
  if (!input) {
279
296
  return;
280
297
  }
298
+ const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
281
299
  const stream = extractStreamFlag(serialized, extraParams);
282
- const sanitizedInput = await this.preflight(input, stream);
300
+ const prepared = await this.preflight(input, stream, requestedClientEventId);
301
+ const sanitizedInput = prepared.sanitizedInput;
283
302
  if (sanitizedInput !== input) {
284
303
  const mutated = setPromptInPrompts(prompts, sanitizedInput);
285
304
  if (!mutated) {
@@ -288,7 +307,6 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
288
307
  );
289
308
  }
290
309
  }
291
- const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
292
310
  const modelName = extractModel(serialized, extraParams);
293
311
  const pipelineStartedAtMs = Date.now();
294
312
  const verdict = await this.agent.guard({
@@ -296,20 +314,47 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
296
314
  system_id: this.systemId,
297
315
  model: modelName,
298
316
  client_event_id: requestedClientEventId,
317
+ expected_languages: this.expectedLanguages,
299
318
  client_capabilities: this.getLangchainCapabilities()
300
319
  }, this.requestOptions);
320
+ let transformedForRun = sanitizedInput;
321
+ let sdkLocalScanMs = prepared.sdkLocalScanMs;
322
+ let localFallbackApplied = false;
323
+ let localFallbackReason = null;
301
324
  if (!verdict.allowed) {
302
- throw new SecurityBlockError(verdict.reason ?? "guard_denied");
325
+ const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
326
+ if (fallbackEligible) {
327
+ const fallback = await this.agent.applyLocalFallbackForGuardFailure({
328
+ input: sanitizedInput,
329
+ systemId: this.systemId,
330
+ stream,
331
+ clientEventId: requestedClientEventId,
332
+ capabilityConfig: prepared.capabilityConfig,
333
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs
334
+ }, this.requestOptions);
335
+ transformedForRun = fallback.sanitizedInput;
336
+ sdkLocalScanMs = fallback.sdkLocalScanMs;
337
+ localFallbackApplied = true;
338
+ localFallbackReason = verdict.reason ?? "guard_unreachable";
339
+ } else {
340
+ throw new SecurityBlockError(verdict.reason ?? "guard_denied");
341
+ }
342
+ }
343
+ if (transformedForRun !== sanitizedInput) {
344
+ const mutated = setPromptInPrompts(prompts, transformedForRun);
345
+ if (!mutated) {
346
+ transformedForRun = sanitizedInput;
347
+ }
303
348
  }
304
349
  const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
305
350
  const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
306
351
  const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
307
352
  const transparency = coerceTransparencyMetadata(verdict.transparency);
308
- let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : sanitizedInput;
309
- if (transformedInput !== sanitizedInput) {
353
+ let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
354
+ if (transformedInput !== transformedForRun) {
310
355
  const mutated = setPromptInPrompts(prompts, transformedInput);
311
356
  if (!mutated) {
312
- transformedInput = sanitizedInput;
357
+ transformedInput = transformedForRun;
313
358
  }
314
359
  }
315
360
  this.runs.set(id, {
@@ -317,6 +362,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
317
362
  startedAtMs: Date.now(),
318
363
  pipelineStartedAtMs,
319
364
  guardLatencyMs,
365
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
366
+ sdkLocalScanMs,
367
+ localFallbackApplied,
368
+ localFallbackReason,
320
369
  model: modelName,
321
370
  clientEventId: canonicalClientEventId,
322
371
  guardEventId,
@@ -335,8 +384,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
335
384
  if (!input) {
336
385
  return;
337
386
  }
387
+ const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
338
388
  const stream = extractStreamFlag(serialized, extraParams);
339
- const sanitizedInput = await this.preflight(input, stream);
389
+ const prepared = await this.preflight(input, stream, requestedClientEventId);
390
+ const sanitizedInput = prepared.sanitizedInput;
340
391
  if (sanitizedInput !== input) {
341
392
  const mutated = setPromptInMessages(messages, sanitizedInput);
342
393
  if (!mutated) {
@@ -345,7 +396,6 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
345
396
  );
346
397
  }
347
398
  }
348
- const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
349
399
  const modelName = extractModel(serialized, extraParams);
350
400
  const pipelineStartedAtMs = Date.now();
351
401
  const verdict = await this.agent.guard({
@@ -353,20 +403,47 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
353
403
  system_id: this.systemId,
354
404
  model: modelName,
355
405
  client_event_id: requestedClientEventId,
406
+ expected_languages: this.expectedLanguages,
356
407
  client_capabilities: this.getLangchainCapabilities()
357
408
  }, this.requestOptions);
409
+ let transformedForRun = sanitizedInput;
410
+ let sdkLocalScanMs = prepared.sdkLocalScanMs;
411
+ let localFallbackApplied = false;
412
+ let localFallbackReason = null;
358
413
  if (!verdict.allowed) {
359
- throw new SecurityBlockError(verdict.reason ?? "guard_denied");
414
+ const fallbackEligible = isGuardFailureEligibleForLocalFallback(verdict.reason) && verdict.reason !== "guard_denied";
415
+ if (fallbackEligible) {
416
+ const fallback = await this.agent.applyLocalFallbackForGuardFailure({
417
+ input: sanitizedInput,
418
+ systemId: this.systemId,
419
+ stream,
420
+ clientEventId: requestedClientEventId,
421
+ capabilityConfig: prepared.capabilityConfig,
422
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs
423
+ }, this.requestOptions);
424
+ transformedForRun = fallback.sanitizedInput;
425
+ sdkLocalScanMs = fallback.sdkLocalScanMs;
426
+ localFallbackApplied = true;
427
+ localFallbackReason = verdict.reason ?? "guard_unreachable";
428
+ } else {
429
+ throw new SecurityBlockError(verdict.reason ?? "guard_denied");
430
+ }
431
+ }
432
+ if (transformedForRun !== sanitizedInput) {
433
+ const mutated = setPromptInMessages(messages, transformedForRun);
434
+ if (!mutated) {
435
+ transformedForRun = sanitizedInput;
436
+ }
360
437
  }
361
438
  const canonicalClientEventId = isUuidLike(verdict.client_event_id) ? verdict.client_event_id.trim() : requestedClientEventId;
362
439
  const guardEventId = typeof verdict.guard_event_id === "string" && verdict.guard_event_id.length > 0 ? verdict.guard_event_id : void 0;
363
440
  const guardLatencyMs = typeof verdict.guard_latency_ms === "number" && Number.isFinite(verdict.guard_latency_ms) ? Math.max(0, Math.trunc(verdict.guard_latency_ms)) : Math.max(0, Date.now() - pipelineStartedAtMs);
364
441
  const transparency = coerceTransparencyMetadata(verdict.transparency);
365
- let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : sanitizedInput;
366
- if (transformedInput !== sanitizedInput) {
442
+ let transformedInput = typeof verdict.transformed_input === "string" && verdict.transformed_input.length > 0 ? verdict.transformed_input : transformedForRun;
443
+ if (transformedInput !== transformedForRun) {
367
444
  const mutated = setPromptInMessages(messages, transformedInput);
368
445
  if (!mutated) {
369
- transformedInput = sanitizedInput;
446
+ transformedInput = transformedForRun;
370
447
  }
371
448
  }
372
449
  this.runs.set(id, {
@@ -374,6 +451,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
374
451
  startedAtMs: Date.now(),
375
452
  pipelineStartedAtMs,
376
453
  guardLatencyMs,
454
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
455
+ sdkLocalScanMs,
456
+ localFallbackApplied,
457
+ localFallbackReason,
377
458
  model: modelName,
378
459
  clientEventId: canonicalClientEventId,
379
460
  guardEventId,
@@ -410,7 +491,12 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
410
491
  }
411
492
  if (typeof state.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
412
493
  metadata.guard_latency_ms = state.guardLatencyMs;
494
+ metadata.sdk_guard_ms = state.guardLatencyMs;
413
495
  }
496
+ setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state.sdkConfigFetchMs);
497
+ setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state.sdkLocalScanMs);
498
+ metadata.sdk_local_fallback_applied = state.localFallbackApplied === true;
499
+ metadata.sdk_local_fallback_reason = state.localFallbackReason ?? null;
414
500
  if (state.transparency) {
415
501
  metadata.transparency = state.transparency;
416
502
  }
@@ -450,7 +536,12 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
450
536
  }
451
537
  if (typeof state?.guardLatencyMs === "number" && Number.isFinite(state.guardLatencyMs)) {
452
538
  metadata.guard_latency_ms = state.guardLatencyMs;
539
+ metadata.sdk_guard_ms = state.guardLatencyMs;
453
540
  }
541
+ setFiniteDurationMetadata(metadata, "sdk_config_fetch_ms", state?.sdkConfigFetchMs);
542
+ setFiniteDurationMetadata(metadata, "sdk_local_scan_ms", state?.sdkLocalScanMs);
543
+ metadata.sdk_local_fallback_applied = state?.localFallbackApplied === true;
544
+ metadata.sdk_local_fallback_reason = state?.localFallbackReason ?? null;
454
545
  if (state?.transparency) {
455
546
  metadata.transparency = state.transparency;
456
547
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentid-sdk",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "description": "AgentID JavaScript/TypeScript SDK for guard, ingest, tracing, and analytics.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://agentid.ai",