@contractspec/lib.ai-agent 1.61.0 → 2.0.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 (207) hide show
  1. package/dist/agent/agent-factory.d.ts +5 -1
  2. package/dist/agent/agent-factory.js +2293 -31
  3. package/dist/agent/agent.test.d.ts +0 -1
  4. package/dist/agent/contract-spec-agent.d.ts +6 -1
  5. package/dist/agent/contract-spec-agent.js +2292 -31
  6. package/dist/agent/index.d.ts +0 -1
  7. package/dist/agent/index.js +2408 -91
  8. package/dist/agent/json-runner.d.ts +1 -1
  9. package/dist/agent/json-runner.js +2326 -57
  10. package/dist/agent/json-runner.test.d.ts +0 -1
  11. package/dist/agent/unified-agent.d.ts +0 -1
  12. package/dist/agent/unified-agent.js +2374 -65
  13. package/dist/approval/index.d.ts +0 -1
  14. package/dist/approval/index.js +2122 -2
  15. package/dist/approval/workflow.d.ts +7 -2
  16. package/dist/approval/workflow.js +2122 -2
  17. package/dist/exporters/claude-agent-exporter.d.ts +0 -1
  18. package/dist/exporters/claude-agent-exporter.js +2144 -35
  19. package/dist/exporters/index.d.ts +0 -1
  20. package/dist/exporters/index.js +2193 -69
  21. package/dist/exporters/opencode-exporter.d.ts +0 -1
  22. package/dist/exporters/opencode-exporter.js +2152 -39
  23. package/dist/exporters/types.d.ts +0 -1
  24. package/dist/i18n/catalogs/en.d.ts +8 -0
  25. package/dist/i18n/catalogs/en.js +614 -0
  26. package/dist/i18n/catalogs/es.d.ts +8 -0
  27. package/dist/i18n/catalogs/es.js +663 -0
  28. package/dist/i18n/catalogs/fr.d.ts +8 -0
  29. package/dist/i18n/catalogs/fr.js +629 -0
  30. package/dist/i18n/catalogs/index.d.ts +8 -0
  31. package/dist/i18n/catalogs/index.js +1875 -0
  32. package/dist/i18n/i18n.test.d.ts +1 -0
  33. package/dist/i18n/index.d.ts +29 -0
  34. package/dist/i18n/index.js +2127 -0
  35. package/dist/i18n/keys.d.ts +552 -0
  36. package/dist/i18n/keys.js +188 -0
  37. package/dist/i18n/locale.d.ts +33 -0
  38. package/dist/i18n/locale.js +41 -0
  39. package/dist/i18n/messages.d.ts +65 -0
  40. package/dist/i18n/messages.js +1939 -0
  41. package/dist/index.d.ts +0 -13
  42. package/dist/index.js +2106 -3254
  43. package/dist/interop/index.d.ts +0 -1
  44. package/dist/interop/index.js +2182 -47
  45. package/dist/interop/spec-consumer.d.ts +0 -1
  46. package/dist/interop/spec-consumer.js +2151 -34
  47. package/dist/interop/tool-consumer.d.ts +0 -1
  48. package/dist/interop/tool-consumer.js +2122 -13
  49. package/dist/interop/types.d.ts +0 -1
  50. package/dist/knowledge/index.d.ts +0 -1
  51. package/dist/knowledge/index.js +2105 -7
  52. package/dist/knowledge/injector.d.ts +2 -3
  53. package/dist/knowledge/injector.js +2104 -7
  54. package/dist/memory/in-memory.d.ts +0 -1
  55. package/dist/memory/index.d.ts +0 -1
  56. package/dist/memory/manager.d.ts +0 -1
  57. package/dist/memory/memory.test.d.ts +0 -1
  58. package/dist/node/agent/agent-factory.js +2293 -31
  59. package/dist/node/agent/contract-spec-agent.js +2292 -31
  60. package/dist/node/agent/index.js +2408 -91
  61. package/dist/node/agent/json-runner.js +2326 -57
  62. package/dist/node/agent/unified-agent.js +2374 -65
  63. package/dist/node/approval/index.js +2122 -2
  64. package/dist/node/approval/workflow.js +2122 -2
  65. package/dist/node/exporters/claude-agent-exporter.js +2144 -35
  66. package/dist/node/exporters/index.js +2193 -69
  67. package/dist/node/exporters/opencode-exporter.js +2152 -39
  68. package/dist/node/i18n/catalogs/en.js +614 -0
  69. package/dist/node/i18n/catalogs/es.js +663 -0
  70. package/dist/node/i18n/catalogs/fr.js +629 -0
  71. package/dist/node/i18n/catalogs/index.js +1875 -0
  72. package/dist/node/i18n/index.js +2127 -0
  73. package/dist/node/i18n/keys.js +188 -0
  74. package/dist/node/i18n/locale.js +41 -0
  75. package/dist/node/i18n/messages.js +1939 -0
  76. package/dist/node/index.js +2106 -3254
  77. package/dist/node/interop/index.js +2182 -47
  78. package/dist/node/interop/spec-consumer.js +2151 -34
  79. package/dist/node/interop/tool-consumer.js +2122 -13
  80. package/dist/node/knowledge/index.js +2105 -7
  81. package/dist/node/knowledge/injector.js +2104 -7
  82. package/dist/node/providers/claude-agent-sdk/adapter.js +2143 -22
  83. package/dist/node/providers/claude-agent-sdk/index.js +2144 -22
  84. package/dist/node/providers/claude-agent-sdk/tool-bridge.js +2101 -3
  85. package/dist/node/providers/index.js +2182 -39
  86. package/dist/node/providers/opencode-sdk/adapter.js +2148 -27
  87. package/dist/node/providers/opencode-sdk/agent-bridge.js +2110 -10
  88. package/dist/node/providers/opencode-sdk/index.js +2149 -27
  89. package/dist/node/providers/opencode-sdk/tool-bridge.js +2101 -3
  90. package/dist/node/providers/registry.js +2094 -2
  91. package/dist/node/session/index.js +37 -2
  92. package/dist/node/session/store.js +37 -2
  93. package/dist/node/spec/index.js +2111 -7
  94. package/dist/node/spec/registry.js +2096 -2
  95. package/dist/node/spec/spec.js +2105 -5
  96. package/dist/node/telemetry/index.js +117 -1
  97. package/dist/node/telemetry/posthog-types.js +0 -0
  98. package/dist/node/telemetry/posthog.js +132 -0
  99. package/dist/node/tools/index.js +2117 -17
  100. package/dist/node/tools/knowledge-tool.js +2105 -11
  101. package/dist/node/tools/mcp-server.js +2101 -5
  102. package/dist/node/tools/tool-adapter.js +2093 -1
  103. package/dist/providers/claude-agent-sdk/adapter.d.ts +0 -1
  104. package/dist/providers/claude-agent-sdk/adapter.js +2143 -22
  105. package/dist/providers/claude-agent-sdk/index.d.ts +0 -1
  106. package/dist/providers/claude-agent-sdk/index.js +2144 -22
  107. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +0 -1
  108. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +0 -1
  109. package/dist/providers/claude-agent-sdk/tool-bridge.js +2101 -3
  110. package/dist/providers/index.d.ts +0 -1
  111. package/dist/providers/index.js +2182 -39
  112. package/dist/providers/opencode-sdk/adapter.d.ts +0 -1
  113. package/dist/providers/opencode-sdk/adapter.js +2148 -27
  114. package/dist/providers/opencode-sdk/agent-bridge.d.ts +0 -1
  115. package/dist/providers/opencode-sdk/agent-bridge.js +2110 -10
  116. package/dist/providers/opencode-sdk/index.d.ts +0 -1
  117. package/dist/providers/opencode-sdk/index.js +2149 -27
  118. package/dist/providers/opencode-sdk/tool-bridge.d.ts +0 -1
  119. package/dist/providers/opencode-sdk/tool-bridge.js +2101 -3
  120. package/dist/providers/registry.d.ts +0 -1
  121. package/dist/providers/registry.js +2094 -2
  122. package/dist/providers/types.d.ts +0 -1
  123. package/dist/schema/index.d.ts +0 -1
  124. package/dist/schema/json-schema-to-zod.d.ts +0 -1
  125. package/dist/schema/schema-output.d.ts +0 -1
  126. package/dist/session/index.d.ts +0 -1
  127. package/dist/session/index.js +37 -2
  128. package/dist/session/store.d.ts +12 -2
  129. package/dist/session/store.js +37 -2
  130. package/dist/spec/index.d.ts +0 -1
  131. package/dist/spec/index.js +2111 -7
  132. package/dist/spec/registry.d.ts +1 -2
  133. package/dist/spec/registry.js +2096 -2
  134. package/dist/spec/spec.d.ts +5 -4
  135. package/dist/spec/spec.js +2105 -5
  136. package/dist/telemetry/adapter.d.ts +0 -1
  137. package/dist/telemetry/index.d.ts +2 -1
  138. package/dist/telemetry/index.js +117 -1
  139. package/dist/telemetry/posthog-types.d.ts +59 -0
  140. package/dist/telemetry/posthog-types.js +1 -0
  141. package/dist/telemetry/posthog.d.ts +80 -0
  142. package/dist/telemetry/posthog.js +132 -0
  143. package/dist/telemetry/posthog.test.d.ts +1 -0
  144. package/dist/tools/index.d.ts +0 -1
  145. package/dist/tools/index.js +2117 -17
  146. package/dist/tools/knowledge-tool.d.ts +1 -2
  147. package/dist/tools/knowledge-tool.js +2105 -11
  148. package/dist/tools/mcp-client.d.ts +0 -1
  149. package/dist/tools/mcp-server.d.ts +0 -1
  150. package/dist/tools/mcp-server.js +2101 -5
  151. package/dist/tools/tool-adapter.d.ts +0 -1
  152. package/dist/tools/tool-adapter.js +2093 -1
  153. package/dist/tools/tools.test.d.ts +0 -1
  154. package/dist/types.d.ts +4 -1
  155. package/package.json +166 -13
  156. package/dist/agent/agent-factory.d.ts.map +0 -1
  157. package/dist/agent/agent.test.d.ts.map +0 -1
  158. package/dist/agent/contract-spec-agent.d.ts.map +0 -1
  159. package/dist/agent/index.d.ts.map +0 -1
  160. package/dist/agent/json-runner.d.ts.map +0 -1
  161. package/dist/agent/json-runner.test.d.ts.map +0 -1
  162. package/dist/agent/unified-agent.d.ts.map +0 -1
  163. package/dist/approval/index.d.ts.map +0 -1
  164. package/dist/approval/workflow.d.ts.map +0 -1
  165. package/dist/exporters/claude-agent-exporter.d.ts.map +0 -1
  166. package/dist/exporters/index.d.ts.map +0 -1
  167. package/dist/exporters/opencode-exporter.d.ts.map +0 -1
  168. package/dist/exporters/types.d.ts.map +0 -1
  169. package/dist/index.d.ts.map +0 -1
  170. package/dist/interop/index.d.ts.map +0 -1
  171. package/dist/interop/spec-consumer.d.ts.map +0 -1
  172. package/dist/interop/tool-consumer.d.ts.map +0 -1
  173. package/dist/interop/types.d.ts.map +0 -1
  174. package/dist/knowledge/index.d.ts.map +0 -1
  175. package/dist/knowledge/injector.d.ts.map +0 -1
  176. package/dist/memory/in-memory.d.ts.map +0 -1
  177. package/dist/memory/index.d.ts.map +0 -1
  178. package/dist/memory/manager.d.ts.map +0 -1
  179. package/dist/memory/memory.test.d.ts.map +0 -1
  180. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +0 -1
  181. package/dist/providers/claude-agent-sdk/index.d.ts.map +0 -1
  182. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +0 -1
  183. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +0 -1
  184. package/dist/providers/index.d.ts.map +0 -1
  185. package/dist/providers/opencode-sdk/adapter.d.ts.map +0 -1
  186. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +0 -1
  187. package/dist/providers/opencode-sdk/index.d.ts.map +0 -1
  188. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +0 -1
  189. package/dist/providers/registry.d.ts.map +0 -1
  190. package/dist/providers/types.d.ts.map +0 -1
  191. package/dist/schema/index.d.ts.map +0 -1
  192. package/dist/schema/json-schema-to-zod.d.ts.map +0 -1
  193. package/dist/schema/schema-output.d.ts.map +0 -1
  194. package/dist/session/index.d.ts.map +0 -1
  195. package/dist/session/store.d.ts.map +0 -1
  196. package/dist/spec/index.d.ts.map +0 -1
  197. package/dist/spec/registry.d.ts.map +0 -1
  198. package/dist/spec/spec.d.ts.map +0 -1
  199. package/dist/telemetry/adapter.d.ts.map +0 -1
  200. package/dist/telemetry/index.d.ts.map +0 -1
  201. package/dist/tools/index.d.ts.map +0 -1
  202. package/dist/tools/knowledge-tool.d.ts.map +0 -1
  203. package/dist/tools/mcp-client.d.ts.map +0 -1
  204. package/dist/tools/mcp-server.d.ts.map +0 -1
  205. package/dist/tools/tool-adapter.d.ts.map +0 -1
  206. package/dist/tools/tools.test.d.ts.map +0 -1
  207. package/dist/types.d.ts.map +0 -1
