trodo-node 1.2.0 → 2.1.0

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 (64) hide show
  1. package/README.md +154 -2
  2. package/dist/cjs/TrodoClient.js +71 -102
  3. package/dist/cjs/TrodoClient.js.map +1 -1
  4. package/dist/cjs/api/ApiClient.js +20 -2
  5. package/dist/cjs/api/ApiClient.js.map +1 -1
  6. package/dist/cjs/api/endpoints.js +7 -1
  7. package/dist/cjs/api/endpoints.js.map +1 -1
  8. package/dist/cjs/index.js +97 -29
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/otel/autoInstrument.js +253 -0
  11. package/dist/cjs/otel/autoInstrument.js.map +1 -0
  12. package/dist/cjs/otel/context.js +49 -0
  13. package/dist/cjs/otel/context.js.map +1 -0
  14. package/dist/cjs/otel/helpers.js +254 -0
  15. package/dist/cjs/otel/helpers.js.map +1 -0
  16. package/dist/cjs/otel/processor.js +129 -0
  17. package/dist/cjs/otel/processor.js.map +1 -0
  18. package/dist/cjs/otel/uuid.js +24 -0
  19. package/dist/cjs/otel/uuid.js.map +1 -0
  20. package/dist/cjs/otel/wrapAgent.js +399 -0
  21. package/dist/cjs/otel/wrapAgent.js.map +1 -0
  22. package/dist/esm/TrodoClient.d.ts +34 -11
  23. package/dist/esm/TrodoClient.d.ts.map +1 -1
  24. package/dist/esm/TrodoClient.js +71 -102
  25. package/dist/esm/TrodoClient.js.map +1 -1
  26. package/dist/esm/api/ApiClient.d.ts +9 -1
  27. package/dist/esm/api/ApiClient.d.ts.map +1 -1
  28. package/dist/esm/api/ApiClient.js +20 -2
  29. package/dist/esm/api/ApiClient.js.map +1 -1
  30. package/dist/esm/api/endpoints.d.ts +6 -1
  31. package/dist/esm/api/endpoints.d.ts.map +1 -1
  32. package/dist/esm/api/endpoints.js +7 -1
  33. package/dist/esm/api/endpoints.js.map +1 -1
  34. package/dist/esm/index.d.ts +84 -19
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/index.js +82 -23
  37. package/dist/esm/index.js.map +1 -1
  38. package/dist/esm/otel/autoInstrument.d.ts +61 -0
  39. package/dist/esm/otel/autoInstrument.d.ts.map +1 -0
  40. package/dist/esm/otel/autoInstrument.js +248 -0
  41. package/dist/esm/otel/autoInstrument.js.map +1 -0
  42. package/dist/esm/otel/context.d.ts +26 -0
  43. package/dist/esm/otel/context.d.ts.map +1 -0
  44. package/dist/esm/otel/context.js +44 -0
  45. package/dist/esm/otel/context.js.map +1 -0
  46. package/dist/esm/otel/helpers.d.ts +119 -0
  47. package/dist/esm/otel/helpers.d.ts.map +1 -0
  48. package/dist/esm/otel/helpers.js +244 -0
  49. package/dist/esm/otel/helpers.js.map +1 -0
  50. package/dist/esm/otel/processor.d.ts +94 -0
  51. package/dist/esm/otel/processor.d.ts.map +1 -0
  52. package/dist/esm/otel/processor.js +125 -0
  53. package/dist/esm/otel/processor.js.map +1 -0
  54. package/dist/esm/otel/uuid.d.ts +7 -0
  55. package/dist/esm/otel/uuid.d.ts.map +1 -0
  56. package/dist/esm/otel/uuid.js +21 -0
  57. package/dist/esm/otel/uuid.js.map +1 -0
  58. package/dist/esm/otel/wrapAgent.d.ts +100 -0
  59. package/dist/esm/otel/wrapAgent.d.ts.map +1 -0
  60. package/dist/esm/otel/wrapAgent.js +389 -0
  61. package/dist/esm/otel/wrapAgent.js.map +1 -0
  62. package/dist/esm/types/index.d.ts +24 -48
  63. package/dist/esm/types/index.d.ts.map +1 -1
  64. package/package.json +1 -1
