@friskai/frisk-js 0.2.10 → 0.3.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.
Files changed (82) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/langchain/frisk-callback-handler.d.ts +80 -3
  3. package/dist/adapters/langchain/frisk-callback-handler.d.ts.map +1 -1
  4. package/dist/adapters/langchain/frisk-tool-middleware.d.ts.map +1 -1
  5. package/dist/adapters/langchain/index.js +758 -388
  6. package/dist/adapters/langchain/index.js.map +1 -454
  7. package/dist/adapters/langchain/langchain-framework-adapter/langchain-framework-adapter.d.ts +3 -3
  8. package/dist/adapters/langchain/langchain-framework-adapter/langchain-framework-adapter.d.ts.map +1 -1
  9. package/dist/core/extensions.d.ts +30 -0
  10. package/dist/core/extensions.d.ts.map +1 -0
  11. package/dist/core/frisk-session.d.ts +48 -12
  12. package/dist/core/frisk-session.d.ts.map +1 -1
  13. package/dist/core/frisk.d.ts +14 -24
  14. package/dist/core/frisk.d.ts.map +1 -1
  15. package/dist/core/llm-reasoning/extractLlmReasoning.d.ts +8 -0
  16. package/dist/core/llm-reasoning/extractLlmReasoning.d.ts.map +1 -0
  17. package/dist/core/spans/frisk-span.d.ts +38 -0
  18. package/dist/core/spans/frisk-span.d.ts.map +1 -0
  19. package/dist/core/spans/index.d.ts +7 -0
  20. package/dist/core/spans/index.d.ts.map +1 -0
  21. package/dist/core/spans/llm-call-span.d.ts +23 -0
  22. package/dist/core/spans/llm-call-span.d.ts.map +1 -0
  23. package/dist/core/spans/operation-span.d.ts +13 -0
  24. package/dist/core/spans/operation-span.d.ts.map +1 -0
  25. package/dist/core/spans/session-span.d.ts +20 -0
  26. package/dist/core/spans/session-span.d.ts.map +1 -0
  27. package/dist/core/spans/tool-call-decision-span.d.ts +27 -0
  28. package/dist/core/spans/tool-call-decision-span.d.ts.map +1 -0
  29. package/dist/core/spans/tool-call-observation-span.d.ts +28 -0
  30. package/dist/core/spans/tool-call-observation-span.d.ts.map +1 -0
  31. package/dist/core/types.d.ts +5 -0
  32. package/dist/core/types.d.ts.map +1 -1
  33. package/dist/errors/index.d.ts +6 -0
  34. package/dist/errors/index.d.ts.map +1 -1
  35. package/dist/framework-adapter/base-framework-adapter.d.ts +3 -3
  36. package/dist/framework-adapter/base-framework-adapter.d.ts.map +1 -1
  37. package/dist/framework-adapter/framework-adapter.d.ts +3 -3
  38. package/dist/framework-adapter/framework-adapter.d.ts.map +1 -1
  39. package/dist/framework-adapter/index.d.ts +2 -2
  40. package/dist/framework-adapter/index.d.ts.map +1 -1
  41. package/dist/generated/sdk-meta.d.ts +1 -1
  42. package/dist/generated/sdk-meta.d.ts.map +1 -1
  43. package/dist/index.d.ts +3 -3
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +526 -333
  46. package/dist/index.js.map +1 -440
  47. package/dist/telemetry/constants.d.ts +24 -0
  48. package/dist/telemetry/constants.d.ts.map +1 -1
  49. package/dist/utils/redact.d.ts +5 -5
  50. package/dist/utils/redact.d.ts.map +1 -1
  51. package/package.json +4 -27
  52. package/dist/adapters/claude/claude-framework-adapter/claude-framework-adapter.d.ts +0 -99
  53. package/dist/adapters/claude/claude-framework-adapter/claude-framework-adapter.d.ts.map +0 -1
  54. package/dist/adapters/claude/claude-framework-adapter/get-claude-agent-sdk-version.d.ts +0 -2
  55. package/dist/adapters/claude/claude-framework-adapter/get-claude-agent-sdk-version.d.ts.map +0 -1
  56. package/dist/adapters/claude/claude-framework-adapter/wrap-tool-with-llm-reasoning.d.ts +0 -4
  57. package/dist/adapters/claude/claude-framework-adapter/wrap-tool-with-llm-reasoning.d.ts.map +0 -1
  58. package/dist/adapters/claude/frisk-claude-session.d.ts +0 -29
  59. package/dist/adapters/claude/frisk-claude-session.d.ts.map +0 -1
  60. package/dist/adapters/claude/frisk-claude.d.ts +0 -71
  61. package/dist/adapters/claude/frisk-claude.d.ts.map +0 -1
  62. package/dist/adapters/claude/index.d.ts +0 -3
  63. package/dist/adapters/claude/index.d.ts.map +0 -1
  64. package/dist/adapters/claude/index.js +0 -65732
  65. package/dist/adapters/claude/index.js.map +0 -449
  66. package/dist/adapters/claude/resolve-claude-tool-name.d.ts +0 -2
  67. package/dist/adapters/claude/resolve-claude-tool-name.d.ts.map +0 -1
  68. package/dist/core/tool-call-span.d.ts +0 -102
  69. package/dist/core/tool-call-span.d.ts.map +0 -1
  70. package/dist/native-bindings/index.d.ts +0 -23
  71. package/dist/native-bindings/index.d.ts.map +0 -1
  72. package/native/README.md +0 -55
  73. package/native/frisk-js.darwin-arm64.node +0 -0
  74. package/native/frisk-js.darwin-x64.node +0 -0
  75. package/native/frisk-js.linux-arm64-gnu.node +0 -0
  76. package/native/frisk-js.linux-arm64-musl.node +0 -0
  77. package/native/frisk-js.linux-x64-gnu.node +0 -0
  78. package/native/frisk-js.linux-x64-musl.node +0 -0
  79. package/native/frisk-js.win32-arm64-msvc.node +0 -0
  80. package/native/frisk-js.win32-x64-msvc.node +0 -0
  81. package/native/index.cjs +0 -580
  82. package/native/index.d.ts +0 -73
