neatlogs 1.1.19 → 1.1.21

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 (69) hide show
  1. package/README.md +34 -2
  2. package/dist/ai-sdk.cjs +186 -11
  3. package/dist/ai-sdk.cjs.map +1 -1
  4. package/dist/ai-sdk.d.ts +17 -7
  5. package/dist/ai-sdk.mjs +189 -12
  6. package/dist/ai-sdk.mjs.map +1 -1
  7. package/dist/anthropic.cjs +31 -14
  8. package/dist/anthropic.cjs.map +1 -1
  9. package/dist/anthropic.mjs +31 -14
  10. package/dist/anthropic.mjs.map +1 -1
  11. package/dist/azure-openai.cjs +31 -14
  12. package/dist/azure-openai.cjs.map +1 -1
  13. package/dist/azure-openai.mjs +31 -14
  14. package/dist/azure-openai.mjs.map +1 -1
  15. package/dist/bedrock.cjs +31 -14
  16. package/dist/bedrock.cjs.map +1 -1
  17. package/dist/bedrock.mjs +31 -14
  18. package/dist/bedrock.mjs.map +1 -1
  19. package/dist/browser.cjs +26 -1
  20. package/dist/browser.cjs.map +1 -1
  21. package/dist/browser.d.ts +1 -1
  22. package/dist/browser.mjs +26 -1
  23. package/dist/browser.mjs.map +1 -1
  24. package/dist/claude-agent-sdk.cjs +2 -2
  25. package/dist/claude-agent-sdk.cjs.map +1 -1
  26. package/dist/claude-agent-sdk.mjs +2 -2
  27. package/dist/claude-agent-sdk.mjs.map +1 -1
  28. package/dist/cli.cjs +452 -200
  29. package/dist/cli.cjs.map +1 -1
  30. package/dist/cli.mjs +427 -173
  31. package/dist/cli.mjs.map +1 -1
  32. package/dist/google-genai.cjs +31 -14
  33. package/dist/google-genai.cjs.map +1 -1
  34. package/dist/google-genai.mjs +31 -14
  35. package/dist/google-genai.mjs.map +1 -1
  36. package/dist/index.cjs +652 -333
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.ts +15 -6
  39. package/dist/index.mjs +505 -184
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/langchain.cjs +3 -3
  42. package/dist/langchain.cjs.map +1 -1
  43. package/dist/langchain.mjs +3 -3
  44. package/dist/langchain.mjs.map +1 -1
  45. package/dist/mastra-wrap.cjs +2 -2
  46. package/dist/mastra-wrap.cjs.map +1 -1
  47. package/dist/mastra-wrap.mjs +2 -2
  48. package/dist/mastra-wrap.mjs.map +1 -1
  49. package/dist/openai-agents.cjs.map +1 -1
  50. package/dist/openai-agents.mjs.map +1 -1
  51. package/dist/openai.cjs +31 -14
  52. package/dist/openai.cjs.map +1 -1
  53. package/dist/openai.mjs +31 -14
  54. package/dist/openai.mjs.map +1 -1
  55. package/dist/opencode-plugin.cjs +1 -1
  56. package/dist/opencode-plugin.cjs.map +1 -1
  57. package/dist/opencode-plugin.mjs +1 -1
  58. package/dist/opencode-plugin.mjs.map +1 -1
  59. package/dist/openrouter-agent.cjs +31 -14
  60. package/dist/openrouter-agent.cjs.map +1 -1
  61. package/dist/openrouter-agent.mjs +31 -14
  62. package/dist/openrouter-agent.mjs.map +1 -1
  63. package/dist/pi-agent.cjs.map +1 -1
  64. package/dist/pi-agent.mjs.map +1 -1
  65. package/dist/vertex-ai.cjs +31 -14
  66. package/dist/vertex-ai.cjs.map +1 -1
  67. package/dist/vertex-ai.mjs +31 -14
  68. package/dist/vertex-ai.mjs.map +1 -1
  69. package/package.json +1 -1
@@ -166,11 +166,11 @@ function getActiveNeatlogsSpan() {
166
166
  function getNeatlogsParentContext(baseContext) {
167
167
  return baseContext ?? getNeatlogsActiveContext();
168
168
  }
169
- function withNeatlogsSpan(span, fn, baseContext) {
169
+ function withNeatlogsSpan(span, fn, baseContext, rootSpan) {
170
170
  const base = baseContext ?? getNeatlogsActiveContext();
171
171
  let ctx = otelTrace.setSpan(base, span);
172
172
  if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === void 0) {
173
- ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, span);
173
+ ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, rootSpan ?? span);
174
174
  }
175
175
  return privateContextStorage.run(ctx, fn);
176
176
  }