package/dist/esm/index.js CHANGED
@@ -1,20 +1,58 @@
1
1
  /**
2
2
  * trodo-node — Trodo Analytics SDK for Node.js
3
3
  *
4
- * Usage (singleton):
4
+ * Quick start (any stack):
5
5
  * import trodo from 'trodo-node';
6
- * trodo.init({ siteId: 'your-site-id' });
7
- * const user = trodo.forUser('user-123');
8
- * await user.track('purchase_completed', { amount: 99.99 });
6
+ * trodo.init({ siteId: 'your-site-id' }); // autoInstrument on by default
9
7
  *
10
- * Usage (class):
11
- * import { TrodoClient } from 'trodo-node';
12
- * const client = new TrodoClient({ siteId: 'your-site-id' });
8
+ * // OpenAI / Anthropic / LangChain / Vercel AI SDK — nothing else to do.
9
+ * const { result, runId } = await trodo.wrapAgent(
10
+ * 'customer-support',
11
+ * async (run) => {
12
+ * run.setInput({ query });
13
+ * const answer = await agent.run(query);
14
+ * run.setOutput(answer);
15
+ * return answer;
16
+ * },
17
+ * { distinctId, conversationId },
18
+ * );
19
+ *
20
+ * await trodo.feedback(runId, { satisfaction: 'positive', rating: 5 });
21
+ *
22
+ * Raw-HTTP LLM caller:
23
+ * const resp = await fetch(url, { body }).then(r => r.json());
24
+ * await trodo.trackLlmCall({
25
+ * model: 'gemini-2.5-flash', provider: 'google',
26
+ * inputTokens: resp.usageMetadata.promptTokenCount,
27
+ * outputTokens: resp.usageMetadata.candidatesTokenCount,
28
+ * prompt: body, completion: resp,
29
+ * });
30
+ *
31
+ * Custom tool:
32
+ * const runFunnelQuery = trodo.tool(
33
+ * async (teamId, preset) => { ... },
34
+ * { name: 'run_funnel_query' },
35
+ * );
36
+ *
37
+ * Downstream microservice (join the caller's run instead of creating a new one):
38
+ * // Express:
39
+ * app.use(trodo.expressMiddleware());
40
+ *
41
+ * // Or manually:
42
+ * await trodo.joinRun(
43
+ * headers['x-trodo-run-id'],
44
+ * headers['x-trodo-parent-span-id'],
45
+ * async () => { ... },
46
+ * );
13
47
  */
14
48
  export { TrodoClient } from './TrodoClient.js';
15
49
  export { UserContext } from './UserContext.js';
16
50
  export * from './types/index.js';
17
51
  import { TrodoClient } from './TrodoClient.js';
52
+ export { getActiveContext } from './otel/context.js';
53
+ export { currentRunId, currentSpanId } from './otel/wrapAgent.js';
54
+ import { propagationHeaders, trace, llm, retrieval, getTracer, tool as _toolImpl, } from './otel/helpers.js';
55
+ export { propagationHeaders, trace, llm, retrieval, getTracer };
18
56
  // ============================================================================
19
57
  // Singleton convenience API
20
58
  // ============================================================================
@@ -87,22 +125,37 @@ export async function shutdown() {
87
125
  return getClient().shutdown();
88
126
  }
89
127
  // ----------------------------------------------------------------------------
90
- // Agent Analyticssingleton wrappers
128
+ // Agent Runsunified surface
91
129
  // ----------------------------------------------------------------------------
