@contractspec/lib.ai-agent 1.62.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 (216) hide show
  1. package/dist/agent/agent-factory.d.ts +0 -1
  2. package/dist/agent/agent-factory.js +296 -41
  3. package/dist/agent/agent.test.d.ts +0 -1
  4. package/dist/agent/contract-spec-agent.d.ts +3 -2
  5. package/dist/agent/contract-spec-agent.js +296 -41
  6. package/dist/agent/index.d.ts +0 -1
  7. package/dist/agent/index.js +298 -43
  8. package/dist/agent/json-runner.d.ts +0 -1
  9. package/dist/agent/json-runner.js +297 -42
  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 +297 -42
  13. package/dist/approval/index.d.ts +0 -1
  14. package/dist/approval/index.js +31 -5
  15. package/dist/approval/workflow.d.ts +7 -2
  16. package/dist/approval/workflow.js +31 -5
  17. package/dist/exporters/claude-agent-exporter.d.ts +0 -1
  18. package/dist/exporters/claude-agent-exporter.js +4 -4
  19. package/dist/exporters/index.d.ts +0 -1
  20. package/dist/exporters/index.js +4 -4
  21. package/dist/exporters/opencode-exporter.d.ts +0 -1
  22. package/dist/exporters/opencode-exporter.js +4 -4
  23. package/dist/exporters/types.d.ts +0 -1
  24. package/dist/i18n/catalogs/en.d.ts +1 -2
  25. package/dist/i18n/catalogs/en.js +1 -1
  26. package/dist/i18n/catalogs/es.d.ts +1 -2
  27. package/dist/i18n/catalogs/es.js +1 -1
  28. package/dist/i18n/catalogs/fr.d.ts +1 -2
  29. package/dist/i18n/catalogs/fr.js +1 -1
  30. package/dist/i18n/catalogs/index.d.ts +0 -1
  31. package/dist/i18n/catalogs/index.js +3 -3
  32. package/dist/i18n/i18n.test.d.ts +0 -1
  33. package/dist/i18n/index.d.ts +0 -1
  34. package/dist/i18n/index.js +4 -4
  35. package/dist/i18n/keys.d.ts +0 -1
  36. package/dist/i18n/locale.d.ts +0 -1
  37. package/dist/i18n/messages.d.ts +1 -2
  38. package/dist/i18n/messages.js +4 -4
  39. package/dist/index.d.ts +0 -14
  40. package/dist/index.js +6 -3523
  41. package/dist/interop/index.d.ts +0 -1
  42. package/dist/interop/index.js +4 -4
  43. package/dist/interop/spec-consumer.d.ts +0 -1
  44. package/dist/interop/spec-consumer.js +4 -4
  45. package/dist/interop/tool-consumer.d.ts +0 -1
  46. package/dist/interop/tool-consumer.js +4 -4
  47. package/dist/interop/types.d.ts +0 -1
  48. package/dist/knowledge/index.d.ts +0 -1
  49. package/dist/knowledge/index.js +4 -4
  50. package/dist/knowledge/injector.d.ts +0 -1
  51. package/dist/knowledge/injector.js +4 -4
  52. package/dist/memory/in-memory.d.ts +0 -1
  53. package/dist/memory/index.d.ts +0 -1
  54. package/dist/memory/manager.d.ts +0 -1
  55. package/dist/memory/memory.test.d.ts +0 -1
  56. package/dist/node/agent/agent-factory.js +296 -41
  57. package/dist/node/agent/contract-spec-agent.js +296 -41
  58. package/dist/node/agent/index.js +298 -43
  59. package/dist/node/agent/json-runner.js +297 -42
  60. package/dist/node/agent/unified-agent.js +297 -42
  61. package/dist/node/approval/index.js +31 -5
  62. package/dist/node/approval/workflow.js +31 -5
  63. package/dist/node/exporters/claude-agent-exporter.js +4 -4
  64. package/dist/node/exporters/index.js +4 -4
  65. package/dist/node/exporters/opencode-exporter.js +4 -4
  66. package/dist/node/i18n/catalogs/en.js +1 -1
  67. package/dist/node/i18n/catalogs/es.js +1 -1
  68. package/dist/node/i18n/catalogs/fr.js +1 -1
  69. package/dist/node/i18n/catalogs/index.js +3 -3
  70. package/dist/node/i18n/index.js +4 -4
  71. package/dist/node/i18n/messages.js +4 -4
  72. package/dist/node/index.js +6 -3523
  73. package/dist/node/interop/index.js +4 -4
  74. package/dist/node/interop/spec-consumer.js +4 -4
  75. package/dist/node/interop/tool-consumer.js +4 -4
  76. package/dist/node/knowledge/index.js +4 -4
  77. package/dist/node/knowledge/injector.js +4 -4
  78. package/dist/node/providers/claude-agent-sdk/adapter.js +4 -4
  79. package/dist/node/providers/claude-agent-sdk/index.js +4 -4
  80. package/dist/node/providers/claude-agent-sdk/tool-bridge.js +4 -4
  81. package/dist/node/providers/index.js +4 -4
  82. package/dist/node/providers/opencode-sdk/adapter.js +4 -4
  83. package/dist/node/providers/opencode-sdk/agent-bridge.js +4 -4
  84. package/dist/node/providers/opencode-sdk/index.js +4 -4
  85. package/dist/node/providers/opencode-sdk/tool-bridge.js +4 -4
  86. package/dist/node/providers/registry.js +4 -4
  87. package/dist/node/session/index.js +37 -2
  88. package/dist/node/session/store.js +37 -2
  89. package/dist/node/spec/index.js +5 -5
  90. package/dist/node/spec/registry.js +5 -5
  91. package/dist/node/spec/spec.js +4 -4
  92. package/dist/node/telemetry/adapter.js +84 -4
  93. package/dist/node/telemetry/index.js +165 -15
  94. package/dist/node/telemetry/posthog.js +81 -11
  95. package/dist/node/tools/index.js +4 -4
  96. package/dist/node/tools/knowledge-tool.js +4 -4
  97. package/dist/node/tools/mcp-server.js +4 -4
  98. package/dist/node/tools/tool-adapter.js +4 -4
  99. package/dist/providers/claude-agent-sdk/adapter.d.ts +0 -1
  100. package/dist/providers/claude-agent-sdk/adapter.js +4 -4
  101. package/dist/providers/claude-agent-sdk/index.d.ts +0 -1
  102. package/dist/providers/claude-agent-sdk/index.js +4 -4
  103. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +0 -1
  104. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +0 -1
  105. package/dist/providers/claude-agent-sdk/tool-bridge.js +4 -4
  106. package/dist/providers/index.d.ts +0 -1
  107. package/dist/providers/index.js +4 -4
  108. package/dist/providers/opencode-sdk/adapter.d.ts +0 -1
  109. package/dist/providers/opencode-sdk/adapter.js +4 -4
  110. package/dist/providers/opencode-sdk/agent-bridge.d.ts +0 -1
  111. package/dist/providers/opencode-sdk/agent-bridge.js +4 -4
  112. package/dist/providers/opencode-sdk/index.d.ts +0 -1
  113. package/dist/providers/opencode-sdk/index.js +4 -4
  114. package/dist/providers/opencode-sdk/tool-bridge.d.ts +0 -1
  115. package/dist/providers/opencode-sdk/tool-bridge.js +4 -4
  116. package/dist/providers/registry.d.ts +0 -1
  117. package/dist/providers/registry.js +4 -4
  118. package/dist/providers/types.d.ts +0 -1
  119. package/dist/schema/index.d.ts +0 -1
  120. package/dist/schema/json-schema-to-zod.d.ts +0 -1
  121. package/dist/schema/schema-output.d.ts +0 -1
  122. package/dist/session/index.d.ts +0 -1
  123. package/dist/session/index.js +37 -2
  124. package/dist/session/store.d.ts +12 -2
  125. package/dist/session/store.js +37 -2
  126. package/dist/spec/index.d.ts +0 -1
  127. package/dist/spec/index.js +5 -5
  128. package/dist/spec/registry.d.ts +1 -2
  129. package/dist/spec/registry.js +5 -5
  130. package/dist/spec/spec.d.ts +3 -4
  131. package/dist/spec/spec.js +4 -4
  132. package/dist/telemetry/adapter.d.ts +10 -2
  133. package/dist/telemetry/adapter.js +84 -4
  134. package/dist/telemetry/adapter.test.d.ts +1 -0
  135. package/dist/telemetry/index.d.ts +0 -1
  136. package/dist/telemetry/index.js +165 -15
  137. package/dist/telemetry/posthog-types.d.ts +12 -1
  138. package/dist/telemetry/posthog.d.ts +0 -1
  139. package/dist/telemetry/posthog.js +81 -11
  140. package/dist/telemetry/posthog.test.d.ts +0 -1
  141. package/dist/tools/index.d.ts +0 -1
  142. package/dist/tools/index.js +4 -4
  143. package/dist/tools/knowledge-tool.d.ts +0 -1
  144. package/dist/tools/knowledge-tool.js +4 -4
  145. package/dist/tools/mcp-client.d.ts +0 -1
  146. package/dist/tools/mcp-server.d.ts +0 -1
  147. package/dist/tools/mcp-server.js +4 -4
  148. package/dist/tools/tool-adapter.d.ts +0 -1
  149. package/dist/tools/tool-adapter.js +4 -4
  150. package/dist/tools/tools.test.d.ts +0 -1
  151. package/dist/types.d.ts +0 -1
  152. package/package.json +12 -12
  153. package/dist/agent/agent-factory.d.ts.map +0 -1
  154. package/dist/agent/agent.test.d.ts.map +0 -1
  155. package/dist/agent/contract-spec-agent.d.ts.map +0 -1
  156. package/dist/agent/index.d.ts.map +0 -1
  157. package/dist/agent/json-runner.d.ts.map +0 -1
  158. package/dist/agent/json-runner.test.d.ts.map +0 -1
  159. package/dist/agent/unified-agent.d.ts.map +0 -1
  160. package/dist/approval/index.d.ts.map +0 -1
  161. package/dist/approval/workflow.d.ts.map +0 -1
  162. package/dist/exporters/claude-agent-exporter.d.ts.map +0 -1
  163. package/dist/exporters/index.d.ts.map +0 -1
  164. package/dist/exporters/opencode-exporter.d.ts.map +0 -1
  165. package/dist/exporters/types.d.ts.map +0 -1
  166. package/dist/i18n/catalogs/en.d.ts.map +0 -1
  167. package/dist/i18n/catalogs/es.d.ts.map +0 -1
  168. package/dist/i18n/catalogs/fr.d.ts.map +0 -1
  169. package/dist/i18n/catalogs/index.d.ts.map +0 -1
  170. package/dist/i18n/i18n.test.d.ts.map +0 -1
  171. package/dist/i18n/index.d.ts.map +0 -1
  172. package/dist/i18n/keys.d.ts.map +0 -1
  173. package/dist/i18n/locale.d.ts.map +0 -1
  174. package/dist/i18n/messages.d.ts.map +0 -1
  175. package/dist/index.d.ts.map +0 -1
  176. package/dist/interop/index.d.ts.map +0 -1
  177. package/dist/interop/spec-consumer.d.ts.map +0 -1
  178. package/dist/interop/tool-consumer.d.ts.map +0 -1
  179. package/dist/interop/types.d.ts.map +0 -1
  180. package/dist/knowledge/index.d.ts.map +0 -1
  181. package/dist/knowledge/injector.d.ts.map +0 -1
  182. package/dist/memory/in-memory.d.ts.map +0 -1
  183. package/dist/memory/index.d.ts.map +0 -1
  184. package/dist/memory/manager.d.ts.map +0 -1
  185. package/dist/memory/memory.test.d.ts.map +0 -1
  186. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +0 -1
  187. package/dist/providers/claude-agent-sdk/index.d.ts.map +0 -1
  188. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +0 -1
  189. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +0 -1
  190. package/dist/providers/index.d.ts.map +0 -1
  191. package/dist/providers/opencode-sdk/adapter.d.ts.map +0 -1
  192. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +0 -1
  193. package/dist/providers/opencode-sdk/index.d.ts.map +0 -1
  194. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +0 -1
  195. package/dist/providers/registry.d.ts.map +0 -1
  196. package/dist/providers/types.d.ts.map +0 -1
  197. package/dist/schema/index.d.ts.map +0 -1
  198. package/dist/schema/json-schema-to-zod.d.ts.map +0 -1
  199. package/dist/schema/schema-output.d.ts.map +0 -1
  200. package/dist/session/index.d.ts.map +0 -1
  201. package/dist/session/store.d.ts.map +0 -1
  202. package/dist/spec/index.d.ts.map +0 -1
  203. package/dist/spec/registry.d.ts.map +0 -1
  204. package/dist/spec/spec.d.ts.map +0 -1
  205. package/dist/telemetry/adapter.d.ts.map +0 -1
  206. package/dist/telemetry/index.d.ts.map +0 -1
  207. package/dist/telemetry/posthog-types.d.ts.map +0 -1
  208. package/dist/telemetry/posthog.d.ts.map +0 -1
  209. package/dist/telemetry/posthog.test.d.ts.map +0 -1
  210. package/dist/tools/index.d.ts.map +0 -1
  211. package/dist/tools/knowledge-tool.d.ts.map +0 -1
  212. package/dist/tools/mcp-client.d.ts.map +0 -1
  213. package/dist/tools/mcp-server.d.ts.map +0 -1
  214. package/dist/tools/tool-adapter.d.ts.map +0 -1
  215. package/dist/tools/tools.test.d.ts.map +0 -1
  216. package/dist/types.d.ts.map +0 -1
