agentid-sdk 0.1.37 → 0.1.38

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.
@@ -1,14 +1,24 @@
1
1
  import {
2
2
  PIIManager,
3
- SecurityBlockError
4
- } from "./chunk-HWES3LI2.mjs";
3
+ SecurityBlockError,
4
+ createAgentIdTelemetryContext
5
+ } from "./chunk-AIGMQSAV.mjs";
5
6
 
6
7
  // src/langchain.ts
7
8
  import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
8
9
  var piiManager = new PIIManager();
10
+ var LANGCHAIN_TELEMETRY_FIELD = "agentid_telemetry";
9
11
  function safeString(val) {
10
12
  return typeof val === "string" ? val : "";
11
13
  }
14
+ function firstNonEmptyString(...values) {
15
+ for (const value of values) {
16
+ if (typeof value === "string" && value.trim().length > 0) {
17
+ return value.trim();
18
+ }
19
+ }
20
+ return void 0;
21
+ }
12
22
  function normalizeExpectedLanguages(value) {
13
23
  if (!Array.isArray(value)) {
14
24
  return void 0;
@@ -18,6 +28,121 @@ function normalizeExpectedLanguages(value) {
18
28
  )];
19
29
  return normalized.length > 0 ? normalized : void 0;
20
30
  }
31
+ function isPlainRecord(value) {
32
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
33
+ }
34
+ function hasKnownTelemetryField(record) {
35
+ const knownKeys = [
36
+ "workflow_id",
37
+ "workflowId",
38
+ "workflow_run_id",
39
+ "workflowRunId",
40
+ "workflow_step_id",
41
+ "workflowStepId",
42
+ "workflow_name",
43
+ "workflowName",
44
+ "workflow_step_name",
45
+ "workflowStepName",
46
+ "workflow_step_index",
47
+ "workflowStepIndex",
48
+ "parent_event_id",
49
+ "parentEventId",
50
+ "tool_name",
51
+ "toolName",
52
+ "tool_target",
53
+ "toolTarget",
54
+ "tool_target_type",
55
+ "toolTargetType",
56
+ "event_title",
57
+ "eventTitle",
58
+ "event_status",
59
+ "eventStatus",
60
+ "event_category",
61
+ "eventCategory",
62
+ "event_subtype",
63
+ "eventSubtype"
64
+ ];
65
+ return knownKeys.some((key) => Object.prototype.hasOwnProperty.call(record, key));
66
+ }
67
+ function asTelemetryContext(value) {
68
+ if (!isPlainRecord(value)) {
69
+ return void 0;
70
+ }
71
+ return createAgentIdTelemetryContext(value);
72
+ }
73
+ function mergeTelemetryContexts(...contexts) {
74
+ const merged = {};
75
+ let hasValues = false;
76
+ for (const context of contexts) {
77
+ const normalized = createAgentIdTelemetryContext(context);
78
+ if (!normalized) {
79
+ continue;
80
+ }
81
+ Object.assign(merged, normalized);
82
+ hasValues = true;
83
+ }
84
+ return hasValues ? createAgentIdTelemetryContext(merged) : void 0;
85
+ }
86
+ function extractTelemetryFromRecord(record) {
87
+ const candidates = [];
88
+ const add = (value) => {
89
+ const telemetry = asTelemetryContext(value);
90
+ if (telemetry) {
91
+ candidates.push(telemetry);
92
+ }
93
+ };
94
+ add(record[LANGCHAIN_TELEMETRY_FIELD]);
95
+ add(record.agentidTelemetry);
96
+ const agentid = record.agentid;
97
+ if (isPlainRecord(agentid)) {
98
+ add(agentid.telemetry);
99
+ add(agentid.telemetryMetadata);
100
+ }
101
+ if (hasKnownTelemetryField(record)) {
102
+ add(record);
103
+ }
104
+ return mergeTelemetryContexts(...candidates);
105
+ }
106
+ function extractLangChainTelemetryContext(extraParams) {
107
+ if (!isPlainRecord(extraParams)) {
108
+ return void 0;
109
+ }
110
+ const contexts = [];
111
+ const addFromRecord = (record) => {
112
+ if (!isPlainRecord(record)) {
113
+ return;
114
+ }
115
+ const telemetry = extractTelemetryFromRecord(record);
116
+ if (telemetry) {
117
+ contexts.push(telemetry);
118
+ }
119
+ };
120
+ addFromRecord(extraParams);
121
+ addFromRecord(extraParams.metadata);
122
+ addFromRecord(extraParams.options);
123
+ if (isPlainRecord(extraParams.options)) {
124
+ addFromRecord(extraParams.options.metadata);
125
+ }
126
+ addFromRecord(extraParams.invocation_params);
127
+ if (isPlainRecord(extraParams.invocation_params)) {
128
+ addFromRecord(extraParams.invocation_params.metadata);
129
+ }
130
+ addFromRecord(extraParams.kwargs);
131
+ if (isPlainRecord(extraParams.kwargs)) {
132
+ addFromRecord(extraParams.kwargs.metadata);
133
+ }
134
+ return mergeTelemetryContexts(...contexts);
135
+ }
136
+ function extractTelemetryFromValues(...values) {
137
+ const contexts = [];
138
+ for (const value of values) {
139
+ const telemetry = extractLangChainTelemetryContext(value);
140
+ if (telemetry) {
141
+ contexts.push(telemetry);
142
+ }
143
+ }
144
+ return mergeTelemetryContexts(...contexts);
145
+ }
21
146
  function coerceTransparencyMetadata(value) {
22
147
  if (!value || typeof value !== "object" || Array.isArray(value)) {
23
148
  return void 0;
@@ -188,6 +313,40 @@ function extractModel(serialized, kwargs) {
188
313
  if (typeof name === "string" && name) return name;
189
314
  return void 0;
190
315
  }
316
+ function extractToolName(serialized, extras, telemetry) {
317
+ const serializedRecord = serialized && typeof serialized === "object" ? serialized : void 0;
318
+ const extraName = extras.find(
319
+ (value) => typeof value === "string" && value.trim().length > 0
320
+ );
321
+ return firstNonEmptyString(
322
+ telemetry?.tool_name,
323
+ telemetry?.toolName,
324
+ serializedRecord?.name,
325
+ serializedRecord?.id,
326
+ serializedRecord?.tool_name,
327
+ serializedRecord?.toolName,
328
+ extraName
329
+ );
330
+ }
331
+ function extractWorkflowName(serialized, extras, telemetry) {
332
+ const serializedRecord = serialized && typeof serialized === "object" ? serialized : void 0;
333
+ const extraName = extras.find(
334
+ (value) => typeof value === "string" && value.trim().length > 0
335
+ );
336
+ return firstNonEmptyString(
337
+ telemetry?.workflow_step_name,
338
+ telemetry?.workflowStepName,
339
+ telemetry?.workflow_name,
340
+ telemetry?.workflowName,
341
+ telemetry?.event_title,
342
+ telemetry?.eventTitle,
343
+ serializedRecord?.name,
344
+ serializedRecord?.id,
345
+ serializedRecord?.chain_name,
346
+ serializedRecord?.chainName,
347
+ extraName
348
+ );
349
+ }
191
350
  function extractModelFromOutput(output) {
192
351
  const llmOutput = output?.llmOutput ?? output?.llm_output;
193
352
  const llmModel = llmOutput?.model ?? llmOutput?.model_name ?? llmOutput?.modelName;
@@ -338,22 +497,28 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
338
497
  super();
339
498
  this.name = "agentid_callback_handler";
340
499
  this.runs = /* @__PURE__ */ new Map();
500
+ this.toolRuns = /* @__PURE__ */ new Map();
501
+ this.chainRuns = /* @__PURE__ */ new Map();
341
502
  this.agent = agent;
342
503
  this.systemId = options.system_id;
343
504
  this.expectedLanguages = normalizeExpectedLanguages(
344
505
  options.expected_languages ?? options.expectedLanguages
345
506
  );
346
507
  this.apiKeyOverride = options.apiKey?.trim() || options.api_key?.trim() || void 0;
508
+ this.telemetry = createAgentIdTelemetryContext(options.telemetry);
347
509
  }
348
510
  get requestOptions() {
349
511
  return this.apiKeyOverride ? { apiKey: this.apiKeyOverride } : void 0;
350
512
  }
351
- getLangchainCapabilities(piiMaskingEnabled) {
513
+ getLangchainCapabilities(piiMaskingEnabled, secretMaskingEnabled) {
352
514
  const resolvedPiiMaskingEnabled = typeof piiMaskingEnabled === "boolean" ? piiMaskingEnabled : this.agent.getEffectivePiiMasking(this.requestOptions);
515
+ const agentWithResolvedSecret = this.agent;
516
+ const resolvedSecretMaskingEnabled = typeof secretMaskingEnabled === "boolean" ? secretMaskingEnabled : typeof agentWithResolvedSecret.getEffectiveSecretMaskingForConfig === "function" ? agentWithResolvedSecret.getEffectiveSecretMaskingForConfig() : false;
353
517
  return {
354
518
  capabilities: {
355
519
  has_feedback_handler: true,
356
520
  pii_masking_enabled: resolvedPiiMaskingEnabled,
521
+ secret_masking_enabled: resolvedSecretMaskingEnabled,
357
522
  framework: "langchain"
358
523
  }
359
524
  };
@@ -365,15 +530,76 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
365
530
  }
366
531
  return this.agent.getEffectivePiiMasking(this.requestOptions);
367
532
  }
368
- async preflight(input, stream, clientEventId) {
533
+ resolvePreparedSecretMaskingEnabled(prepared) {
534
+ const agentWithResolvedConfig = this.agent;
535
+ if (typeof agentWithResolvedConfig.getEffectiveSecretMaskingForConfig === "function") {
536
+ return agentWithResolvedConfig.getEffectiveSecretMaskingForConfig(
537
+ prepared.capabilityConfig
538
+ );
539
+ }
540
+ return false;
541
+ }
542
+ async preflight(input, stream, clientEventId, telemetryMetadata) {
369
543
  const prepared = await this.agent.prepareInputForDispatch({
370
544
  input,
371
545
  systemId: this.systemId,
372
546
  stream,
373
- clientEventId
547
+ clientEventId,
548
+ telemetryMetadata
374
549
  }, this.requestOptions);
375
550
  return prepared;
376
551
  }
552
+ resolveTelemetry(extraParams) {
553
+ return mergeTelemetryContexts(
554
+ this.telemetry,
555
+ extractLangChainTelemetryContext(extraParams)
556
+ );
557
+ }
558
+ resolveParentEventContext(parentRunId) {
559
+ const parentId = String(parentRunId ?? "");
560
+ const llmRun = this.runs.get(parentId);
561
+ if (llmRun) {
562
+ return {
563
+ parentEventId: llmRun.clientEventId,
564
+ piiMaskingEnabled: llmRun.piiMaskingEnabled,
565
+ secretMaskingEnabled: llmRun.secretMaskingEnabled
566
+ };
567
+ }
568
+ const toolRun = this.toolRuns.get(parentId);
569
+ if (toolRun) {
570
+ return {
571
+ parentEventId: toolRun.startEventId,
572
+ piiMaskingEnabled: toolRun.piiMaskingEnabled,
573
+ secretMaskingEnabled: toolRun.secretMaskingEnabled
574
+ };
575
+ }
576
+ const chainRun = this.chainRuns.get(parentId);
577
+ if (chainRun) {
578
+ return {
579
+ parentEventId: chainRun.startEventId,
580
+ piiMaskingEnabled: chainRun.piiMaskingEnabled,
581
+ secretMaskingEnabled: chainRun.secretMaskingEnabled
582
+ };
583
+ }
584
+ return {};
585
+ }
586
+ async logWorkflowOperation(params, capabilityHints) {
587
+ const payload = this.agent.buildOperationLogParams({
588
+ system_id: this.systemId,
589
+ telemetry: params.telemetry,
590
+ metadata: params.metadata,
591
+ event_type: params.event_type,
592
+ event_status: params.event_status,
593
+ severity: params.severity,
594
+ latency: params.latency,
595
+ client_capabilities: this.getLangchainCapabilities(
596
+ capabilityHints?.piiMaskingEnabled,
597
+ capabilityHints?.secretMaskingEnabled
598
+ )
599
+ });
600
+ await this.agent.log(payload, this.requestOptions);
601
+ return payload;
602
+ }
377
603
  async handleLLMStart(serialized, prompts, runId, _parentRunId, extraParams) {
378
604
  const input = extractPromptFromPrompts(prompts);
379
605
  const id = String(runId ?? "");
@@ -383,9 +609,16 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
383
609
  }
384
610
  const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
385
611
  const stream = extractStreamFlag(serialized, extraParams);
386
- const prepared = await this.preflight(input, stream, requestedClientEventId);
612
+ const telemetryMetadata = this.resolveTelemetry(extraParams);
613
+ const prepared = await this.preflight(
614
+ input,
615
+ stream,
616
+ requestedClientEventId,
617
+ telemetryMetadata
618
+ );
387
619
  const sanitizedInput = prepared.sanitizedInput;
388
620
  const piiMaskingEnabled = this.resolvePreparedPiiMaskingEnabled(prepared);
621
+ const secretMaskingEnabled = this.resolvePreparedSecretMaskingEnabled(prepared);
389
622
  if (sanitizedInput !== input) {
390
623
  const mutated = setPromptInPrompts(prompts, sanitizedInput);
391
624
  if (!mutated) {
@@ -402,7 +635,11 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
402
635
  model: modelName,
403
636
  client_event_id: requestedClientEventId,
404
637
  expected_languages: this.expectedLanguages,
405
- client_capabilities: this.getLangchainCapabilities(piiMaskingEnabled)
638
+ metadata: telemetryMetadata,
639
+ client_capabilities: this.getLangchainCapabilities(
640
+ piiMaskingEnabled,
641
+ secretMaskingEnabled
642
+ )
406
643
  }, this.requestOptions);
407
644
  let transformedForRun = sanitizedInput;
408
645
  let sdkLocalScanMs = prepared.sdkLocalScanMs;
@@ -417,7 +654,8 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
417
654
  stream,
418
655
  clientEventId: requestedClientEventId,
419
656
  capabilityConfig: prepared.capabilityConfig,
420
- sdkConfigFetchMs: prepared.sdkConfigFetchMs
657
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
658
+ telemetryMetadata
421
659
  }, this.requestOptions);
422
660
  transformedForRun = fallback.sanitizedInput;
423
661
  sdkLocalScanMs = fallback.sdkLocalScanMs;
@@ -456,12 +694,14 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
456
694
  model: modelName,
457
695
  clientEventId: canonicalClientEventId,
458
696
  guardEventId,
697
+ telemetryMetadata,
459
698
  transparency,
460
699
  piiMapping: normalizePiiMapping(prepared.piiMapping),
461
700
  shouldDeanonymize: prepared.shouldDeanonymize === true,
462
701
  responseStreamed: stream,
463
702
  sdkConfigVersion: prepared.capabilityConfig?.version ?? null,
464
- piiMaskingEnabled
703
+ piiMaskingEnabled,
704
+ secretMaskingEnabled
465
705
  });