92
- export function track_agent_call(props) {
93
- return getClient().track_agent_call(props);
130
+ /**
131
+ * Wrap an async function as an agent run. All OTel-instrumented LLM/tool
132
+ * calls and nested withSpan calls are auto-captured as child spans.
133
+ */
134
+ export function wrapAgent(agentName, fn, options) {
135
+ return getClient().wrapAgent(agentName, fn, options);
136
+ }
137
+ /** Create a nested span inside the current run. */
138
+ export function withSpan(name, fn, options) {
139
+ return getClient().withSpan(name, fn, options);
140
+ }
141
+ /** Join an existing run owned by a remote service — spans nest under it. */
142
+ export function joinRun(runId, parentSpanId, fn, options) {
143
+ return getClient().joinRun(runId, parentSpanId, fn, options);
94
144
  }
95
- export function track_tool_use(props) {
96
- return getClient().track_tool_use(props);
145
+ export function tool(a, b) {
146
+ return _toolImpl(a, b);
97
147
  }
98
- export function track_agent_response(props) {
99
- return getClient().track_agent_response(props);
148
+ /** Record a one-shot LLM span for a raw-HTTP caller. */
149
+ export function trackLlmCall(params) {
150
+ return getClient().trackLlmCall(params);
100
151
  }
101
- export function track_agent_error(props) {
102
- return getClient().track_agent_error(props);
152
+ /** Return an Express/Connect middleware that auto-joins inbound runs. */
153
+ export function expressMiddleware() {
154
+ return getClient().expressMiddleware();
103
155
  }
104
- export function track_feedback(props) {
105
- return getClient().track_feedback(props);
156
+ /** Attach feedback to a completed run. */
157
+ export function feedback(runId, props) {
158
+ return getClient().feedback(runId, props);
106
159
  }
107
160
  // Default export: the singleton namespace (matches frontend SDK pattern)
108
161
  const trodo = {
@@ -121,11 +174,17 @@ const trodo = {
121
174
  disableAutoEvents,
122
175
  flush,
123
176
  shutdown,
124
- track_agent_call,
125
- track_tool_use,
126
- track_agent_response,
127
- track_agent_error,
128
- track_feedback,
177
+ wrapAgent,
178
+ withSpan,
179
+ joinRun,
180
+ tool,
181
+ trace,
182
+ llm,
183
+ retrieval,
184
+ getTracer,
185
+ trackLlmCall,
186
+ expressMiddleware,
187
+ feedback,
129
188
  };
130
189
  export default trodo;
131
190
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAiC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EACL,kBAAkB,EAClB,KAAK,EACL,GAAG,EACH,SAAS,EACT,SAAS,EACT,IAAI,IAAI,SAAS,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAGhE,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E,IAAI,OAAO,GAAuB,IAAI,CAAC;AAEvC,SAAS,SAAS;IAChB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+DAA+D,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,IAAI,CAAC,MAAmB;IACtC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,OAAO,CACrB,UAAkB,EAClB,OAAwB;IAExB,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,UAAkB,EAClB,SAAiB,EACjB,UAAoC,EACpC,OAAsB;IAEtB,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,UAAkB,EAClB,OAAwB;IAExB,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,UAAkB;IAElB,OAAO,SAAS,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAkB;IAC5C,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,CAAC,CAAS,EAAE,CAA0B,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,CAAC,CAAS,EAAE,CAA0B,EAAE,EAAE,CACjD,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,CAAS,EAAE,CAAoB,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAAU,EAAE,EAAE,CAC9C,SAAS,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAAY,EAAE,EAAE,CAC7C,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAAY,EAAE,EAAE,CAC5C,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAAY,EAAE,EAAE,CAC7C,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAA2B,EAAE,EAAE,CACjE,SAAS,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,QAAgB,EAChB,OAA0B;IAE1B,OAAO,SAAS,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,QAAgB,EAChB,OAAe;IAEf,OAAO,SAAS,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAkB,EAClB,QAAgB,EAChB,OAAe;IAEf,OAAO,SAAS,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,UAAkB,EAClB,QAAgB,EAChB,OAAe;IAEf,OAAO,SAAS,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,SAAS,EAAE,CAAC,gBAAgB,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,OAAO,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,OAAO,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,EAAyC,EACzC,OAA0B;IAE1B,OAAO,SAAS,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,EAA0C,EAC1C,OAAyB;IAEzB,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,OAAO,CACrB,KAAa,EACb,YAA2B,EAC3B,EAA0C,EAC1C,OAAwB;IAExB,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAgBD,MAAM,UAAU,IAAI,CAClB,CAA+C,EAC/C,CAAqD;IAErD,OAAO,SAAS,CAAC,CAAU,EAAE,CAAU,CAAC,CAAC;AAC3C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,SAAS,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACzC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,KAAmC;IAEnC,OAAO,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,MAAM,KAAK,GAAG;IACZ,IAAI;IACJ,OAAO;IACP,KAAK;IACL,QAAQ;IACR,aAAa;IACb,KAAK;IACL,MAAM;IACN,SAAS;IACT,SAAS;IACT,YAAY;IACZ,SAAS;IACT,gBAAgB;IAChB,iBAAiB;IACjB,KAAK;IACL,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,IAAI;IACJ,KAAK;IACL,GAAG;IACH,SAAS;IACT,SAAS;IACT,YAAY;IACZ,iBAAiB;IACjB,QAAQ;CACT,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Optional: register OpenTelemetry auto-instrumentation that feeds spans into
3
+ * our TrodoSpanProcessor. Call `enableAutoInstrument()` once at app startup to
4
+ * pick up Anthropic, OpenAI, Vercel AI SDK, LangChain, Bedrock, Google
5
+ * Generative AI etc. without any more code from the user.
6
+ *
7
+ * Each underlying OTel package is an optional peer dependency — we require()
8
+ * them lazily and skip anything that isn't installed. The user picks which
9
+ * instrumentations they want by installing the packages.
10
+ */
11
+ import type { TrodoSpanProcessor, TrodoSpan } from './processor.js';
12
+ export type InstrumentationId = 'anthropic' | 'openai' | 'langchain' | 'bedrock' | 'cohere' | 'google-generativeai' | 'vertexai' | 'llama-index' | 'vercel-ai' | 'http' | 'fetch';
13
+ export interface AutoInstrumentOptions {
14
+ processor: TrodoSpanProcessor;
15
+ /** Disable individual instrumentations by name. */
16
+ disable?: InstrumentationId[];
17
+ }
18
+ type OtelSpanLike = {
19
+ name: string;
20
+ attributes?: Record<string, unknown>;
21
+ status?: {
22
+ code?: number;
23
+ };
24
+ startTime?: [number, number];
25
+ endTime?: [number, number];
26
+ spanContext?: () => {
27
+ spanId: string;
28
+ traceId: string;
29
+ };
30
+ parentSpanId?: string;
31
+ };
32
+ /**
33
+ * Translate an OTel span to our TrodoSpan shape using GenAI semantic
34
+ * conventions (gen_ai.*). Accepts both stable and legacy/experimental keys.
35
+ */
36
+ export declare function otelSpanToTrodoSpan(otel: OtelSpanLike): TrodoSpan | null;
37
+ /**
38
+ * Adapter that lets the OTel SDK push spans into our processor.
39
+ * Register with `sdk.addSpanProcessor(otelAdapter(processor))` in your app
40
+ * bootstrap.
41
+ */
42
+ export declare function otelAdapter(processor: TrodoSpanProcessor): {
43
+ onStart(): void;
44
+ onEnd(span: OtelSpanLike): void;
45
+ forceFlush(): Promise<void>;
46
+ shutdown(): Promise<void>;
47
+ };
48
+ /**
49
+ * Best-effort: register OTel auto-instrumentations if the user has them
50
+ * installed. This is optional — users can also configure OTel themselves and
51
+ * pass `otelAdapter(processor)` as a span processor.
52
+ *
53
+ * Returns the list of instrumentation ids that were successfully registered.
54
+ *
55
+ * Vercel AI SDK note: if you set `experimental_telemetry: { isEnabled: true,
56
+ * tracer: trace.getTracer('ai') }` on generateText/streamText calls, those
57
+ * spans flow through the SDK-registered OTel SpanProcessor automatically.
58
+ */
59
+ export declare function enableAutoInstrument(opts: AutoInstrumentOptions): InstrumentationId[];
60
+ export {};
61
+ //# sourceMappingURL=autoInstrument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoInstrument.d.ts","sourceRoot":"","sources":["../../../src/otel/autoInstrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGpE,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,GACT,QAAQ,GACR,qBAAqB,GACrB,UAAU,GACV,aAAa,GACb,WAAW,GACX,MAAM,GACN,OAAO,CAAC;AAEZ,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,mDAAmD;IACnD,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAuCF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CA6DxE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,kBAAkB,GAAG;IAC1D,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAgBA;AA4FD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,EAAE,CA6BrF"}
@@ -0,0 +1,248 @@
1
+ import { getActiveContext } from './context.js';
2
+ function hrToIso(hr) {
3
+ if (!hr)
4
+ return undefined;
5
+ const ms = hr[0] * 1000 + Math.floor(hr[1] / 1e6);
6
+ return new Date(ms).toISOString();
7
+ }
8
+ function inferKind(attrs) {
9
+ if (!attrs)
10
+ return 'generic';
11
+ if (attrs['gen_ai.tool.name'])
12
+ return 'tool';
13
+ if (attrs['gen_ai.operation.name'] || attrs['gen_ai.request.model'])
14
+ return 'llm';
15
+ if (attrs['db.system'] || attrs['retrieval.query'])
16
+ return 'retrieval';
17
+ return 'generic';
18
+ }
19
+ function pickNum(attrs, keys) {
20
+ for (const k of keys) {
21
+ const v = attrs[k];
22
+ if (typeof v === 'number')
23
+ return v;
24
+ if (typeof v === 'string' && v !== '' && !isNaN(Number(v)))
25
+ return Number(v);
26
+ }
27
+ return undefined;
28
+ }
29
+ function pickStr(attrs, keys) {
30
+ for (const k of keys) {
31
+ const v = attrs[k];
32
+ if (typeof v === 'string' && v.length)
33
+ return v;
34
+ }
35
+ return undefined;
36
+ }
37
+ /**
38
+ * Translate an OTel span to our TrodoSpan shape using GenAI semantic
39
+ * conventions (gen_ai.*). Accepts both stable and legacy/experimental keys.
40
+ */
41
+ export function otelSpanToTrodoSpan(otel) {
42
+ const ctx = getActiveContext();
43
+ if (!ctx)
44
+ return null; // outside of wrapAgent — drop
45
+ const sc = otel.spanContext?.();
46
+ if (!sc)
47
+ return null;
48
+ const attrs = otel.attributes || {};
49
+ const kind = inferKind(attrs);
50
+ const startedAt = hrToIso(otel.startTime) || new Date().toISOString();
51
+ const endedAt = hrToIso(otel.endTime);
52
+ const durationMs = otel.startTime && otel.endTime
53
+ ? Math.max(0, (otel.endTime[0] - otel.startTime[0]) * 1000 +
54
+ (otel.endTime[1] - otel.startTime[1]) / 1e6)
55
+ : undefined;
56
+ const model = pickStr(attrs, [
57
+ 'gen_ai.request.model',
58
+ 'gen_ai.response.model',
59
+ 'llm.request.model',
60
+ ]);
61
+ const provider = pickStr(attrs, ['gen_ai.system', 'llm.vendor']);
62
+ const inputTokens = pickNum(attrs, [
63
+ 'gen_ai.usage.input_tokens',
64
+ 'gen_ai.usage.prompt_tokens',
65
+ 'llm.usage.prompt_tokens',
66
+ ]);
67
+ const outputTokens = pickNum(attrs, [
68
+ 'gen_ai.usage.output_tokens',
69
+ 'gen_ai.usage.completion_tokens',
70
+ 'llm.usage.completion_tokens',
71
+ ]);
72
+ const temperature = pickNum(attrs, ['gen_ai.request.temperature']);
73
+ const toolName = pickStr(attrs, ['gen_ai.tool.name']);
74
+ const input = pickStr(attrs, ['gen_ai.prompt', 'llm.prompts']);
75
+ const output = pickStr(attrs, ['gen_ai.completion', 'llm.completion']);
76
+ const span = {
77
+ span_id: sc.spanId,
78
+ run_id: ctx.runId,
79
+ parent_span_id: otel.parentSpanId || ctx.spanId,
80
+ kind,
81
+ name: otel.name,
82
+ status: otel.status?.code === 2 ? 'error' : 'ok',
83
+ started_at: startedAt,
84
+ ended_at: endedAt,
85
+ duration_ms: durationMs,
86
+ model,
87
+ provider,
88
+ input_tokens: inputTokens,
89
+ output_tokens: outputTokens,
90
+ temperature,
91
+ tool_name: toolName,
92
+ input,
93
+ output,
94
+ attributes: attrs,
95
+ };
96
+ return span;
97
+ }
98
+ /**
99
+ * Adapter that lets the OTel SDK push spans into our processor.
100
+ * Register with `sdk.addSpanProcessor(otelAdapter(processor))` in your app
101
+ * bootstrap.
102
+ */
103
+ export function otelAdapter(processor) {
104
+ return {
105
+ onStart() {
106
+ /* noop */
107
+ },
108
+ onEnd(otel) {
109
+ const span = otelSpanToTrodoSpan(otel);
110
+ if (span)
111
+ processor.enqueueSpan(span);
112
+ },
113
+ async forceFlush() {
114
+ await processor.forceFlush();
115
+ },
116
+ async shutdown() {
117
+ await processor.shutdown();
118
+ },
119
+ };
120
+ }
121
+ function buildInstrumentors() {
122
+ return [
123
+ {
124
+ id: 'anthropic',
125
+ factory: () => {
126
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
127
+ const m = require('@opentelemetry/instrumentation-anthropic');
128
+ return new m.AnthropicInstrumentation();
129
+ },
130
+ },
131
+ {
132
+ id: 'openai',
133
+ factory: () => {
134
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
135
+ const m = require('@opentelemetry/instrumentation-openai');
136
+ return new m.OpenAIInstrumentation();
137
+ },
138
+ },
139
+ {
140
+ id: 'langchain',
141
+ factory: () => {
142
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
143
+ const m = require('@opentelemetry/instrumentation-langchain');
144
+ return new m.LangChainInstrumentation();
145
+ },
146
+ },
147
+ {
148
+ id: 'bedrock',
149
+ factory: () => {
150
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
151
+ const m = require('@opentelemetry/instrumentation-bedrock');
152
+ return new m.BedrockInstrumentation();
153
+ },
154
+ },
155
+ {
156
+ id: 'cohere',
157
+ factory: () => {
158
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
159
+ const m = require('@opentelemetry/instrumentation-cohere');
160
+ return new m.CohereInstrumentation();
161
+ },
162
+ },
163
+ {
164
+ id: 'google-generativeai',
165
+ factory: () => {
166
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
167
+ const m = require('@opentelemetry/instrumentation-google-generativeai');
168
+ return new m.GoogleGenerativeAIInstrumentation();
169
+ },
170
+ },
171
+ {
172
+ id: 'vertexai',
173
+ factory: () => {
174
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
175
+ const m = require('@opentelemetry/instrumentation-vertexai');
176
+ return new m.VertexAIInstrumentation();
177
+ },
178
+ },
179
+ {
180
+ id: 'llama-index',
181
+ factory: () => {
182
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
183
+ const m = require('@opentelemetry/instrumentation-llamaindex');
184
+ return new m.LlamaIndexInstrumentation();
185
+ },
186
+ },
187
+ {
188
+ id: 'http',
189
+ factory: () => {
190
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
191
+ const m = require('@opentelemetry/instrumentation-http');
192
+ return new m.HttpInstrumentation();
193
+ },
194
+ },
195
+ {
196
+ id: 'fetch',
197
+ factory: () => {
198
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
199
+ const m = require('@opentelemetry/instrumentation-fetch');
200
+ return new m.FetchInstrumentation();
201
+ },
202
+ },
203
+ ];
204
+ }
205
+ /**
206
+ * Best-effort: register OTel auto-instrumentations if the user has them
207
+ * installed. This is optional — users can also configure OTel themselves and
208
+ * pass `otelAdapter(processor)` as a span processor.
209
+ *
210
+ * Returns the list of instrumentation ids that were successfully registered.
211
+ *
212
+ * Vercel AI SDK note: if you set `experimental_telemetry: { isEnabled: true,
213
+ * tracer: trace.getTracer('ai') }` on generateText/streamText calls, those
214
+ * spans flow through the SDK-registered OTel SpanProcessor automatically.
215
+ */
216
+ export function enableAutoInstrument(opts) {
217
+ const disabled = new Set(opts.disable || []);
218
+ const active = [];
219
+ try {
220
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
221
+ const { NodeSDK } = require('@opentelemetry/sdk-node');
222
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
223
+ const { Resource } = require('@opentelemetry/resources');
224
+ const instrumentations = [];
225
+ for (const spec of buildInstrumentors()) {
226
+ if (disabled.has(spec.id))
227
+ continue;
228
+ try {
229
+ instrumentations.push(spec.factory());
230
+ active.push(spec.id);
231
+ }
232
+ catch {
233
+ /* package not installed — skip */
234
+ }
235
+ }
236
+ const sdk = new NodeSDK({
237
+ resource: new Resource({ 'service.name': 'trodo-agent' }),
238
+ spanProcessor: otelAdapter(opts.processor),
239
+ instrumentations,
240
+ });
241
+ sdk.start();
242
+ }
243
+ catch {
244
+ // @opentelemetry/sdk-node not installed; wrapAgent + withSpan still work.
245
+ }
246
+ return active;
247
+ }
248
+ //# sourceMappingURL=autoInstrument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoInstrument.js","sourceRoot":"","sources":["../../../src/otel/autoInstrument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Run/span active-context — used by wrapAgent, joinRun, and withSpan to
3
+ * thread parent_span_id and run_id through nested function calls without
4
+ * the user touching IDs.
5
+ *
6
+ * Backed by AsyncLocalStorage in Node (Node >= 14). Falls back to a global
7
+ * store in other runtimes (best-effort — only the top of each call chain
8
+ * is preserved).
9
+ *
10
+ * When a user registers a real OpenTelemetry SDK, their OTel ContextManager
11
+ * supersedes this for cross-package propagation. This lightweight store is
12
+ * the baseline so wrapAgent works without any external OTel dependency.
13
+ */
14
+ import type { TrodoSpanProcessor } from './processor.js';
15
+ export interface ActiveSpanContext {
16
+ runId: string;
17
+ spanId: string;
18
+ parentSpanId: string | null;
19
+ teamSiteId: string;
20
+ processor: TrodoSpanProcessor;
21
+ }
22
+ export declare function getActiveContext(): ActiveSpanContext | null;
23
+ export declare function runWithContext<R>(ctx: ActiveSpanContext, fn: () => R): R;
24
+ /** Async variant — context is preserved across awaits via AsyncLocalStorage. */
25
+ export declare function runWithContextAsync<R>(ctx: ActiveSpanContext, fn: () => Promise<R>): Promise<R>;
26
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/otel/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAsBD,wBAAgB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI,CAG3D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CASxE;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,iBAAiB,EACtB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
@@ -0,0 +1,44 @@
1
+ let AsyncLocalStorageCtor = null;
2
+ try {
3
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
4
+ AsyncLocalStorageCtor = require('node:async_hooks').AsyncLocalStorage;
5
+ }
6
+ catch {
7
+ try {
8
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
9
+ AsyncLocalStorageCtor = require('async_hooks').AsyncLocalStorage;
10
+ }
11
+ catch {
12
+ AsyncLocalStorageCtor = null;
13
+ }
14
+ }
15
+ const als = AsyncLocalStorageCtor ? new AsyncLocalStorageCtor() : null;
16
+ let fallbackStore = null;
17
+ export function getActiveContext() {
18
+ if (als)
19
+ return als.getStore() ?? null;
20
+ return fallbackStore;
21
+ }
22
+ export function runWithContext(ctx, fn) {
23
+ if (als)
24
+ return als.run(ctx, fn);
25
+ const prev = fallbackStore;
26
+ fallbackStore = ctx;
27
+ try {
28
+ return fn();
29
+ }
30
+ finally {
31
+ fallbackStore = prev;
32
+ }
33
+ }
34
+ /** Async variant — context is preserved across awaits via AsyncLocalStorage. */
35
+ export function runWithContextAsync(ctx, fn) {
36
+ if (als)
37
+ return als.run(ctx, fn);
38
+ const prev = fallbackStore;
39
+ fallbackStore = ctx;
40
+ return fn().finally(() => {
41
+ fallbackStore = prev;
42
+ });
43
+ }
44
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/otel/context.ts"],"names":[],"mappings":"AAuBA,IAAI,qBAAqB,GAGb,IAAI,CAAC;AAEjB,IAAI,CAAC;IACH,8DAA8D;IAC9D,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,iBAAiB,CAAC;AACxE,CAAC;AAAC,MAAM,CAAC;IACP,IAAI,CAAC;QACH,8DAA8D;QAC9D,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1F,IAAI,aAAa,GAA6B,IAAI,CAAC;AAEnD,MAAM,UAAU,gBAAgB;IAC9B,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,GAAsB,EAAE,EAAW;IACnE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,aAAa,GAAG,GAAG,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;YAAS,CAAC;QACT,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,GAAsB,EACtB,EAAoB;IAEpB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC;IAC3B,aAAa,GAAG,GAAG,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QACvB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}