@@ -2542,7 +2542,7 @@ var require_call_credentials = __commonJS((exports) => {
2542
2542
  if (isCurrentOauth2Client(googleCredentials)) {
2543
2543
  getHeaders = googleCredentials.getRequestHeaders(options.service_url);
2544
2544
  } else {
2545
- getHeaders = new Promise((resolve2, reject) => {
2545
+ getHeaders = new Promise((resolve, reject) => {
2546
2546
  googleCredentials.getRequestMetadata(options.service_url, (err, headers) => {
2547
2547
  if (err) {
2548
2548
  reject(err);
@@ -2552,7 +2552,7 @@ var require_call_credentials = __commonJS((exports) => {
2552
2552
  reject(new Error("Headers not set by metadata plugin"));
2553
2553
  return;
2554
2554
  }
2555
- resolve2(headers);
2555
+ resolve(headers);
2556
2556
  });
2557
2557
  });
2558
2558
  }
@@ -2607,10 +2607,10 @@ var require_call_credentials = __commonJS((exports) => {
2607
2607
  this.metadataGenerator = metadataGenerator;
2608
2608
  }
2609
2609
  generateMetadata(options) {
2610
- return new Promise((resolve2, reject) => {
2610
+ return new Promise((resolve, reject) => {
2611
2611
  this.metadataGenerator(options, (err, metadata) => {
2612
2612
  if (metadata !== undefined) {
2613
- resolve2(metadata);
2613
+ resolve(metadata);
2614
2614
  } else {
2615
2615
  reject(err);
2616
2616
  }
@@ -2932,14 +2932,14 @@ var require_channel_credentials = __commonJS((exports) => {
2932
2932
  }
2933
2933
  connect(socket) {
2934
2934
  const tlsConnectOptions = Object.assign({ socket }, this.connectionOptions);
2935
- return new Promise((resolve2, reject) => {
2935
+ return new Promise((resolve, reject) => {
2936
2936
  const tlsSocket = (0, tls_1.connect)(tlsConnectOptions, () => {
2937
2937
  var _a2;
2938
2938
  if (((_a2 = this.connectionOptions.rejectUnauthorized) !== null && _a2 !== undefined ? _a2 : true) && !tlsSocket.authorized) {
2939
2939
  reject(tlsSocket.authorizationError);
2940
2940
  return;
2941
2941
  }
2942
- resolve2({
2942
+ resolve({
2943
2943
  socket: tlsSocket,
2944
2944
  secure: true
2945
2945
  });
@@ -3059,8 +3059,8 @@ var require_channel_credentials = __commonJS((exports) => {
3059
3059
  if (this.hasReceivedUpdates()) {
3060
3060
  return Promise.resolve(this.getLatestSecureContext());
3061
3061
  } else {
3062
- return new Promise((resolve2) => {
3063
- this.secureContextWatchers.push(resolve2);
3062
+ return new Promise((resolve) => {
3063
+ this.secureContextWatchers.push(resolve);
3064
3064
  });
3065
3065
  }
3066
3066
  }
@@ -3093,7 +3093,7 @@ var require_channel_credentials = __commonJS((exports) => {
3093
3093
  this.callCredentials = callCredentials;
3094
3094
  }
3095
3095
  connect(socket) {
3096
- return new Promise((resolve2, reject) => {
3096
+ return new Promise((resolve, reject) => {
3097
3097
  const secureContext = this.parent.getLatestSecureContext();
3098
3098
  if (!secureContext) {
3099
3099
  reject(new Error("Failed to load credentials"));
@@ -3118,7 +3118,7 @@ var require_channel_credentials = __commonJS((exports) => {
3118
3118
  reject(tlsSocket.authorizationError);
3119
3119
  return;
3120
3120
  }
3121
- resolve2({
3121
+ resolve({
3122
3122
  socket: tlsSocket,
3123
3123
  secure: true
3124
3124
  });
@@ -6646,7 +6646,7 @@ var require_aspromise = __commonJS((exports, module) => {
6646
6646
  var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true;
6647
6647
  while (index < arguments.length)
6648
6648
  params[offset++] = arguments[index++];
6649
- return new Promise(function executor(resolve2, reject) {
6649
+ return new Promise(function executor(resolve, reject) {
6650
6650
  params[offset] = function callback(err) {
6651
6651
  if (pending) {
6652
6652
  pending = false;
@@ -6656,7 +6656,7 @@ var require_aspromise = __commonJS((exports, module) => {
6656
6656
  var params2 = new Array(arguments.length - 1), offset2 = 0;
6657
6657
  while (offset2 < params2.length)
6658
6658
  params2[offset2++] = arguments[offset2];
6659
- resolve2.apply(null, params2);
6659
+ resolve.apply(null, params2);
6660
6660
  }
6661
6661
  }
6662
6662
  };
@@ -8044,7 +8044,7 @@ var require_path = __commonJS((exports) => {
8044
8044
  }
8045
8045
  return prefix + parts.join("/");
8046
8046
  };
8047
- path.resolve = function resolve2(originPath, includePath, alreadyNormalized) {
8047
+ path.resolve = function resolve(originPath, includePath, alreadyNormalized) {
8048
8048
  if (!alreadyNormalized)
8049
8049
  includePath = normalize(includePath);
8050
8050
  if (isAbsolute(includePath))
@@ -8357,7 +8357,7 @@ var require_mapfield = __commonJS((exports, module) => {
8357
8357
  keepComments ? this.comment : undefined
8358
8358
  ]);
8359
8359
  };
8360
- MapField.prototype.resolve = function resolve2() {
8360
+ MapField.prototype.resolve = function resolve() {
8361
8361
  if (this.resolved)
8362
8362
  return this;
8363
8363
  if (types.mapKey[this.keyType] === undefined)
@@ -8430,7 +8430,7 @@ var require_method = __commonJS((exports, module) => {
8430
8430
  this.parsedOptions
8431
8431
  ]);
8432
8432
  };
8433
- Method.prototype.resolve = function resolve2() {
8433
+ Method.prototype.resolve = function resolve() {
8434
8434
  if (this.resolved)
8435
8435
  return this;
8436
8436
  this.resolvedRequestType = this.parent.lookupType(this.requestType);
@@ -9830,7 +9830,7 @@ var require_field = __commonJS((exports, module) => {
9830
9830
  keepComments ? this.comment : undefined
9831
9831
  ]);
9832
9832
  };
9833
- Field.prototype.resolve = function resolve2() {
9833
+ Field.prototype.resolve = function resolve() {
9834
9834
  if (this.resolved)
9835
9835
  return this;
9836
9836
  if ((this.typeDefault = types.defaults[this.type]) === undefined) {
@@ -10084,7 +10084,7 @@ var require_object = __commonJS((exports, module) => {
10084
10084
  this.parent = null;
10085
10085
  this.resolved = false;
10086
10086
  };
10087
- ReflectionObject.prototype.resolve = function resolve2() {
10087
+ ReflectionObject.prototype.resolve = function resolve() {
10088
10088
  if (this.resolved)
10089
10089
  return this;
10090
10090
  if (this.root instanceof Root)
@@ -15635,18 +15635,18 @@ var require_compression_filter = __commonJS((exports) => {
15635
15635
  this.maxRecvMessageLength = maxRecvMessageLength;
15636
15636
  }
15637
15637
  compressMessage(message) {
15638
- return new Promise((resolve2, reject) => {
15638
+ return new Promise((resolve, reject) => {
15639
15639
  zlib.deflate(message, (err, output) => {
15640
15640
  if (err) {
15641
15641
  reject(err);
15642
15642
  } else {
15643
- resolve2(output);
15643
+ resolve(output);
15644
15644
  }
15645
15645
  });
15646
15646
  });
15647
15647
  }
15648
15648
  decompressMessage(message) {
15649
- return new Promise((resolve2, reject) => {
15649
+ return new Promise((resolve, reject) => {
15650
15650
  let totalLength = 0;
15651
15651
  const messageParts = [];
15652
15652
  const decompresser = zlib.createInflate();
@@ -15662,7 +15662,7 @@ var require_compression_filter = __commonJS((exports) => {
15662
15662
  }
15663
15663
  });
15664
15664
  decompresser.on("end", () => {
15665
- resolve2(Buffer.concat(messageParts));
15665
+ resolve(Buffer.concat(messageParts));
15666
15666
  });
15667
15667
  decompresser.write(message);
15668
15668
  decompresser.end();
@@ -15676,18 +15676,18 @@ var require_compression_filter = __commonJS((exports) => {
15676
15676
  this.maxRecvMessageLength = maxRecvMessageLength;
15677
15677
  }
15678
15678
  compressMessage(message) {
15679
- return new Promise((resolve2, reject) => {
15679
+ return new Promise((resolve, reject) => {
15680
15680
  zlib.gzip(message, (err, output) => {
15681
15681
  if (err) {
15682
15682
  reject(err);
15683
15683
  } else {
15684
- resolve2(output);
15684
+ resolve(output);
15685
15685
  }
15686
15686
  });
15687
15687
  });
15688
15688
  }
15689
15689
  decompressMessage(message) {
15690
- return new Promise((resolve2, reject) => {
15690
+ return new Promise((resolve, reject) => {
15691
15691
  let totalLength = 0;
15692
15692
  const messageParts = [];
15693
15693
  const decompresser = zlib.createGunzip();
@@ -15703,7 +15703,7 @@ var require_compression_filter = __commonJS((exports) => {
15703
15703
  }
15704
15704
  });
15705
15705
  decompresser.on("end", () => {
15706
- resolve2(Buffer.concat(messageParts));
15706
+ resolve(Buffer.concat(messageParts));
15707
15707
  });
15708
15708
  decompresser.write(message);
15709
15709
  decompresser.end();
@@ -16957,7 +16957,7 @@ var require_http_proxy = __commonJS((exports) => {
16957
16957
  options.headers = headers;
16958
16958
  const proxyAddressString = (0, subchannel_address_1.subchannelAddressToString)(address);
16959
16959
  trace3("Using proxy " + proxyAddressString + " to connect to " + options.path);
16960
- return new Promise((resolve2, reject) => {
16960
+ return new Promise((resolve, reject) => {
16961
16961
  const request = http.request(options);
16962
16962
  request.once("connect", (res, socket, head) => {
16963
16963
  request.removeAllListeners();
@@ -16968,7 +16968,7 @@ var require_http_proxy = __commonJS((exports) => {
16968
16968
  socket.unshift(head);
16969
16969
  }
16970
16970
  trace3("Successfully established a plaintext connection to " + options.path + " through proxy " + proxyAddressString);
16971
- resolve2(socket);
16971
+ resolve(socket);
16972
16972
  } else {
16973
16973
  (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to " + options.path + " through proxy " + proxyAddressString + " with status " + res.statusCode);
16974
16974
  reject();
@@ -17840,7 +17840,7 @@ var require_transport = __commonJS((exports) => {
17840
17840
  if (secureConnectResult.socket.closed) {
17841
17841
  return Promise.reject("Connection closed before starting HTTP/2 handshake");
17842
17842
  }
17843
- return new Promise((resolve2, reject) => {
17843
+ return new Promise((resolve, reject) => {
17844
17844
  var _a2, _b, _c, _d, _e, _f, _g, _h;
17845
17845
  let remoteName = null;
17846
17846
  let realTarget = this.channelTarget;
@@ -17905,7 +17905,7 @@ var require_transport = __commonJS((exports) => {
17905
17905
  session.removeAllListeners();
17906
17906
  secureConnectResult.socket.removeListener("close", closeHandler);
17907
17907
  secureConnectResult.socket.removeListener("error", errorHandler);
17908
- resolve2(new Http2Transport(session, address, options, remoteName));
17908
+ resolve(new Http2Transport(session, address, options, remoteName));
17909
17909
  this.session = null;
17910
17910
  });
17911
17911
  session.once("close", closeHandler);
@@ -17919,7 +17919,7 @@ var require_transport = __commonJS((exports) => {
17919
17919
  if (proxiedSocket) {
17920
17920
  return proxiedSocket;
17921
17921
  } else {
17922
- return new Promise((resolve2, reject) => {
17922
+ return new Promise((resolve, reject) => {
17923
17923
  const closeCallback = () => {
17924
17924
  reject(new Error("Socket closed"));
17925
17925
  };
@@ -17929,7 +17929,7 @@ var require_transport = __commonJS((exports) => {
17929
17929
  const socket = net.connect(address, () => {
17930
17930
  socket.removeListener("close", closeCallback);
17931
17931
  socket.removeListener("error", errorCallback);
17932
- resolve2(socket);
17932
+ resolve(socket);
17933
17933
  });
17934
17934
  socket.once("close", closeCallback);
17935
17935
  socket.once("error", errorCallback);
@@ -21143,7 +21143,7 @@ var require_server_interceptors = __commonJS((exports) => {
21143
21143
  } else {
21144
21144
  decompresser = zlib.createGunzip();
21145
21145
  }
21146
- return new Promise((resolve2, reject) => {
21146
+ return new Promise((resolve, reject) => {
21147
21147
  let totalLength = 0;
21148
21148
  const messageParts = [];
21149
21149
  decompresser.on("data", (chunk) => {
@@ -21158,7 +21158,7 @@ var require_server_interceptors = __commonJS((exports) => {
21158
21158
  }
21159
21159
  });
21160
21160
  decompresser.on("end", () => {
21161
- resolve2(Buffer.concat(messageParts));
21161
+ resolve(Buffer.concat(messageParts));
21162
21162
  });
21163
21163
  decompresser.write(messageContents);
21164
21164
  decompresser.end();
@@ -21751,10 +21751,10 @@ var require_server = __commonJS((exports) => {
21751
21751
  bindOneAddress(address, boundPortObject) {
21752
21752
  this.trace("Attempting to bind " + (0, subchannel_address_1.subchannelAddressToString)(address));
21753
21753
  const http2Server = this.createHttp2Server(boundPortObject.credentials);
21754
- return new Promise((resolve2, reject) => {
21754
+ return new Promise((resolve, reject) => {
21755
21755
  const onError = (err) => {
21756
21756
  this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message);
21757
- resolve2({
21757
+ resolve({
21758
21758
  port: "port" in address ? address.port : 1,
21759
21759
  error: err.message
21760
21760
  });
@@ -21782,7 +21782,7 @@ var require_server = __commonJS((exports) => {
21782
21782
  });
21783
21783
  boundPortObject.listeningServers.add(http2Server);
21784
21784
  this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress));
21785
- resolve2({
21785
+ resolve({
21786
21786
  port: "port" in boundSubchannelAddress ? boundSubchannelAddress.port : 1
21787
21787
  });
21788
21788
  http2Server.removeListener("error", onError);
@@ -21835,7 +21835,7 @@ var require_server = __commonJS((exports) => {
21835
21835
  }
21836
21836
  }
21837
21837
  resolvePort(port) {
21838
- return new Promise((resolve2, reject) => {
21838
+ return new Promise((resolve, reject) => {
21839
21839
  let seenResolution = false;
21840
21840
  const resolverListener = (endpointList, attributes, serviceConfig, resolutionNote) => {
21841
21841
  if (seenResolution) {
@@ -21851,7 +21851,7 @@ var require_server = __commonJS((exports) => {
21851
21851
  reject(new Error(`No addresses resolved for port ${port}`));
21852
21852
  return true;
21853
21853
  }
21854
- resolve2(addressList);
21854
+ resolve(addressList);
21855
21855
  return true;
21856
21856
  };
21857
21857
  const resolver = (0, resolver_1.createResolver)(port, resolverListener, this.options);
@@ -27564,8 +27564,8 @@ var require_promise = __commonJS((exports) => {
27564
27564
  _resolve;
27565
27565
  _reject;
27566
27566
  constructor() {
27567
- this._promise = new Promise((resolve2, reject) => {
27568
- this._resolve = resolve2;
27567
+ this._promise = new Promise((resolve, reject) => {
27568
+ this._resolve = resolve;
27569
27569
  this._reject = reject;
27570
27570
  });
27571
27571
  }
@@ -27653,9 +27653,9 @@ var require_exporter = __commonJS((exports) => {
27653
27653
  var api_1 = require_src();
27654
27654
  var suppress_tracing_1 = require_suppress_tracing();
27655
27655
  function _export(exporter, arg) {
27656
- return new Promise((resolve2) => {
27656
+ return new Promise((resolve) => {
27657
27657
  api_1.context.with((0, suppress_tracing_1.suppressTracing)(api_1.context.active()), () => {
27658
- exporter.export(arg, resolve2);
27658
+ exporter.export(arg, resolve);
27659
27659
  });
27660
27660
  });
27661
27661
  }
@@ -28111,22 +28111,22 @@ var require_grpc_exporter_transport = __commonJS((exports) => {
28111
28111
  });
28112
28112
  }
28113
28113
  }
28114
- return new Promise((resolve2) => {
28114
+ return new Promise((resolve) => {
28115
28115
  const deadline = Date.now() + timeoutMillis;
28116
28116
  if (this._metadata == null) {
28117
- return resolve2({
28117
+ return resolve({
28118
28118
  error: new Error("metadata was null"),
28119
28119
  status: "failure"
28120
28120
  });
28121
28121
  }
28122
28122
  this._client.export(buffer, this._metadata, { deadline }, (err, response) => {
28123
28123
  if (err) {
28124
- resolve2({
28124
+ resolve({
28125
28125
  status: "failure",
28126
28126
  error: err
28127
28127
  });
28128
28128
  } else {
28129
- resolve2({
28129
+ resolve({
28130
28130
  data: response,
28131
28131
  status: "success"
28132
28132
  });
@@ -28469,9 +28469,9 @@ var require_http_exporter_transport = __commonJS((exports) => {
28469
28469
  async send(data, timeoutMillis) {
28470
28470
  const { agent, request } = await this._loadUtils();
28471
28471
  const headers = await this._parameters.headers();
28472
- return new Promise((resolve2) => {
28472
+ return new Promise((resolve) => {
28473
28473
  (0, http_transport_utils_1.sendWithHttp)(request, this._parameters.url, headers, this._parameters.compression, this._parameters.userAgent, agent, data, (result) => {
28474
- resolve2(result);
28474
+ resolve(result);
28475
28475
  }, timeoutMillis);
28476
28476
  });
28477
28477
  }
@@ -28520,9 +28520,9 @@ var require_retrying_transport = __commonJS((exports) => {
28520
28520
  this._transport = transport;
28521
28521
  }
28522
28522
  retry(data, timeoutMillis, inMillis) {
28523
- return new Promise((resolve2, reject) => {
28523
+ return new Promise((resolve, reject) => {
28524
28524
  setTimeout(() => {
28525
- this._transport.send(data, timeoutMillis).then(resolve2, reject);
28525
+ this._transport.send(data, timeoutMillis).then(resolve, reject);
28526
28526
  }, inMillis);
28527
28527
  });
28528
28528
  }
@@ -31252,7 +31252,7 @@ var require_root2 = __commonJS((exports, module) => {
31252
31252
  return ScopeSpans;
31253
31253
  }();
31254
31254
  v12.Span = function() {
31255
- function Span2(properties) {
31255
+ function Span(properties) {
31256
31256
  this.attributes = [];
31257
31257
  this.events = [];
31258
31258
  this.links = [];
@@ -31262,26 +31262,26 @@ var require_root2 = __commonJS((exports, module) => {
31262
31262
  this[keys[i]] = properties[keys[i]];
31263
31263
  }
31264
31264
  }
31265
- Span2.prototype.traceId = null;
31266
- Span2.prototype.spanId = null;
31267
- Span2.prototype.traceState = null;
31268
- Span2.prototype.parentSpanId = null;
31269
- Span2.prototype.flags = null;
31270
- Span2.prototype.name = null;
31271
- Span2.prototype.kind = null;
31272
- Span2.prototype.startTimeUnixNano = null;
31273
- Span2.prototype.endTimeUnixNano = null;
31274
- Span2.prototype.attributes = $util.emptyArray;
31275
- Span2.prototype.droppedAttributesCount = null;
31276
- Span2.prototype.events = $util.emptyArray;
31277
- Span2.prototype.droppedEventsCount = null;
31278
- Span2.prototype.links = $util.emptyArray;
31279
- Span2.prototype.droppedLinksCount = null;
31280
- Span2.prototype.status = null;
31281
- Span2.create = function create(properties) {
31282
- return new Span2(properties);
31283
- };
31284
- Span2.encode = function encode2(message, writer) {
31265
+ Span.prototype.traceId = null;
31266
+ Span.prototype.spanId = null;
31267
+ Span.prototype.traceState = null;
31268
+ Span.prototype.parentSpanId = null;
31269
+ Span.prototype.flags = null;
31270
+ Span.prototype.name = null;
31271
+ Span.prototype.kind = null;
31272
+ Span.prototype.startTimeUnixNano = null;
31273
+ Span.prototype.endTimeUnixNano = null;
31274
+ Span.prototype.attributes = $util.emptyArray;
31275
+ Span.prototype.droppedAttributesCount = null;
31276
+ Span.prototype.events = $util.emptyArray;
31277
+ Span.prototype.droppedEventsCount = null;
31278
+ Span.prototype.links = $util.emptyArray;
31279
+ Span.prototype.droppedLinksCount = null;
31280
+ Span.prototype.status = null;
31281
+ Span.create = function create(properties) {
31282
+ return new Span(properties);
31283
+ };
31284
+ Span.encode = function encode2(message, writer) {
31285
31285
  if (!writer)
31286
31286
  writer = $Writer.create();
31287
31287
  if (message.traceId != null && Object.hasOwnProperty.call(message, "traceId"))
@@ -31321,10 +31321,10 @@ var require_root2 = __commonJS((exports, module) => {
31321
31321
  writer.uint32(133).fixed32(message.flags);
31322
31322
  return writer;
31323
31323
  };
31324
- Span2.encodeDelimited = function encodeDelimited(message, writer) {
31324
+ Span.encodeDelimited = function encodeDelimited(message, writer) {
31325
31325
  return this.encode(message, writer).ldelim();
31326
31326
  };
31327
- Span2.decode = function decode2(reader, length, error2) {
31327
+ Span.decode = function decode2(reader, length, error2) {
31328
31328
  if (!(reader instanceof $Reader))
31329
31329
  reader = $Reader.create(reader);
31330
31330
  var end = length === undefined ? reader.len : reader.pos + length, message = new $root.opentelemetry.proto.trace.v1.Span;
@@ -31410,12 +31410,12 @@ var require_root2 = __commonJS((exports, module) => {
31410
31410
  }
31411
31411
  return message;
31412
31412
  };
31413
- Span2.decodeDelimited = function decodeDelimited(reader) {
31413
+ Span.decodeDelimited = function decodeDelimited(reader) {
31414
31414
  if (!(reader instanceof $Reader))
31415
31415
  reader = new $Reader(reader);
31416
31416
  return this.decode(reader, reader.uint32());
31417
31417
  };
31418
- Span2.verify = function verify(message) {
31418
+ Span.verify = function verify(message) {
31419
31419
  if (typeof message !== "object" || message === null)
31420
31420
  return "object expected";
31421
31421
  if (message.traceId != null && message.hasOwnProperty("traceId")) {
@@ -31508,7 +31508,7 @@ var require_root2 = __commonJS((exports, module) => {
31508
31508
  }
31509
31509
  return null;
31510
31510
  };
31511
- Span2.fromObject = function fromObject(object2) {
31511
+ Span.fromObject = function fromObject(object2) {
31512
31512
  if (object2 instanceof $root.opentelemetry.proto.trace.v1.Span)
31513
31513
  return object2;
31514
31514
  var message = new $root.opentelemetry.proto.trace.v1.Span;
@@ -31631,7 +31631,7 @@ var require_root2 = __commonJS((exports, module) => {
31631
31631
  }
31632
31632
  return message;
31633
31633
  };
31634
- Span2.toObject = function toObject(message, options) {
31634
+ Span.toObject = function toObject(message, options) {
31635
31635
  if (!options)
31636
31636
  options = {};
31637
31637
  var object2 = {};
@@ -31730,16 +31730,16 @@ var require_root2 = __commonJS((exports, module) => {
31730
31730
  object2.flags = message.flags;
31731
31731
  return object2;
31732
31732
  };
31733
- Span2.prototype.toJSON = function toJSON() {
31733
+ Span.prototype.toJSON = function toJSON() {
31734
31734
  return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
31735
31735
  };
31736
- Span2.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
31736
+ Span.getTypeUrl = function getTypeUrl(typeUrlPrefix) {
31737
31737
  if (typeUrlPrefix === undefined) {
31738
31738
  typeUrlPrefix = "type.googleapis.com";
31739
31739
  }
31740
31740
  return typeUrlPrefix + "/opentelemetry.proto.trace.v1.Span";
31741
31741
  };
31742
- Span2.SpanKind = function() {
31742
+ Span.SpanKind = function() {
31743
31743
  var valuesById = {}, values = Object.create(valuesById);
31744
31744
  values[valuesById[0] = "SPAN_KIND_UNSPECIFIED"] = 0;
31745
31745
  values[valuesById[1] = "SPAN_KIND_INTERNAL"] = 1;
@@ -31749,7 +31749,7 @@ var require_root2 = __commonJS((exports, module) => {
31749
31749
  values[valuesById[5] = "SPAN_KIND_CONSUMER"] = 5;
31750
31750
  return values;
31751
31751
  }();
31752
- Span2.Event = function() {
31752
+ Span.Event = function() {
31753
31753
  function Event(properties) {
31754
31754
  this.attributes = [];
31755
31755
  if (properties) {
@@ -31919,7 +31919,7 @@ var require_root2 = __commonJS((exports, module) => {
31919
31919
  };
31920
31920
  return Event;
31921
31921
  }();
31922
- Span2.Link = function() {
31922
+ Span.Link = function() {
31923
31923
  function Link(properties) {
31924
31924
  this.attributes = [];
31925
31925
  if (properties) {
@@ -32126,7 +32126,7 @@ var require_root2 = __commonJS((exports, module) => {
32126
32126
  };
32127
32127
  return Link;
32128
32128
  }();
32129
- return Span2;
32129
+ return Span;
32130
32130
  }();
32131
32131
  v12.Status = function() {
32132
32132
  function Status(properties) {
@@ -42765,14 +42765,14 @@ var require_BatchSpanProcessorBase = __commonJS((exports) => {
42765
42765
  this._maybeStartTimer();
42766
42766
  }
42767
42767
  _flushAll() {
42768
- return new Promise((resolve2, reject) => {
42768
+ return new Promise((resolve, reject) => {
42769
42769
  const promises = [];
42770
42770
  const count = Math.ceil(this._finishedSpans.length / this._maxExportBatchSize);
42771
42771
  for (let i = 0, j = count;i < j; i++) {
42772
42772
  promises.push(this._flushOneBatch());
42773
42773
  }
42774
42774
  Promise.all(promises).then(() => {
42775
- resolve2();
42775
+ resolve();
42776
42776
  }).catch(reject);
42777
42777
  });
42778
42778
  }
@@ -42781,7 +42781,7 @@ var require_BatchSpanProcessorBase = __commonJS((exports) => {
42781
42781
  if (this._finishedSpans.length === 0) {
42782
42782
  return Promise.resolve();
42783
42783
  }
42784
- return new Promise((resolve2, reject) => {
42784
+ return new Promise((resolve, reject) => {
42785
42785
  const timer = setTimeout(() => {
42786
42786
  reject(new Error("Timeout"));
42787
42787
  }, this._exportTimeoutMillis);
@@ -42796,7 +42796,7 @@ var require_BatchSpanProcessorBase = __commonJS((exports) => {
42796
42796
  const doExport = () => this._exporter.export(spans, (result) => {
42797
42797
  clearTimeout(timer);
42798
42798
  if (result.code === core_1.ExportResultCode.SUCCESS) {
42799
- resolve2();
42799
+ resolve();
42800
42800
  } else {
42801
42801
  reject(result.error ?? new Error("BatchSpanProcessor: span export failed"));
42802
42802
  }
@@ -42935,7 +42935,7 @@ var require_Tracer = __commonJS((exports) => {
42935
42935
  var utility_1 = require_utility();
42936
42936
  var platform_1 = require_platform4();
42937
42937
 
42938
- class Tracer2 {
42938
+ class Tracer {
42939
42939
  _sampler;
42940
42940
  _generalLimits;
42941
42941
  _spanLimits;
@@ -43037,7 +43037,7 @@ var require_Tracer = __commonJS((exports) => {
43037
43037
  return this._spanLimits;
43038
43038
  }
43039
43039
  }
43040
- exports.Tracer = Tracer2;
43040
+ exports.Tracer = Tracer;
43041
43041
  });
43042
43042
 
43043
43043
  // ../../node_modules/@opentelemetry/sdk-trace-base/build/src/MultiSpanProcessor.js
@@ -43056,12 +43056,12 @@ var require_MultiSpanProcessor = __commonJS((exports) => {
43056
43056
  for (const spanProcessor of this._spanProcessors) {
43057
43057
  promises.push(spanProcessor.forceFlush());
43058
43058
  }
43059
- return new Promise((resolve2) => {
43059
+ return new Promise((resolve) => {
43060
43060
  Promise.all(promises).then(() => {
43061
- resolve2();
43061
+ resolve();
43062
43062
  }).catch((error2) => {
43063
43063
  (0, core_1.globalErrorHandler)(error2 || new Error("MultiSpanProcessor: forceFlush failed"));
43064
- resolve2();
43064
+ resolve();
43065
43065
  });
43066
43066
  });
43067
43067
  }
@@ -43087,9 +43087,9 @@ var require_MultiSpanProcessor = __commonJS((exports) => {
43087
43087
  for (const spanProcessor of this._spanProcessors) {
43088
43088
  promises.push(spanProcessor.shutdown());
43089
43089
  }
43090
- return new Promise((resolve2, reject) => {
43090
+ return new Promise((resolve, reject) => {
43091
43091
  Promise.all(promises).then(() => {
43092
- resolve2();
43092
+ resolve();
43093
43093
  }, reject);
43094
43094
  });
43095
43095
  }
@@ -43142,32 +43142,32 @@ var require_BasicTracerProvider = __commonJS((exports) => {
43142
43142
  forceFlush() {
43143
43143
  const timeout = this._config.forceFlushTimeoutMillis;
43144
43144
  const promises = this._activeSpanProcessor["_spanProcessors"].map((spanProcessor) => {
43145
- return new Promise((resolve2) => {
43145
+ return new Promise((resolve) => {
43146
43146
  let state;
43147
43147
  const timeoutInterval = setTimeout(() => {
43148
- resolve2(new Error(`Span processor did not completed within timeout period of ${timeout} ms`));
43148
+ resolve(new Error(`Span processor did not completed within timeout period of ${timeout} ms`));
43149
43149
  state = ForceFlushState.timeout;
43150
43150
  }, timeout);
43151
43151
  spanProcessor.forceFlush().then(() => {
43152
43152
  clearTimeout(timeoutInterval);
43153
43153
  if (state !== ForceFlushState.timeout) {
43154
43154
  state = ForceFlushState.resolved;
43155
- resolve2(state);
43155
+ resolve(state);
43156
43156
  }
43157
43157
  }).catch((error2) => {
43158
43158
  clearTimeout(timeoutInterval);
43159
43159
  state = ForceFlushState.error;
43160
- resolve2(error2);
43160
+ resolve(error2);
43161
43161
  });
43162
43162
  });
43163
43163
  });
43164
- return new Promise((resolve2, reject) => {
43164
+ return new Promise((resolve, reject) => {
43165
43165
  Promise.all(promises).then((results) => {
43166
43166
  const errors3 = results.filter((result) => result !== ForceFlushState.resolved);
43167
43167
  if (errors3.length > 0) {
43168
43168
  reject(errors3);
43169
43169
  } else {
43170
- resolve2();
43170
+ resolve();
43171
43171
  }
43172
43172
  }).catch((error2) => reject([error2]));
43173
43173
  });
@@ -43618,10 +43618,10 @@ class UnexpectedFriskServerResponseError extends Error {
43618
43618
  }
43619
43619
  }
43620
43620
 
43621
- class ToolCallSpanNotInitializedError extends Error {
43622
- constructor(message = "Tool call span has not been initialized. Call enter() first.") {
43623
- super(message);
43624
- this.name = "ToolCallSpanNotInitializedError";
43621
+ class MissingToolPoliciesExtensionError extends FriskError {
43622
+ constructor(options) {
43623
+ super("decide_tool_call requires the tool policies extension. Install and register the @friskai/frisk-js-tool-policies extension; calling frisk.connect() alone is not sufficient.", options);
43624
+ this.name = "MissingToolPoliciesExtensionError";
43625
43625
  }
43626
43626
  }
43627
43627
 
@@ -43744,35 +43744,6 @@ function captureError(e, logger, meta) {
43744
43744
  logError(logger, e.message, e, meta);
43745
43745
  }
43746
43746
 
43747
- // src/telemetry/constants.ts
43748
- var TRACER_NAME = "frisk_js_sdk";
43749
- var TRACER_VERSION = "0.1.0";
43750
- var SPAN_NAME_DECIDE_TOOL_CALL = "frisk.tool_call.decide";
43751
- var SPAN_NAME_OBSERVE_TOOL_CALL = "frisk.tool_call.observation";
43752
- var SPAN_NAME_FRISK_SESSION = "frisk.session";
43753
- var ATTRIBUTE_NAME_SESSION_PROMPT = "frisk.session.prompt";
43754
- var ATTRIBUTE_NAME_SESSION_ID = "frisk.session.id";
43755
- var ATTRIBUTE_NAME_REMOTE_SESSION_ID = "frisk.session.remote_id";
43756
- var ATTRIBUTE_NAME_LLM_REASONING = "frisk.llm_reasoning";
43757
- var ATTRIBUTE_NAME_TOOL_NAME = "frisk.tool.name";
43758
- var ATTRIBUTE_NAME_FRISK_TOOL_ID = "frisk.tool.id";
43759
- var ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID = "frisk.tool.version_id";
43760
- var ATTRIBUTE_NAME_TOOL_CALL_ID = "frisk.tool_call.id";
43761
- var ATTRIBUTE_NAME_TOOL_ARGS_JSON = "frisk.tool.args.json";
43762
- var ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON = "frisk.tool.args_redacted_paths.json";
43763
- var ATTRIBUTE_NAME_AGENT_STATE_JSON = "frisk.agent_state.json";
43764
- var ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON = "frisk.agent_state_redacted_paths.json";
43765
- var ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT = "frisk.decision.matched_rule_count";
43766
- var ATTRIBUTE_NAME_DECISION_OUTCOME = "frisk.decision.outcome";
43767
- var ATTRIBUTE_NAME_DECISION_REASON = "frisk.decision.reason";
43768
- var ATTRIBUTE_NAME_ERROR_TYPE = "error.type";
43769
- var ATTRIBUTE_NAME_ERROR_MESSAGE = "error.message";
43770
- var ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS = "frisk.tool_call.is_success";
43771
- var ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR = "frisk.tool_call.is_error";
43772
- var ATTRIBUTE_NAME_TOOL_CALL_COUNT = "frisk.tool_calls.count";
43773
- var ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT = "frisk.tool_calls.error_count";
43774
- var ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER = "frisk.tool_call.sequence_number";
43775
-
43776
43747
  // ../../node_modules/zod/v4/core/core.js
43777
43748
  var NEVER = Object.freeze({
43778
43749
  status: "aborted"
@@ -48164,6 +48135,18 @@ var llmReasoningZodShape = {
48164
48135
  [LLM_REASONING_ARG_NAME]: string2().describe(LLM_REASONING_ARG_DESCRIPTION)
48165
48136
  };
48166
48137
 
48138
+ // src/core/llm-reasoning/extractLlmReasoning.ts
48139
+ function extractLlmReasoning(toolArgs) {
48140
+ if (typeof toolArgs !== "object" || toolArgs === null || Array.isArray(toolArgs)) {
48141
+ return null;
48142
+ }
48143
+ const rawReasoning = toolArgs[LLM_REASONING_ARG_NAME];
48144
+ if (rawReasoning === null || rawReasoning === undefined) {
48145
+ return null;
48146
+ }
48147
+ return String(rawReasoning);
48148
+ }
48149
+
48167
48150
  // src/core/llm-reasoning/removeLlmReasoningArg.ts
48168
48151
  function removeLlmReasoningArg(input) {
48169
48152
  if (!(LLM_REASONING_ARG_NAME in input)) {
@@ -48209,136 +48192,226 @@ class SessionRegistry {
48209
48192
  }
48210
48193
  }
48211
48194
 
48212
- // src/core/tool-call-span.ts
48195
+ // src/core/spans/frisk-span.ts
48213
48196
  var import_api = __toESM(require_src(), 1);
48214
48197
 
48215
- // src/core/redaction-options.ts
48216
- function resolveRedactionOptions(options) {
48217
- return {
48218
- redactToolArgs: options?.redactToolArgs ?? false,
48219
- redactAgentState: options?.redactAgentState ?? false
48220
- };
48221
- }
48222
-
48223
- // src/core/tool-call-span.ts
48224
- class ToolCallSpan {
48225
- adapter;
48226
- toolCall;
48227
- friskToolId;
48228
- agentState;
48229
- parent;
48230
- tracer;
48231
- redaction;
48232
- _span = null;
48233
- _traceContextCarrier = null;
48234
- sessionId;
48235
- friskToolVersionId;
48198
+ class FriskSpan {
48199
+ _spanName;
48200
+ _attributeFields;
48201
+ _otelSpan;
48202
+ _attributes = {};
48203
+ _ended = false;
48236
48204
  constructor({
48237
- sessionId,
48238
- adapter,
48239
- toolCall,
48240
- friskToolId,
48241
- friskToolVersionId,
48242
- agentState,
48243
- parent,
48244
48205
  tracer,
48245
- redact
48206
+ parent,
48207
+ spanName,
48208
+ attributeFields
48246
48209
  }) {
48247
- this.sessionId = sessionId;
48248
- this.adapter = adapter;
48249
- this.toolCall = toolCall;
48250
- this.friskToolId = friskToolId ?? null;
48251
- this.friskToolVersionId = friskToolVersionId ?? null;
48252
- this.agentState = agentState;
48253
- this.parent = parent;
48254
- this.tracer = tracer;
48255
- this.redaction = resolveRedactionOptions(redact);
48210
+ this._spanName = spanName;
48211
+ this._attributeFields = attributeFields;
48212
+ const parentContext = parent ? import_api.trace.setSpan(import_api.context.active(), parent.otelSpan) : import_api.context.active();
48213
+ this._otelSpan = tracer.startSpan(this._spanName, undefined, parentContext);
48256
48214
  }
48257
- get span() {
48258
- if (!this._span) {
48259
- throw new ToolCallSpanNotInitializedError;
48260
- }
48261
- return this._span;
48215
+ get otelSpan() {
48216
+ return this._otelSpan;
48262
48217
  }
48263
- get traceContextCarrier() {
48264
- return this._traceContextCarrier;
48218
+ get spanId() {
48219
+ return this._otelSpan.spanContext().spanId;
48265
48220
  }
48266
- run(callback) {
48267
- this.enter();
48268
- try {
48269
- return callback(this);
48270
- } finally {
48271
- this.exit();
48221
+ setAttribute(field, value) {
48222
+ this.setAttributesByField({ [field]: value });
48223
+ }
48224
+ getAttribute(field) {
48225
+ return this._attributes[this.constantFor(field)];
48226
+ }
48227
+ end() {
48228
+ if (this._ended) {
48229
+ return;
48272
48230
  }
48231
+ this._ended = true;
48232
+ this._otelSpan.end();
48273
48233
  }
48274
- async runAsync(callback) {
48275
- this.enter();
48276
- try {
48277
- return await callback(this);
48278
- } finally {
48279
- this.exit();
48234
+ setAttributesByField(values) {
48235
+ for (const [field, value] of Object.entries(values)) {
48236
+ const constant = this.constantFor(field);
48237
+ if (value === null || value === undefined) {
48238
+ continue;
48239
+ }
48240
+ this._attributes[constant] = value;
48241
+ this._otelSpan.setAttribute(constant, value);
48242
+ }
48243
+ }
48244
+ constantFor(field) {
48245
+ const constant = this._attributeFields[field];
48246
+ if (constant === undefined) {
48247
+ throw new Error(`Unknown attribute '${field}' for ${this.constructor.name}`);
48280
48248
  }
48249
+ return constant;
48250
+ }
48251
+ }
48252
+ // src/telemetry/constants.ts
48253
+ var TRACER_NAME = "frisk_js_sdk";
48254
+ var TRACER_VERSION = "0.1.0";
48255
+ var SPAN_NAME_DECIDE_TOOL_CALL = "frisk.tool_call.decide";
48256
+ var SPAN_NAME_OBSERVE_TOOL_CALL = "frisk.tool_call.observation";
48257
+ var SPAN_NAME_LLM_CALL = "frisk.llm_call";
48258
+ var SPAN_NAME_OPERATION = "frisk.operation";
48259
+ var SPAN_NAME_FRISK_SESSION = "frisk.session";
48260
+ var ATTRIBUTE_NAME_LLM_CALL_SPAN_ID = "frisk.tool_call.llm_call_span_id";
48261
+ var ATTRIBUTE_NAME_LLM_CALL_PROMPTS_JSON = "frisk.llm_call.prompts.json";
48262
+ var ATTRIBUTE_NAME_LLM_CALL_RESPONSES_JSON = "frisk.llm_call.responses.json";
48263
+ var ATTRIBUTE_NAME_LLM_CALL_TOOL_CALLS_JSON = "frisk.llm_call.tool_calls.json";
48264
+ var ATTRIBUTE_NAME_MODEL_NAME = "frisk.model.name";
48265
+ var ATTRIBUTE_NAME_MODEL_PROVIDER = "frisk.model.provider";
48266
+ var ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS = "frisk.token_usage.input_tokens";
48267
+ var ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS = "frisk.token_usage.output_tokens";
48268
+ var ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS = "frisk.token_usage.total_tokens";
48269
+ var ATTRIBUTE_NAME_SESSION_PROMPT = "frisk.session.prompt";
48270
+ var ATTRIBUTE_NAME_SESSION_ID = "frisk.session.id";
48271
+ var ATTRIBUTE_NAME_REMOTE_SESSION_ID = "frisk.session.remote_id";
48272
+ var ATTRIBUTE_NAME_LLM_REASONING = "frisk.llm_reasoning";
48273
+ var ATTRIBUTE_NAME_TOOL_NAME = "frisk.tool.name";
48274
+ var ATTRIBUTE_NAME_FRISK_TOOL_ID = "frisk.tool.id";
48275
+ var ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID = "frisk.tool.version_id";
48276
+ var ATTRIBUTE_NAME_TOOL_CALL_ID = "frisk.tool_call.id";
48277
+ var ATTRIBUTE_NAME_TOOL_ARGS_JSON = "frisk.tool.args.json";
48278
+ var ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON = "frisk.tool.args_redacted_paths.json";
48279
+ var ATTRIBUTE_NAME_AGENT_STATE_JSON = "frisk.agent_state.json";
48280
+ var ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON = "frisk.agent_state_redacted_paths.json";
48281
+ var ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT = "frisk.decision.matched_rule_count";
48282
+ var ATTRIBUTE_NAME_DECISION_OUTCOME = "frisk.decision.outcome";
48283
+ var ATTRIBUTE_NAME_DECISION_REASON = "frisk.decision.reason";
48284
+ var ATTRIBUTE_NAME_ERROR_TYPE = "error.type";
48285
+ var ATTRIBUTE_NAME_ERROR_MESSAGE = "error.message";
48286
+ var ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS = "frisk.tool_call.is_success";
48287
+ var ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR = "frisk.tool_call.is_error";
48288
+ var ATTRIBUTE_NAME_TOOL_CALL_COUNT = "frisk.tool_calls.count";
48289
+ var ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT = "frisk.tool_calls.error_count";
48290
+ var ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER = "frisk.tool_call.sequence_number";
48291
+
48292
+ // src/core/spans/llm-call-span.ts
48293
+ var FIELDS = {
48294
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48295
+ promptsJson: ATTRIBUTE_NAME_LLM_CALL_PROMPTS_JSON,
48296
+ responsesJson: ATTRIBUTE_NAME_LLM_CALL_RESPONSES_JSON,
48297
+ toolCallsJson: ATTRIBUTE_NAME_LLM_CALL_TOOL_CALLS_JSON,
48298
+ modelName: ATTRIBUTE_NAME_MODEL_NAME,
48299
+ modelProvider: ATTRIBUTE_NAME_MODEL_PROVIDER,
48300
+ inputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS,
48301
+ outputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS,
48302
+ totalTokens: ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS,
48303
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48304
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE
48305
+ };
48306
+
48307
+ class LlmCallSpan extends FriskSpan {
48308
+ constructor(args) {
48309
+ super({ ...args, spanName: SPAN_NAME_LLM_CALL, attributeFields: FIELDS });
48281
48310
  }
48282
- setAttribute(key, value) {
48283
- this.span.setAttribute(key, value);
48311
+ setAttributes(values) {
48312
+ this.setAttributesByField(values);
48284
48313
  }
48285
- setAttributes(attributes) {
48286
- this.span.setAttributes(attributes);
48314
+ }
48315
+ // src/core/spans/operation-span.ts
48316
+ var FIELDS2 = {
48317
+ sessionId: ATTRIBUTE_NAME_SESSION_ID
48318
+ };
48319
+
48320
+ class OperationSpan extends FriskSpan {
48321
+ constructor(args) {
48322
+ super({ ...args, spanName: SPAN_NAME_OPERATION, attributeFields: FIELDS2 });
48287
48323
  }
48288
- saveResult(decision) {
48289
- if (!this.span) {
48290
- return;
48291
- }
48292
- this.setAttributes({
48293
- [ATTRIBUTE_NAME_DECISION_OUTCOME]: decision.outcome,
48294
- [ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT]: Number(decision.rulesMatchedCount)
48324
+ setAttributes(values) {
48325
+ this.setAttributesByField(values);
48326
+ }
48327
+ }
48328
+ // src/core/spans/session-span.ts
48329
+ var FIELDS3 = {
48330
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48331
+ remoteSessionId: ATTRIBUTE_NAME_REMOTE_SESSION_ID,
48332
+ prompt: ATTRIBUTE_NAME_SESSION_PROMPT,
48333
+ toolCallCount: ATTRIBUTE_NAME_TOOL_CALL_COUNT,
48334
+ toolCallErrorCount: ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT,
48335
+ inputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS,
48336
+ outputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS,
48337
+ totalTokens: ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS
48338
+ };
48339
+
48340
+ class SessionSpan extends FriskSpan {
48341
+ constructor(args) {
48342
+ super({
48343
+ ...args,
48344
+ spanName: SPAN_NAME_FRISK_SESSION,
48345
+ attributeFields: FIELDS3
48295
48346
  });
48296
- if (decision.reason) {
48297
- this.setAttribute(ATTRIBUTE_NAME_DECISION_REASON, decision.reason);
48298
- }
48299
48347
  }
48300
- saveError(error2) {
48301
- if (!this.span) {
48302
- return;
48303
- }
48304
- const errorMessage = error2 instanceof Error ? error2.message : String(error2);
48305
- const errorType = error2 instanceof Error ? error2.constructor.name : typeof error2;
48306
- this.setAttributes({
48307
- [ATTRIBUTE_NAME_ERROR_TYPE]: errorType,
48308
- [ATTRIBUTE_NAME_ERROR_MESSAGE]: errorMessage
48348
+ setAttributes(values) {
48349
+ this.setAttributesByField(values);
48350
+ }
48351
+ }
48352
+ // src/core/spans/tool-call-decision-span.ts
48353
+ var FIELDS4 = {
48354
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48355
+ toolName: ATTRIBUTE_NAME_TOOL_NAME,
48356
+ toolCallId: ATTRIBUTE_NAME_TOOL_CALL_ID,
48357
+ toolArgsJson: ATTRIBUTE_NAME_TOOL_ARGS_JSON,
48358
+ toolArgsRedactedPathsJson: ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON,
48359
+ agentStateJson: ATTRIBUTE_NAME_AGENT_STATE_JSON,
48360
+ agentStateRedactedPathsJson: ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON,
48361
+ friskToolId: ATTRIBUTE_NAME_FRISK_TOOL_ID,
48362
+ friskToolVersionId: ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID,
48363
+ llmReasoning: ATTRIBUTE_NAME_LLM_REASONING,
48364
+ decisionOutcome: ATTRIBUTE_NAME_DECISION_OUTCOME,
48365
+ decisionMatchedRuleCount: ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT,
48366
+ decisionReason: ATTRIBUTE_NAME_DECISION_REASON,
48367
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48368
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE
48369
+ };
48370
+
48371
+ class ToolCallDecisionSpan extends FriskSpan {
48372
+ constructor(args) {
48373
+ super({
48374
+ ...args,
48375
+ spanName: SPAN_NAME_DECIDE_TOOL_CALL,
48376
+ attributeFields: FIELDS4
48309
48377
  });
48310
48378
  }
48311
- enter() {
48312
- const parentContext = this.parent ? import_api.trace.setSpan(import_api.context.active(), this.parent) : import_api.context.active();
48313
- const redactedToolArgsResult = this.adapter.serializeToolArgs(removeLlmReasoningArg(this.toolCall.args), { redact: this.redaction.redactToolArgs });
48314
- const redactedAgentStateResult = this.adapter.serializeAgentState(this.agentState, { redact: this.redaction.redactAgentState });
48315
- this._span = this.tracer.startSpan(SPAN_NAME_DECIDE_TOOL_CALL, {
48316
- attributes: {
48317
- [ATTRIBUTE_NAME_SESSION_ID]: this.sessionId,
48318
- [ATTRIBUTE_NAME_TOOL_NAME]: this.toolCall.name,
48319
- ...this.friskToolId !== null ? { [ATTRIBUTE_NAME_FRISK_TOOL_ID]: this.friskToolId } : {},
48320
- ...this.friskToolVersionId !== null ? {
48321
- [ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID]: this.friskToolVersionId
48322
- } : {},
48323
- [ATTRIBUTE_NAME_TOOL_CALL_ID]: this.toolCall.id,
48324
- [ATTRIBUTE_NAME_TOOL_ARGS_JSON]: redactedToolArgsResult.value ?? "",
48325
- [ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON]: JSON.stringify(redactedToolArgsResult.redactedPaths),
48326
- [ATTRIBUTE_NAME_AGENT_STATE_JSON]: redactedAgentStateResult.value ?? "",
48327
- [ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON]: JSON.stringify(redactedAgentStateResult.redactedPaths)
48328
- }
48329
- }, parentContext);
48330
- this._traceContextCarrier = {};
48331
- const spanContext = import_api.trace.setSpan(import_api.context.active(), this.span);
48332
- import_api.propagation.inject(spanContext, this._traceContextCarrier);
48333
- }
48334
- exit() {
48335
- if (!this.span) {
48336
- return;
48337
- }
48338
- this.span.end();
48379
+ setAttributes(values) {
48380
+ this.setAttributesByField(values);
48339
48381
  }
48340
48382
  }
48383
+ // src/core/spans/tool-call-observation-span.ts
48384
+ var FIELDS5 = {
48385
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48386
+ toolName: ATTRIBUTE_NAME_TOOL_NAME,
48387
+ toolCallId: ATTRIBUTE_NAME_TOOL_CALL_ID,
48388
+ toolArgsJson: ATTRIBUTE_NAME_TOOL_ARGS_JSON,
48389
+ toolArgsRedactedPathsJson: ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON,
48390
+ agentStateJson: ATTRIBUTE_NAME_AGENT_STATE_JSON,
48391
+ agentStateRedactedPathsJson: ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON,
48392
+ toolCallSequenceNumber: ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER,
48393
+ friskToolId: ATTRIBUTE_NAME_FRISK_TOOL_ID,
48394
+ friskToolVersionId: ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID,
48395
+ llmReasoning: ATTRIBUTE_NAME_LLM_REASONING,
48396
+ isSuccess: ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS,
48397
+ isError: ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR,
48398
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE,
48399
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48400
+ llmCallSpanId: ATTRIBUTE_NAME_LLM_CALL_SPAN_ID
48401
+ };
48341
48402
 
48403
+ class ToolCallObservationSpan extends FriskSpan {
48404
+ constructor(args) {
48405
+ super({
48406
+ ...args,
48407
+ spanName: SPAN_NAME_OBSERVE_TOOL_CALL,
48408
+ attributeFields: FIELDS5
48409
+ });
48410
+ }
48411
+ setAttributes(values) {
48412
+ this.setAttributesByField(values);
48413
+ }
48414
+ }
48342
48415
  // src/core/types.ts
48343
48416
  var DecisionOutcome;
48344
48417
  ((DecisionOutcome2) => {
@@ -48358,9 +48431,13 @@ class FriskSession {
48358
48431
  logger;
48359
48432
  _rootRunId = null;
48360
48433
  _isTracing = false;
48434
+ _agentState = null;
48361
48435
  toolCallSequenceNumber = 0;
48362
48436
  toolCallSequenceGenerator = this.createToolCallSequenceGenerator();
48363
48437
  toolCallErrorCount = 0;
48438
+ tokenUsageInput = 0;
48439
+ tokenUsageOutput = 0;
48440
+ tokenUsageTotal = 0;
48364
48441
  constructor({ frisk, redact, tracer, logging }) {
48365
48442
  const sessionId = this.constructor.generateSessionId();
48366
48443
  this.logger = deriveSdkLogger(logging, {
@@ -48383,33 +48460,67 @@ class FriskSession {
48383
48460
  get rootRunId() {
48384
48461
  return this._rootRunId;
48385
48462
  }
48463
+ createLlmCallSpan({
48464
+ parent
48465
+ } = {}) {
48466
+ const span = new LlmCallSpan({
48467
+ tracer: this.tracer,
48468
+ parent: parent ?? this._rootSpan
48469
+ });
48470
+ span.setAttributes({ sessionId: this.id });
48471
+ return span;
48472
+ }
48473
+ createOperationSpan({
48474
+ parent
48475
+ } = {}) {
48476
+ const span = new OperationSpan({
48477
+ tracer: this.tracer,
48478
+ parent: parent ?? this._rootSpan
48479
+ });
48480
+ span.setAttributes({ sessionId: this.id });
48481
+ return span;
48482
+ }
48386
48483
  async createToolCallSpan({
48387
48484
  name,
48388
- args: toolArgsInput
48485
+ args: toolArgsInput,
48486
+ agentState,
48487
+ parent
48389
48488
  }) {
48390
48489
  const toolArgs = this.validateToolArgs(toolArgsInput);
48490
+ const llmReasoning = extractLlmReasoning(toolArgs);
48391
48491
  const redactedToolArgsResult = this.frisk.adapter?.serializeToolArgs(removeLlmReasoningArg(toolArgs), { redact: this.redaction.redactToolArgs }) ?? {
48392
48492
  value: "{}",
48393
48493
  redactedPaths: []
48394
48494
  };
48395
- const sessionSpan = this.rootSpan;
48396
- const parentContext = sessionSpan ? import_api2.trace.setSpan(import_api2.context.active(), sessionSpan) : import_api2.context.active();
48397
- const spanAttributes = {
48398
- [ATTRIBUTE_NAME_SESSION_ID]: this.id,
48399
- [ATTRIBUTE_NAME_TOOL_NAME]: name,
48400
- [ATTRIBUTE_NAME_TOOL_ARGS_JSON]: redactedToolArgsResult.value,
48401
- [ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON]: JSON.stringify(redactedToolArgsResult.redactedPaths),
48402
- [ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER]: this.toolCallSequenceGenerator.next().value
48495
+ const agentStateToUse = agentState ?? this._agentState ?? {};
48496
+ const redactedAgentStateResult = this.frisk.adapter?.serializeAgentState(agentStateToUse, { redact: this.redaction.redactAgentState }) ?? {
48497
+ value: "{}",
48498
+ redactedPaths: []
48403
48499
  };
48500
+ const span = new ToolCallObservationSpan({
48501
+ tracer: this.tracer,
48502
+ parent: parent ?? this._rootSpan
48503
+ });
48504
+ span.setAttributes({
48505
+ sessionId: this.id,
48506
+ toolName: name,
48507
+ toolArgsJson: redactedToolArgsResult.value ?? "{}",
48508
+ toolArgsRedactedPathsJson: JSON.stringify(redactedToolArgsResult.redactedPaths),
48509
+ agentStateJson: redactedAgentStateResult.value ?? "{}",
48510
+ agentStateRedactedPathsJson: JSON.stringify(redactedAgentStateResult.redactedPaths),
48511
+ toolCallSequenceNumber: this.toolCallSequenceGenerator.next().value
48512
+ });
48404
48513
  await this.frisk.toolRegistrationComplete;
48405
48514
  const registeredTool = this.frisk.getRegisteredTool(name);
48406
48515
  if (registeredTool) {
48407
- spanAttributes[ATTRIBUTE_NAME_FRISK_TOOL_ID] = registeredTool.id;
48408
- spanAttributes[ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID] = registeredTool.versionId;
48516
+ span.setAttributes({
48517
+ friskToolId: registeredTool.id,
48518
+ friskToolVersionId: registeredTool.versionId
48519
+ });
48520
+ }
48521
+ if (llmReasoning !== null) {
48522
+ span.setAttributes({ llmReasoning });
48409
48523
  }
48410
- const span = this.getTracer().startSpan(SPAN_NAME_OBSERVE_TOOL_CALL, {
48411
- attributes: spanAttributes
48412
- }, parentContext);
48413
48524
  return span;
48414
48525
  }
48415
48526
  closeToolCallSpan({
@@ -48419,19 +48530,19 @@ class FriskSession {
48419
48530
  status
48420
48531
  }) {
48421
48532
  if (toolCallId) {
48422
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_ID, toolCallId);
48533
+ span.setAttributes({ toolCallId });
48423
48534
  }
48424
48535
  if (status === "error" /* Error */ || !!err) {
48425
48536
  this.incrementToolCallErrors();
48426
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR, true);
48427
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS, false);
48537
+ span.setAttributes({ isError: true, isSuccess: false });
48428
48538
  } else if (status === "success" /* Success */) {
48429
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS, true);
48430
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR, false);
48539
+ span.setAttributes({ isSuccess: true, isError: false });
48431
48540
  }
48432
- if (err && err instanceof Error) {
48433
- span.setAttribute(ATTRIBUTE_NAME_ERROR_MESSAGE, `${err}`);
48434
- span.setAttribute(ATTRIBUTE_NAME_ERROR_TYPE, `${err.constructor.name}`);
48541
+ if (err instanceof Error) {
48542
+ span.setAttributes({
48543
+ errorMessage: `${err}`,
48544
+ errorType: `${err.constructor.name}`
48545
+ });
48435
48546
  }
48436
48547
  span.end();
48437
48548
  }
@@ -48445,32 +48556,37 @@ class FriskSession {
48445
48556
  agentState
48446
48557
  }) {
48447
48558
  const registeredTool = this.frisk.getRegisteredTool(toolCall.name);
48448
- const toolCallSpan = new ToolCallSpan({
48449
- sessionId: this.id,
48450
- adapter: this.frisk.adapter,
48451
- toolCall,
48452
- friskToolId: registeredTool?.id ?? null,
48453
- friskToolVersionId: registeredTool?.versionId ?? null,
48454
- agentState,
48455
- parent: this._rootSpan,
48559
+ const redactedToolArgs = this.frisk.adapter.serializeToolArgs(removeLlmReasoningArg(toolCall.args), { redact: this.redaction.redactToolArgs });
48560
+ const redactedAgentState = this.frisk.adapter.serializeAgentState(agentState, { redact: this.redaction.redactAgentState });
48561
+ const llmReasoning = extractLlmReasoning(toolCall.args);
48562
+ const span = new ToolCallDecisionSpan({
48456
48563
  tracer: this.tracer,
48457
- redact: this.redaction
48564
+ parent: this._rootSpan
48458
48565
  });
48459
- const toolArgs = toolCall.args;
48460
- return toolCallSpan.run((span) => {
48566
+ try {
48567
+ span.setAttributes({
48568
+ sessionId: this.id,
48569
+ toolName: toolCall.name,
48570
+ toolCallId: toolCall.id,
48571
+ toolArgsJson: redactedToolArgs.value ?? "{}",
48572
+ toolArgsRedactedPathsJson: JSON.stringify(redactedToolArgs.redactedPaths),
48573
+ agentStateJson: redactedAgentState.value ?? "{}",
48574
+ agentStateRedactedPathsJson: JSON.stringify(redactedAgentState.redactedPaths),
48575
+ friskToolId: registeredTool?.id,
48576
+ friskToolVersionId: registeredTool?.versionId,
48577
+ llmReasoning: llmReasoning ?? undefined
48578
+ });
48579
+ const spanContext = import_api2.trace.setSpan(import_api2.context.active(), span.otelSpan);
48580
+ const traceContextCarrier = {};
48581
+ import_api2.propagation.inject(spanContext, traceContextCarrier);
48461
48582
  try {
48462
- if (LLM_REASONING_ARG_NAME in toolArgs) {
48463
- const llmReasoning = toolArgs[LLM_REASONING_ARG_NAME];
48464
- span.setAttribute(ATTRIBUTE_NAME_LLM_REASONING, llmReasoning);
48465
- }
48466
- const baseToolCallArgs = removeLlmReasoningArg(toolCall.args);
48467
48583
  const coreResult = this.frisk.decideToolCall({
48468
48584
  toolCall: {
48469
48585
  ...toolCall,
48470
- args: baseToolCallArgs
48586
+ args: removeLlmReasoningArg(toolCall.args)
48471
48587
  },
48472
48588
  agentState,
48473
- traceContextCarrier: span.traceContextCarrier ?? undefined
48589
+ traceContextCarrier
48474
48590
  });
48475
48591
  const result = {
48476
48592
  outcome: coreResult.outcome,
@@ -48479,7 +48595,11 @@ class FriskSession {
48479
48595
  policyId: coreResult.policyId,
48480
48596
  policyVersionId: coreResult.policyVersionId
48481
48597
  };
48482
- span.saveResult(result);
48598
+ span.setAttributes({
48599
+ decisionOutcome: result.outcome,
48600
+ decisionMatchedRuleCount: Number(result.rulesMatchedCount),
48601
+ decisionReason: result.reason ?? undefined
48602
+ });
48483
48603
  return result;
48484
48604
  } catch (error2) {
48485
48605
  const wrapped = new ToolCallEvaluationError(error2);
@@ -48487,14 +48607,19 @@ class FriskSession {
48487
48607
  toolName: toolCall.name,
48488
48608
  toolCallId: toolCall.id
48489
48609
  });
48490
- span.saveError(wrapped);
48610
+ span.setAttributes({
48611
+ errorType: wrapped.constructor.name,
48612
+ errorMessage: wrapped.message
48613
+ });
48491
48614
  return {
48492
48615
  outcome: "error" /* ERROR */,
48493
48616
  rulesMatchedCount: 0,
48494
48617
  reason: wrapped.message
48495
48618
  };
48496
48619
  }
48497
- });
48620
+ } finally {
48621
+ span.end();
48622
+ }
48498
48623
  }
48499
48624
  *createToolCallSequenceGenerator() {
48500
48625
  while (true) {
@@ -48510,23 +48635,49 @@ class FriskSession {
48510
48635
  getToolCallErrorCount() {
48511
48636
  return this.toolCallErrorCount;
48512
48637
  }
48513
- initTracing({ runId, inputs }) {
48638
+ recordTokenUsage({
48639
+ inputTokens = 0,
48640
+ outputTokens = 0,
48641
+ totalTokens = 0
48642
+ }) {
48643
+ this.tokenUsageInput += inputTokens;
48644
+ this.tokenUsageOutput += outputTokens;
48645
+ this.tokenUsageTotal += totalTokens;
48646
+ this._rootSpan?.setAttributes({
48647
+ inputTokens: this.tokenUsageInput,
48648
+ outputTokens: this.tokenUsageOutput,
48649
+ totalTokens: this.tokenUsageTotal
48650
+ });
48651
+ }
48652
+ getTokenUsage() {
48653
+ return {
48654
+ inputTokens: this.tokenUsageInput,
48655
+ outputTokens: this.tokenUsageOutput,
48656
+ totalTokens: this.tokenUsageTotal
48657
+ };
48658
+ }
48659
+ initTracing({ runId, agentState }) {
48514
48660
  this._rootRunId = runId;
48515
48661
  this._isTracing = true;
48516
- const span = this.tracer.startSpan(SPAN_NAME_FRISK_SESSION);
48517
- span.setAttribute(ATTRIBUTE_NAME_SESSION_ID, this.id);
48518
- span.setAttribute(ATTRIBUTE_NAME_REMOTE_SESSION_ID, runId);
48519
- const userPrompt = this.frisk.adapter.extractPrompt?.(inputs);
48662
+ this._agentState = agentState;
48663
+ const span = new SessionSpan({ tracer: this.tracer });
48664
+ span.setAttributes({ sessionId: this.id, remoteSessionId: runId });
48665
+ const userPrompt = this.frisk.adapter.extractPrompt?.(agentState);
48520
48666
  if (userPrompt) {
48521
- span.setAttribute(ATTRIBUTE_NAME_SESSION_PROMPT, userPrompt);
48667
+ span.setAttributes({ prompt: userPrompt });
48522
48668
  }
48523
48669
  this.setRootSpan(span);
48524
48670
  return span;
48525
48671
  }
48526
48672
  endTracing() {
48527
48673
  if (this._rootSpan) {
48528
- this._rootSpan.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_COUNT, this.getToolCallCount());
48529
- this._rootSpan.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT, this.getToolCallErrorCount());
48674
+ this._rootSpan.setAttributes({
48675
+ toolCallCount: this.getToolCallCount(),
48676
+ toolCallErrorCount: this.getToolCallErrorCount(),
48677
+ inputTokens: this.tokenUsageInput,
48678
+ outputTokens: this.tokenUsageOutput,
48679
+ totalTokens: this.tokenUsageTotal
48680
+ });
48530
48681
  this._rootSpan.end();
48531
48682
  }
48532
48683
  this._isTracing = false;
@@ -48546,6 +48697,7 @@ class FriskCallbackHandler extends BaseCallbackHandler {
48546
48697
  name = "FriskCallbackHandler";
48547
48698
  session;
48548
48699
  spansByRunId;
48700
+ llmCallSpanIdByToolCallId;
48549
48701
  frisk;
48550
48702
  logger;
48551
48703
  constructor({
@@ -48557,22 +48709,57 @@ class FriskCallbackHandler extends BaseCallbackHandler {
48557
48709
  this.session = session;
48558
48710
  this.frisk = frisk;
48559
48711
  this.spansByRunId = new Map;
48712
+ this.llmCallSpanIdByToolCallId = new Map;
48560
48713
  this.logger = deriveSdkLogger(logging, {
48561
48714
  component: "FriskCallbackHandler"
48562
48715
  });
48563
48716
  }
48564
48717
  handleChainStart(_chain, inputs, runId, parentRunId) {
48718
+ let span;
48565
48719
  if (parentRunId === undefined) {
48566
- this.session.initTracing({
48720
+ span = this.session.initTracing({
48567
48721
  runId,
48568
- inputs
48722
+ agentState: inputs
48723
+ });
48724
+ } else {
48725
+ span = this.session.createOperationSpan({
48726
+ parent: this.resolveParentSpan(parentRunId)
48569
48727
  });
48570
48728
  }
48729
+ this.spansByRunId.set(runId, span);
48571
48730
  }
48572
48731
  handleChainEnd(_outputs, runId, _parentRunId, _tags, _kwargs) {
48573
48732
  if (this.session.rootRunId === runId) {
48733
+ this.spansByRunId.delete(runId);
48734
+ for (const span of this.spansByRunId.values()) {
48735
+ span.end();
48736
+ }
48737
+ this.spansByRunId.clear();
48738
+ this.llmCallSpanIdByToolCallId.clear();
48574
48739
  this.session.endTracing();
48740
+ return;
48575
48741
  }
48742
+ this.endSpan(runId);
48743
+ }
48744
+ handleChatModelStart(_llm, messages, runId, parentRunId) {
48745
+ const span = this.openLlmCallSpan(runId, parentRunId);
48746
+ const promptsJson = this.safeJsonStringify(this.getPromptMessages(messages), "chat prompt messages");
48747
+ if (promptsJson !== null) {
48748
+ span.setAttributes({ promptsJson });
48749
+ }
48750
+ }
48751
+ handleLLMStart(_llm, prompts, runId, parentRunId) {
48752
+ const span = this.openLlmCallSpan(runId, parentRunId);
48753
+ const promptsJson = this.safeJsonStringify(prompts, "LLM prompts");
48754
+ if (promptsJson !== null) {
48755
+ span.setAttributes({ promptsJson });
48756
+ }
48757
+ }
48758
+ handleLLMEnd(output, runId) {
48759
+ this.finalizeLlmCall(output, runId, null);
48760
+ }
48761
+ handleLLMError(err, runId) {
48762
+ this.finalizeLlmCall(null, runId, err);
48576
48763
  }
48577
48764
  async handleToolStart(tool, input, runId, parentRunId, tags, metadata, runName) {
48578
48765
  const toolName = runName;
@@ -48591,18 +48778,20 @@ class FriskCallbackHandler extends BaseCallbackHandler {
48591
48778
  }
48592
48779
  const span = await this.session.createToolCallSpan({
48593
48780
  name: toolName,
48594
- args: parsedToolArgs
48781
+ args: parsedToolArgs,
48782
+ parent: this.resolveParentSpan(parentRunId)
48595
48783
  });
48596
48784
  this.spansByRunId.set(runId, span);
48597
48785
  }
48598
48786
  async handleToolEnd(output, runId, parentRunId, tags) {
48599
48787
  const span = this.spansByRunId.get(runId);
48600
- if (!span) {
48788
+ if (!(span instanceof ToolCallObservationSpan)) {
48601
48789
  captureError(new Error("Langchain invoked handleToolEnd but no span was found for the given runId. This tool call won't be included in Frisk telemetry data."), this.logger);
48602
48790
  return;
48603
48791
  }
48604
48792
  const toolCallId = output.tool_call_id;
48605
48793
  const status = output.status;
48794
+ this.stampLlmCallSpanId(span, toolCallId);
48606
48795
  this.closeToolCallSpan({
48607
48796
  toolCallId,
48608
48797
  span,
@@ -48613,7 +48802,7 @@ class FriskCallbackHandler extends BaseCallbackHandler {
48613
48802
  }
48614
48803
  async handleToolError(err, runId, parentRunId, tags) {
48615
48804
  const span = this.spansByRunId.get(runId);
48616
- if (!span) {
48805
+ if (!(span instanceof ToolCallObservationSpan)) {
48617
48806
  captureError(new Error("Langchain invoked handleToolError but no span was found for the given runId. This tool call won't be included in Frisk telemetry data."), this.logger);
48618
48807
  return;
48619
48808
  }
@@ -48625,6 +48814,144 @@ class FriskCallbackHandler extends BaseCallbackHandler {
48625
48814
  });
48626
48815
  this.spansByRunId.delete(runId);
48627
48816
  }
48817
+ resolveParentSpan(parentRunId) {
48818
+ if (parentRunId === undefined) {
48819
+ return null;
48820
+ }
48821
+ return this.spansByRunId.get(parentRunId) ?? null;
48822
+ }
48823
+ openLlmCallSpan(runId, parentRunId) {
48824
+ const existing = this.spansByRunId.get(runId);
48825
+ if (existing instanceof LlmCallSpan) {
48826
+ return existing;
48827
+ }
48828
+ const span = this.session.createLlmCallSpan({
48829
+ parent: this.resolveParentSpan(parentRunId)
48830
+ });
48831
+ this.spansByRunId.set(runId, span);
48832
+ return span;
48833
+ }
48834
+ safeJsonStringify(value, what) {
48835
+ try {
48836
+ return JSON.stringify(value);
48837
+ } catch (e) {
48838
+ captureError(new Error(`Failed to serialize ${what} for Frisk telemetry`, {
48839
+ cause: e
48840
+ }), this.logger);
48841
+ return null;
48842
+ }
48843
+ }
48844
+ getPromptMessages(messages) {
48845
+ const lastBatch = messages[messages.length - 1];
48846
+ if (!lastBatch || lastBatch.length === 0) {
48847
+ return [];
48848
+ }
48849
+ const collected = [];
48850
+ for (let i = lastBatch.length - 1;i >= 0; i--) {
48851
+ const message = lastBatch[i];
48852
+ const type = message.getType();
48853
+ if (type === "ai") {
48854
+ break;
48855
+ }
48856
+ const entry = { type, content: message.content };
48857
+ if (type === "tool") {
48858
+ const toolMessage = message;
48859
+ entry.metadata = {
48860
+ tool_name: toolMessage.name ?? null,
48861
+ tool_call_id: toolMessage.tool_call_id ?? null
48862
+ };
48863
+ }
48864
+ collected.push(entry);
48865
+ }
48866
+ collected.reverse();
48867
+ return collected;
48868
+ }
48869
+ finalizeLlmCall(output, runId, err) {
48870
+ const found = this.spansByRunId.get(runId) ?? null;
48871
+ const llmCallSpan = found instanceof LlmCallSpan ? found : null;
48872
+ const generations = output?.generations ?? [];
48873
+ const responses = [];
48874
+ const toolCalls = [];
48875
+ let modelName;
48876
+ let modelProvider;
48877
+ let inputTokens = 0;
48878
+ let outputTokens = 0;
48879
+ let totalTokens = 0;
48880
+ let hasUsage = false;
48881
+ for (const generationList of generations) {
48882
+ for (const generation of generationList) {
48883
+ const message = generation.message;
48884
+ const generationInfo = generation.generationInfo ?? {};
48885
+ const responseMetadata = message?.response_metadata ?? {};
48886
+ modelName = modelName || generationInfo.model || generationInfo.model_name || responseMetadata.model;
48887
+ modelProvider = modelProvider || generationInfo.model_provider || responseMetadata.model_provider;
48888
+ if (!message || message.getType() !== "ai") {
48889
+ if (!message && generation.text) {
48890
+ responses.push({ content: generation.text });
48891
+ }
48892
+ continue;
48893
+ }
48894
+ responses.push({ content: message.content });
48895
+ const usage = message.usage_metadata;
48896
+ if (usage) {
48897
+ inputTokens += usage.input_tokens ?? 0;
48898
+ outputTokens += usage.output_tokens ?? 0;
48899
+ totalTokens += usage.total_tokens ?? 0;
48900
+ hasUsage = true;
48901
+ }
48902
+ const messageToolCalls = message.tool_calls ?? [];
48903
+ for (const toolCall of messageToolCalls) {
48904
+ const announced = { tool_name: toolCall.name };
48905
+ const toolCallId = toolCall.id;
48906
+ if (toolCallId) {
48907
+ announced.tool_call_id = toolCallId;
48908
+ }
48909
+ toolCalls.push(announced);
48910
+ if (llmCallSpan !== null && toolCallId) {
48911
+ this.llmCallSpanIdByToolCallId.set(toolCallId, llmCallSpan.spanId);
48912
+ }
48913
+ }
48914
+ }
48915
+ }
48916
+ if (hasUsage) {
48917
+ this.session.recordTokenUsage({ inputTokens, outputTokens, totalTokens });
48918
+ }
48919
+ if (llmCallSpan !== null) {
48920
+ const responsesJson = responses.length > 0 ? this.safeJsonStringify(responses, "LLM responses") : null;
48921
+ const toolCallsJson = toolCalls.length > 0 ? this.safeJsonStringify(toolCalls, "LLM tool calls") : null;
48922
+ llmCallSpan.setAttributes({
48923
+ modelName,
48924
+ modelProvider,
48925
+ ...hasUsage ? { inputTokens, outputTokens, totalTokens } : {},
48926
+ ...responsesJson !== null ? { responsesJson } : {},
48927
+ ...toolCallsJson !== null ? { toolCallsJson } : {}
48928
+ });
48929
+ if (err !== null) {
48930
+ llmCallSpan.setAttributes({
48931
+ errorType: err.constructor.name,
48932
+ errorMessage: `${err}`
48933
+ });
48934
+ }
48935
+ }
48936
+ this.endSpan(runId);
48937
+ }
48938
+ stampLlmCallSpanId(span, toolCallId) {
48939
+ if (!toolCallId) {
48940
+ return;
48941
+ }
48942
+ const llmCallSpanId = this.llmCallSpanIdByToolCallId.get(toolCallId);
48943
+ if (llmCallSpanId !== undefined) {
48944
+ span.setAttributes({ llmCallSpanId });
48945
+ }
48946
+ this.llmCallSpanIdByToolCallId.delete(toolCallId);
48947
+ }
48948
+ endSpan(runId) {
48949
+ const span = this.spansByRunId.get(runId);
48950
+ if (span !== undefined) {
48951
+ span.end();
48952
+ this.spansByRunId.delete(runId);
48953
+ }
48954
+ }
48628
48955
  closeToolCallSpan({
48629
48956
  toolCallId,
48630
48957
  span,
@@ -48679,26 +49006,52 @@ function combineRedactOptions(...options) {
48679
49006
  }
48680
49007
  return false;
48681
49008
  }
48682
- function redactDictionarySimple(data, redactOption) {
49009
+ function deleteDotPath(root, path) {
49010
+ const parts = path.split(".").filter((p) => p.length > 0);
49011
+ if (parts.length === 0)
49012
+ return false;
49013
+ let cur = root;
49014
+ for (const key of parts.slice(0, -1)) {
49015
+ if (cur === null || typeof cur !== "object" || Array.isArray(cur))
49016
+ return false;
49017
+ if (!(key in cur))
49018
+ return false;
49019
+ cur = cur[key];
49020
+ }
49021
+ if (cur === null || typeof cur !== "object" || Array.isArray(cur))
49022
+ return false;
49023
+ const last = parts[parts.length - 1];
49024
+ if (!(last in cur))
49025
+ return false;
49026
+ delete cur[last];
49027
+ return true;
49028
+ }
49029
+ function deepClone(obj) {
49030
+ return JSON.parse(JSON.stringify(obj));
49031
+ }
49032
+ function redactObject(data, redactOption) {
48683
49033
  if (redactOption === undefined || redactOption === false) {
48684
49034
  return { value: data, redactedPaths: [] };
48685
49035
  }
48686
- const redactedPaths = [];
48687
- const result = { ...data };
48688
49036
  if (redactOption === true) {
48689
- for (const key of Object.keys(result)) {
48690
- delete result[key];
48691
- redactedPaths.push(key);
48692
- }
48693
- } else if (Array.isArray(redactOption)) {
48694
- for (const path of redactOption) {
48695
- if (path in result) {
48696
- delete result[path];
48697
- redactedPaths.push(path);
48698
- }
49037
+ return { value: {}, redactedPaths: ["*"] };
49038
+ }
49039
+ if (!Array.isArray(redactOption) || redactOption.length === 0) {
49040
+ return { value: data, redactedPaths: [] };
49041
+ }
49042
+ const out = deepClone(data);
49043
+ const hits = [];
49044
+ const seen = new Set;
49045
+ for (const rawPath of redactOption) {
49046
+ const path = rawPath.trim();
49047
+ if (path.length === 0)
49048
+ continue;
49049
+ if (deleteDotPath(out, path) && !seen.has(path)) {
49050
+ seen.add(path);
49051
+ hits.push(path);
48699
49052
  }
48700
49053
  }
48701
- return { value: result, redactedPaths };
49054
+ return { value: out, redactedPaths: hits };
48702
49055
  }
48703
49056
  // src/framework-adapter/base-framework-adapter.ts
48704
49057
  class BaseFrameworkAdapter {
@@ -48725,10 +49078,10 @@ class BaseFrameworkAdapter {
48725
49078
  };
48726
49079
  }
48727
49080
  toolArgsToDict(toolArgs, options) {
48728
- return redactDictionarySimple(toolArgs, options?.redact);
49081
+ return redactObject(toolArgs, options?.redact);
48729
49082
  }
48730
49083
  agentStateToDict(agentState, options) {
48731
- return redactDictionarySimple(agentState, options?.redact);
49084
+ return redactObject(agentState, options?.redact);
48732
49085
  }
48733
49086
  normalizeToolCall(toolCall) {
48734
49087
  return {
@@ -48749,22 +49102,6 @@ class BaseFrameworkAdapter {
48749
49102
  var DefaultWrapToolOptions = {
48750
49103
  captureReasoning: true
48751
49104
  };
48752
-
48753
- // src/native-bindings/index.ts
48754
- import { createRequire as createRequire2 } from "module";
48755
- import { dirname, resolve } from "path";
48756
- var require2 = createRequire2(import.meta.url);
48757
- function resolveNativePath() {
48758
- const injected = process.env.FRISk_NATIVE_BINDINGS_PATH;
48759
- if (injected)
48760
- return injected;
48761
- const pkgJsonPath = require2.resolve("@friskai/frisk-js/package.json");
48762
- const pkgRoot = dirname(pkgJsonPath);
48763
- return resolve(pkgRoot, "native/index.cjs");
48764
- }
48765
- var nativeBindings = require2(resolveNativePath());
48766
- var FriskHandle = nativeBindings.FriskHandle;
48767
- var redactDictionary = nativeBindings.redactDictionary;
48768
49105
  // src/telemetry/tracing-manager.ts
48769
49106
  var import_grpc_js = __toESM(require_src4(), 1);
48770
49107
  var import_exporter_trace_otlp_grpc = __toESM(require_src12(), 1);
@@ -49040,6 +49377,14 @@ class AccessTokenProvider {
49040
49377
  }
49041
49378
  }
49042
49379
 
49380
+ // src/core/redaction-options.ts
49381
+ function resolveRedactionOptions(options) {
49382
+ return {
49383
+ redactToolArgs: options?.redactToolArgs ?? false,
49384
+ redactAgentState: options?.redactAgentState ?? false
49385
+ };
49386
+ }
49387
+
49043
49388
  // src/core/sdk-attributes/detect-runtime.ts
49044
49389
  function detectRuntime() {
49045
49390
  const g = globalThis;
@@ -49075,12 +49420,12 @@ function detectRuntime() {
49075
49420
 
49076
49421
  // src/core/sdk-attributes/read-sdk-meta.ts
49077
49422
  import { existsSync, readFileSync } from "node:fs";
49078
- import { dirname as dirname2, join } from "node:path";
49423
+ import { dirname, join } from "node:path";
49079
49424
  import { fileURLToPath } from "node:url";
49080
49425
 
49081
49426
  // src/generated/sdk-meta.ts
49082
49427
  var SDK_NAME = "@friskai/frisk-js";
49083
- var SDK_VERSION = "0.2.10";
49428
+ var SDK_VERSION = "0.3.1";
49084
49429
 
49085
49430
  // src/core/sdk-attributes/read-sdk-meta.ts
49086
49431
  function getSdkMeta() {
@@ -49114,7 +49459,7 @@ function findNearestPackageJson(startDir) {
49114
49459
  if (existsSync(candidate)) {
49115
49460
  return candidate;
49116
49461
  }
49117
- const parent = dirname2(dir);
49462
+ const parent = dirname(dir);
49118
49463
  if (parent === dir) {
49119
49464
  return null;
49120
49465
  }
@@ -49123,7 +49468,7 @@ function findNearestPackageJson(startDir) {
49123
49468
  }
49124
49469
  function tryReadPackageJson() {
49125
49470
  try {
49126
- const here = dirname2(fileURLToPath(import.meta.url));
49471
+ const here = dirname(fileURLToPath(import.meta.url));
49127
49472
  const pkgPath = findNearestPackageJson(here);
49128
49473
  if (!pkgPath)
49129
49474
  return null;
@@ -49491,6 +49836,9 @@ class ToolRegistry {
49491
49836
 
49492
49837
  // src/core/frisk.ts
49493
49838
  class Frisk {
49839
+ get toolPoliciesAvailable() {
49840
+ return this.toolPolicies?.available ?? false;
49841
+ }
49494
49842
  get redaction() {
49495
49843
  return this._redaction;
49496
49844
  }
@@ -49498,24 +49846,34 @@ class Frisk {
49498
49846
  apiBaseUrl;
49499
49847
  otlpEndpoint;
49500
49848
  accessTokenProvider;
49849
+ get adapter() {
49850
+ return this._adapter;
49851
+ }
49852
+ get logLevel() {
49853
+ return this._logLevel;
49854
+ }
49855
+ get tracingManager() {
49856
+ if (!this._tracingManager) {
49857
+ throw new FriskNotInitializedError;
49858
+ }
49859
+ return this._tracingManager;
49860
+ }
49501
49861
  initialized = false;
49502
49862
  rootLogger;
49503
49863
  logger;
49504
49864
  _logLevel;
49505
49865
  _adapter;
49506
- _friskHandle = null;
49507
49866
  _tracingManager = null;
49508
- _toolRegistry;
49867
+ toolRegistry;
49509
49868
  sdkAttributes;
49869
+ extensions = [];
49870
+ toolPolicies = null;
49510
49871
  wrapToolsCalled = false;
49511
49872
  get toolRegistrationComplete() {
49512
49873
  if (!this.wrapToolsCalled) {
49513
49874
  return Promise.resolve(true);
49514
49875
  }
49515
- return this._toolRegistry.initialized;
49516
- }
49517
- get logLevel() {
49518
- return this._logLevel;
49876
+ return this.toolRegistry.initialized;
49519
49877
  }
49520
49878
  static async connect(options) {
49521
49879
  const instance = new this(options);
@@ -49529,7 +49887,7 @@ class Frisk {
49529
49887
  this._logLevel = options?.logging?.logLevel;
49530
49888
  this.logger = deriveSdkLogger({
49531
49889
  logger: this.rootLogger,
49532
- logLevel: this._logLevel
49890
+ logLevel: this.logLevel
49533
49891
  }, {
49534
49892
  component: "FriskCore"
49535
49893
  });
@@ -49549,10 +49907,10 @@ class Frisk {
49549
49907
  baseUrl,
49550
49908
  logging: {
49551
49909
  logger: this.rootLogger,
49552
- logLevel: this._logLevel
49910
+ logLevel: this.logLevel
49553
49911
  }
49554
49912
  });
49555
- this._toolRegistry = new ToolRegistry({
49913
+ this.toolRegistry = new ToolRegistry({
49556
49914
  apiBaseUrl: baseUrl,
49557
49915
  getAccessToken: async () => this.accessTokenProvider.getAccessToken(),
49558
49916
  logger: this.logger
@@ -49563,21 +49921,20 @@ class Frisk {
49563
49921
  }
49564
49922
  this.otlpEndpoint = otlpEndpoint;
49565
49923
  this._redaction = resolveRedactionOptions(options?.redact);
49924
+ this.extensions = options?.extensions ?? [];
49925
+ this.mountExtensions();
49566
49926
  }
49567
- get friskHandle() {
49568
- if (!this._friskHandle) {
49569
- throw new FriskNotInitializedError;
49927
+ mountExtensions() {
49928
+ for (const ext of this.extensions) {
49929
+ if ("available" in ext && "decideToolCall" in ext) {
49930
+ this.toolPolicies = ext;
49931
+ }
49570
49932
  }
49571
- return this._friskHandle;
49572
49933
  }
49573
- get adapter() {
49574
- return this._adapter;
49575
- }
49576
- get tracingManager() {
49577
- if (!this._tracingManager) {
49578
- throw new FriskNotInitializedError;
49934
+ async initializeExtensions() {
49935
+ for (const ext of this.extensions) {
49936
+ await ext.initialize(this);
49579
49937
  }
49580
- return this._tracingManager;
49581
49938
  }
49582
49939
  async connect() {
49583
49940
  if (!this.initialized) {
@@ -49591,20 +49948,20 @@ class Frisk {
49591
49948
  tracerName: TRACER_NAME,
49592
49949
  tracerVersion: TRACER_VERSION
49593
49950
  });
49594
- this._friskHandle = new FriskHandle(currentToken, this.apiBaseUrl, this.otlpEndpoint);
49595
49951
  this.accessTokenProvider.addCallback((newToken) => this.updateAccessToken(newToken));
49596
49952
  this.accessTokenProvider.startBackgroundRefresh();
49597
49953
  this.initialized = true;
49954
+ await this.initializeExtensions();
49598
49955
  }
49599
49956
  }
49600
49957
  session(metadata) {
49601
49958
  const session = new FriskSession({
49602
49959
  frisk: this,
49603
- redact: this._redaction,
49960
+ redact: this.redaction,
49604
49961
  tracer: this.tracingManager.getTracer(),
49605
49962
  logging: {
49606
49963
  logger: this.rootLogger,
49607
- logLevel: this._logLevel
49964
+ logLevel: this.logLevel
49608
49965
  }
49609
49966
  });
49610
49967
  const registry2 = SessionRegistry.getInstance();
@@ -49612,20 +49969,20 @@ class Frisk {
49612
49969
  return session;
49613
49970
  }
49614
49971
  normalizeToolCall(toolCall) {
49615
- return this._adapter.normalizeToolCall(toolCall);
49972
+ return this.adapter.normalizeToolCall(toolCall);
49616
49973
  }
49617
49974
  wrapTools(tools, options = DefaultWrapToolOptions) {
49618
49975
  this.wrapToolsCalled = true;
49619
49976
  const toolList = [...tools];
49620
- const registerToolProperties = toolList.map((tool) => this._adapter.extractRegisterToolProperties?.(tool)).filter((properties) => properties !== null && properties !== undefined);
49977
+ const registerToolProperties = toolList.map((tool) => this.adapter.extractRegisterToolProperties?.(tool)).filter((properties) => properties !== null && properties !== undefined);
49621
49978
  if (registerToolProperties.length > 0) {
49622
- this._toolRegistry.registerTools({
49979
+ this.toolRegistry.registerTools({
49623
49980
  tools: registerToolProperties,
49624
49981
  sdkAttributes: this.sdkAttributes
49625
49982
  });
49626
49983
  }
49627
- if (this._adapter.wrapTools) {
49628
- return this._adapter.wrapTools(toolList, options);
49984
+ if (this.adapter.wrapTools) {
49985
+ return this.adapter.wrapTools(toolList, options);
49629
49986
  }
49630
49987
  return toolList;
49631
49988
  }
@@ -49637,8 +49994,8 @@ class Frisk {
49637
49994
  };
49638
49995
  }
49639
49996
  wrapTool(tool, options = DefaultWrapToolOptions) {
49640
- if (this._adapter.wrapTool) {
49641
- return this._adapter.wrapTool(tool, options);
49997
+ if (this.adapter.wrapTool) {
49998
+ return this.adapter.wrapTool(tool, options);
49642
49999
  }
49643
50000
  return tool;
49644
50001
  }
@@ -49647,30 +50004,38 @@ class Frisk {
49647
50004
  return registry2.get(sessionId);
49648
50005
  }
49649
50006
  updateAccessToken(authToken) {
49650
- this.friskHandle.updateAuthToken(authToken);
50007
+ this.toolPolicies?.updateAccessToken(authToken);
49651
50008
  this.tracingManager.updateAuthToken(authToken);
49652
50009
  }
49653
50010
  getRegisteredTool(toolName) {
49654
- return this._toolRegistry.getRegisteredTool(toolName);
50011
+ return this.toolRegistry.getRegisteredTool(toolName);
49655
50012
  }
49656
50013
  decideToolCall({
49657
50014
  toolCall,
49658
50015
  agentState,
49659
50016
  traceContextCarrier
49660
50017
  }) {
49661
- const id = toolCall.id ?? v4();
49662
- const argsJson = toolCall.args ? JSON.stringify(removeLlmReasoningArg(toolCall.args)) : null;
49663
- const stateJson = agentState ? JSON.stringify(agentState) : null;
49664
- const registeredTool = this.getRegisteredTool(toolCall.name);
49665
- const coreResult = this.friskHandle.process(toolCall.name, registeredTool?.id ?? null, registeredTool?.versionId ?? null, argsJson, stateJson, id, this._redaction, traceContextCarrier);
49666
- const outcome = coreResult.decision === "allow" ? "allow" /* ALLOW */ : coreResult.decision === "deny" ? "deny" /* DENY */ : coreResult.decision === "escalate" ? "escalate" /* ESCALATE */ : "error" /* ERROR */;
49667
- return {
49668
- outcome,
49669
- rulesMatchedCount: coreResult.rulesMatchedCount,
49670
- reason: coreResult.reason,
49671
- policyId: coreResult.policyId,
49672
- policyVersionId: coreResult.policyVersionId
49673
- };
50018
+ if (!this.toolPolicies) {
50019
+ throw new MissingToolPoliciesExtensionError;
50020
+ }
50021
+ const toolArgsJson = toolCall.args ? JSON.stringify(toolCall.args) : null;
50022
+ const agentStateJson = agentState ? JSON.stringify(agentState) : null;
50023
+ const redactedArgs = toolCall.args ? redactObject(toolCall.args, this.redaction.redactToolArgs) : { value: {}, redactedPaths: [] };
50024
+ const toolArgsRedactedJson = toolCall.args ? JSON.stringify(redactedArgs.value) : null;
50025
+ const toolArgsRedactedPathsJson = JSON.stringify(redactedArgs.redactedPaths);
50026
+ const redactedState = agentState ? redactObject(agentState, this.redaction.redactAgentState) : { value: {}, redactedPaths: [] };
50027
+ const agentStateRedactedJson = agentState ? JSON.stringify(redactedState.value) : null;
50028
+ const agentStateRedactedPathsJson = JSON.stringify(redactedState.redactedPaths);
50029
+ return this.toolPolicies.decideToolCall({
50030
+ toolCall,
50031
+ toolArgsJson,
50032
+ toolArgsRedactedJson,
50033
+ toolArgsRedactedPathsJson,
50034
+ agentStateJson,
50035
+ agentStateRedactedJson,
50036
+ agentStateRedactedPathsJson,
50037
+ traceContextCarrier
50038
+ });
49674
50039
  }
49675
50040
  async getOrCreateToolApprovalRequest({
49676
50041
  toolCallId,
@@ -49718,7 +50083,9 @@ class Frisk {
49718
50083
  if (this.tracingManager) {
49719
50084
  await this.tracingManager.shutdown();
49720
50085
  }
49721
- this.friskHandle.shutdown();
50086
+ for (const ext of this.extensions) {
50087
+ ext.shutdown();
50088
+ }
49722
50089
  }
49723
50090
  }
49724
50091
 
@@ -49778,7 +50145,10 @@ class FriskToolMiddleware {
49778
50145
  this.logger = deriveSdkLogger(options?.logging, {
49779
50146
  component: "FriskToolMiddleware"
49780
50147
  });
49781
- this.toolPoliciesEnabled = options?.controls?.toolPolicies !== false;
50148
+ this.toolPoliciesEnabled = options?.controls?.toolPolicies === true;
50149
+ if (this.toolPoliciesEnabled && !frisk.toolPoliciesAvailable) {
50150
+ throw new MissingToolPoliciesExtensionError;
50151
+ }
49782
50152
  }
49783
50153
  get frisk() {
49784
50154
  return this._frisk;
@@ -50039,14 +50409,14 @@ function createFriskToolCallId() {
50039
50409
  }
50040
50410
 
50041
50411
  // src/adapters/langchain/langchain-framework-adapter/get-langchain-version.ts
50042
- import { createRequire as createRequire3 } from "module";
50412
+ import { createRequire as createRequire2 } from "module";
50043
50413
  var langchainVersionSet = false;
50044
50414
  var langchainVersion = null;
50045
50415
  function tryGetLangchainVersion() {
50046
50416
  if (!langchainVersionSet) {
50047
50417
  try {
50048
- const require3 = createRequire3(import.meta.url);
50049
- const pkg = require3("langchain/package.json");
50418
+ const require2 = createRequire2(import.meta.url);
50419
+ const pkg = require2("langchain/package.json");
50050
50420
  langchainVersion = pkg.version ?? null;
50051
50421
  } catch {
50052
50422
  langchainVersion = null;
@@ -50147,11 +50517,11 @@ class LangchainFrameworkAdapter {
50147
50517
  };
50148
50518
  }
50149
50519
  toolArgsToDict(toolArgs, options) {
50150
- return redactDictionarySimple(toolArgs, options?.redact);
50520
+ return redactObject(toolArgs, options?.redact);
50151
50521
  }
50152
50522
  agentStateToDict(agentState, options) {
50153
50523
  const combinedRedact = combineRedactOptions(EXCLUDED_STATE_KEYS, options?.redact);
50154
- return redactDictionarySimple(agentState, combinedRedact);
50524
+ return redactObject(agentState, combinedRedact);
50155
50525
  }
50156
50526
  normalizeToolCall(toolCall) {
50157
50527
  return {
@@ -50218,7 +50588,7 @@ var FRISK_CONTEXT_SCHEMA = object({
50218
50588
  [FRISK_SESSION_ID_KEY]: string2().optional()
50219
50589
  });
50220
50590
  var DefaultFriskGuardControls = {
50221
- toolPolicies: true
50591
+ toolPolicies: false
50222
50592
  };
50223
50593
 
50224
50594
  class FriskLangchain extends Frisk {
@@ -50279,5 +50649,5 @@ export {
50279
50649
  FRISK_SESSION_ID_KEY
50280
50650
  };
50281
50651
 
50282
- //# debugId=A5DABECDF865C55064756E2164756E21
50652
+ //# debugId=B3DA4933179DBD8B64756E2164756E21
50283
50653
  //# sourceMappingURL=index.js.map