466
706
  logCallbackDebug("handleLLMStart state_set", {
467
707
  runId: id,
@@ -478,9 +718,16 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
478
718
  }
479
719
  const requestedClientEventId = isUuidLike(id) ? id.trim() : createClientEventId();
480
720
  const stream = extractStreamFlag(serialized, extraParams);
481
- const prepared = await this.preflight(input, stream, requestedClientEventId);
721
+ const telemetryMetadata = this.resolveTelemetry(extraParams);
722
+ const prepared = await this.preflight(
723
+ input,
724
+ stream,
725
+ requestedClientEventId,
726
+ telemetryMetadata
727
+ );
482
728
  const sanitizedInput = prepared.sanitizedInput;
483
729
  const piiMaskingEnabled = this.resolvePreparedPiiMaskingEnabled(prepared);
730
+ const secretMaskingEnabled = this.resolvePreparedSecretMaskingEnabled(prepared);
484
731
  if (sanitizedInput !== input) {
485
732
  const mutated = setPromptInMessages(messages, sanitizedInput);
486
733
  if (!mutated) {
@@ -497,7 +744,11 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
497
744
  model: modelName,
498
745
  client_event_id: requestedClientEventId,
499
746
  expected_languages: this.expectedLanguages,
500
- client_capabilities: this.getLangchainCapabilities(piiMaskingEnabled)
747
+ metadata: telemetryMetadata,
748
+ client_capabilities: this.getLangchainCapabilities(
749
+ piiMaskingEnabled,
750
+ secretMaskingEnabled
751
+ )
501
752
  }, this.requestOptions);
502
753
  let transformedForRun = sanitizedInput;
503
754
  let sdkLocalScanMs = prepared.sdkLocalScanMs;
@@ -512,7 +763,8 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
512
763
  stream,
513
764
  clientEventId: requestedClientEventId,
514
765
  capabilityConfig: prepared.capabilityConfig,
515
- sdkConfigFetchMs: prepared.sdkConfigFetchMs
766
+ sdkConfigFetchMs: prepared.sdkConfigFetchMs,
767
+ telemetryMetadata
516
768
  }, this.requestOptions);