@@ -907,7 +907,8 @@ var USER_PROMPT_TEMPLATE_KEY = createContextKey2("neatlogs.user_prompt_template"
907
907
  var USER_PROMPT_VARIABLES_KEY = createContextKey2("neatlogs.user_prompt_variables");
908
908
 
909
909
  // src/core/auto-root.ts
910
- var ROOT_KINDS = /* @__PURE__ */ new Set(["workflow", "chain", "agent", "mcp_tool"]);
910
+ var boundAutoRoots = /* @__PURE__ */ new WeakMap();
911
+ var ROOT_KINDS = /* @__PURE__ */ new Set(["workflow", "chain", "agent", "mcp_tool", "llm"]);
911
912
  function autoRootEnabled() {
912
913
  const val = (process.env.NEATLOGS_AUTO_ROOT ?? "").trim().toLowerCase();
913
914
  return !["false", "0", "no", "off"].includes(val);
@@ -922,11 +923,12 @@ function resolveRootWorkflowName() {
922
923
  }
923
924
  return "workflow";
924
925
  }
925
- function stampAutoRootIdentity(root) {
926
+ function stampRootIdentity(root) {
926
927
  applySessionAttributes(root, void 0, true);
927
928
  applyEndUserAttributes(root, void 0, void 0, true);
928
929
  }
929
- function wrapSpanWithRoot(child, root) {
930
+ function bindSpanToAutoRoot(child, root) {
931
+ if (!root) return child;
930
932
  let ended = false;
931
933
  const proxy = new Proxy(child, {
932
934
  get(target, prop, _receiver) {
@@ -948,6 +950,7 @@ function wrapSpanWithRoot(child, root) {
948
950
  return typeof value === "function" ? value.bind(target) : value;
949
951
  }
950
952
  });
953
+ boundAutoRoots.set(proxy, root);
951
954
  aliasMediaCaptureSpan(proxy, child);
952
955
  return proxy;
953
956
  }
@@ -960,27 +963,41 @@ var AutoRootTracer = class {
960
963
  const kind = String(
961
964
  options?.attributes?.["neatlogs.span.kind"] ?? ""
962
965
  ).toLowerCase();
966
+ const hasExplicitContext = context !== void 0;
963
967
  const ctx = context ?? getNeatlogsParentContext();
964
968
  const parent = getActiveNeatlogsSpan();
965
- const needsRoot = autoRootEnabled() && !ROOT_KINDS.has(kind) && !(parent !== void 0 && parent.isRecording());
969
+ const isParentless = !hasExplicitContext && !(parent !== void 0 && parent.isRecording());
970
+ const needsRoot = autoRootEnabled() && !ROOT_KINDS.has(kind) && isParentless;
966
971
  if (!needsRoot) {
967
- return this._tracer.startSpan(name, options, ctx);
972
+ const span = this._tracer.startSpan(name, options, ctx);
973
+ if (isParentless && ROOT_KINDS.has(kind)) stampRootIdentity(span);
974
+ return span;
968
975
  }
969
976
  const root = this._tracer.startSpan(
970
977
  resolveRootWorkflowName(),
971
978
  { attributes: { "neatlogs.span.kind": "workflow", "neatlogs.auto_root": true } },
972
979
  ctx
973
980
  );
974
- stampAutoRootIdentity(root);
981
+ stampRootIdentity(root);
975
982
  const childCtx = otelTrace3.setSpan(ctx, root);
976
983
  const child = this._tracer.startSpan(name, options, childCtx);
977
- return wrapSpanWithRoot(child, root);
984
+ return bindSpanToAutoRoot(child, root);
978
985
  }
979
- // startActiveSpan is used by traceTool (callback-scoped, always under an
980
- // active span in practice) — pass straight through, no auto-root.
981
- startActiveSpan = ((...args) => this._tracer.startActiveSpan(
982
- ...args
983
- ));
986
+ startActiveSpan = ((name, ...args) => {
987
+ const callback = args.at(-1);
988
+ if (typeof callback !== "function") {
989
+ throw new TypeError("startActiveSpan requires a callback");
990
+ }
991
+ const options = args.length >= 2 ? args[0] : void 0;
992
+ const parentContext = args.length >= 3 ? args[1] : getNeatlogsParentContext();
993
+ const span = args.length >= 3 ? this.startSpan(name, options, parentContext) : this.startSpan(name, options);
994
+ return withNeatlogsSpan(
995
+ span,
996
+ () => callback(span),
997
+ parentContext,
998
+ boundAutoRoots.get(span)
999
+ );
1000
+ });
984
1001
  };
985
1002
  function getProviderTracer(name) {
986
1003
  return new AutoRootTracer(getNeatlogsTracer(name));