@@ -15,10 +15,19 @@ var __require = import.meta.require;
15
15
  // src/session/store.ts
16
16
  class InMemorySessionStore {
17
17
  sessions = new Map;
18
+ maxSessions;
19
+ maxMessagesPerSession;
20
+ maxStepsPerSession;
21
+ constructor(options = {}) {
22
+ this.maxSessions = options.maxSessions ?? 500;
23
+ this.maxMessagesPerSession = options.maxMessagesPerSession ?? 200;
24
+ this.maxStepsPerSession = options.maxStepsPerSession ?? 200;
25
+ }
18
26
  async get(sessionId) {
19
27
  return this.sessions.get(sessionId) ?? null;
20
28
  }
21
29
  async create(session) {
30
+ this.evictIfNeeded();
22
31
  const now = new Date;
23
32
  const fullSession = {
24
33
  ...session,
@@ -32,6 +41,7 @@ class InMemorySessionStore {
32
41
  const session = this.sessions.get(sessionId);
33
42
  if (session) {
34
43
  session.steps.push(step);
44
+ this.trimArray(session.steps, this.maxStepsPerSession);
35
45
  session.updatedAt = new Date;
36
46
  }
37
47
  }
@@ -39,6 +49,7 @@ class InMemorySessionStore {
39
49
  const session = this.sessions.get(sessionId);
40
50
  if (session) {
41
51
  session.messages.push(message);
52
+ this.trimArray(session.messages, this.maxMessagesPerSession);
42
53
  session.updatedAt = new Date;
43
54
  }
44
55
  }
@@ -76,9 +87,33 @@ class InMemorySessionStore {
76
87
  clear() {
77
88
  this.sessions.clear();
78
89
  }
90
+ evictIfNeeded() {
91
+ if (this.sessions.size < this.maxSessions) {
92
+ return;
93
+ }
94
+ let oldestSessionId = null;
95
+ let oldestUpdatedAt = Number.POSITIVE_INFINITY;
96
+ for (const [sessionId, session] of this.sessions.entries()) {
97
+ const updatedAt = session.updatedAt.getTime();
98
+ if (updatedAt < oldestUpdatedAt) {
99
+ oldestUpdatedAt = updatedAt;
100
+ oldestSessionId = sessionId;
101
+ }
102
+ }
103
+ if (oldestSessionId) {
104
+ this.sessions.delete(oldestSessionId);
105
+ }
106
+ }
107
+ trimArray(items, maxItems) {
108
+ if (items.length <= maxItems) {
109
+ return;
110
+ }
111
+ const overflow = items.length - maxItems;
112
+ items.splice(0, overflow);
113
+ }
79
114
  }
80
- function createInMemorySessionStore() {
81
- return new InMemorySessionStore;
115
+ function createInMemorySessionStore(options) {
116
+ return new InMemorySessionStore(options);
82
117
  }
83
118
  function generateSessionId() {
84
119
  return `sess_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
@@ -1,3 +1,2 @@
1
1
  export * from './spec';
2
2
  export * from './registry';
3
- //# sourceMappingURL=index.d.ts.map
@@ -13,7 +13,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
13
  var __require = import.meta.require;
14
14
 
15
15
  // src/i18n/catalogs/en.ts
16
- import { defineTranslation } from "@contractspec/lib.contracts/translations";
16
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
17
17
  var enMessages;
18
18
  var init_en = __esm(() => {
19
19
  enMessages = defineTranslation({
@@ -609,7 +609,7 @@ var init_en = __esm(() => {
609
609
  });
610
610
 
611
611
  // src/i18n/catalogs/fr.ts
612
- import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts/translations";
612
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
613
613
  var frMessages;
614
614
  var init_fr = __esm(() => {
615
615
  frMessages = defineTranslation2({
@@ -1220,7 +1220,7 @@ var init_fr = __esm(() => {
1220
1220
  });
1221
1221
 
1222
1222
  // src/i18n/catalogs/es.ts
1223
- import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts/translations";
1223
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
1224
1224
  var esMessages;
1225
1225
  var init_es = __esm(() => {
1226
1226
  esMessages = defineTranslation3({
@@ -1885,7 +1885,7 @@ var init_locale = __esm(() => {
1885
1885
  });
1886
1886
 
1887
1887
  // src/i18n/messages.ts
1888
- import { TranslationRegistry } from "@contractspec/lib.contracts/translations";
1888
+ import { TranslationRegistry } from "@contractspec/lib.contracts-spec/translations";
1889
1889
  function getRegistry() {
1890
1890
  if (!sharedRegistry) {
1891
1891
  sharedRegistry = new TranslationRegistry([
@@ -2140,7 +2140,7 @@ var init_spec = __esm(() => {
2140
2140
  // src/spec/registry.ts
2141
2141
  init_i18n();
2142
2142
  import { compareVersions } from "compare-versions";
2143
- import { SpecContractRegistry } from "@contractspec/lib.contracts/registry";
2143
+ import { SpecContractRegistry } from "@contractspec/lib.contracts-spec/registry";
2144
2144
 
2145
2145
  class AgentRegistry extends SpecContractRegistry {
2146
2146
  constructor(items) {
@@ -1,5 +1,5 @@
1
1
  import type { AgentSpec } from './spec';
2
- import { SpecContractRegistry } from '@contractspec/lib.contracts/registry';
2
+ import { SpecContractRegistry } from '@contractspec/lib.contracts-spec/registry';
3
3
  /**
4
4
  * Registry for managing agent specifications.
5
5
  *
@@ -39,4 +39,3 @@ export declare class AgentRegistry extends SpecContractRegistry<'agent', AgentSp
39
39
  * Create a new agent registry.
40
40
  */
41
41
  export declare function createAgentRegistry(): AgentRegistry;
42
- //# sourceMappingURL=registry.d.ts.map
@@ -13,7 +13,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
13
  var __require = import.meta.require;
14
14
 
15
15
  // src/i18n/catalogs/en.ts
16
- import { defineTranslation } from "@contractspec/lib.contracts/translations";
16
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
17
17
  var enMessages;
18
18
  var init_en = __esm(() => {
19
19
  enMessages = defineTranslation({
@@ -609,7 +609,7 @@ var init_en = __esm(() => {
609
609
  });
610
610
 
611
611
  // src/i18n/catalogs/fr.ts
612
- import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts/translations";
612
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
613
613
  var frMessages;
614
614
  var init_fr = __esm(() => {
615
615
  frMessages = defineTranslation2({
@@ -1220,7 +1220,7 @@ var init_fr = __esm(() => {
1220
1220
  });
1221
1221
 
1222
1222
  // src/i18n/catalogs/es.ts
1223
- import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts/translations";
1223
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
1224
1224
  var esMessages;
1225
1225
  var init_es = __esm(() => {
1226
1226
  esMessages = defineTranslation3({
@@ -1885,7 +1885,7 @@ var init_locale = __esm(() => {
1885
1885
  });
1886
1886
 
1887
1887
  // src/i18n/messages.ts
1888
- import { TranslationRegistry } from "@contractspec/lib.contracts/translations";
1888
+ import { TranslationRegistry } from "@contractspec/lib.contracts-spec/translations";
1889
1889
  function getRegistry() {
1890
1890
  if (!sharedRegistry) {
1891
1891
  sharedRegistry = new TranslationRegistry([
@@ -2106,7 +2106,7 @@ var init_i18n = __esm(() => {
2106
2106
  // src/spec/registry.ts
2107
2107
  init_i18n();
2108
2108
  import { compareVersions } from "compare-versions";
2109
- import { SpecContractRegistry } from "@contractspec/lib.contracts/registry";
2109
+ import { SpecContractRegistry } from "@contractspec/lib.contracts-spec/registry";
2110
2110
 
2111
2111
  class AgentRegistry extends SpecContractRegistry {
2112
2112
  constructor(items) {
@@ -1,6 +1,6 @@
1
- import type { OwnerShipMeta } from '@contractspec/lib.contracts/ownership';
2
- import type { KnowledgeCategory } from '@contractspec/lib.contracts/knowledge/spec';
3
- import type { PolicyRef } from '@contractspec/lib.contracts/policy/spec';
1
+ import type { OwnerShipMeta } from '@contractspec/lib.contracts-spec/ownership';
2
+ import type { KnowledgeCategory } from '@contractspec/lib.contracts-spec/knowledge/spec';
3
+ import type { PolicyRef } from '@contractspec/lib.contracts-spec/policy/spec';
4
4
  /**
5
5
  * Metadata for an agent specification.
6
6
  */
@@ -121,4 +121,3 @@ export declare function defineAgent(spec: AgentSpec): AgentSpec;
121
121
  * Generate a unique key for an agent spec.
122
122
  */
123
123
  export declare function agentKey(meta: AgentMeta): string;
124
- //# sourceMappingURL=spec.d.ts.map
package/dist/spec/spec.js CHANGED
@@ -13,7 +13,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
13
  var __require = import.meta.require;
14
14
 
15
15
  // src/i18n/catalogs/en.ts
16
- import { defineTranslation } from "@contractspec/lib.contracts/translations";
16
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
17
17
  var enMessages;
18
18
  var init_en = __esm(() => {
19
19
  enMessages = defineTranslation({
@@ -609,7 +609,7 @@ var init_en = __esm(() => {
609
609
  });
610
610
 
611
611
  // src/i18n/catalogs/fr.ts
612
- import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts/translations";
612
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
613
613
  var frMessages;
614
614
  var init_fr = __esm(() => {
615
615
  frMessages = defineTranslation2({
@@ -1220,7 +1220,7 @@ var init_fr = __esm(() => {
1220
1220
  });
1221
1221
 
1222
1222
  // src/i18n/catalogs/es.ts
1223
- import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts/translations";
1223
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
1224
1224
  var esMessages;
1225
1225
  var init_es = __esm(() => {
1226
1226
  esMessages = defineTranslation3({
@@ -1885,7 +1885,7 @@ var init_locale = __esm(() => {
1885
1885
  });
1886
1886
 
1887
1887
  // src/i18n/messages.ts
1888
- import { TranslationRegistry } from "@contractspec/lib.contracts/translations";
1888
+ import { TranslationRegistry } from "@contractspec/lib.contracts-spec/translations";
1889
1889
  function getRegistry() {
1890
1890
  if (!sharedRegistry) {
1891
1891
  sharedRegistry = new TranslationRegistry([
@@ -26,6 +26,14 @@ export interface TelemetryCollector {
26
26
  */
27
27
  collect(sample: OperationMetricSample): Promise<void>;
28
28
  }
29
+ interface TrackAgentStepContext {
30
+ sessionId?: string;
31
+ tenantId?: string;
32
+ actorId?: string;
33
+ traceId?: string;
34
+ stepIndex?: number;
35
+ stepStartedAt?: Date;
36
+ }
29
37
  /**
30
38
  * Track an agent step for telemetry.
31
39
  *
@@ -37,7 +45,7 @@ export interface TelemetryCollector {
37
45
  * @param step - AI SDK step result
38
46
  * @param durationMs - Optional step duration in milliseconds
39
47
  */
40
- export declare function trackAgentStep(collector: TelemetryCollector, agentId: string, step: StepResult<ToolSet>, durationMs?: number): Promise<void>;
48
+ export declare function trackAgentStep(collector: TelemetryCollector, agentId: string, step: StepResult<ToolSet>, durationMs?: number, context?: TrackAgentStepContext): Promise<void>;
41
49
  /**
42
50
  * In-memory telemetry collector for testing.
43
51
  */
@@ -65,4 +73,4 @@ export declare function createInMemoryTelemetryCollector(): InMemoryTelemetryCol
65
73
  * No-op telemetry collector that discards all metrics.
66
74
  */
67
75
  export declare const noopTelemetryCollector: TelemetryCollector;
68
- //# sourceMappingURL=adapter.d.ts.map
76
+ export {};
@@ -14,24 +14,78 @@ var __require = import.meta.require;
14
14
 
15
15
  // src/telemetry/adapter.ts
16
16
  function parseAgentId(agentId) {
17
- const match = agentId.match(/^(.+)\.v(\s+)$/);
17
+ const match = agentId.match(/^(.+)\.v(\d+)$/);
18
18
  if (match) {
19
19
  return { name: match[1], version: match[2] };
20
20
  }
21
21
  return { name: agentId, version: "1.0.0" };
22
22
  }
23
- async function trackAgentStep(collector, agentId, step, durationMs) {
23
+ function getRecord(value) {
24
+ return value && typeof value === "object" ? value : undefined;
25
+ }
26
+ function getStepResponse(step) {
27
+ const response = getRecord(step.response);
28
+ if (!response)
29
+ return;
30
+ return {
31
+ id: response["id"],
32
+ modelId: response["modelId"],
33
+ timestamp: response["timestamp"],
34
+ headers: response["headers"],
35
+ body: response["body"],
36
+ messages: response["messages"]
37
+ };
38
+ }
39
+ function getRequestBodyValue(request, key) {
40
+ const body = request?.["body"];
41
+ if (!body)
42
+ return;
43
+ if (typeof body === "string") {
44
+ try {
45
+ const parsed = JSON.parse(body);
46
+ return typeof parsed[key] === "string" ? parsed[key] : undefined;
47
+ } catch {
48
+ return;
49
+ }
50
+ }
51
+ const record = getRecord(body);
52
+ return typeof record?.[key] === "string" ? record[key] : undefined;
53
+ }
54
+ async function trackAgentStep(collector, agentId, step, durationMs, context) {
24
55
  const { name, version } = parseAgentId(agentId);
56
+ const response = getStepResponse(step);
57
+ const providerMetadata = step.providerMetadata;
58
+ const warnings = step.warnings;
59
+ const rawFinishReason = step.rawFinishReason;
60
+ const request = getRecord(step.request);
61
+ const traceId = context?.traceId ?? getRequestBodyValue(request, "$ai_trace_id");
62
+ const sessionId = context?.sessionId ?? getRequestBodyValue(request, "$ai_session_id");
63
+ const parentSpanId = response?.id;
25
64
  for (const toolCall of step.toolCalls ?? []) {
65
+ const toolResult = step.toolResults?.find((r) => r.toolCallId === toolCall.toolCallId);
66
+ const toolError = getRecord(toolResult?.output)?.["error"];
26
67
  const toolSample = {
27
68
  operation: { name: `${name}.${toolCall.toolName}`, version },
28
69
  durationMs: durationMs ?? 0,
29
70
  success: step.toolResults?.some((r) => r.toolCallId === toolCall.toolCallId && r.output !== undefined) ?? false,
30
71
  timestamp: new Date,
31
72
  metadata: {
73
+ telemetryEvent: "span",
74
+ traceId,
75
+ sessionId,
76
+ spanId: toolCall.toolCallId,
77
+ parentSpanId,
78
+ spanName: `tool.${toolCall.toolName}`,
32
79
  agentId,
80
+ actorId: context?.actorId,
81
+ tenantId: context?.tenantId,
82
+ stepIndex: context?.stepIndex,
33
83
  toolName: toolCall.toolName,
34
- finishReason: step.finishReason
84
+ toolCallArgs: toolCall.input,
85
+ toolResultOutput: toolResult?.output,
86
+ errorMessage: typeof toolError === "string" ? toolError : typeof toolResult?.output === "string" ? toolResult.output : undefined,
87
+ finishReason: step.finishReason,
88
+ rawFinishReason
35
89
  }
36
90
  };
37
91
  await collector.collect(toolSample);
@@ -42,10 +96,36 @@ async function trackAgentStep(collector, agentId, step, durationMs) {
42
96
  success: step.finishReason !== "error",
43
97
  timestamp: new Date,
44
98
  metadata: {
99
+ telemetryEvent: "generation",
100
+ traceId,
101
+ sessionId,
102
+ spanId: response?.id,
103
+ spanName: `agent.${name}.step`,
45
104
  agentId,
105
+ actorId: context?.actorId,
106
+ tenantId: context?.tenantId,
107
+ stepIndex: context?.stepIndex,
108
+ stepStartedAt: context?.stepStartedAt,
46
109
  finishReason: step.finishReason,
110
+ rawFinishReason,
47
111
  tokenUsage: step.usage,
48
- toolCallCount: step.toolCalls?.length ?? 0
112
+ totalUsage: step.totalUsage,
113
+ providerMetadata,
114
+ warnings,
115
+ stepText: step.text,
116
+ stepReasoningText: step.reasoningText,
117
+ responseId: response?.id,
118
+ responseModelId: response?.modelId,
119
+ responseTimestamp: response?.timestamp,
120
+ responseHeaders: response?.headers,
121
+ responseBody: response?.body,
122
+ responseMessages: response?.messages,
123
+ requestBody: request?.["body"],
124
+ requestHeaders: request?.["headers"],
125
+ toolCallCount: step.toolCalls?.length ?? 0,
126
+ toolCalls: step.toolCalls,
127
+ toolResults: step.toolResults,
128
+ errorMessage: step.finishReason === "error" ? step.text : undefined
49
129
  }
50
130
  };
51
131
  await collector.collect(stepSample);
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,3 @@
1
1
  export * from './adapter';
2
2
  export * from './posthog-types';
3
3
  export * from './posthog';
4
- //# sourceMappingURL=index.d.ts.map
@@ -14,24 +14,78 @@ var __require = import.meta.require;
14
14
 
15
15
  // src/telemetry/adapter.ts
16
16
  function parseAgentId(agentId) {
17
- const match = agentId.match(/^(.+)\.v(\s+)$/);
17
+ const match = agentId.match(/^(.+)\.v(\d+)$/);
18
18
  if (match) {
19
19
  return { name: match[1], version: match[2] };
20
20
  }
21
21
  return { name: agentId, version: "1.0.0" };
22
22
  }
23
- async function trackAgentStep(collector, agentId, step, durationMs) {
23
+ function getRecord(value) {
24
+ return value && typeof value === "object" ? value : undefined;
25
+ }
26
+ function getStepResponse(step) {
27
+ const response = getRecord(step.response);
28
+ if (!response)
29
+ return;
30
+ return {
31
+ id: response["id"],
32
+ modelId: response["modelId"],
33
+ timestamp: response["timestamp"],
34
+ headers: response["headers"],
35
+ body: response["body"],
36
+ messages: response["messages"]
37
+ };
38
+ }
39
+ function getRequestBodyValue(request, key) {
40
+ const body = request?.["body"];
41
+ if (!body)
42
+ return;
43
+ if (typeof body === "string") {
44
+ try {
45
+ const parsed = JSON.parse(body);
46
+ return typeof parsed[key] === "string" ? parsed[key] : undefined;
47
+ } catch {
48
+ return;
49
+ }
50
+ }
51
+ const record = getRecord(body);
52
+ return typeof record?.[key] === "string" ? record[key] : undefined;
53
+ }
54
+ async function trackAgentStep(collector, agentId, step, durationMs, context) {
24
55
  const { name, version } = parseAgentId(agentId);
56
+ const response = getStepResponse(step);
57
+ const providerMetadata = step.providerMetadata;
58
+ const warnings = step.warnings;
59
+ const rawFinishReason = step.rawFinishReason;
60
+ const request = getRecord(step.request);
61
+ const traceId = context?.traceId ?? getRequestBodyValue(request, "$ai_trace_id");
62
+ const sessionId = context?.sessionId ?? getRequestBodyValue(request, "$ai_session_id");
63
+ const parentSpanId = response?.id;
25
64
  for (const toolCall of step.toolCalls ?? []) {
65
+ const toolResult = step.toolResults?.find((r) => r.toolCallId === toolCall.toolCallId);
66
+ const toolError = getRecord(toolResult?.output)?.["error"];
26
67
  const toolSample = {
27
68
  operation: { name: `${name}.${toolCall.toolName}`, version },
28
69
  durationMs: durationMs ?? 0,
29
70
  success: step.toolResults?.some((r) => r.toolCallId === toolCall.toolCallId && r.output !== undefined) ?? false,
30
71
  timestamp: new Date,
31
72
  metadata: {
73
+ telemetryEvent: "span",
74
+ traceId,
75
+ sessionId,
76
+ spanId: toolCall.toolCallId,
77
+ parentSpanId,
78
+ spanName: `tool.${toolCall.toolName}`,
32
79
  agentId,
80
+ actorId: context?.actorId,
81
+ tenantId: context?.tenantId,
82
+ stepIndex: context?.stepIndex,
33
83
  toolName: toolCall.toolName,
34
- finishReason: step.finishReason
84
+ toolCallArgs: toolCall.input,
85
+ toolResultOutput: toolResult?.output,
86
+ errorMessage: typeof toolError === "string" ? toolError : typeof toolResult?.output === "string" ? toolResult.output : undefined,
87
+ finishReason: step.finishReason,
88
+ rawFinishReason
35
89
  }
36
90
  };
37
91
  await collector.collect(toolSample);
@@ -42,10 +96,36 @@ async function trackAgentStep(collector, agentId, step, durationMs) {
42
96
  success: step.finishReason !== "error",
43
97
  timestamp: new Date,
44
98
  metadata: {
99
+ telemetryEvent: "generation",
100
+ traceId,
101
+ sessionId,
102
+ spanId: response?.id,
103
+ spanName: `agent.${name}.step`,
45
104
  agentId,
105
+ actorId: context?.actorId,
106
+ tenantId: context?.tenantId,
107
+ stepIndex: context?.stepIndex,
108
+ stepStartedAt: context?.stepStartedAt,
46
109
  finishReason: step.finishReason,
110
+ rawFinishReason,
47
111
  tokenUsage: step.usage,
48
- toolCallCount: step.toolCalls?.length ?? 0
112
+ totalUsage: step.totalUsage,
113
+ providerMetadata,
114
+ warnings,
115
+ stepText: step.text,
116
+ stepReasoningText: step.reasoningText,
117
+ responseId: response?.id,
118
+ responseModelId: response?.modelId,
119
+ responseTimestamp: response?.timestamp,
120
+ responseHeaders: response?.headers,
121
+ responseBody: response?.body,
122
+ responseMessages: response?.messages,
123
+ requestBody: request?.["body"],
124
+ requestHeaders: request?.["headers"],
125
+ toolCallCount: step.toolCalls?.length ?? 0,
126
+ toolCalls: step.toolCalls,
127
+ toolResults: step.toolResults,
128
+ errorMessage: step.finishReason === "error" ? step.text : undefined
49
129
  }
50
130
  };
51
131
  await collector.collect(stepSample);
@@ -105,23 +185,60 @@ class PostHogTelemetryCollector {
105
185
  }
106
186
  async collect(sample) {
107
187
  const client = await this.getClient();
108
- const distinctId = this.config.defaults?.posthogDistinctId ?? sample.metadata?.["actorId"] ?? "system";
188
+ const metadata = asRecord(sample.metadata);
189
+ const distinctId = this.config.defaults?.posthogDistinctId ?? asString(metadata["actorId"]) ?? "system";
190
+ const traceId = asString(metadata["traceId"]) ?? this.config.defaults?.posthogTraceId;
191
+ const sessionId = asString(metadata["sessionId"]);
192
+ const telemetryEvent = asString(metadata["telemetryEvent"]);
193
+ const event = telemetryEvent === "span" ? "$ai_span" : "$ai_generation";
194
+ const tokenUsage = metadata["tokenUsage"];
195
+ const totalUsage = metadata["totalUsage"];
196
+ const errorMessage = asString(metadata["errorMessage"]);
109
197
  client.capture({
110
198
  distinctId,
111
- event: "$ai_generation",
199
+ event,
112
200
  properties: {
113
- $ai_model: sample.operation.name,
114
- $ai_provider: "contractspec",
201
+ $ai_model: asString(metadata["responseModelId"]) ?? sample.operation.name,
202
+ $ai_provider: asString(metadata["provider"]) ?? "contractspec",
115
203
  $ai_latency: sample.durationMs / 1000,
116
204
  $ai_is_error: !sample.success,
117
- $ai_trace_id: this.config.defaults?.posthogTraceId,
118
- ...sample.metadata?.["tokenUsage"] ? mapTokenUsage(sample.metadata["tokenUsage"]) : {},
205
+ $ai_error: !sample.success ? errorMessage : undefined,
206
+ $ai_trace_id: traceId,
207
+ $ai_session_id: sessionId,
208
+ $ai_span_id: asString(metadata["spanId"]),
209
+ $ai_parent_id: asString(metadata["parentSpanId"]),
210
+ $ai_span_name: asString(metadata["spanName"]) ?? sample.operation.name,
211
+ ...tokenUsage ? mapTokenUsage(tokenUsage) : {},
212
+ ...totalUsage ? mapTotalUsage(totalUsage) : {},
213
+ $ai_http_status: asNumber(metadata["httpStatus"]),
214
+ $ai_request_url: asString(metadata["requestUrl"]),
215
+ $ai_base_url: asString(metadata["baseUrl"]),
119
216
  ...this.config.defaults?.posthogProperties,
120
217
  contractspec_operation: sample.operation.name,
121
218
  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"]
219
+ contractspec_agent_id: asString(metadata["agentId"]),
220
+ contractspec_tenant_id: asString(metadata["tenantId"]),
221
+ contractspec_actor_id: asString(metadata["actorId"]),
222
+ contractspec_step_index: asNumber(metadata["stepIndex"]),
223
+ contractspec_step_started_at: asDateIso(metadata["stepStartedAt"]),
224
+ contractspec_finish_reason: asString(metadata["finishReason"]),
225
+ contractspec_finish_reason_raw: asString(metadata["rawFinishReason"]),
226
+ contractspec_tool_count: asNumber(metadata["toolCallCount"]),
227
+ contractspec_tool_name: asString(metadata["toolName"]),
228
+ contractspec_tool_call_args: metadata["toolCallArgs"],
229
+ contractspec_tool_result_output: metadata["toolResultOutput"],
230
+ contractspec_provider_metadata: metadata["providerMetadata"],
231
+ contractspec_step_warnings: metadata["warnings"],
232
+ contractspec_response_id: asString(metadata["responseId"]),
233
+ contractspec_response_model_id: asString(metadata["responseModelId"]),
234
+ contractspec_response_timestamp: asDateIso(metadata["responseTimestamp"]),
235
+ contractspec_response_headers: metadata["responseHeaders"],
236
+ contractspec_response_body: this.config.defaults?.posthogPrivacyMode ? undefined : metadata["responseBody"],
237
+ contractspec_response_messages: this.config.defaults?.posthogPrivacyMode ? undefined : metadata["responseMessages"],
238
+ contractspec_request_headers: metadata["requestHeaders"],
239
+ contractspec_request_body: this.config.defaults?.posthogPrivacyMode ? undefined : metadata["requestBody"],
240
+ contractspec_step_text: this.config.defaults?.posthogPrivacyMode ? undefined : metadata["stepText"],
241
+ contractspec_step_reasoning_text: this.config.defaults?.posthogPrivacyMode ? undefined : metadata["stepReasoningText"]
125
242
  },
126
243
  groups: this.config.defaults?.posthogGroups
127
244
  });
@@ -182,11 +299,44 @@ async function resolvePostHogClient(config) {
182
299
  }
183
300
  }
184
301
  function mapTokenUsage(usage) {
302
+ const usageRecord = asRecord(usage);
303
+ const inputTokenDetails = asRecord(usageRecord["inputTokenDetails"]);
304
+ const outputTokenDetails = asRecord(usageRecord["outputTokenDetails"]);
185
305
  return {
186
- $ai_input_tokens: usage["promptTokens"],
187
- $ai_output_tokens: usage["completionTokens"]
306
+ $ai_input_tokens: asNumber(usageRecord["inputTokens"]) ?? asNumber(usageRecord["promptTokens"]),
307
+ $ai_output_tokens: asNumber(usageRecord["outputTokens"]) ?? asNumber(usageRecord["completionTokens"]),
308
+ $ai_reasoning_tokens: asNumber(outputTokenDetails["reasoningTokens"]) ?? asNumber(usageRecord["reasoningTokens"]),
309
+ $ai_cache_read_input_tokens: asNumber(inputTokenDetails["cacheReadTokens"]) ?? asNumber(usageRecord["cachedInputTokens"]),
310
+ $ai_cache_creation_input_tokens: asNumber(inputTokenDetails["cacheWriteTokens"]),
311
+ $ai_usage: maybeRecord(usageRecord["raw"]) ?? usageRecord
188
312
  };
189
313
  }
314
+ function mapTotalUsage(usage) {
315
+ const usageRecord = asRecord(usage);
316
+ return {
317
+ contractspec_total_input_tokens: asNumber(usageRecord["inputTokens"]),
318
+ contractspec_total_output_tokens: asNumber(usageRecord["outputTokens"]),
319
+ contractspec_total_tokens: asNumber(usageRecord["totalTokens"]),
320
+ contractspec_total_usage_raw: maybeRecord(usageRecord["raw"]) ?? usageRecord
321
+ };
322
+ }
323
+ function asRecord(value) {
324
+ return value && typeof value === "object" ? value : {};
325
+ }
326
+ function maybeRecord(value) {
327
+ return value && typeof value === "object" ? value : undefined;
328
+ }
329
+ function asString(value) {
330
+ return typeof value === "string" && value.length > 0 ? value : undefined;
331
+ }
332
+ function asNumber(value) {
333
+ return typeof value === "number" ? value : undefined;
334
+ }
335
+ function asDateIso(value) {
336
+ if (value instanceof Date)
337
+ return value.toISOString();
338
+ return;
339
+ }
190
340
  // src/telemetry/index.ts
191
341
  init_adapter();
192
342
  export {
@@ -15,12 +15,24 @@ export interface PostHogTracingOptions {
15
15
  posthogDistinctId?: string;
16
16
  /** Trace ID for grouping related generations */
17
17
  posthogTraceId?: string;
18
+ /** Optional model id override */
19
+ posthogModelOverride?: string;
20
+ /** Optional provider override */
21
+ posthogProviderOverride?: string;
22
+ /** Optional explicit token pricing override */
23
+ posthogCostOverride?: PostHogCostOverride;
18
24
  /** Custom properties attached to every generation event */
19
25
  posthogProperties?: Record<string, unknown>;
20
26
  /** When true, input/output content is redacted */
21
27
  posthogPrivacyMode?: boolean;
22
28
  /** Group analytics (e.g., { company: "companyId" }) */
23
29
  posthogGroups?: Record<string, string>;
30
+ /** Sends events immediately (useful for short-lived/serverless contexts) */
31
+ posthogCaptureImmediate?: boolean;
32
+ }
33
+ export interface PostHogCostOverride {
34
+ inputCost: number;
35
+ outputCost: number;
24
36
  }
25
37
  /**
26
38
  * Minimal interface for posthog-node PostHog client.
@@ -57,4 +69,3 @@ export interface PostHogLLMConfig {
57
69
  /** Default tracing options applied to all wrapped models */
58
70
  defaults?: PostHogTracingOptions;
59
71
  }
60
- //# sourceMappingURL=posthog-types.d.ts.map
@@ -78,4 +78,3 @@ export declare class CompositeTelemetryCollector implements TelemetryCollector {
78
78
  }
79
79
  /** Create a composite telemetry collector. */
80
80
  export declare function createCompositeTelemetryCollector(collectors: TelemetryCollector[]): CompositeTelemetryCollector;
81
- //# sourceMappingURL=posthog.d.ts.map