517
769
  transformedForRun = fallback.sanitizedInput;
518
770
  sdkLocalScanMs = fallback.sdkLocalScanMs;
@@ -551,12 +803,14 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
551
803
  model: modelName,
552
804
  clientEventId: canonicalClientEventId,
553
805
  guardEventId,
806
+ telemetryMetadata,
554
807
  transparency,
555
808
  piiMapping: normalizePiiMapping(prepared.piiMapping),
556
809
  shouldDeanonymize: prepared.shouldDeanonymize === true,
557
810
  responseStreamed: stream,
558
811
  sdkConfigVersion: prepared.capabilityConfig?.version ?? null,
559
- piiMaskingEnabled
812
+ piiMaskingEnabled,
813
+ secretMaskingEnabled
560
814
  });
561
815
  logCallbackDebug("handleChatModelStart state_set", {
562
816
  runId: id,
@@ -584,7 +838,9 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
584
838
  }
585
839
  const clientOutputText = extractOutputText(output);
586
840
  const usage = extractTokenUsage(output);
587
- const metadata = {};
841
+ const metadata = {
842
+ ...state.telemetryMetadata ?? {}
843
+ };
588
844
  if (state.clientEventId) {
589
845
  metadata.client_event_id = state.clientEventId;
590
846
  }
@@ -620,7 +876,10 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
620
876
  usage,
621
877
  latency: modelLatencyMs,
622
878
  metadata: Object.keys(metadata).length > 0 ? metadata : void 0,
623
- client_capabilities: this.getLangchainCapabilities(state.piiMaskingEnabled)
879
+ client_capabilities: this.getLangchainCapabilities(
880
+ state.piiMaskingEnabled,
881
+ state.secretMaskingEnabled
882
+ )
624
883
  }, this.requestOptions);