@@ -65,4 +65,3 @@ export declare function createInMemoryTelemetryCollector(): InMemoryTelemetryCol
65
65
  * No-op telemetry collector that discards all metrics.
66
66
  */
67
67
  export declare const noopTelemetryCollector: TelemetryCollector;
68
- //# sourceMappingURL=adapter.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export * from './adapter';
2
- //# sourceMappingURL=index.d.ts.map
2
+ export * from './posthog-types';
3
+ export * from './posthog';
@@ -76,11 +76,127 @@ var init_adapter = __esm(() => {
76
76
  };
77
77
  });
78
78
 
79
+ // src/telemetry/posthog.ts
80
+ var exports_posthog = {};
81
+ __export(exports_posthog, {
82
+ createPostHogTracedModel: () => createPostHogTracedModel,
83
+ createPostHogTelemetryCollector: () => createPostHogTelemetryCollector,
84
+ createCompositeTelemetryCollector: () => createCompositeTelemetryCollector,
85
+ PostHogTelemetryCollector: () => PostHogTelemetryCollector,
86
+ CompositeTelemetryCollector: () => CompositeTelemetryCollector
87
+ });
88
+ async function createPostHogTracedModel(model, config, overrides) {
89
+ const { withTracing } = await importPostHogAI();
90
+ const phClient = await resolvePostHogClient(config);
91
+ const tracingOptions = {
92
+ ...config.defaults,
93
+ ...overrides
94
+ };
95
+ return withTracing(model, phClient, tracingOptions);
96
+ }
97
+
98
+ class PostHogTelemetryCollector {
99
+ phClient;
100
+ config;
101
+ initPromise;
102
+ constructor(config) {
103
+ this.config = config;
104
+ this.phClient = config.client;
105
+ }
106
+ async collect(sample) {
107
+ const client = await this.getClient();
108
+ const distinctId = this.config.defaults?.posthogDistinctId ?? sample.metadata?.["actorId"] ?? "system";
109
+ client.capture({
110
+ distinctId,
111
+ event: "$ai_generation",
112
+ properties: {
113
+ $ai_model: sample.operation.name,
114
+ $ai_provider: "contractspec",
115
+ $ai_latency: sample.durationMs / 1000,
116
+ $ai_is_error: !sample.success,
117
+ $ai_trace_id: this.config.defaults?.posthogTraceId,
118
+ ...sample.metadata?.["tokenUsage"] ? mapTokenUsage(sample.metadata["tokenUsage"]) : {},
119
+ ...this.config.defaults?.posthogProperties,
120
+ contractspec_operation: sample.operation.name,
121
+ contractspec_version: sample.operation.version,
122
+ contractspec_agent_id: sample.metadata?.["agentId"],
123
+ contractspec_finish_reason: sample.metadata?.["finishReason"],
124
+ contractspec_tool_count: sample.metadata?.["toolCallCount"]
125
+ },
126
+ groups: this.config.defaults?.posthogGroups
127
+ });
128
+ }
129
+ async shutdown() {
130
+ if (this.phClient?.shutdown) {
131
+ await this.phClient.shutdown();
132
+ }
133
+ }
134
+ async getClient() {
135
+ if (this.phClient)
136
+ return this.phClient;
137
+ if (!this.initPromise) {
138
+ this.initPromise = resolvePostHogClient(this.config).then((client) => {
139
+ this.phClient = client;
140
+ return client;
141
+ });
142
+ }
143
+ return this.initPromise;
144
+ }
145
+ }
146
+ function createPostHogTelemetryCollector(config) {
147
+ return new PostHogTelemetryCollector(config);
148
+ }
149
+
150
+ class CompositeTelemetryCollector {
151
+ collectors;
152
+ constructor(collectors) {
153
+ this.collectors = collectors;
154
+ }
155
+ async collect(sample) {
156
+ await Promise.all(this.collectors.map((c) => c.collect(sample)));
157
+ }
158
+ }
159
+ function createCompositeTelemetryCollector(collectors) {
160
+ return new CompositeTelemetryCollector(collectors);
161
+ }
162
+ async function importPostHogAI() {
163
+ try {
164
+ return await import("@posthog/ai");
165
+ } catch {
166
+ throw new Error("PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node");
167
+ }
168
+ }
169
+ async function resolvePostHogClient(config) {
170
+ if (config.client)
171
+ return config.client;
172
+ if (!config.apiKey) {
173
+ throw new Error("PostHog LLM Analytics requires either a client instance or an apiKey.");
174
+ }
175
+ try {
176
+ const { PostHog } = await import("posthog-node");
177
+ return new PostHog(config.apiKey, {
178
+ host: config.host ?? "https://us.i.posthog.com"
179
+ });
180
+ } catch {
181
+ throw new Error("PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node");
182
+ }
183
+ }
184
+ function mapTokenUsage(usage) {
185
+ return {
186
+ $ai_input_tokens: usage["promptTokens"],
187
+ $ai_output_tokens: usage["completionTokens"]
188
+ };
189
+ }
79
190
  // src/telemetry/index.ts
