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
@@ -180,11 +180,11 @@ function getActiveNeatlogsSpan() {
180
180
  function getNeatlogsParentContext(baseContext) {
181
181
  return baseContext ?? getNeatlogsActiveContext();
182
182
  }
183
- function withNeatlogsSpan(span, fn, baseContext) {
183
+ function withNeatlogsSpan(span, fn, baseContext, rootSpan) {
184
184
  const base = baseContext ?? getNeatlogsActiveContext();
185
185
  let ctx = import_api.trace.setSpan(base, span);
186
186
  if (base.getValue(NEATLOGS_ROOT_SPAN_KEY) === void 0) {
187
- ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, span);
187
+ ctx = ctx.setValue(NEATLOGS_ROOT_SPAN_KEY, rootSpan ?? span);
188
188
  }
189
189
  return privateContextStorage.run(ctx, fn);
190
190
  }
@@ -918,7 +918,8 @@ var USER_PROMPT_TEMPLATE_KEY = (0, import_api3.createContextKey)("neatlogs.user_
918
918
  var USER_PROMPT_VARIABLES_KEY = (0, import_api3.createContextKey)("neatlogs.user_prompt_variables");
919
919
 
920
920
  // src/core/auto-root.ts
921
- var ROOT_KINDS = /* @__PURE__ */ new Set(["workflow", "chain", "agent", "mcp_tool"]);
921
+ var boundAutoRoots = /* @__PURE__ */ new WeakMap();
922
+ var ROOT_KINDS = /* @__PURE__ */ new Set(["workflow", "chain", "agent", "mcp_tool", "llm"]);
922
923
  function autoRootEnabled() {
923
924
  const val = (process.env.NEATLOGS_AUTO_ROOT ?? "").trim().toLowerCase();
924
925
  return !["false", "0", "no", "off"].includes(val);
@@ -933,11 +934,12 @@ function resolveRootWorkflowName() {
933
934
  }
934
935
  return "workflow";
935
936
  }
936
- function stampAutoRootIdentity(root) {
937
+ function stampRootIdentity(root) {
937
938
  applySessionAttributes(root, void 0, true);
938
939
  applyEndUserAttributes(root, void 0, void 0, true);
939
940
  }
940
- function wrapSpanWithRoot(child, root) {
941
+ function bindSpanToAutoRoot(child, root) {
942
+ if (!root) return child;
941
943
  let ended = false;
942
944
  const proxy = new Proxy(child, {
943
945
  get(target, prop, _receiver) {
@@ -959,6 +961,7 @@ function wrapSpanWithRoot(child, root) {
959
961
  return typeof value === "function" ? value.bind(target) : value;
960
962
  }
961
963
  });
964
+ boundAutoRoots.set(proxy, root);
962
965
  aliasMediaCaptureSpan(proxy, child);
963
966
  return proxy;
964
967
  }
@@ -971,27 +974,41 @@ var AutoRootTracer = class {
971
974
  const kind = String(
972
975
  options?.attributes?.["neatlogs.span.kind"] ?? ""
973
976
  ).toLowerCase();
977
+ const hasExplicitContext = context !== void 0;
974
978
  const ctx = context ?? getNeatlogsParentContext();
975
979
  const parent = getActiveNeatlogsSpan();
976
- const needsRoot = autoRootEnabled() && !ROOT_KINDS.has(kind) && !(parent !== void 0 && parent.isRecording());
980
+ const isParentless = !hasExplicitContext && !(parent !== void 0 && parent.isRecording());
981
+ const needsRoot = autoRootEnabled() && !ROOT_KINDS.has(kind) && isParentless;
977
982
  if (!needsRoot) {
978
- return this._tracer.startSpan(name, options, ctx);
983
+ const span = this._tracer.startSpan(name, options, ctx);
984
+ if (isParentless && ROOT_KINDS.has(kind)) stampRootIdentity(span);
985
+ return span;
979
986
  }
980
987
  const root = this._tracer.startSpan(
981
988
  resolveRootWorkflowName(),
982
989
  { attributes: { "neatlogs.span.kind": "workflow", "neatlogs.auto_root": true } },
983
990
  ctx
984
991
  );
985
- stampAutoRootIdentity(root);
992
+ stampRootIdentity(root);
986
993
  const childCtx = import_api4.trace.setSpan(ctx, root);
987
994
  const child = this._tracer.startSpan(name, options, childCtx);
988
- return wrapSpanWithRoot(child, root);
995
+ return bindSpanToAutoRoot(child, root);
989
996
  }
990
- // startActiveSpan is used by traceTool (callback-scoped, always under an
991
- // active span in practice) — pass straight through, no auto-root.
992
- startActiveSpan = ((...args) => this._tracer.startActiveSpan(
993
- ...args
994
- ));
997
+ startActiveSpan = ((name, ...args) => {
998
+ const callback = args.at(-1);
999
+ if (typeof callback !== "function") {
1000
+ throw new TypeError("startActiveSpan requires a callback");
1001
+ }
1002
+ const options = args.length >= 2 ? args[0] : void 0;
1003
+ const parentContext = args.length >= 3 ? args[1] : getNeatlogsParentContext();
1004
+ const span = args.length >= 3 ? this.startSpan(name, options, parentContext) : this.startSpan(name, options);
1005
+ return withNeatlogsSpan(
1006
+ span,
1007
+ () => callback(span),
1008
+ parentContext,
1009
+ boundAutoRoots.get(span)
1010
+ );
1011
+ });
995
1012
  };
996
1013
  function getProviderTracer(name) {
997
1014
  return new AutoRootTracer(getNeatlogsTracer(name));