625
884
  logCallbackDebug("handleLLMEnd logged", {
626
885
  runId: id,
@@ -634,6 +893,7 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
634
893
  if (state) this.runs.delete(id);
635
894
  const message = err && typeof err === "object" && "message" in err ? String(err.message) : String(err ?? "");
636
895
  const metadata = {
896
+ ...state?.telemetryMetadata ?? {},
637
897
  error_message: message
638
898
  };
639
899
  if (state?.clientEventId) {
@@ -662,9 +922,184 @@ var AgentIDCallbackHandler = class extends BaseCallbackHandler {
662
922
  event_type: "error",
663
923
  severity: "error",
664
924
  metadata,
665
- client_capabilities: this.getLangchainCapabilities(state?.piiMaskingEnabled)
925
+ client_capabilities: this.getLangchainCapabilities(
926
+ state?.piiMaskingEnabled,
927
+ state?.secretMaskingEnabled
928
+ )
666
929
  }, this.requestOptions);
667
930
  }
931
+ async handleToolStart(serialized, _input, runId, parentRunId, ...rest) {
932
+ const id = String(runId ?? "");
933
+ const parentContext = this.resolveParentEventContext(parentRunId);
934
+ const baseTelemetry = extractTelemetryFromValues(...rest);
935
+ const toolName = extractToolName(serialized, rest, baseTelemetry);
936
+ const workflowStepId = firstNonEmptyString(baseTelemetry?.workflow_step_id, baseTelemetry?.workflowStepId) ?? createClientEventId();
937
+ const telemetry = mergeTelemetryContexts(
938
+ this.telemetry,
939
+ baseTelemetry,
940
+ createAgentIdTelemetryContext({
941
+ workflow_step_id: workflowStepId,
942
+ parent_event_id: parentContext.parentEventId,
943
+ tool_name: toolName
944
+ })
945
+ );
946
+ const startedAtMs = Date.now();
947
+ const payload = await this.logWorkflowOperation(
948
+ {
949
+ telemetry,
950
+ event_type: "start",
951
+ event_status: "started"
952
+ },
953
+ parentContext
954
+ );
955
+ this.toolRuns.set(id, {
956
+ startedAtMs,
957
+ workflowStepId,
958
+ startEventId: payload.event_id ?? createClientEventId(),
959
+ telemetryMetadata: telemetry,
960
+ piiMaskingEnabled: parentContext.piiMaskingEnabled,
961
+ secretMaskingEnabled: parentContext.secretMaskingEnabled
962
+ });
963
+ }
964
+ async handleToolEnd(_output, runId) {
965
+ const id = String(runId ?? "");
966
+ const state = this.toolRuns.get(id);
967
+ if (!state) {
968
+ return;
969
+ }
970
+ this.toolRuns.delete(id);
971
+ await this.logWorkflowOperation(
972
+ {
973
+ telemetry: mergeTelemetryContexts(
974
+ state.telemetryMetadata,
975
+ createAgentIdTelemetryContext({
976
+ workflow_step_id: state.workflowStepId,
977
+ parent_event_id: state.startEventId
978
+ })
979
+ ),
980
+ event_type: "complete",
981
+ event_status: "completed",
982
+ latency: Math.max(0, Date.now() - state.startedAtMs)
983
+ },
984
+ state
985
+ );
986
+ }
987
+ async handleToolError(err, runId) {
988
+ const id = String(runId ?? "");
989
+ const state = this.toolRuns.get(id);
990
+ if (!state) {
991
+ return;
992
+ }
993
+ this.toolRuns.delete(id);
994
+ const errorMessage = err instanceof Error ? err.message : typeof err === "undefined" ? "" : String(err);
995
+ await this.logWorkflowOperation(
996
+ {
997
+ telemetry: mergeTelemetryContexts(
998
+ state?.telemetryMetadata,
999
+ createAgentIdTelemetryContext({
1000
+ workflow_step_id: state?.workflowStepId,
1001
+ parent_event_id: state?.startEventId
1002
+ })
1003
+ ),
1004
+ metadata: errorMessage.trim().length > 0 ? {
1005
+ error_message: errorMessage.trim(),
1006
+ ...err instanceof Error && err.name ? { error_name: err.name } : {}
1007
+ } : void 0,
1008
+ event_type: "error",
1009
+ event_status: "failed",
1010
+ severity: "error",
1011
+ latency: typeof state?.startedAtMs === "number" ? Math.max(0, Date.now() - state.startedAtMs) : void 0
1012
+ },
1013
+ state
1014
+ );
1015
+ }
1016
+ async handleChainStart(serialized, _inputs, runId, parentRunId, ...rest) {
1017
+ const id = String(runId ?? "");
1018
+ const parentContext = this.resolveParentEventContext(parentRunId);
1019
+ const baseTelemetry = extractTelemetryFromValues(...rest);
1020
+ const workflowName = extractWorkflowName(serialized, rest, baseTelemetry);
1021
+ const workflowStepId = firstNonEmptyString(baseTelemetry?.workflow_step_id, baseTelemetry?.workflowStepId) ?? createClientEventId();
1022
+ const resolvedCategory = firstNonEmptyString(baseTelemetry?.event_category, baseTelemetry?.eventCategory) ?? "workflow";
1023
+ const telemetry = mergeTelemetryContexts(
1024
+ this.telemetry,
1025
+ baseTelemetry,
1026
+ createAgentIdTelemetryContext({
1027
+ workflow_step_id: workflowStepId,
1028
+ workflow_step_name: workflowName,
1029
+ parent_event_id: parentContext.parentEventId,
1030
+ event_category: resolvedCategory
1031
+ })
1032
+ );
1033
+ const startedAtMs = Date.now();
1034
+ const payload = await this.logWorkflowOperation(
1035
+ {
1036
+ telemetry,
1037
+ event_type: "start",
1038
+ event_status: "started"
1039
+ },
1040
+ parentContext
1041
+ );
1042
+ this.chainRuns.set(id, {
1043
+ startedAtMs,
1044
+ workflowStepId,
1045
+ startEventId: payload.event_id ?? createClientEventId(),
1046
+ telemetryMetadata: telemetry,
1047
+ piiMaskingEnabled: parentContext.piiMaskingEnabled,
1048
+ secretMaskingEnabled: parentContext.secretMaskingEnabled
1049
+ });
1050
+ }
1051
+ async handleChainEnd(_outputs, runId) {
1052
+ const id = String(runId ?? "");
1053
+ const state = this.chainRuns.get(id);
1054
+ if (!state) {
1055
+ return;
1056
+ }
1057
+ this.chainRuns.delete(id);
1058
+ await this.logWorkflowOperation(
1059
+ {
1060
+ telemetry: mergeTelemetryContexts(
1061
+ state.telemetryMetadata,
1062
+ createAgentIdTelemetryContext({
1063
+ workflow_step_id: state.workflowStepId,
1064
+ parent_event_id: state.startEventId
1065
+ })
1066
+ ),
1067
+ event_type: "complete",
1068
+ event_status: "completed",
1069
+ latency: Math.max(0, Date.now() - state.startedAtMs)
1070
+ },
1071
+ state
1072
+ );
1073
+ }
1074
+ async handleChainError(err, runId) {
1075
+ const id = String(runId ?? "");
1076
+ const state = this.chainRuns.get(id);
1077
+ if (!state) {
1078
+ return;
1079
+ }
1080
+ this.chainRuns.delete(id);
1081
+ const errorMessage = err instanceof Error ? err.message : typeof err === "undefined" ? "" : String(err);
1082
+ await this.logWorkflowOperation(
1083
+ {
1084
+ telemetry: mergeTelemetryContexts(
1085
+ state.telemetryMetadata,
1086
+ createAgentIdTelemetryContext({
1087
+ workflow_step_id: state.workflowStepId,
1088
+ parent_event_id: state.startEventId
1089
+ })
1090
+ ),
1091
+ metadata: errorMessage.trim().length > 0 ? {
1092
+ error_message: errorMessage.trim(),
1093
+ ...err instanceof Error && err.name ? { error_name: err.name } : {}
1094
+ } : void 0,
1095
+ event_type: "error",
1096
+ event_status: "failed",
1097
+ severity: "error",
1098
+ latency: Math.max(0, Date.now() - state.startedAtMs)
1099
+ },
1100
+ state
1101
+ );
1102
+ }
668
1103
  };