80
191
  init_adapter();
81
192
  export {
82
193
  trackAgentStep,
83
194
  noopTelemetryCollector,
195
+ createPostHogTracedModel,
196
+ createPostHogTelemetryCollector,
84
197
  createInMemoryTelemetryCollector,
85
- InMemoryTelemetryCollector
198
+ createCompositeTelemetryCollector,
199
+ PostHogTelemetryCollector,
200
+ InMemoryTelemetryCollector,
201
+ CompositeTelemetryCollector
86
202
  };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * PostHog LLM Analytics type definitions.
3
+ *
4
+ * Shared types for PostHog integration. Separated from implementation
5
+ * to allow importing types without pulling in dynamic imports.
6
+ */
7
+ /**
8
+ * PostHog tracing options passed to @posthog/ai withTracing wrapper.
9
+ * These enrich captured $ai_generation events with contextual data.
10
+ *
11
+ * @see https://posthog.com/docs/llm-analytics/installation/vercel-ai
12
+ */
13
+ export interface PostHogTracingOptions {
14
+ /** Distinct user ID for attribution */
15
+ posthogDistinctId?: string;
16
+ /** Trace ID for grouping related generations */
17
+ posthogTraceId?: string;
18
+ /** Custom properties attached to every generation event */
19
+ posthogProperties?: Record<string, unknown>;
20
+ /** When true, input/output content is redacted */
21
+ posthogPrivacyMode?: boolean;
22
+ /** Group analytics (e.g., { company: "companyId" }) */
23
+ posthogGroups?: Record<string, string>;
24
+ }
25
+ /**
26
+ * Minimal interface for posthog-node PostHog client.
27
+ * Avoids hard dependency on posthog-node types.
28
+ */
29
+ export interface PostHogClient {
30
+ capture(params: {
31
+ distinctId: string;
32
+ event: string;
33
+ properties?: Record<string, unknown>;
34
+ groups?: Record<string, string>;
35
+ }): void;
36
+ shutdown?(): Promise<void>;
37
+ }
38
+ /**
39
+ * Configuration for PostHog LLM Analytics integration.
40
+ *
41
+ * Provide either an existing PostHog client instance or
42
+ * apiKey + host to create one internally.
43
+ *
44
+ * PostHog Evaluations (Relevance, Helpfulness, Hallucination, Toxicity,
45
+ * Jailbreak, and custom prompts) run server-side on captured $ai_generation
46
+ * events. Configure them in PostHog UI under LLM Analytics > Evaluations.
47
+ *
48
+ * @see https://posthog.com/docs/llm-analytics/evaluations
49
+ */
50
+ export interface PostHogLLMConfig {
51
+ /** Existing posthog-node client instance */
52
+ client?: PostHogClient;
53
+ /** PostHog project API key (used when client is not provided) */
54
+ apiKey?: string;
55
+ /** PostHog ingestion host (defaults to https://us.i.posthog.com) */
56
+ host?: string;
57
+ /** Default tracing options applied to all wrapped models */
58
+ defaults?: PostHogTracingOptions;
59
+ }
@@ -0,0 +1 @@
1
+ // @bun
@@ -0,0 +1,80 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { TelemetryCollector, OperationMetricSample } from './adapter';
3
+ import type { PostHogLLMConfig, PostHogTracingOptions } from './posthog-types';
4
+ export type { PostHogClient, PostHogLLMConfig, PostHogTracingOptions, } from './posthog-types';
5
+ /**
6
+ * Wrap a Vercel AI SDK LanguageModel with PostHog LLM tracing.
7
+ *
8
+ * Requires `@posthog/ai` and `posthog-node` to be installed as peer deps.
9
+ * Automatically captures `$ai_generation` events for every LLM call,
10
+ * including token usage, latency, cost, input/output, and tool metadata.
11
+ *
12
+ * These events power PostHog's LLM Analytics dashboard (Traces, Generations)
13
+ * and are the basis for server-side Evaluations.
14
+ *
15
+ * @param model - AI SDK LanguageModel to wrap
16
+ * @param config - PostHog configuration
17
+ * @param overrides - Per-call tracing option overrides
18
+ * @returns Wrapped LanguageModel that auto-reports to PostHog
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { createPostHogTracedModel } from '@contractspec/lib.ai-agent/telemetry/posthog';
23
+ *
24
+ * const model = await createPostHogTracedModel(
25
+ * anthropic('claude-sonnet-4-20250514'),
26
+ * { apiKey: process.env.POSTHOG_API_KEY },
27
+ * { posthogDistinctId: 'user_123' },
28
+ * );
29
+ * ```
30
+ */
31
+ export declare function createPostHogTracedModel(model: LanguageModel, config: PostHogLLMConfig, overrides?: PostHogTracingOptions): Promise<LanguageModel>;
32
+ /**
33
+ * PostHog-backed telemetry collector.
34
+ *
35
+ * Implements the existing TelemetryCollector interface so it integrates
36
+ * seamlessly with trackAgentStep(). Each OperationMetricSample is captured
37
+ * as a PostHog $ai_generation event, bridging ContractSpec's evolution
38
+ * engine with PostHog's LLM Analytics dashboard.
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const collector = createPostHogTelemetryCollector({
43
+ * apiKey: process.env.POSTHOG_API_KEY,
44
+ * defaults: { posthogDistinctId: 'system' },
45
+ * });
46
+ * ```
47
+ */
48
+ export declare class PostHogTelemetryCollector implements TelemetryCollector {
49
+ private phClient;
50
+ private readonly config;
51
+ private initPromise;
52
+ constructor(config: PostHogLLMConfig);
53
+ collect(sample: OperationMetricSample): Promise<void>;
54
+ /** Shut down the PostHog client (flushes pending events). */
55
+ shutdown(): Promise<void>;
56
+ private getClient;
57
+ }
58
+ /** Create a PostHog-backed telemetry collector. */
59
+ export declare function createPostHogTelemetryCollector(config: PostHogLLMConfig): PostHogTelemetryCollector;
60
+ /**
61
+ * Composite telemetry collector that forwards samples to multiple collectors.
62
+ *
63
+ * Useful when you want both PostHog LLM Analytics and the existing
64
+ * evolution engine to receive the same telemetry data.
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const composite = createCompositeTelemetryCollector([
69
+ * evolutionCollector,
70
+ * createPostHogTelemetryCollector({ apiKey: '...' }),
71
+ * ]);
72
+ * ```
73
+ */
74
+ export declare class CompositeTelemetryCollector implements TelemetryCollector {
75
+ private readonly collectors;
76
+ constructor(collectors: TelemetryCollector[]);
77
+ collect(sample: OperationMetricSample): Promise<void>;
78
+ }
79
+ /** Create a composite telemetry collector. */
80
+ export declare function createCompositeTelemetryCollector(collectors: TelemetryCollector[]): CompositeTelemetryCollector;
@@ -0,0 +1,132 @@
1
+ // @bun
2
+ var __defProp = Object.defineProperty;
3
+ var __export = (target, all) => {
4
+ for (var name in all)
5
+ __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true,
8
+ configurable: true,
9
+ set: (newValue) => all[name] = () => newValue
10
+ });
11
+ };
12
+ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
+ var __require = import.meta.require;
14
+
15
+ // src/telemetry/posthog.ts
16
+ var exports_posthog = {};
17
+ __export(exports_posthog, {
18
+ createPostHogTracedModel: () => createPostHogTracedModel,
19
+ createPostHogTelemetryCollector: () => createPostHogTelemetryCollector,
20
+ createCompositeTelemetryCollector: () => createCompositeTelemetryCollector,
21
+ PostHogTelemetryCollector: () => PostHogTelemetryCollector,
22
+ CompositeTelemetryCollector: () => CompositeTelemetryCollector
23
+ });
24
+ async function createPostHogTracedModel(model, config, overrides) {
25
+ const { withTracing } = await importPostHogAI();
26
+ const phClient = await resolvePostHogClient(config);
27
+ const tracingOptions = {
28
+ ...config.defaults,
29
+ ...overrides
30
+ };
31
+ return withTracing(model, phClient, tracingOptions);
32
+ }
33
+
34
+ class PostHogTelemetryCollector {
35
+ phClient;
36
+ config;
37
+ initPromise;
38
+ constructor(config) {
39
+ this.config = config;
40
+ this.phClient = config.client;
41
+ }
42
+ async collect(sample) {
43
+ const client = await this.getClient();
44
+ const distinctId = this.config.defaults?.posthogDistinctId ?? sample.metadata?.["actorId"] ?? "system";
45
+ client.capture({
46
+ distinctId,
47
+ event: "$ai_generation",
48
+ properties: {
49
+ $ai_model: sample.operation.name,
50
+ $ai_provider: "contractspec",
51
+ $ai_latency: sample.durationMs / 1000,
52
+ $ai_is_error: !sample.success,
53
+ $ai_trace_id: this.config.defaults?.posthogTraceId,
54
+ ...sample.metadata?.["tokenUsage"] ? mapTokenUsage(sample.metadata["tokenUsage"]) : {},
55
+ ...this.config.defaults?.posthogProperties,
56
+ contractspec_operation: sample.operation.name,
57
+ contractspec_version: sample.operation.version,
58
+ contractspec_agent_id: sample.metadata?.["agentId"],
59
+ contractspec_finish_reason: sample.metadata?.["finishReason"],
60
+ contractspec_tool_count: sample.metadata?.["toolCallCount"]
61
+ },
62
+ groups: this.config.defaults?.posthogGroups
63
+ });
64
+ }
65
+ async shutdown() {
66
+ if (this.phClient?.shutdown) {
67
+ await this.phClient.shutdown();
68
+ }
69
+ }
70
+ async getClient() {
71
+ if (this.phClient)
72
+ return this.phClient;
73
+ if (!this.initPromise) {
74
+ this.initPromise = resolvePostHogClient(this.config).then((client) => {
75
+ this.phClient = client;
76
+ return client;
77
+ });
78
+ }
79
+ return this.initPromise;
80
+ }
81
+ }
82
+ function createPostHogTelemetryCollector(config) {
83
+ return new PostHogTelemetryCollector(config);
84
+ }
85
+
86
+ class CompositeTelemetryCollector {
87
+ collectors;
88
+ constructor(collectors) {
89
+ this.collectors = collectors;
90
+ }
91
+ async collect(sample) {
92
+ await Promise.all(this.collectors.map((c) => c.collect(sample)));
93
+ }
94
+ }
95
+ function createCompositeTelemetryCollector(collectors) {
96
+ return new CompositeTelemetryCollector(collectors);
97
+ }
98
+ async function importPostHogAI() {
99
+ try {
100
+ return await import("@posthog/ai");
101
+ } catch {
102
+ throw new Error("PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node");
103
+ }
104
+ }
105
+ async function resolvePostHogClient(config) {
106
+ if (config.client)
107
+ return config.client;
108
+ if (!config.apiKey) {
109
+ throw new Error("PostHog LLM Analytics requires either a client instance or an apiKey.");
110
+ }
111
+ try {
112
+ const { PostHog } = await import("posthog-node");
113
+ return new PostHog(config.apiKey, {
114
+ host: config.host ?? "https://us.i.posthog.com"
115
+ });
116
+ } catch {
117
+ throw new Error("PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node");
118
+ }
119
+ }
120
+ function mapTokenUsage(usage) {
121
+ return {
122
+ $ai_input_tokens: usage["promptTokens"],
123
+ $ai_output_tokens: usage["completionTokens"]
124
+ };
125
+ }
126
+ export {
127
+ createPostHogTracedModel,
128
+ createPostHogTelemetryCollector,
129
+ createCompositeTelemetryCollector,
130
+ PostHogTelemetryCollector,
131
+ CompositeTelemetryCollector
132
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -2,4 +2,3 @@ export * from './tool-adapter';
2
2
  export * from './knowledge-tool';
3
3
  export * from './mcp-client';
4
4
  export * from './mcp-server';
5
- //# sourceMappingURL=index.d.ts.map