@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
package/dist/index.js CHANGED
@@ -1141,7 +1141,7 @@ var require_call_credentials = __commonJS((exports) => {
1141
1141
  if (isCurrentOauth2Client(googleCredentials)) {
1142
1142
  getHeaders = googleCredentials.getRequestHeaders(options.service_url);
1143
1143
  } else {
1144
- getHeaders = new Promise((resolve2, reject) => {
1144
+ getHeaders = new Promise((resolve, reject) => {
1145
1145
  googleCredentials.getRequestMetadata(options.service_url, (err, headers) => {
1146
1146
  if (err) {
1147
1147
  reject(err);
@@ -1151,7 +1151,7 @@ var require_call_credentials = __commonJS((exports) => {
1151
1151
  reject(new Error("Headers not set by metadata plugin"));
1152
1152
  return;
1153
1153
  }
1154
- resolve2(headers);
1154
+ resolve(headers);
1155
1155
  });
1156
1156
  });
1157
1157
  }
@@ -1206,10 +1206,10 @@ var require_call_credentials = __commonJS((exports) => {
1206
1206
  this.metadataGenerator = metadataGenerator;
1207
1207
  }
1208
1208
  generateMetadata(options) {
1209
- return new Promise((resolve2, reject) => {
1209
+ return new Promise((resolve, reject) => {
1210
1210
  this.metadataGenerator(options, (err, metadata) => {
1211
1211
  if (metadata !== undefined) {
1212
- resolve2(metadata);
1212
+ resolve(metadata);
1213
1213
  } else {
1214
1214
  reject(err);
1215
1215
  }
@@ -1531,14 +1531,14 @@ var require_channel_credentials = __commonJS((exports) => {
1531
1531
  }
1532
1532
  connect(socket) {
1533
1533
  const tlsConnectOptions = Object.assign({ socket }, this.connectionOptions);
1534
- return new Promise((resolve2, reject) => {
1534
+ return new Promise((resolve, reject) => {
1535
1535
  const tlsSocket = (0, tls_1.connect)(tlsConnectOptions, () => {
1536
1536
  var _a;
1537
1537
  if (((_a = this.connectionOptions.rejectUnauthorized) !== null && _a !== undefined ? _a : true) && !tlsSocket.authorized) {
1538
1538
  reject(tlsSocket.authorizationError);
1539
1539
  return;
1540
1540
  }
1541
- resolve2({
1541
+ resolve({
1542
1542
  socket: tlsSocket,
1543
1543
  secure: true
1544
1544
  });
@@ -1658,8 +1658,8 @@ var require_channel_credentials = __commonJS((exports) => {
1658
1658
  if (this.hasReceivedUpdates()) {
1659
1659
  return Promise.resolve(this.getLatestSecureContext());
1660
1660
  } else {
1661
- return new Promise((resolve2) => {
1662
- this.secureContextWatchers.push(resolve2);
1661
+ return new Promise((resolve) => {
1662
+ this.secureContextWatchers.push(resolve);
1663
1663
  });
1664
1664
  }
1665
1665
  }
@@ -1692,7 +1692,7 @@ var require_channel_credentials = __commonJS((exports) => {
1692
1692
  this.callCredentials = callCredentials;
1693
1693
  }
1694
1694
  connect(socket) {
1695
- return new Promise((resolve2, reject) => {
1695
+ return new Promise((resolve, reject) => {
1696
1696
  const secureContext = this.parent.getLatestSecureContext();
1697
1697
  if (!secureContext) {
1698
1698
  reject(new Error("Failed to load credentials"));
@@ -1717,7 +1717,7 @@ var require_channel_credentials = __commonJS((exports) => {
1717
1717
  reject(tlsSocket.authorizationError);
1718
1718
  return;
1719
1719
  }
1720
- resolve2({
1720
+ resolve({
1721
1721
  socket: tlsSocket,
1722
1722
  secure: true
1723
1723
  });
@@ -5245,7 +5245,7 @@ var require_aspromise = __commonJS((exports, module) => {
5245
5245
  var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true;
5246
5246
  while (index < arguments.length)
5247
5247
  params[offset++] = arguments[index++];
5248
- return new Promise(function executor(resolve2, reject) {
5248
+ return new Promise(function executor(resolve, reject) {
5249
5249
  params[offset] = function callback(err) {
5250
5250
  if (pending) {
5251
5251
  pending = false;
@@ -5255,7 +5255,7 @@ var require_aspromise = __commonJS((exports, module) => {
5255
5255
  var params2 = new Array(arguments.length - 1), offset2 = 0;
5256
5256
  while (offset2 < params2.length)
5257
5257
  params2[offset2++] = arguments[offset2];
5258
- resolve2.apply(null, params2);
5258
+ resolve.apply(null, params2);
5259
5259
  }
5260
5260
  }
5261
5261
  };
@@ -6643,7 +6643,7 @@ var require_path = __commonJS((exports) => {
6643
6643
  }
6644
6644
  return prefix + parts.join("/");
6645
6645
  };
6646
- path.resolve = function resolve2(originPath, includePath, alreadyNormalized) {
6646
+ path.resolve = function resolve(originPath, includePath, alreadyNormalized) {
6647
6647
  if (!alreadyNormalized)
6648
6648
  includePath = normalize(includePath);
6649
6649
  if (isAbsolute(includePath))
@@ -6956,7 +6956,7 @@ var require_mapfield = __commonJS((exports, module) => {
6956
6956
  keepComments ? this.comment : undefined
6957
6957
  ]);
6958
6958
  };
6959
- MapField.prototype.resolve = function resolve2() {
6959
+ MapField.prototype.resolve = function resolve() {
6960
6960
  if (this.resolved)
6961
6961
  return this;
6962
6962
  if (types.mapKey[this.keyType] === undefined)
@@ -7029,7 +7029,7 @@ var require_method = __commonJS((exports, module) => {
7029
7029
  this.parsedOptions
7030
7030
  ]);
7031
7031
  };
7032
- Method.prototype.resolve = function resolve2() {
7032
+ Method.prototype.resolve = function resolve() {
7033
7033
  if (this.resolved)
7034
7034
  return this;
7035
7035
  this.resolvedRequestType = this.parent.lookupType(this.requestType);
@@ -8429,7 +8429,7 @@ var require_field = __commonJS((exports, module) => {
8429
8429
  keepComments ? this.comment : undefined
8430
8430
  ]);
8431
8431
  };
8432
- Field.prototype.resolve = function resolve2() {
8432
+ Field.prototype.resolve = function resolve() {
8433
8433
  if (this.resolved)
8434
8434
  return this;
8435
8435
  if ((this.typeDefault = types.defaults[this.type]) === undefined) {
@@ -8683,7 +8683,7 @@ var require_object = __commonJS((exports, module) => {
8683
8683
  this.parent = null;
8684
8684
  this.resolved = false;
8685
8685
  };
8686
- ReflectionObject.prototype.resolve = function resolve2() {
8686
+ ReflectionObject.prototype.resolve = function resolve() {
8687
8687
  if (this.resolved)
8688
8688
  return this;
8689
8689
  if (this.root instanceof Root)
@@ -14234,18 +14234,18 @@ var require_compression_filter = __commonJS((exports) => {
14234
14234
  this.maxRecvMessageLength = maxRecvMessageLength;
14235
14235
  }
14236
14236
  compressMessage(message) {
14237
- return new Promise((resolve2, reject) => {
14237
+ return new Promise((resolve, reject) => {
14238
14238
  zlib.deflate(message, (err, output) => {
14239
14239
  if (err) {
14240
14240
  reject(err);
14241
14241
  } else {
14242
- resolve2(output);
14242
+ resolve(output);
14243
14243
  }
14244
14244
  });
14245
14245
  });
14246
14246
  }
14247
14247
  decompressMessage(message) {
14248
- return new Promise((resolve2, reject) => {
14248
+ return new Promise((resolve, reject) => {
14249
14249
  let totalLength = 0;
14250
14250
  const messageParts = [];
14251
14251
  const decompresser = zlib.createInflate();
@@ -14261,7 +14261,7 @@ var require_compression_filter = __commonJS((exports) => {
14261
14261
  }
14262
14262
  });
14263
14263
  decompresser.on("end", () => {
14264
- resolve2(Buffer.concat(messageParts));
14264
+ resolve(Buffer.concat(messageParts));
14265
14265
  });
14266
14266
  decompresser.write(message);
14267
14267
  decompresser.end();
@@ -14275,18 +14275,18 @@ var require_compression_filter = __commonJS((exports) => {
14275
14275
  this.maxRecvMessageLength = maxRecvMessageLength;
14276
14276
  }
14277
14277
  compressMessage(message) {
14278
- return new Promise((resolve2, reject) => {
14278
+ return new Promise((resolve, reject) => {
14279
14279
  zlib.gzip(message, (err, output) => {
14280
14280
  if (err) {
14281
14281
  reject(err);
14282
14282
  } else {
14283
- resolve2(output);
14283
+ resolve(output);
14284
14284
  }
14285
14285
  });
14286
14286
  });
14287
14287
  }
14288
14288
  decompressMessage(message) {
14289
- return new Promise((resolve2, reject) => {
14289
+ return new Promise((resolve, reject) => {
14290
14290
  let totalLength = 0;
14291
14291
  const messageParts = [];
14292
14292
  const decompresser = zlib.createGunzip();
@@ -14302,7 +14302,7 @@ var require_compression_filter = __commonJS((exports) => {
14302
14302
  }
14303
14303
  });
14304
14304
  decompresser.on("end", () => {
14305
- resolve2(Buffer.concat(messageParts));
14305
+ resolve(Buffer.concat(messageParts));
14306
14306
  });
14307
14307
  decompresser.write(message);
14308
14308
  decompresser.end();
@@ -15556,7 +15556,7 @@ var require_http_proxy = __commonJS((exports) => {
15556
15556
  options.headers = headers;
15557
15557
  const proxyAddressString = (0, subchannel_address_1.subchannelAddressToString)(address);
15558
15558
  trace("Using proxy " + proxyAddressString + " to connect to " + options.path);
15559
- return new Promise((resolve2, reject) => {
15559
+ return new Promise((resolve, reject) => {
15560
15560
  const request = http.request(options);
15561
15561
  request.once("connect", (res, socket, head) => {
15562
15562
  request.removeAllListeners();
@@ -15567,7 +15567,7 @@ var require_http_proxy = __commonJS((exports) => {
15567
15567
  socket.unshift(head);
15568
15568
  }
15569
15569
  trace("Successfully established a plaintext connection to " + options.path + " through proxy " + proxyAddressString);
15570
- resolve2(socket);
15570
+ resolve(socket);
15571
15571
  } else {
15572
15572
  (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to " + options.path + " through proxy " + proxyAddressString + " with status " + res.statusCode);
15573
15573
  reject();
@@ -16439,7 +16439,7 @@ var require_transport = __commonJS((exports) => {
16439
16439
  if (secureConnectResult.socket.closed) {
16440
16440
  return Promise.reject("Connection closed before starting HTTP/2 handshake");
16441
16441
  }
16442
- return new Promise((resolve2, reject) => {
16442
+ return new Promise((resolve, reject) => {
16443
16443
  var _a, _b, _c, _d, _e, _f, _g, _h;
16444
16444
  let remoteName = null;
16445
16445
  let realTarget = this.channelTarget;
@@ -16504,7 +16504,7 @@ var require_transport = __commonJS((exports) => {
16504
16504
  session.removeAllListeners();
16505
16505
  secureConnectResult.socket.removeListener("close", closeHandler);
16506
16506
  secureConnectResult.socket.removeListener("error", errorHandler);
16507
- resolve2(new Http2Transport(session, address, options, remoteName));
16507
+ resolve(new Http2Transport(session, address, options, remoteName));
16508
16508
  this.session = null;
16509
16509
  });
16510
16510
  session.once("close", closeHandler);
@@ -16518,7 +16518,7 @@ var require_transport = __commonJS((exports) => {
16518
16518
  if (proxiedSocket) {
16519
16519
  return proxiedSocket;
16520
16520
  } else {
16521
- return new Promise((resolve2, reject) => {
16521
+ return new Promise((resolve, reject) => {
16522
16522
  const closeCallback = () => {
16523
16523
  reject(new Error("Socket closed"));
16524
16524
  };
@@ -16528,7 +16528,7 @@ var require_transport = __commonJS((exports) => {
16528
16528
  const socket = net.connect(address, () => {
16529
16529
  socket.removeListener("close", closeCallback);
16530
16530
  socket.removeListener("error", errorCallback);
16531
- resolve2(socket);
16531
+ resolve(socket);
16532
16532
  });
16533
16533
  socket.once("close", closeCallback);
16534
16534
  socket.once("error", errorCallback);
@@ -19742,7 +19742,7 @@ var require_server_interceptors = __commonJS((exports) => {
19742
19742
  } else {
19743
19743
  decompresser = zlib.createGunzip();
19744
19744
  }
19745
- return new Promise((resolve2, reject) => {
19745
+ return new Promise((resolve, reject) => {
19746
19746
  let totalLength = 0;
19747
19747
  const messageParts = [];
19748
19748
  decompresser.on("data", (chunk) => {
@@ -19757,7 +19757,7 @@ var require_server_interceptors = __commonJS((exports) => {
19757
19757
  }
19758
19758
  });
19759
19759
  decompresser.on("end", () => {
19760
- resolve2(Buffer.concat(messageParts));
19760
+ resolve(Buffer.concat(messageParts));
19761
19761
  });
19762
19762
  decompresser.write(messageContents);
19763
19763
  decompresser.end();
@@ -20350,10 +20350,10 @@ var require_server = __commonJS((exports) => {
20350
20350
  bindOneAddress(address, boundPortObject) {
20351
20351
  this.trace("Attempting to bind " + (0, subchannel_address_1.subchannelAddressToString)(address));
20352
20352
  const http2Server = this.createHttp2Server(boundPortObject.credentials);
20353
- return new Promise((resolve2, reject) => {
20353
+ return new Promise((resolve, reject) => {
20354
20354
  const onError = (err) => {
20355
20355
  this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message);
20356
- resolve2({
20356
+ resolve({
20357
20357
  port: "port" in address ? address.port : 1,
20358
20358
  error: err.message
20359
20359
  });
@@ -20381,7 +20381,7 @@ var require_server = __commonJS((exports) => {
20381
20381
  });
20382
20382
  boundPortObject.listeningServers.add(http2Server);
20383
20383
  this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress));
20384
- resolve2({
20384
+ resolve({
20385
20385
  port: "port" in boundSubchannelAddress ? boundSubchannelAddress.port : 1
20386
20386
  });
20387
20387
  http2Server.removeListener("error", onError);
@@ -20434,7 +20434,7 @@ var require_server = __commonJS((exports) => {
20434
20434
  }
20435
20435
  }
20436
20436
  resolvePort(port) {
20437
- return new Promise((resolve2, reject) => {
20437
+ return new Promise((resolve, reject) => {
20438
20438
  let seenResolution = false;
20439
20439
  const resolverListener = (endpointList, attributes, serviceConfig, resolutionNote) => {
20440
20440
  if (seenResolution) {
@@ -20450,7 +20450,7 @@ var require_server = __commonJS((exports) => {
20450
20450
  reject(new Error(`No addresses resolved for port ${port}`));
20451
20451
  return true;
20452
20452
  }
20453
- resolve2(addressList);
20453
+ resolve(addressList);
20454
20454
  return true;
20455
20455
  };
20456
20456
  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_src4();
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
  }
@@ -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
  }
@@ -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((error) => {
43063
43063
  (0, core_1.globalErrorHandler)(error || 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((error) => {
43158
43158
  clearTimeout(timeoutInterval);
43159
43159
  state = ForceFlushState.error;
43160
- resolve2(error);
43160
+ resolve(error);
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 errors = results.filter((result) => result !== ForceFlushState.resolved);
43167
43167
  if (errors.length > 0) {
43168
43168
  reject(errors);
43169
43169
  } else {
43170
- resolve2();
43170
+ resolve();
43171
43171
  }
43172
43172
  }).catch((error) => reject([error]));
43173
43173
  });
@@ -43595,10 +43595,10 @@ class UnexpectedFriskServerResponseError extends Error {
43595
43595
  }
43596
43596
  }
43597
43597
 
43598
- class ToolCallSpanNotInitializedError extends Error {
43599
- constructor(message = "Tool call span has not been initialized. Call enter() first.") {
43600
- super(message);
43601
- this.name = "ToolCallSpanNotInitializedError";
43598
+ class MissingToolPoliciesExtensionError extends FriskError {
43599
+ constructor(options) {
43600
+ 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);
43601
+ this.name = "MissingToolPoliciesExtensionError";
43602
43602
  }
43603
43603
  }
43604
43604
 
@@ -43940,23 +43940,6 @@ class AccessTokenProvider {
43940
43940
  return this.refreshIntervalId !== null;
43941
43941
  }
43942
43942
  }
43943
- // ../../node_modules/uuid/wrapper.mjs
43944
- var import_dist = __toESM(require_dist(), 1);
43945
- var v1 = import_dist.default.v1;
43946
- var v1ToV6 = import_dist.default.v1ToV6;
43947
- var v3 = import_dist.default.v3;
43948
- var v4 = import_dist.default.v4;
43949
- var v5 = import_dist.default.v5;
43950
- var v6 = import_dist.default.v6;
43951
- var v6ToV1 = import_dist.default.v6ToV1;
43952
- var v7 = import_dist.default.v7;
43953
- var NIL = import_dist.default.NIL;
43954
- var MAX = import_dist.default.MAX;
43955
- var version = import_dist.default.version;
43956
- var validate = import_dist.default.validate;
43957
- var stringify = import_dist.default.stringify;
43958
- var parse = import_dist.default.parse;
43959
-
43960
43943
  // src/env/index.ts
43961
43944
  var FRISK_API_KEY = "FRISK_API_KEY";
43962
43945
  var FRISK_BASE_URL = "FRISK_BASE_URL";
@@ -43993,27 +43976,70 @@ function combineRedactOptions(...options) {
43993
43976
  }
43994
43977
  return false;
43995
43978
  }
43996
- function redactDictionarySimple(data, redactOption) {
43979
+ function deleteDotPath(root, path) {
43980
+ const parts = path.split(".").filter((p) => p.length > 0);
43981
+ if (parts.length === 0)
43982
+ return false;
43983
+ let cur = root;
43984
+ for (const key of parts.slice(0, -1)) {
43985
+ if (cur === null || typeof cur !== "object" || Array.isArray(cur))
43986
+ return false;
43987
+ if (!(key in cur))
43988
+ return false;
43989
+ cur = cur[key];
43990
+ }
43991
+ if (cur === null || typeof cur !== "object" || Array.isArray(cur))
43992
+ return false;
43993
+ const last = parts[parts.length - 1];
43994
+ if (!(last in cur))
43995
+ return false;
43996
+ delete cur[last];
43997
+ return true;
43998
+ }
43999
+ function deepClone(obj) {
44000
+ return JSON.parse(JSON.stringify(obj));
44001
+ }
44002
+ function redactObject(data, redactOption) {
43997
44003
  if (redactOption === undefined || redactOption === false) {
43998
44004
  return { value: data, redactedPaths: [] };
43999
44005
  }
44000
- const redactedPaths = [];
44001
- const result = { ...data };
44002
44006
  if (redactOption === true) {
44003
- for (const key of Object.keys(result)) {
44004
- delete result[key];
44005
- redactedPaths.push(key);
44006
- }
44007
- } else if (Array.isArray(redactOption)) {
44008
- for (const path of redactOption) {
44009
- if (path in result) {
44010
- delete result[path];
44011
- redactedPaths.push(path);
44012
- }
44007
+ return { value: {}, redactedPaths: ["*"] };
44008
+ }
44009
+ if (!Array.isArray(redactOption) || redactOption.length === 0) {
44010
+ return { value: data, redactedPaths: [] };
44011
+ }
44012
+ const out = deepClone(data);
44013
+ const hits = [];
44014
+ const seen = new Set;
44015
+ for (const rawPath of redactOption) {
44016
+ const path = rawPath.trim();
44017
+ if (path.length === 0)
44018
+ continue;
44019
+ if (deleteDotPath(out, path) && !seen.has(path)) {
44020
+ seen.add(path);
44021
+ hits.push(path);
44013
44022
  }
44014
44023
  }
44015
- return { value: result, redactedPaths };
44024
+ return { value: out, redactedPaths: hits };
44016
44025
  }
44026
+ // ../../node_modules/uuid/wrapper.mjs
44027
+ var import_dist = __toESM(require_dist(), 1);
44028
+ var v1 = import_dist.default.v1;
44029
+ var v1ToV6 = import_dist.default.v1ToV6;
44030
+ var v3 = import_dist.default.v3;
44031
+ var v4 = import_dist.default.v4;
44032
+ var v5 = import_dist.default.v5;
44033
+ var v6 = import_dist.default.v6;
44034
+ var v6ToV1 = import_dist.default.v6ToV1;
44035
+ var v7 = import_dist.default.v7;
44036
+ var NIL = import_dist.default.NIL;
44037
+ var MAX = import_dist.default.MAX;
44038
+ var version = import_dist.default.version;
44039
+ var validate = import_dist.default.validate;
44040
+ var stringify = import_dist.default.stringify;
44041
+ var parse = import_dist.default.parse;
44042
+
44017
44043
  // src/framework-adapter/base-framework-adapter.ts
44018
44044
  class BaseFrameworkAdapter {
44019
44045
  agentFramework = "none";
@@ -44039,10 +44065,10 @@ class BaseFrameworkAdapter {
44039
44065
  };
44040
44066
  }
44041
44067
  toolArgsToDict(toolArgs, options) {
44042
- return redactDictionarySimple(toolArgs, options?.redact);
44068
+ return redactObject(toolArgs, options?.redact);
44043
44069
  }
44044
44070
  agentStateToDict(agentState, options) {
44045
- return redactDictionarySimple(agentState, options?.redact);
44071
+ return redactObject(agentState, options?.redact);
44046
44072
  }
44047
44073
  normalizeToolCall(toolCall) {
44048
44074
  return {
@@ -44064,28 +44090,23 @@ var DefaultWrapToolOptions = {
44064
44090
  captureReasoning: true
44065
44091
  };
44066
44092
 
44067
- // src/native-bindings/index.ts
44068
- import { createRequire as createRequire2 } from "module";
44069
- import { dirname, resolve } from "path";
44070
- var require2 = createRequire2(import.meta.url);
44071
- function resolveNativePath() {
44072
- const injected = process.env.FRISk_NATIVE_BINDINGS_PATH;
44073
- if (injected)
44074
- return injected;
44075
- const pkgJsonPath = require2.resolve("@friskai/frisk-js/package.json");
44076
- const pkgRoot = dirname(pkgJsonPath);
44077
- return resolve(pkgRoot, "native/index.cjs");
44078
- }
44079
- var nativeBindings = require2(resolveNativePath());
44080
- var FriskHandle = nativeBindings.FriskHandle;
44081
- var redactDictionary = nativeBindings.redactDictionary;
44082
-
44083
44093
  // src/telemetry/constants.ts
44084
44094
  var TRACER_NAME = "frisk_js_sdk";
44085
44095
  var TRACER_VERSION = "0.1.0";
44086
44096
  var SPAN_NAME_DECIDE_TOOL_CALL = "frisk.tool_call.decide";
44087
44097
  var SPAN_NAME_OBSERVE_TOOL_CALL = "frisk.tool_call.observation";
44098
+ var SPAN_NAME_LLM_CALL = "frisk.llm_call";
44099
+ var SPAN_NAME_OPERATION = "frisk.operation";
44088
44100
  var SPAN_NAME_FRISK_SESSION = "frisk.session";
44101
+ var ATTRIBUTE_NAME_LLM_CALL_SPAN_ID = "frisk.tool_call.llm_call_span_id";
44102
+ var ATTRIBUTE_NAME_LLM_CALL_PROMPTS_JSON = "frisk.llm_call.prompts.json";
44103
+ var ATTRIBUTE_NAME_LLM_CALL_RESPONSES_JSON = "frisk.llm_call.responses.json";
44104
+ var ATTRIBUTE_NAME_LLM_CALL_TOOL_CALLS_JSON = "frisk.llm_call.tool_calls.json";
44105
+ var ATTRIBUTE_NAME_MODEL_NAME = "frisk.model.name";
44106
+ var ATTRIBUTE_NAME_MODEL_PROVIDER = "frisk.model.provider";
44107
+ var ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS = "frisk.token_usage.input_tokens";
44108
+ var ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS = "frisk.token_usage.output_tokens";
44109
+ var ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS = "frisk.token_usage.total_tokens";
44089
44110
  var ATTRIBUTE_NAME_SESSION_PROMPT = "frisk.session.prompt";
44090
44111
  var ATTRIBUTE_NAME_SESSION_ID = "frisk.session.id";
44091
44112
  var ATTRIBUTE_NAME_REMOTE_SESSION_ID = "frisk.session.remote_id";
@@ -48449,6 +48470,18 @@ var llmReasoningZodShape = {
48449
48470
  [LLM_REASONING_ARG_NAME]: string2().describe(LLM_REASONING_ARG_DESCRIPTION)
48450
48471
  };
48451
48472
 
48473
+ // src/core/llm-reasoning/extractLlmReasoning.ts
48474
+ function extractLlmReasoning(toolArgs) {
48475
+ if (typeof toolArgs !== "object" || toolArgs === null || Array.isArray(toolArgs)) {
48476
+ return null;
48477
+ }
48478
+ const rawReasoning = toolArgs[LLM_REASONING_ARG_NAME];
48479
+ if (rawReasoning === null || rawReasoning === undefined) {
48480
+ return null;
48481
+ }
48482
+ return String(rawReasoning);
48483
+ }
48484
+
48452
48485
  // src/core/llm-reasoning/removeLlmReasoningArg.ts
48453
48486
  function removeLlmReasoningArg(input) {
48454
48487
  if (!(LLM_REASONING_ARG_NAME in input)) {
@@ -48494,136 +48527,186 @@ class SessionRegistry {
48494
48527
  }
48495
48528
  }
48496
48529
 
48497
- // src/core/tool-call-span.ts
48530
+ // src/core/spans/frisk-span.ts
48498
48531
  var import_api = __toESM(require_src4(), 1);
48499
48532
 
48500
- // src/core/redaction-options.ts
48501
- function resolveRedactionOptions(options) {
48502
- return {
48503
- redactToolArgs: options?.redactToolArgs ?? false,
48504
- redactAgentState: options?.redactAgentState ?? false
48505
- };
48506
- }
48507
-
48508
- // src/core/tool-call-span.ts
48509
- class ToolCallSpan {
48510
- adapter;
48511
- toolCall;
48512
- friskToolId;
48513
- agentState;
48514
- parent;
48515
- tracer;
48516
- redaction;
48517
- _span = null;
48518
- _traceContextCarrier = null;
48519
- sessionId;
48520
- friskToolVersionId;
48533
+ class FriskSpan {
48534
+ _spanName;
48535
+ _attributeFields;
48536
+ _otelSpan;
48537
+ _attributes = {};
48538
+ _ended = false;
48521
48539
  constructor({
48522
- sessionId,
48523
- adapter,
48524
- toolCall,
48525
- friskToolId,
48526
- friskToolVersionId,
48527
- agentState,
48528
- parent,
48529
48540
  tracer,
48530
- redact
48541
+ parent,
48542
+ spanName,
48543
+ attributeFields
48531
48544
  }) {
48532
- this.sessionId = sessionId;
48533
- this.adapter = adapter;
48534
- this.toolCall = toolCall;
48535
- this.friskToolId = friskToolId ?? null;
48536
- this.friskToolVersionId = friskToolVersionId ?? null;
48537
- this.agentState = agentState;
48538
- this.parent = parent;
48539
- this.tracer = tracer;
48540
- this.redaction = resolveRedactionOptions(redact);
48545
+ this._spanName = spanName;
48546
+ this._attributeFields = attributeFields;
48547
+ const parentContext = parent ? import_api.trace.setSpan(import_api.context.active(), parent.otelSpan) : import_api.context.active();
48548
+ this._otelSpan = tracer.startSpan(this._spanName, undefined, parentContext);
48541
48549
  }
48542
- get span() {
48543
- if (!this._span) {
48544
- throw new ToolCallSpanNotInitializedError;
48545
- }
48546
- return this._span;
48550
+ get otelSpan() {
48551
+ return this._otelSpan;
48547
48552
  }
48548
- get traceContextCarrier() {
48549
- return this._traceContextCarrier;
48553
+ get spanId() {
48554
+ return this._otelSpan.spanContext().spanId;
48550
48555
  }
48551
- run(callback) {
48552
- this.enter();
48553
- try {
48554
- return callback(this);
48555
- } finally {
48556
- this.exit();
48556
+ setAttribute(field, value) {
48557
+ this.setAttributesByField({ [field]: value });
48558
+ }
48559
+ getAttribute(field) {
48560
+ return this._attributes[this.constantFor(field)];
48561
+ }
48562
+ end() {
48563
+ if (this._ended) {
48564
+ return;
48557
48565
  }
48566
+ this._ended = true;
48567
+ this._otelSpan.end();
48558
48568
  }
48559
- async runAsync(callback) {
48560
- this.enter();
48561
- try {
48562
- return await callback(this);
48563
- } finally {
48564
- this.exit();
48569
+ setAttributesByField(values) {
48570
+ for (const [field, value] of Object.entries(values)) {
48571
+ const constant = this.constantFor(field);
48572
+ if (value === null || value === undefined) {
48573
+ continue;
48574
+ }
48575
+ this._attributes[constant] = value;
48576
+ this._otelSpan.setAttribute(constant, value);
48565
48577
  }
48566
48578
  }
48567
- setAttribute(key, value) {
48568
- this.span.setAttribute(key, value);
48579
+ constantFor(field) {
48580
+ const constant = this._attributeFields[field];
48581
+ if (constant === undefined) {
48582
+ throw new Error(`Unknown attribute '${field}' for ${this.constructor.name}`);
48583
+ }
48584
+ return constant;
48569
48585
  }
48570
- setAttributes(attributes) {
48571
- this.span.setAttributes(attributes);
48586
+ }
48587
+ // src/core/spans/llm-call-span.ts
48588
+ var FIELDS = {
48589
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48590
+ promptsJson: ATTRIBUTE_NAME_LLM_CALL_PROMPTS_JSON,
48591
+ responsesJson: ATTRIBUTE_NAME_LLM_CALL_RESPONSES_JSON,
48592
+ toolCallsJson: ATTRIBUTE_NAME_LLM_CALL_TOOL_CALLS_JSON,
48593
+ modelName: ATTRIBUTE_NAME_MODEL_NAME,
48594
+ modelProvider: ATTRIBUTE_NAME_MODEL_PROVIDER,
48595
+ inputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS,
48596
+ outputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS,
48597
+ totalTokens: ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS,
48598
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48599
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE
48600
+ };
48601
+
48602
+ class LlmCallSpan extends FriskSpan {
48603
+ constructor(args) {
48604
+ super({ ...args, spanName: SPAN_NAME_LLM_CALL, attributeFields: FIELDS });
48572
48605
  }
48573
- saveResult(decision) {
48574
- if (!this.span) {
48575
- return;
48576
- }
48577
- this.setAttributes({
48578
- [ATTRIBUTE_NAME_DECISION_OUTCOME]: decision.outcome,
48579
- [ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT]: Number(decision.rulesMatchedCount)
48606
+ setAttributes(values) {
48607
+ this.setAttributesByField(values);
48608
+ }
48609
+ }
48610
+ // src/core/spans/operation-span.ts
48611
+ var FIELDS2 = {
48612
+ sessionId: ATTRIBUTE_NAME_SESSION_ID
48613
+ };
48614
+
48615
+ class OperationSpan extends FriskSpan {
48616
+ constructor(args) {
48617
+ super({ ...args, spanName: SPAN_NAME_OPERATION, attributeFields: FIELDS2 });
48618
+ }
48619
+ setAttributes(values) {
48620
+ this.setAttributesByField(values);
48621
+ }
48622
+ }
48623
+ // src/core/spans/session-span.ts
48624
+ var FIELDS3 = {
48625
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48626
+ remoteSessionId: ATTRIBUTE_NAME_REMOTE_SESSION_ID,
48627
+ prompt: ATTRIBUTE_NAME_SESSION_PROMPT,
48628
+ toolCallCount: ATTRIBUTE_NAME_TOOL_CALL_COUNT,
48629
+ toolCallErrorCount: ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT,
48630
+ inputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_INPUT_TOKENS,
48631
+ outputTokens: ATTRIBUTE_NAME_TOKEN_USAGE_OUTPUT_TOKENS,
48632
+ totalTokens: ATTRIBUTE_NAME_TOKEN_USAGE_TOTAL_TOKENS
48633
+ };
48634
+
48635
+ class SessionSpan extends FriskSpan {
48636
+ constructor(args) {
48637
+ super({
48638
+ ...args,
48639
+ spanName: SPAN_NAME_FRISK_SESSION,
48640
+ attributeFields: FIELDS3
48580
48641
  });
48581
- if (decision.reason) {
48582
- this.setAttribute(ATTRIBUTE_NAME_DECISION_REASON, decision.reason);
48583
- }
48584
48642
  }
48585
- saveError(error) {
48586
- if (!this.span) {
48587
- return;
48588
- }
48589
- const errorMessage = error instanceof Error ? error.message : String(error);
48590
- const errorType = error instanceof Error ? error.constructor.name : typeof error;
48591
- this.setAttributes({
48592
- [ATTRIBUTE_NAME_ERROR_TYPE]: errorType,
48593
- [ATTRIBUTE_NAME_ERROR_MESSAGE]: errorMessage
48643
+ setAttributes(values) {
48644
+ this.setAttributesByField(values);
48645
+ }
48646
+ }
48647
+ // src/core/spans/tool-call-decision-span.ts
48648
+ var FIELDS4 = {
48649
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48650
+ toolName: ATTRIBUTE_NAME_TOOL_NAME,
48651
+ toolCallId: ATTRIBUTE_NAME_TOOL_CALL_ID,
48652
+ toolArgsJson: ATTRIBUTE_NAME_TOOL_ARGS_JSON,
48653
+ toolArgsRedactedPathsJson: ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON,
48654
+ agentStateJson: ATTRIBUTE_NAME_AGENT_STATE_JSON,
48655
+ agentStateRedactedPathsJson: ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON,
48656
+ friskToolId: ATTRIBUTE_NAME_FRISK_TOOL_ID,
48657
+ friskToolVersionId: ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID,
48658
+ llmReasoning: ATTRIBUTE_NAME_LLM_REASONING,
48659
+ decisionOutcome: ATTRIBUTE_NAME_DECISION_OUTCOME,
48660
+ decisionMatchedRuleCount: ATTRIBUTE_NAME_DECISION_MATCHED_RULE_COUNT,
48661
+ decisionReason: ATTRIBUTE_NAME_DECISION_REASON,
48662
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48663
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE
48664
+ };
48665
+
48666
+ class ToolCallDecisionSpan extends FriskSpan {
48667
+ constructor(args) {
48668
+ super({
48669
+ ...args,
48670
+ spanName: SPAN_NAME_DECIDE_TOOL_CALL,
48671
+ attributeFields: FIELDS4
48594
48672
  });
48595
48673
  }
48596
- enter() {
48597
- const parentContext = this.parent ? import_api.trace.setSpan(import_api.context.active(), this.parent) : import_api.context.active();
48598
- const redactedToolArgsResult = this.adapter.serializeToolArgs(removeLlmReasoningArg(this.toolCall.args), { redact: this.redaction.redactToolArgs });
48599
- const redactedAgentStateResult = this.adapter.serializeAgentState(this.agentState, { redact: this.redaction.redactAgentState });
48600
- this._span = this.tracer.startSpan(SPAN_NAME_DECIDE_TOOL_CALL, {
48601
- attributes: {
48602
- [ATTRIBUTE_NAME_SESSION_ID]: this.sessionId,
48603
- [ATTRIBUTE_NAME_TOOL_NAME]: this.toolCall.name,
48604
- ...this.friskToolId !== null ? { [ATTRIBUTE_NAME_FRISK_TOOL_ID]: this.friskToolId } : {},
48605
- ...this.friskToolVersionId !== null ? {
48606
- [ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID]: this.friskToolVersionId
48607
- } : {},
48608
- [ATTRIBUTE_NAME_TOOL_CALL_ID]: this.toolCall.id,
48609
- [ATTRIBUTE_NAME_TOOL_ARGS_JSON]: redactedToolArgsResult.value ?? "",
48610
- [ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON]: JSON.stringify(redactedToolArgsResult.redactedPaths),
48611
- [ATTRIBUTE_NAME_AGENT_STATE_JSON]: redactedAgentStateResult.value ?? "",
48612
- [ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON]: JSON.stringify(redactedAgentStateResult.redactedPaths)
48613
- }
48614
- }, parentContext);
48615
- this._traceContextCarrier = {};
48616
- const spanContext = import_api.trace.setSpan(import_api.context.active(), this.span);
48617
- import_api.propagation.inject(spanContext, this._traceContextCarrier);
48618
- }
48619
- exit() {
48620
- if (!this.span) {
48621
- return;
48622
- }
48623
- this.span.end();
48674
+ setAttributes(values) {
48675
+ this.setAttributesByField(values);
48624
48676
  }
48625
48677
  }
48678
+ // src/core/spans/tool-call-observation-span.ts
48679
+ var FIELDS5 = {
48680
+ sessionId: ATTRIBUTE_NAME_SESSION_ID,
48681
+ toolName: ATTRIBUTE_NAME_TOOL_NAME,
48682
+ toolCallId: ATTRIBUTE_NAME_TOOL_CALL_ID,
48683
+ toolArgsJson: ATTRIBUTE_NAME_TOOL_ARGS_JSON,
48684
+ toolArgsRedactedPathsJson: ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON,
48685
+ agentStateJson: ATTRIBUTE_NAME_AGENT_STATE_JSON,
48686
+ agentStateRedactedPathsJson: ATTRIBUTE_NAME_AGENT_STATE_REDACTED_PATHS_JSON,
48687
+ toolCallSequenceNumber: ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER,
48688
+ friskToolId: ATTRIBUTE_NAME_FRISK_TOOL_ID,
48689
+ friskToolVersionId: ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID,
48690
+ llmReasoning: ATTRIBUTE_NAME_LLM_REASONING,
48691
+ isSuccess: ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS,
48692
+ isError: ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR,
48693
+ errorMessage: ATTRIBUTE_NAME_ERROR_MESSAGE,
48694
+ errorType: ATTRIBUTE_NAME_ERROR_TYPE,
48695
+ llmCallSpanId: ATTRIBUTE_NAME_LLM_CALL_SPAN_ID
48696
+ };
48626
48697
 
48698
+ class ToolCallObservationSpan extends FriskSpan {
48699
+ constructor(args) {
48700
+ super({
48701
+ ...args,
48702
+ spanName: SPAN_NAME_OBSERVE_TOOL_CALL,
48703
+ attributeFields: FIELDS5
48704
+ });
48705
+ }
48706
+ setAttributes(values) {
48707
+ this.setAttributesByField(values);
48708
+ }
48709
+ }
48627
48710
  // src/core/types.ts
48628
48711
  var DecisionOutcome;
48629
48712
  ((DecisionOutcome2) => {
@@ -48643,9 +48726,13 @@ class FriskSession {
48643
48726
  logger;
48644
48727
  _rootRunId = null;
48645
48728
  _isTracing = false;
48729
+ _agentState = null;
48646
48730
  toolCallSequenceNumber = 0;
48647
48731
  toolCallSequenceGenerator = this.createToolCallSequenceGenerator();
48648
48732
  toolCallErrorCount = 0;
48733
+ tokenUsageInput = 0;
48734
+ tokenUsageOutput = 0;
48735
+ tokenUsageTotal = 0;
48649
48736
  constructor({ frisk, redact, tracer, logging }) {
48650
48737
  const sessionId = this.constructor.generateSessionId();
48651
48738
  this.logger = deriveSdkLogger(logging, {
@@ -48668,33 +48755,67 @@ class FriskSession {
48668
48755
  get rootRunId() {
48669
48756
  return this._rootRunId;
48670
48757
  }
48758
+ createLlmCallSpan({
48759
+ parent
48760
+ } = {}) {
48761
+ const span = new LlmCallSpan({
48762
+ tracer: this.tracer,
48763
+ parent: parent ?? this._rootSpan
48764
+ });
48765
+ span.setAttributes({ sessionId: this.id });
48766
+ return span;
48767
+ }
48768
+ createOperationSpan({
48769
+ parent
48770
+ } = {}) {
48771
+ const span = new OperationSpan({
48772
+ tracer: this.tracer,
48773
+ parent: parent ?? this._rootSpan
48774
+ });
48775
+ span.setAttributes({ sessionId: this.id });
48776
+ return span;
48777
+ }
48671
48778
  async createToolCallSpan({
48672
48779
  name,
48673
- args: toolArgsInput
48780
+ args: toolArgsInput,
48781
+ agentState,
48782
+ parent
48674
48783
  }) {
48675
48784
  const toolArgs = this.validateToolArgs(toolArgsInput);
48785
+ const llmReasoning = extractLlmReasoning(toolArgs);
48676
48786
  const redactedToolArgsResult = this.frisk.adapter?.serializeToolArgs(removeLlmReasoningArg(toolArgs), { redact: this.redaction.redactToolArgs }) ?? {
48677
48787
  value: "{}",
48678
48788
  redactedPaths: []
48679
48789
  };
48680
- const sessionSpan = this.rootSpan;
48681
- const parentContext = sessionSpan ? import_api2.trace.setSpan(import_api2.context.active(), sessionSpan) : import_api2.context.active();
48682
- const spanAttributes = {
48683
- [ATTRIBUTE_NAME_SESSION_ID]: this.id,
48684
- [ATTRIBUTE_NAME_TOOL_NAME]: name,
48685
- [ATTRIBUTE_NAME_TOOL_ARGS_JSON]: redactedToolArgsResult.value,
48686
- [ATTRIBUTE_NAME_TOOL_ARGS_REDACTED_PATHS_JSON]: JSON.stringify(redactedToolArgsResult.redactedPaths),
48687
- [ATTRIBUTE_NAME_TOOL_CALL_SEQUENCE_NUMBER]: this.toolCallSequenceGenerator.next().value
48790
+ const agentStateToUse = agentState ?? this._agentState ?? {};
48791
+ const redactedAgentStateResult = this.frisk.adapter?.serializeAgentState(agentStateToUse, { redact: this.redaction.redactAgentState }) ?? {
48792
+ value: "{}",
48793
+ redactedPaths: []
48688
48794
  };
48795
+ const span = new ToolCallObservationSpan({
48796
+ tracer: this.tracer,
48797
+ parent: parent ?? this._rootSpan
48798
+ });
48799
+ span.setAttributes({
48800
+ sessionId: this.id,
48801
+ toolName: name,
48802
+ toolArgsJson: redactedToolArgsResult.value ?? "{}",
48803
+ toolArgsRedactedPathsJson: JSON.stringify(redactedToolArgsResult.redactedPaths),
48804
+ agentStateJson: redactedAgentStateResult.value ?? "{}",
48805
+ agentStateRedactedPathsJson: JSON.stringify(redactedAgentStateResult.redactedPaths),
48806
+ toolCallSequenceNumber: this.toolCallSequenceGenerator.next().value
48807
+ });
48689
48808
  await this.frisk.toolRegistrationComplete;
48690
48809
  const registeredTool = this.frisk.getRegisteredTool(name);
48691
48810
  if (registeredTool) {
48692
- spanAttributes[ATTRIBUTE_NAME_FRISK_TOOL_ID] = registeredTool.id;
48693
- spanAttributes[ATTRIBUTE_NAME_FRISK_TOOL_VERSION_ID] = registeredTool.versionId;
48811
+ span.setAttributes({
48812
+ friskToolId: registeredTool.id,
48813
+ friskToolVersionId: registeredTool.versionId
48814
+ });
48815
+ }
48816
+ if (llmReasoning !== null) {
48817
+ span.setAttributes({ llmReasoning });
48694
48818
  }
48695
- const span = this.getTracer().startSpan(SPAN_NAME_OBSERVE_TOOL_CALL, {
48696
- attributes: spanAttributes
48697
- }, parentContext);
48698
48819
  return span;
48699
48820
  }
48700
48821
  closeToolCallSpan({
@@ -48704,19 +48825,19 @@ class FriskSession {
48704
48825
  status
48705
48826
  }) {
48706
48827
  if (toolCallId) {
48707
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_ID, toolCallId);
48828
+ span.setAttributes({ toolCallId });
48708
48829
  }
48709
48830
  if (status === "error" /* Error */ || !!err) {
48710
48831
  this.incrementToolCallErrors();
48711
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR, true);
48712
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS, false);
48832
+ span.setAttributes({ isError: true, isSuccess: false });
48713
48833
  } else if (status === "success" /* Success */) {
48714
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_SUCCESS, true);
48715
- span.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_IS_ERROR, false);
48834
+ span.setAttributes({ isSuccess: true, isError: false });
48716
48835
  }
48717
- if (err && err instanceof Error) {
48718
- span.setAttribute(ATTRIBUTE_NAME_ERROR_MESSAGE, `${err}`);
48719
- span.setAttribute(ATTRIBUTE_NAME_ERROR_TYPE, `${err.constructor.name}`);
48836
+ if (err instanceof Error) {
48837
+ span.setAttributes({
48838
+ errorMessage: `${err}`,
48839
+ errorType: `${err.constructor.name}`
48840
+ });
48720
48841
  }
48721
48842
  span.end();
48722
48843
  }
@@ -48730,32 +48851,37 @@ class FriskSession {
48730
48851
  agentState
48731
48852
  }) {
48732
48853
  const registeredTool = this.frisk.getRegisteredTool(toolCall.name);
48733
- const toolCallSpan = new ToolCallSpan({
48734
- sessionId: this.id,
48735
- adapter: this.frisk.adapter,
48736
- toolCall,
48737
- friskToolId: registeredTool?.id ?? null,
48738
- friskToolVersionId: registeredTool?.versionId ?? null,
48739
- agentState,
48740
- parent: this._rootSpan,
48854
+ const redactedToolArgs = this.frisk.adapter.serializeToolArgs(removeLlmReasoningArg(toolCall.args), { redact: this.redaction.redactToolArgs });
48855
+ const redactedAgentState = this.frisk.adapter.serializeAgentState(agentState, { redact: this.redaction.redactAgentState });
48856
+ const llmReasoning = extractLlmReasoning(toolCall.args);
48857
+ const span = new ToolCallDecisionSpan({
48741
48858
  tracer: this.tracer,
48742
- redact: this.redaction
48859
+ parent: this._rootSpan
48743
48860
  });
48744
- const toolArgs = toolCall.args;
48745
- return toolCallSpan.run((span) => {
48861
+ try {
48862
+ span.setAttributes({
48863
+ sessionId: this.id,
48864
+ toolName: toolCall.name,
48865
+ toolCallId: toolCall.id,
48866
+ toolArgsJson: redactedToolArgs.value ?? "{}",
48867
+ toolArgsRedactedPathsJson: JSON.stringify(redactedToolArgs.redactedPaths),
48868
+ agentStateJson: redactedAgentState.value ?? "{}",
48869
+ agentStateRedactedPathsJson: JSON.stringify(redactedAgentState.redactedPaths),
48870
+ friskToolId: registeredTool?.id,
48871
+ friskToolVersionId: registeredTool?.versionId,
48872
+ llmReasoning: llmReasoning ?? undefined
48873
+ });
48874
+ const spanContext = import_api2.trace.setSpan(import_api2.context.active(), span.otelSpan);
48875
+ const traceContextCarrier = {};
48876
+ import_api2.propagation.inject(spanContext, traceContextCarrier);
48746
48877
  try {
48747
- if (LLM_REASONING_ARG_NAME in toolArgs) {
48748
- const llmReasoning = toolArgs[LLM_REASONING_ARG_NAME];
48749
- span.setAttribute(ATTRIBUTE_NAME_LLM_REASONING, llmReasoning);
48750
- }
48751
- const baseToolCallArgs = removeLlmReasoningArg(toolCall.args);
48752
48878
  const coreResult = this.frisk.decideToolCall({
48753
48879
  toolCall: {
48754
48880
  ...toolCall,
48755
- args: baseToolCallArgs
48881
+ args: removeLlmReasoningArg(toolCall.args)
48756
48882
  },
48757
48883
  agentState,
48758
- traceContextCarrier: span.traceContextCarrier ?? undefined
48884
+ traceContextCarrier
48759
48885
  });
48760
48886
  const result = {
48761
48887
  outcome: coreResult.outcome,
@@ -48764,7 +48890,11 @@ class FriskSession {
48764
48890
  policyId: coreResult.policyId,
48765
48891
  policyVersionId: coreResult.policyVersionId
48766
48892
  };
48767
- span.saveResult(result);
48893
+ span.setAttributes({
48894
+ decisionOutcome: result.outcome,
48895
+ decisionMatchedRuleCount: Number(result.rulesMatchedCount),
48896
+ decisionReason: result.reason ?? undefined
48897
+ });
48768
48898
  return result;
48769
48899
  } catch (error) {
48770
48900
  const wrapped = new ToolCallEvaluationError(error);
@@ -48772,14 +48902,19 @@ class FriskSession {
48772
48902
  toolName: toolCall.name,
48773
48903
  toolCallId: toolCall.id
48774
48904
  });
48775
- span.saveError(wrapped);
48905
+ span.setAttributes({
48906
+ errorType: wrapped.constructor.name,
48907
+ errorMessage: wrapped.message
48908
+ });
48776
48909
  return {
48777
48910
  outcome: "error" /* ERROR */,
48778
48911
  rulesMatchedCount: 0,
48779
48912
  reason: wrapped.message
48780
48913
  };
48781
48914
  }
48782
- });
48915
+ } finally {
48916
+ span.end();
48917
+ }
48783
48918
  }
48784
48919
  *createToolCallSequenceGenerator() {
48785
48920
  while (true) {
@@ -48795,23 +48930,49 @@ class FriskSession {
48795
48930
  getToolCallErrorCount() {
48796
48931
  return this.toolCallErrorCount;
48797
48932
  }
48798
- initTracing({ runId, inputs }) {
48933
+ recordTokenUsage({
48934
+ inputTokens = 0,
48935
+ outputTokens = 0,
48936
+ totalTokens = 0
48937
+ }) {
48938
+ this.tokenUsageInput += inputTokens;
48939
+ this.tokenUsageOutput += outputTokens;
48940
+ this.tokenUsageTotal += totalTokens;
48941
+ this._rootSpan?.setAttributes({
48942
+ inputTokens: this.tokenUsageInput,
48943
+ outputTokens: this.tokenUsageOutput,
48944
+ totalTokens: this.tokenUsageTotal
48945
+ });
48946
+ }
48947
+ getTokenUsage() {
48948
+ return {
48949
+ inputTokens: this.tokenUsageInput,
48950
+ outputTokens: this.tokenUsageOutput,
48951
+ totalTokens: this.tokenUsageTotal
48952
+ };
48953
+ }
48954
+ initTracing({ runId, agentState }) {
48799
48955
  this._rootRunId = runId;
48800
48956
  this._isTracing = true;
48801
- const span = this.tracer.startSpan(SPAN_NAME_FRISK_SESSION);
48802
- span.setAttribute(ATTRIBUTE_NAME_SESSION_ID, this.id);
48803
- span.setAttribute(ATTRIBUTE_NAME_REMOTE_SESSION_ID, runId);
48804
- const userPrompt = this.frisk.adapter.extractPrompt?.(inputs);
48957
+ this._agentState = agentState;
48958
+ const span = new SessionSpan({ tracer: this.tracer });
48959
+ span.setAttributes({ sessionId: this.id, remoteSessionId: runId });
48960
+ const userPrompt = this.frisk.adapter.extractPrompt?.(agentState);
48805
48961
  if (userPrompt) {
48806
- span.setAttribute(ATTRIBUTE_NAME_SESSION_PROMPT, userPrompt);
48962
+ span.setAttributes({ prompt: userPrompt });
48807
48963
  }
48808
48964
  this.setRootSpan(span);
48809
48965
  return span;
48810
48966
  }
48811
48967
  endTracing() {
48812
48968
  if (this._rootSpan) {
48813
- this._rootSpan.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_COUNT, this.getToolCallCount());
48814
- this._rootSpan.setAttribute(ATTRIBUTE_NAME_TOOL_CALL_ERROR_COUNT, this.getToolCallErrorCount());
48969
+ this._rootSpan.setAttributes({
48970
+ toolCallCount: this.getToolCallCount(),
48971
+ toolCallErrorCount: this.getToolCallErrorCount(),
48972
+ inputTokens: this.tokenUsageInput,
48973
+ outputTokens: this.tokenUsageOutput,
48974
+ totalTokens: this.tokenUsageTotal
48975
+ });
48815
48976
  this._rootSpan.end();
48816
48977
  }
48817
48978
  this._isTracing = false;
@@ -48826,6 +48987,14 @@ class FriskSession {
48826
48987
  }
48827
48988
  }
48828
48989
 
48990
+ // src/core/redaction-options.ts
48991
+ function resolveRedactionOptions(options) {
48992
+ return {
48993
+ redactToolArgs: options?.redactToolArgs ?? false,
48994
+ redactAgentState: options?.redactAgentState ?? false
48995
+ };
48996
+ }
48997
+
48829
48998
  // src/core/sdk-attributes/detect-runtime.ts
48830
48999
  function detectRuntime() {
48831
49000
  const g = globalThis;
@@ -48861,12 +49030,12 @@ function detectRuntime() {
48861
49030
 
48862
49031
  // src/core/sdk-attributes/read-sdk-meta.ts
48863
49032
  import { existsSync, readFileSync } from "node:fs";
48864
- import { dirname as dirname2, join } from "node:path";
49033
+ import { dirname, join } from "node:path";
48865
49034
  import { fileURLToPath } from "node:url";
48866
49035
 
48867
49036
  // src/generated/sdk-meta.ts
48868
49037
  var SDK_NAME = "@friskai/frisk-js";
48869
- var SDK_VERSION = "0.2.10";
49038
+ var SDK_VERSION = "0.3.1";
48870
49039
 
48871
49040
  // src/core/sdk-attributes/read-sdk-meta.ts
48872
49041
  function getSdkMeta() {
@@ -48900,7 +49069,7 @@ function findNearestPackageJson(startDir) {
48900
49069
  if (existsSync(candidate)) {
48901
49070
  return candidate;
48902
49071
  }
48903
- const parent = dirname2(dir);
49072
+ const parent = dirname(dir);
48904
49073
  if (parent === dir) {
48905
49074
  return null;
48906
49075
  }
@@ -48909,7 +49078,7 @@ function findNearestPackageJson(startDir) {
48909
49078
  }
48910
49079
  function tryReadPackageJson() {
48911
49080
  try {
48912
- const here = dirname2(fileURLToPath(import.meta.url));
49081
+ const here = dirname(fileURLToPath(import.meta.url));
48913
49082
  const pkgPath = findNearestPackageJson(here);
48914
49083
  if (!pkgPath)
48915
49084
  return null;
@@ -49277,6 +49446,9 @@ class ToolRegistry {
49277
49446
 
49278
49447
  // src/core/frisk.ts
49279
49448
  class Frisk {
49449
+ get toolPoliciesAvailable() {
49450
+ return this.toolPolicies?.available ?? false;
49451
+ }
49280
49452
  get redaction() {
49281
49453
  return this._redaction;
49282
49454
  }
@@ -49284,24 +49456,34 @@ class Frisk {
49284
49456
  apiBaseUrl;
49285
49457
  otlpEndpoint;
49286
49458
  accessTokenProvider;
49459
+ get adapter() {
49460
+ return this._adapter;
49461
+ }
49462
+ get logLevel() {
49463
+ return this._logLevel;
49464
+ }
49465
+ get tracingManager() {
49466
+ if (!this._tracingManager) {
49467
+ throw new FriskNotInitializedError;
49468
+ }
49469
+ return this._tracingManager;
49470
+ }
49287
49471
  initialized = false;
49288
49472
  rootLogger;
49289
49473
  logger;
49290
49474
  _logLevel;
49291
49475
  _adapter;
49292
- _friskHandle = null;
49293
49476
  _tracingManager = null;
49294
- _toolRegistry;
49477
+ toolRegistry;
49295
49478
  sdkAttributes;
49479
+ extensions = [];
49480
+ toolPolicies = null;
49296
49481
  wrapToolsCalled = false;
49297
49482
  get toolRegistrationComplete() {
49298
49483
  if (!this.wrapToolsCalled) {
49299
49484
  return Promise.resolve(true);
49300
49485
  }
49301
- return this._toolRegistry.initialized;
49302
- }
49303
- get logLevel() {
49304
- return this._logLevel;
49486
+ return this.toolRegistry.initialized;
49305
49487
  }
49306
49488
  static async connect(options) {
49307
49489
  const instance = new this(options);
@@ -49315,7 +49497,7 @@ class Frisk {
49315
49497
  this._logLevel = options?.logging?.logLevel;
49316
49498
  this.logger = deriveSdkLogger({
49317
49499
  logger: this.rootLogger,
49318
- logLevel: this._logLevel
49500
+ logLevel: this.logLevel
49319
49501
  }, {
49320
49502
  component: "FriskCore"
49321
49503
  });
@@ -49335,10 +49517,10 @@ class Frisk {
49335
49517
  baseUrl,
49336
49518
  logging: {
49337
49519
  logger: this.rootLogger,
49338
- logLevel: this._logLevel
49520
+ logLevel: this.logLevel
49339
49521
  }
49340
49522
  });
49341
- this._toolRegistry = new ToolRegistry({
49523
+ this.toolRegistry = new ToolRegistry({
49342
49524
  apiBaseUrl: baseUrl,
49343
49525
  getAccessToken: async () => this.accessTokenProvider.getAccessToken(),
49344
49526
  logger: this.logger
@@ -49349,21 +49531,20 @@ class Frisk {
49349
49531
  }
49350
49532
  this.otlpEndpoint = otlpEndpoint;
49351
49533
  this._redaction = resolveRedactionOptions(options?.redact);
49534
+ this.extensions = options?.extensions ?? [];
49535
+ this.mountExtensions();
49352
49536
  }
49353
- get friskHandle() {
49354
- if (!this._friskHandle) {
49355
- throw new FriskNotInitializedError;
49537
+ mountExtensions() {
49538
+ for (const ext of this.extensions) {
49539
+ if ("available" in ext && "decideToolCall" in ext) {
49540
+ this.toolPolicies = ext;
49541
+ }
49356
49542
  }
49357
- return this._friskHandle;
49358
49543
  }
49359
- get adapter() {
49360
- return this._adapter;
49361
- }
49362
- get tracingManager() {
49363
- if (!this._tracingManager) {
49364
- throw new FriskNotInitializedError;
49544
+ async initializeExtensions() {
49545
+ for (const ext of this.extensions) {
49546
+ await ext.initialize(this);
49365
49547
  }
49366
- return this._tracingManager;
49367
49548
  }
49368
49549
  async connect() {
49369
49550
  if (!this.initialized) {
@@ -49377,20 +49558,20 @@ class Frisk {
49377
49558
  tracerName: TRACER_NAME,
49378
49559
  tracerVersion: TRACER_VERSION
49379
49560
  });
49380
- this._friskHandle = new FriskHandle(currentToken, this.apiBaseUrl, this.otlpEndpoint);
49381
49561
  this.accessTokenProvider.addCallback((newToken) => this.updateAccessToken(newToken));
49382
49562
  this.accessTokenProvider.startBackgroundRefresh();
49383
49563
  this.initialized = true;
49564
+ await this.initializeExtensions();
49384
49565
  }
49385
49566
  }
49386
49567
  session(metadata) {
49387
49568
  const session = new FriskSession({
49388
49569
  frisk: this,
49389
- redact: this._redaction,
49570
+ redact: this.redaction,
49390
49571
  tracer: this.tracingManager.getTracer(),
49391
49572
  logging: {
49392
49573
  logger: this.rootLogger,
49393
- logLevel: this._logLevel
49574
+ logLevel: this.logLevel
49394
49575
  }
49395
49576
  });
49396
49577
  const registry2 = SessionRegistry.getInstance();
@@ -49398,20 +49579,20 @@ class Frisk {
49398
49579
  return session;
49399
49580
  }
49400
49581
  normalizeToolCall(toolCall) {
49401
- return this._adapter.normalizeToolCall(toolCall);
49582
+ return this.adapter.normalizeToolCall(toolCall);
49402
49583
  }
49403
49584
  wrapTools(tools, options = DefaultWrapToolOptions) {
49404
49585
  this.wrapToolsCalled = true;
49405
49586
  const toolList = [...tools];
49406
- const registerToolProperties = toolList.map((tool) => this._adapter.extractRegisterToolProperties?.(tool)).filter((properties) => properties !== null && properties !== undefined);
49587
+ const registerToolProperties = toolList.map((tool) => this.adapter.extractRegisterToolProperties?.(tool)).filter((properties) => properties !== null && properties !== undefined);
49407
49588
  if (registerToolProperties.length > 0) {
49408
- this._toolRegistry.registerTools({
49589
+ this.toolRegistry.registerTools({
49409
49590
  tools: registerToolProperties,
49410
49591
  sdkAttributes: this.sdkAttributes
49411
49592
  });
49412
49593
  }
49413
- if (this._adapter.wrapTools) {
49414
- return this._adapter.wrapTools(toolList, options);
49594
+ if (this.adapter.wrapTools) {
49595
+ return this.adapter.wrapTools(toolList, options);
49415
49596
  }
49416
49597
  return toolList;
49417
49598
  }
@@ -49423,8 +49604,8 @@ class Frisk {
49423
49604
  };
49424
49605
  }
49425
49606
  wrapTool(tool, options = DefaultWrapToolOptions) {
49426
- if (this._adapter.wrapTool) {
49427
- return this._adapter.wrapTool(tool, options);
49607
+ if (this.adapter.wrapTool) {
49608
+ return this.adapter.wrapTool(tool, options);
49428
49609
  }
49429
49610
  return tool;
49430
49611
  }
@@ -49433,30 +49614,38 @@ class Frisk {
49433
49614
  return registry2.get(sessionId);
49434
49615
  }
49435
49616
  updateAccessToken(authToken) {
49436
- this.friskHandle.updateAuthToken(authToken);
49617
+ this.toolPolicies?.updateAccessToken(authToken);
49437
49618
  this.tracingManager.updateAuthToken(authToken);
49438
49619
  }
49439
49620
  getRegisteredTool(toolName) {
49440
- return this._toolRegistry.getRegisteredTool(toolName);
49621
+ return this.toolRegistry.getRegisteredTool(toolName);
49441
49622
  }
49442
49623
  decideToolCall({
49443
49624
  toolCall,
49444
49625
  agentState,
49445
49626
  traceContextCarrier
49446
49627
  }) {
49447
- const id = toolCall.id ?? v4();
49448
- const argsJson = toolCall.args ? JSON.stringify(removeLlmReasoningArg(toolCall.args)) : null;
49449
- const stateJson = agentState ? JSON.stringify(agentState) : null;
49450
- const registeredTool = this.getRegisteredTool(toolCall.name);
49451
- const coreResult = this.friskHandle.process(toolCall.name, registeredTool?.id ?? null, registeredTool?.versionId ?? null, argsJson, stateJson, id, this._redaction, traceContextCarrier);
49452
- const outcome = coreResult.decision === "allow" ? "allow" /* ALLOW */ : coreResult.decision === "deny" ? "deny" /* DENY */ : coreResult.decision === "escalate" ? "escalate" /* ESCALATE */ : "error" /* ERROR */;
49453
- return {
49454
- outcome,
49455
- rulesMatchedCount: coreResult.rulesMatchedCount,
49456
- reason: coreResult.reason,
49457
- policyId: coreResult.policyId,
49458
- policyVersionId: coreResult.policyVersionId
49459
- };
49628
+ if (!this.toolPolicies) {
49629
+ throw new MissingToolPoliciesExtensionError;
49630
+ }
49631
+ const toolArgsJson = toolCall.args ? JSON.stringify(toolCall.args) : null;
49632
+ const agentStateJson = agentState ? JSON.stringify(agentState) : null;
49633
+ const redactedArgs = toolCall.args ? redactObject(toolCall.args, this.redaction.redactToolArgs) : { value: {}, redactedPaths: [] };
49634
+ const toolArgsRedactedJson = toolCall.args ? JSON.stringify(redactedArgs.value) : null;
49635
+ const toolArgsRedactedPathsJson = JSON.stringify(redactedArgs.redactedPaths);
49636
+ const redactedState = agentState ? redactObject(agentState, this.redaction.redactAgentState) : { value: {}, redactedPaths: [] };
49637
+ const agentStateRedactedJson = agentState ? JSON.stringify(redactedState.value) : null;
49638
+ const agentStateRedactedPathsJson = JSON.stringify(redactedState.redactedPaths);
49639
+ return this.toolPolicies.decideToolCall({
49640
+ toolCall,
49641
+ toolArgsJson,
49642
+ toolArgsRedactedJson,
49643
+ toolArgsRedactedPathsJson,
49644
+ agentStateJson,
49645
+ agentStateRedactedJson,
49646
+ agentStateRedactedPathsJson,
49647
+ traceContextCarrier
49648
+ });
49460
49649
  }
49461
49650
  async getOrCreateToolApprovalRequest({
49462
49651
  toolCallId,
@@ -49504,29 +49693,33 @@ class Frisk {
49504
49693
  if (this.tracingManager) {
49505
49694
  await this.tracingManager.shutdown();
49506
49695
  }
49507
- this.friskHandle.shutdown();
49696
+ for (const ext of this.extensions) {
49697
+ ext.shutdown();
49698
+ }
49508
49699
  }
49509
49700
  }
49510
49701
  export {
49511
49702
  requireEnv,
49512
- redactDictionarySimple,
49513
- redactDictionary,
49514
49703
  getEnv,
49515
49704
  combineRedactOptions,
49516
49705
  UnexpectedFriskServerResponseError,
49517
- ToolCallSpan,
49706
+ ToolCallObservationSpan,
49707
+ ToolCallDecisionSpan,
49518
49708
  ToolApprovalStatus,
49709
+ SessionSpan,
49519
49710
  SessionRegistry,
49520
49711
  SessionNotFoundError,
49712
+ OperationSpan,
49521
49713
  MissingOtlpEndpointError,
49522
49714
  MissingFriskSessionContextError,
49523
49715
  MissingBaseURLError,
49524
49716
  MissingAPIKeyError,
49717
+ LlmCallSpan,
49525
49718
  InvalidFriskSessionError,
49526
49719
  InvalidAccessTokenError,
49720
+ FriskSpan,
49527
49721
  FriskSession,
49528
49722
  FriskInvalidAPIKeyError,
49529
- FriskHandle,
49530
49723
  FriskError,
49531
49724
  FriskBaseURLNotFoundError,
49532
49725
  Frisk,
@@ -49540,5 +49733,5 @@ export {
49540
49733
  AccessTokenProvider
49541
49734
  };
49542
49735
 
49543
- //# debugId=40ACC90B60961E6C64756E2164756E21
49736
+ //# debugId=6FCEF90393747D4664756E2164756E21
49544
49737
  //# sourceMappingURL=index.js.map