669
1104
  export {
670
1105
  AgentIDCallbackHandler
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { T as TransparencyMetadata } from './agentid-JQx2Iy7B.mjs';
2
+ import { T as TransparencyMetadata } from './agentid-CxVUF_eo.mjs';
3
3
 
4
4
  type AgentIDTransparencyBadgeTelemetry = {
5
5
  systemId: string;
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { T as TransparencyMetadata } from './agentid-JQx2Iy7B.js';
2
+ import { T as TransparencyMetadata } from './agentid-CxVUF_eo.js';
3
3
 
4
4
  type AgentIDTransparencyBadgeTelemetry = {
5
5
  systemId: string;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "agentid-sdk",
3
- "version": "0.1.37",
4
- "description": "AgentID JavaScript/TypeScript SDK for guard, ingest, tracing, and analytics.",
3
+ "version": "0.1.38",
4
+ "description": "AgentID JavaScript/TypeScript SDK for guardrails, masking, workflow telemetry, and audit logging.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://agentid.ai",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/ondrejsukac-rgb/agentid.git",
10
- "directory": "js-sdk"
10
+ "directory": "agentid-sdk"
11
11
  },
12
12
  "bugs": {
13
13
  "url": "https://github.com/ondrejsukac-rgb/agentid/issues"
@@ -38,7 +38,9 @@
38
38
  ],
39
39
  "scripts": {
40
40
  "build": "tsup --config tsup.config.ts",
41
- "release:check": "npm run build && npm pack --dry-run",
41
+ "typecheck": "tsc --noEmit",
42
+ "test": "vitest run ./src",
43
+ "release:check": "npm run typecheck && npm run test && npm run build && npm pack --dry-run",
42
44
  "prepublishOnly": "npm run build"
43
45
  },
44
46
  "publishConfig": {
@@ -62,8 +64,10 @@
62
64
  }
63
65
  },
64
66
  "devDependencies": {
67
+ "@langchain/core": "^1.1.42",
65
68
  "@types/react": "^19.2.2",
66
69
  "tsup": "^8.3.5",
67
- "typescript": "^5.0.0"
70
+ "typescript": "^5.0.0",
71
+ "vitest": "^4.0.16"
68
72
  }
69
73
  }