@happyvertical/smrt-core 0.30.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 (631) hide show
  1. package/AGENTS.md +124 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +265 -0
  5. package/bin/smrt-prebuild.js +26 -0
  6. package/dist/__tests__/fixtures/advisor-test-classes.d.ts +28 -0
  7. package/dist/__tests__/fixtures/advisor-test-classes.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts +12 -0
  9. package/dist/__tests__/fixtures/collection-coverage-fixtures.d.ts.map +1 -0
  10. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts +28 -0
  11. package/dist/__tests__/fixtures/inheritance-resolver-fixtures.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts +43 -0
  13. package/dist/__tests__/fixtures/inheritance-test-classes.d.ts.map +1 -0
  14. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts +18 -0
  15. package/dist/__tests__/fixtures/mcp-integration-test-classes.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts +15 -0
  17. package/dist/__tests__/fixtures/object-ai-memory-fixtures.d.ts.map +1 -0
  18. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts +13 -0
  19. package/dist/__tests__/fixtures/object-spec-test-classes.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/registry-test-classes.d.ts +23 -0
  21. package/dist/__tests__/fixtures/registry-test-classes.d.ts.map +1 -0
  22. package/dist/adapters/ai-usage.d.ts +23 -0
  23. package/dist/adapters/ai-usage.d.ts.map +1 -0
  24. package/dist/adapters/ai-usage.js +105 -0
  25. package/dist/adapters/ai-usage.js.map +1 -0
  26. package/dist/adapters/cost-rates.d.ts +20 -0
  27. package/dist/adapters/cost-rates.d.ts.map +1 -0
  28. package/dist/adapters/cost-rates.js +40 -0
  29. package/dist/adapters/cost-rates.js.map +1 -0
  30. package/dist/adapters/index.d.ts +19 -0
  31. package/dist/adapters/index.d.ts.map +1 -0
  32. package/dist/adapters/metrics.d.ts +111 -0
  33. package/dist/adapters/metrics.d.ts.map +1 -0
  34. package/dist/adapters/metrics.js +169 -0
  35. package/dist/adapters/metrics.js.map +1 -0
  36. package/dist/adapters/pubsub.d.ts +124 -0
  37. package/dist/adapters/pubsub.d.ts.map +1 -0
  38. package/dist/adapters/pubsub.js +121 -0
  39. package/dist/adapters/pubsub.js.map +1 -0
  40. package/dist/browser.d.ts +32 -0
  41. package/dist/browser.d.ts.map +1 -0
  42. package/dist/browser.js +68 -0
  43. package/dist/browser.js.map +1 -0
  44. package/dist/child-accessors.d.ts +27 -0
  45. package/dist/child-accessors.d.ts.map +1 -0
  46. package/dist/child-accessors.js +35 -0
  47. package/dist/child-accessors.js.map +1 -0
  48. package/dist/class.d.ts +313 -0
  49. package/dist/class.d.ts.map +1 -0
  50. package/dist/class.js +896 -0
  51. package/dist/class.js.map +1 -0
  52. package/dist/collection-cache.d.ts +110 -0
  53. package/dist/collection-cache.d.ts.map +1 -0
  54. package/dist/collection-cache.js +187 -0
  55. package/dist/collection-cache.js.map +1 -0
  56. package/dist/collection.d.ts +894 -0
  57. package/dist/collection.d.ts.map +1 -0
  58. package/dist/collection.js +1987 -0
  59. package/dist/collection.js.map +1 -0
  60. package/dist/config/global-config.d.ts +3 -0
  61. package/dist/config/global-config.d.ts.map +1 -0
  62. package/dist/config/global-config.js +19 -0
  63. package/dist/config/global-config.js.map +1 -0
  64. package/dist/config.d.ts +145 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +57 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/consumer-plugin/index.d.ts +22 -0
  69. package/dist/consumer-plugin/index.d.ts.map +1 -0
  70. package/dist/consumer-plugin/index.js +452 -0
  71. package/dist/consumer-plugin/index.js.map +1 -0
  72. package/dist/consumer-plugin.d.ts +8 -0
  73. package/dist/consumer-plugin.d.ts.map +1 -0
  74. package/dist/consumer-plugin.js +5 -0
  75. package/dist/consumer-plugin.js.map +1 -0
  76. package/dist/database.d.ts +95 -0
  77. package/dist/database.d.ts.map +1 -0
  78. package/dist/database.js +32 -0
  79. package/dist/database.js.map +1 -0
  80. package/dist/decorators/compatibility.d.ts +14 -0
  81. package/dist/decorators/compatibility.d.ts.map +1 -0
  82. package/dist/decorators/compatibility.js +111 -0
  83. package/dist/decorators/compatibility.js.map +1 -0
  84. package/dist/decorators/index.d.ts +381 -0
  85. package/dist/decorators/index.d.ts.map +1 -0
  86. package/dist/decorators/index.js +104 -0
  87. package/dist/decorators/index.js.map +1 -0
  88. package/dist/dispatch/bus.d.ts +306 -0
  89. package/dist/dispatch/bus.d.ts.map +1 -0
  90. package/dist/dispatch/bus.js +583 -0
  91. package/dist/dispatch/bus.js.map +1 -0
  92. package/dist/dispatch/collections/DispatchSubscriptions.d.ts +79 -0
  93. package/dist/dispatch/collections/DispatchSubscriptions.d.ts.map +1 -0
  94. package/dist/dispatch/collections/DispatchSubscriptions.js +243 -0
  95. package/dist/dispatch/collections/DispatchSubscriptions.js.map +1 -0
  96. package/dist/dispatch/collections/Dispatches.d.ts +98 -0
  97. package/dist/dispatch/collections/Dispatches.d.ts.map +1 -0
  98. package/dist/dispatch/collections/Dispatches.js +358 -0
  99. package/dist/dispatch/collections/Dispatches.js.map +1 -0
  100. package/dist/dispatch/index.d.ts +47 -0
  101. package/dist/dispatch/index.d.ts.map +1 -0
  102. package/dist/dispatch/models/Dispatch.d.ts +101 -0
  103. package/dist/dispatch/models/Dispatch.d.ts.map +1 -0
  104. package/dist/dispatch/models/Dispatch.js +162 -0
  105. package/dist/dispatch/models/Dispatch.js.map +1 -0
  106. package/dist/dispatch/models/DispatchSubscription.d.ts +83 -0
  107. package/dist/dispatch/models/DispatchSubscription.d.ts.map +1 -0
  108. package/dist/dispatch/models/DispatchSubscription.js +112 -0
  109. package/dist/dispatch/models/DispatchSubscription.js.map +1 -0
  110. package/dist/dispatch/tenant-resolver.d.ts +98 -0
  111. package/dist/dispatch/tenant-resolver.d.ts.map +1 -0
  112. package/dist/dispatch/tenant-resolver.js +32 -0
  113. package/dist/dispatch/tenant-resolver.js.map +1 -0
  114. package/dist/dispatch/types.d.ts +149 -0
  115. package/dist/dispatch/types.d.ts.map +1 -0
  116. package/dist/embeddings/hash.d.ts +33 -0
  117. package/dist/embeddings/hash.d.ts.map +1 -0
  118. package/dist/embeddings/hash.js +37 -0
  119. package/dist/embeddings/hash.js.map +1 -0
  120. package/dist/embeddings/index.d.ts +36 -0
  121. package/dist/embeddings/index.d.ts.map +1 -0
  122. package/dist/embeddings/provider.d.ts +75 -0
  123. package/dist/embeddings/provider.d.ts.map +1 -0
  124. package/dist/embeddings/provider.js +170 -0
  125. package/dist/embeddings/provider.js.map +1 -0
  126. package/dist/embeddings/similarity.d.ts +47 -0
  127. package/dist/embeddings/similarity.d.ts.map +1 -0
  128. package/dist/embeddings/similarity.js +64 -0
  129. package/dist/embeddings/similarity.js.map +1 -0
  130. package/dist/embeddings/storage.d.ts +125 -0
  131. package/dist/embeddings/storage.d.ts.map +1 -0
  132. package/dist/embeddings/storage.js +283 -0
  133. package/dist/embeddings/storage.js.map +1 -0
  134. package/dist/embeddings/types.d.ts +250 -0
  135. package/dist/embeddings/types.d.ts.map +1 -0
  136. package/dist/errors.d.ts +363 -0
  137. package/dist/errors.d.ts.map +1 -0
  138. package/dist/errors.js +669 -0
  139. package/dist/errors.js.map +1 -0
  140. package/dist/generators/cli.d.ts +162 -0
  141. package/dist/generators/cli.d.ts.map +1 -0
  142. package/dist/generators/cli.js +462 -0
  143. package/dist/generators/cli.js.map +1 -0
  144. package/dist/generators/index.d.ts +13 -0
  145. package/dist/generators/index.d.ts.map +1 -0
  146. package/dist/generators/mcp-runtime-template.d.ts +60 -0
  147. package/dist/generators/mcp-runtime-template.d.ts.map +1 -0
  148. package/dist/generators/mcp-runtime-template.js +509 -0
  149. package/dist/generators/mcp-runtime-template.js.map +1 -0
  150. package/dist/generators/mcp.d.ts +231 -0
  151. package/dist/generators/mcp.d.ts.map +1 -0
  152. package/dist/generators/mcp.js +1220 -0
  153. package/dist/generators/mcp.js.map +1 -0
  154. package/dist/generators/rest.d.ts +171 -0
  155. package/dist/generators/rest.d.ts.map +1 -0
  156. package/dist/generators/rest.js +591 -0
  157. package/dist/generators/rest.js.map +1 -0
  158. package/dist/generators/swagger.d.ts +21 -0
  159. package/dist/generators/swagger.d.ts.map +1 -0
  160. package/dist/generators/swagger.js +307 -0
  161. package/dist/generators/swagger.js.map +1 -0
  162. package/dist/generators/tenant-gate.d.ts +74 -0
  163. package/dist/generators/tenant-gate.d.ts.map +1 -0
  164. package/dist/generators/tenant-gate.js +15 -0
  165. package/dist/generators/tenant-gate.js.map +1 -0
  166. package/dist/generators.d.ts +8 -0
  167. package/dist/generators.d.ts.map +1 -0
  168. package/dist/generators.js +19 -0
  169. package/dist/generators.js.map +1 -0
  170. package/dist/hierarchical.d.ts +103 -0
  171. package/dist/hierarchical.d.ts.map +1 -0
  172. package/dist/hierarchical.js +184 -0
  173. package/dist/hierarchical.js.map +1 -0
  174. package/dist/index.d.ts +57 -0
  175. package/dist/index.d.ts.map +1 -0
  176. package/dist/index.js +202 -0
  177. package/dist/index.js.map +1 -0
  178. package/dist/interceptors.d.ts +251 -0
  179. package/dist/interceptors.d.ts.map +1 -0
  180. package/dist/interceptors.js +259 -0
  181. package/dist/interceptors.js.map +1 -0
  182. package/dist/junction.d.ts +99 -0
  183. package/dist/junction.d.ts.map +1 -0
  184. package/dist/junction.js +136 -0
  185. package/dist/junction.js.map +1 -0
  186. package/dist/knowledge.d.ts +11 -0
  187. package/dist/knowledge.d.ts.map +1 -0
  188. package/dist/knowledge.js +310 -0
  189. package/dist/knowledge.js.map +1 -0
  190. package/dist/lazy-config.d.ts +160 -0
  191. package/dist/lazy-config.d.ts.map +1 -0
  192. package/dist/lazy-config.js +146 -0
  193. package/dist/lazy-config.js.map +1 -0
  194. package/dist/manifest/discover-base-classes.d.ts +78 -0
  195. package/dist/manifest/discover-base-classes.d.ts.map +1 -0
  196. package/dist/manifest/discover-base-classes.js +85 -0
  197. package/dist/manifest/discover-base-classes.js.map +1 -0
  198. package/dist/manifest/discover-smrt-packages.d.ts +48 -0
  199. package/dist/manifest/discover-smrt-packages.d.ts.map +1 -0
  200. package/dist/manifest/discover-smrt-packages.js +361 -0
  201. package/dist/manifest/discover-smrt-packages.js.map +1 -0
  202. package/dist/manifest/generator.d.ts +93 -0
  203. package/dist/manifest/generator.d.ts.map +1 -0
  204. package/dist/manifest/generator.js +380 -0
  205. package/dist/manifest/generator.js.map +1 -0
  206. package/dist/manifest/index.d.ts +16 -0
  207. package/dist/manifest/index.d.ts.map +1 -0
  208. package/dist/manifest/index.js +51 -0
  209. package/dist/manifest/index.js.map +1 -0
  210. package/dist/manifest/manager.d.ts +51 -0
  211. package/dist/manifest/manager.d.ts.map +1 -0
  212. package/dist/manifest/manager.js +89 -0
  213. package/dist/manifest/manager.js.map +1 -0
  214. package/dist/manifest/manifest-loader.d.ts +187 -0
  215. package/dist/manifest/manifest-loader.d.ts.map +1 -0
  216. package/dist/manifest/manifest-loader.js +847 -0
  217. package/dist/manifest/manifest-loader.js.map +1 -0
  218. package/dist/manifest/sources/composite.d.ts +22 -0
  219. package/dist/manifest/sources/composite.d.ts.map +1 -0
  220. package/dist/manifest/sources/composite.js +60 -0
  221. package/dist/manifest/sources/composite.js.map +1 -0
  222. package/dist/manifest/sources/embedded.d.ts +7 -0
  223. package/dist/manifest/sources/embedded.d.ts.map +1 -0
  224. package/dist/manifest/sources/embedded.js +30 -0
  225. package/dist/manifest/sources/embedded.js.map +1 -0
  226. package/dist/manifest/sources/explicit-paths.d.ts +17 -0
  227. package/dist/manifest/sources/explicit-paths.d.ts.map +1 -0
  228. package/dist/manifest/sources/explicit-paths.js +35 -0
  229. package/dist/manifest/sources/explicit-paths.js.map +1 -0
  230. package/dist/manifest/sources/fallback.d.ts +25 -0
  231. package/dist/manifest/sources/fallback.d.ts.map +1 -0
  232. package/dist/manifest/sources/fallback.js +63 -0
  233. package/dist/manifest/sources/fallback.js.map +1 -0
  234. package/dist/manifest/sources/index.d.ts +17 -0
  235. package/dist/manifest/sources/index.d.ts.map +1 -0
  236. package/dist/manifest/sources/local-test.d.ts +7 -0
  237. package/dist/manifest/sources/local-test.d.ts.map +1 -0
  238. package/dist/manifest/sources/local-test.js +21 -0
  239. package/dist/manifest/sources/local-test.js.map +1 -0
  240. package/dist/manifest/sources/static.d.ts +7 -0
  241. package/dist/manifest/sources/static.d.ts.map +1 -0
  242. package/dist/manifest/sources/static.js +19 -0
  243. package/dist/manifest/sources/static.js.map +1 -0
  244. package/dist/manifest/sources/test.d.ts +7 -0
  245. package/dist/manifest/sources/test.d.ts.map +1 -0
  246. package/dist/manifest/sources/test.js +21 -0
  247. package/dist/manifest/sources/test.js.map +1 -0
  248. package/dist/manifest/sources/types.d.ts +79 -0
  249. package/dist/manifest/sources/types.d.ts.map +1 -0
  250. package/dist/manifest/sources/types.js +61 -0
  251. package/dist/manifest/sources/types.js.map +1 -0
  252. package/dist/manifest/static-manifest.d.ts +4 -0
  253. package/dist/manifest/static-manifest.d.ts.map +1 -0
  254. package/dist/manifest/static-manifest.js +1535 -0
  255. package/dist/manifest/static-manifest.js.map +1 -0
  256. package/dist/manifest/store.d.ts +111 -0
  257. package/dist/manifest/store.d.ts.map +1 -0
  258. package/dist/manifest/store.js +431 -0
  259. package/dist/manifest/store.js.map +1 -0
  260. package/dist/manifest/test-manifest-loader.d.ts +3 -0
  261. package/dist/manifest/test-manifest-loader.d.ts.map +1 -0
  262. package/dist/manifest/test-manifest-stub.d.ts +4 -0
  263. package/dist/manifest/test-manifest-stub.d.ts.map +1 -0
  264. package/dist/manifest/test-manifest-stub.js +80013 -0
  265. package/dist/manifest/test-manifest-stub.js.map +1 -0
  266. package/dist/manifest.d.ts +8 -0
  267. package/dist/manifest.d.ts.map +1 -0
  268. package/dist/manifest.js +20 -0
  269. package/dist/manifest.js.map +1 -0
  270. package/dist/manifest.json +1489 -0
  271. package/dist/mcp-advisor/index.d.ts +499 -0
  272. package/dist/mcp-advisor/index.d.ts.map +1 -0
  273. package/dist/mcp-advisor/tools/add-ai-methods.d.ts +6 -0
  274. package/dist/mcp-advisor/tools/add-ai-methods.d.ts.map +1 -0
  275. package/dist/mcp-advisor/tools/configure-decorators.d.ts +6 -0
  276. package/dist/mcp-advisor/tools/configure-decorators.d.ts.map +1 -0
  277. package/dist/mcp-advisor/tools/generate-collection.d.ts +6 -0
  278. package/dist/mcp-advisor/tools/generate-collection.d.ts.map +1 -0
  279. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts +6 -0
  280. package/dist/mcp-advisor/tools/generate-field-definitions.d.ts.map +1 -0
  281. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts +6 -0
  282. package/dist/mcp-advisor/tools/generate-smrt-class.d.ts.map +1 -0
  283. package/dist/mcp-advisor/tools/get-object-config.d.ts +6 -0
  284. package/dist/mcp-advisor/tools/get-object-config.d.ts.map +1 -0
  285. package/dist/mcp-advisor/tools/get-object-schema.d.ts +10 -0
  286. package/dist/mcp-advisor/tools/get-object-schema.d.ts.map +1 -0
  287. package/dist/mcp-advisor/tools/list-registered-objects.d.ts +9 -0
  288. package/dist/mcp-advisor/tools/list-registered-objects.d.ts.map +1 -0
  289. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts +9 -0
  290. package/dist/mcp-advisor/tools/preview-api-endpoints.d.ts.map +1 -0
  291. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts +9 -0
  292. package/dist/mcp-advisor/tools/preview-mcp-tools.d.ts.map +1 -0
  293. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts +6 -0
  294. package/dist/mcp-advisor/tools/validate-smrt-object.d.ts.map +1 -0
  295. package/dist/mcp-advisor/types.d.ts +209 -0
  296. package/dist/mcp-advisor/types.d.ts.map +1 -0
  297. package/dist/migrations/backfill-tracker.d.ts +84 -0
  298. package/dist/migrations/backfill-tracker.d.ts.map +1 -0
  299. package/dist/migrations/backfill-tracker.js +118 -0
  300. package/dist/migrations/backfill-tracker.js.map +1 -0
  301. package/dist/migrations/checksum.d.ts +43 -0
  302. package/dist/migrations/checksum.d.ts.map +1 -0
  303. package/dist/migrations/checksum.js +32 -0
  304. package/dist/migrations/checksum.js.map +1 -0
  305. package/dist/migrations/differ.d.ts +186 -0
  306. package/dist/migrations/differ.d.ts.map +1 -0
  307. package/dist/migrations/differ.js +601 -0
  308. package/dist/migrations/differ.js.map +1 -0
  309. package/dist/migrations/generator.d.ts +133 -0
  310. package/dist/migrations/generator.d.ts.map +1 -0
  311. package/dist/migrations/generator.js +328 -0
  312. package/dist/migrations/generator.js.map +1 -0
  313. package/dist/migrations/index.d.ts +20 -0
  314. package/dist/migrations/index.d.ts.map +1 -0
  315. package/dist/migrations/orchestrate.d.ts +148 -0
  316. package/dist/migrations/orchestrate.d.ts.map +1 -0
  317. package/dist/migrations/orchestrate.js +118 -0
  318. package/dist/migrations/orchestrate.js.map +1 -0
  319. package/dist/migrations/tracker.d.ts +134 -0
  320. package/dist/migrations/tracker.d.ts.map +1 -0
  321. package/dist/migrations/tracker.js +624 -0
  322. package/dist/migrations/tracker.js.map +1 -0
  323. package/dist/migrations/types.d.ts +221 -0
  324. package/dist/migrations/types.d.ts.map +1 -0
  325. package/dist/migrations.d.ts +7 -0
  326. package/dist/migrations.d.ts.map +1 -0
  327. package/dist/migrations.js +26 -0
  328. package/dist/migrations.js.map +1 -0
  329. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js +56 -0
  330. package/dist/node_modules/.pnpm/balanced-match@4.0.4/node_modules/balanced-match/dist/esm/index.js.map +1 -0
  331. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js +163 -0
  332. package/dist/node_modules/.pnpm/brace-expansion@5.0.5/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
  333. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js +13 -0
  334. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
  335. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js +654 -0
  336. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/ast.js.map +1 -0
  337. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js +111 -0
  338. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
  339. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js +10 -0
  340. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/escape.js.map +1 -0
  341. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js +824 -0
  342. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/index.js.map +1 -0
  343. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js +10 -0
  344. package/dist/node_modules/.pnpm/minimatch@10.2.3/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
  345. package/dist/object.d.ts +1202 -0
  346. package/dist/object.d.ts.map +1 -0
  347. package/dist/object.js +2731 -0
  348. package/dist/object.js.map +1 -0
  349. package/dist/polymorphic-association.d.ts +69 -0
  350. package/dist/polymorphic-association.d.ts.map +1 -0
  351. package/dist/polymorphic-association.js +96 -0
  352. package/dist/polymorphic-association.js.map +1 -0
  353. package/dist/prebuild/cli.d.ts +7 -0
  354. package/dist/prebuild/cli.d.ts.map +1 -0
  355. package/dist/prebuild/cli.js +29 -0
  356. package/dist/prebuild/cli.js.map +1 -0
  357. package/dist/prebuild/index.d.ts +22 -0
  358. package/dist/prebuild/index.d.ts.map +1 -0
  359. package/dist/prebuild/index.js +239 -0
  360. package/dist/prebuild/index.js.map +1 -0
  361. package/dist/prebuild.d.ts +8 -0
  362. package/dist/prebuild.d.ts.map +1 -0
  363. package/dist/prebuild.js +6 -0
  364. package/dist/prebuild.js.map +1 -0
  365. package/dist/registry/cache-config.d.ts +13 -0
  366. package/dist/registry/cache-config.d.ts.map +1 -0
  367. package/dist/registry/cache-config.js +17 -0
  368. package/dist/registry/cache-config.js.map +1 -0
  369. package/dist/registry/class-registration.d.ts +31 -0
  370. package/dist/registry/class-registration.d.ts.map +1 -0
  371. package/dist/registry/class-registration.js +1074 -0
  372. package/dist/registry/class-registration.js.map +1 -0
  373. package/dist/registry/collection-resolution.d.ts +45 -0
  374. package/dist/registry/collection-resolution.d.ts.map +1 -0
  375. package/dist/registry/collection-resolution.js +121 -0
  376. package/dist/registry/collection-resolution.js.map +1 -0
  377. package/dist/registry/collision-policy.d.ts +179 -0
  378. package/dist/registry/collision-policy.d.ts.map +1 -0
  379. package/dist/registry/collision-policy.js +153 -0
  380. package/dist/registry/collision-policy.js.map +1 -0
  381. package/dist/registry/diagnostics.d.ts +58 -0
  382. package/dist/registry/diagnostics.d.ts.map +1 -0
  383. package/dist/registry/diagnostics.js +54 -0
  384. package/dist/registry/diagnostics.js.map +1 -0
  385. package/dist/registry/embedding-manager.d.ts +23 -0
  386. package/dist/registry/embedding-manager.d.ts.map +1 -0
  387. package/dist/registry/embedding-manager.js +62 -0
  388. package/dist/registry/embedding-manager.js.map +1 -0
  389. package/dist/registry/index.d.ts +13 -0
  390. package/dist/registry/index.d.ts.map +1 -0
  391. package/dist/registry/inheritance-resolver.d.ts +13 -0
  392. package/dist/registry/inheritance-resolver.d.ts.map +1 -0
  393. package/dist/registry/inheritance-resolver.js +244 -0
  394. package/dist/registry/inheritance-resolver.js.map +1 -0
  395. package/dist/registry/manifest-field-merge.d.ts +4 -0
  396. package/dist/registry/manifest-field-merge.d.ts.map +1 -0
  397. package/dist/registry/manifest-field-merge.js +82 -0
  398. package/dist/registry/manifest-field-merge.js.map +1 -0
  399. package/dist/registry/name-resolver.d.ts +102 -0
  400. package/dist/registry/name-resolver.d.ts.map +1 -0
  401. package/dist/registry/name-resolver.js +241 -0
  402. package/dist/registry/name-resolver.js.map +1 -0
  403. package/dist/registry/relationship-graph.d.ts +16 -0
  404. package/dist/registry/relationship-graph.d.ts.map +1 -0
  405. package/dist/registry/relationship-graph.js +79 -0
  406. package/dist/registry/relationship-graph.js.map +1 -0
  407. package/dist/registry/schema-builder.d.ts +113 -0
  408. package/dist/registry/schema-builder.d.ts.map +1 -0
  409. package/dist/registry/schema-builder.js +474 -0
  410. package/dist/registry/schema-builder.js.map +1 -0
  411. package/dist/registry/shared-state.d.ts +62 -0
  412. package/dist/registry/shared-state.d.ts.map +1 -0
  413. package/dist/registry/shared-state.js +135 -0
  414. package/dist/registry/shared-state.js.map +1 -0
  415. package/dist/registry/types.d.ts +667 -0
  416. package/dist/registry/types.d.ts.map +1 -0
  417. package/dist/registry/validator.d.ts +13 -0
  418. package/dist/registry/validator.d.ts.map +1 -0
  419. package/dist/registry/validator.js +138 -0
  420. package/dist/registry/validator.js.map +1 -0
  421. package/dist/registry.d.ts +1358 -0
  422. package/dist/registry.d.ts.map +1 -0
  423. package/dist/registry.js +2301 -0
  424. package/dist/registry.js.map +1 -0
  425. package/dist/runtime/client.d.ts +34 -0
  426. package/dist/runtime/client.d.ts.map +1 -0
  427. package/dist/runtime/client.js +104 -0
  428. package/dist/runtime/client.js.map +1 -0
  429. package/dist/runtime/index.d.ts +10 -0
  430. package/dist/runtime/index.d.ts.map +1 -0
  431. package/dist/runtime/mcp.d.ts +47 -0
  432. package/dist/runtime/mcp.d.ts.map +1 -0
  433. package/dist/runtime/mcp.js +72 -0
  434. package/dist/runtime/mcp.js.map +1 -0
  435. package/dist/runtime/server.d.ts +92 -0
  436. package/dist/runtime/server.d.ts.map +1 -0
  437. package/dist/runtime/server.js +390 -0
  438. package/dist/runtime/server.js.map +1 -0
  439. package/dist/runtime/types.d.ts +58 -0
  440. package/dist/runtime/types.d.ts.map +1 -0
  441. package/dist/runtime.d.ts +8 -0
  442. package/dist/runtime.d.ts.map +1 -0
  443. package/dist/runtime.js +10 -0
  444. package/dist/runtime.js.map +1 -0
  445. package/dist/scanner/import-scanner.d.ts +7 -0
  446. package/dist/scanner/import-scanner.d.ts.map +1 -0
  447. package/dist/scanner/index.d.ts +12 -0
  448. package/dist/scanner/index.d.ts.map +1 -0
  449. package/dist/scanner/manifest-generator.d.ts +304 -0
  450. package/dist/scanner/manifest-generator.d.ts.map +1 -0
  451. package/dist/scanner/manifest-generator.js +1707 -0
  452. package/dist/scanner/manifest-generator.js.map +1 -0
  453. package/dist/scanner/test-file-patterns.d.ts +18 -0
  454. package/dist/scanner/test-file-patterns.d.ts.map +1 -0
  455. package/dist/scanner/test-file-patterns.js +16 -0
  456. package/dist/scanner/test-file-patterns.js.map +1 -0
  457. package/dist/scanner/types.d.ts +313 -0
  458. package/dist/scanner/types.d.ts.map +1 -0
  459. package/dist/scanner/types.js +2 -0
  460. package/dist/scanner/types.js.map +1 -0
  461. package/dist/scanner.d.ts +6 -0
  462. package/dist/scanner.d.ts.map +1 -0
  463. package/dist/scanner.js +6 -0
  464. package/dist/scanner.js.map +1 -0
  465. package/dist/schema/code-generator.d.ts +53 -0
  466. package/dist/schema/code-generator.d.ts.map +1 -0
  467. package/dist/schema/ddl/base-strategy.d.ts +80 -0
  468. package/dist/schema/ddl/base-strategy.d.ts.map +1 -0
  469. package/dist/schema/ddl/base-strategy.js +240 -0
  470. package/dist/schema/ddl/base-strategy.js.map +1 -0
  471. package/dist/schema/ddl/duckdb-strategy.d.ts +33 -0
  472. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -0
  473. package/dist/schema/ddl/duckdb-strategy.js +74 -0
  474. package/dist/schema/ddl/duckdb-strategy.js.map +1 -0
  475. package/dist/schema/ddl/index.d.ts +53 -0
  476. package/dist/schema/ddl/index.d.ts.map +1 -0
  477. package/dist/schema/ddl/index.js +80 -0
  478. package/dist/schema/ddl/index.js.map +1 -0
  479. package/dist/schema/ddl/json-duckdb-strategy.d.ts +8 -0
  480. package/dist/schema/ddl/json-duckdb-strategy.d.ts.map +1 -0
  481. package/dist/schema/ddl/json-duckdb-strategy.js +14 -0
  482. package/dist/schema/ddl/json-duckdb-strategy.js.map +1 -0
  483. package/dist/schema/ddl/postgres-strategy.d.ts +29 -0
  484. package/dist/schema/ddl/postgres-strategy.d.ts.map +1 -0
  485. package/dist/schema/ddl/postgres-strategy.js +102 -0
  486. package/dist/schema/ddl/postgres-strategy.js.map +1 -0
  487. package/dist/schema/ddl/sqlite-strategy.d.ts +38 -0
  488. package/dist/schema/ddl/sqlite-strategy.d.ts.map +1 -0
  489. package/dist/schema/ddl/sqlite-strategy.js +74 -0
  490. package/dist/schema/ddl/sqlite-strategy.js.map +1 -0
  491. package/dist/schema/ddl/types.d.ts +114 -0
  492. package/dist/schema/ddl/types.d.ts.map +1 -0
  493. package/dist/schema/generator.d.ts +176 -0
  494. package/dist/schema/generator.d.ts.map +1 -0
  495. package/dist/schema/generator.js +1076 -0
  496. package/dist/schema/generator.js.map +1 -0
  497. package/dist/schema/index-utils.d.ts +19 -0
  498. package/dist/schema/index-utils.d.ts.map +1 -0
  499. package/dist/schema/index-utils.js +32 -0
  500. package/dist/schema/index-utils.js.map +1 -0
  501. package/dist/schema/index.d.ts +13 -0
  502. package/dist/schema/index.d.ts.map +1 -0
  503. package/dist/schema/override-system.d.ts +43 -0
  504. package/dist/schema/override-system.d.ts.map +1 -0
  505. package/dist/schema/schema-aggregator.d.ts +112 -0
  506. package/dist/schema/schema-aggregator.d.ts.map +1 -0
  507. package/dist/schema/schema-manager.d.ts +95 -0
  508. package/dist/schema/schema-manager.d.ts.map +1 -0
  509. package/dist/schema/schema-manager.js +283 -0
  510. package/dist/schema/schema-manager.js.map +1 -0
  511. package/dist/schema/sql-identifiers.d.ts +107 -0
  512. package/dist/schema/sql-identifiers.d.ts.map +1 -0
  513. package/dist/schema/sql-identifiers.js +190 -0
  514. package/dist/schema/sql-identifiers.js.map +1 -0
  515. package/dist/schema/table-verifier.d.ts +10 -0
  516. package/dist/schema/table-verifier.d.ts.map +1 -0
  517. package/dist/schema/table-verifier.js +37 -0
  518. package/dist/schema/table-verifier.js.map +1 -0
  519. package/dist/schema/types.d.ts +241 -0
  520. package/dist/schema/types.d.ts.map +1 -0
  521. package/dist/schema/utils.d.ts +32 -0
  522. package/dist/schema/utils.d.ts.map +1 -0
  523. package/dist/schema/utils.js +134 -0
  524. package/dist/schema/utils.js.map +1 -0
  525. package/dist/scripts/create-wrappers.js +89 -0
  526. package/dist/scripts/generate-manifest.js +155 -0
  527. package/dist/scripts/generate-test-manifest.js +77 -0
  528. package/dist/scripts/migrate-datetime-to-timestamp.ts +310 -0
  529. package/dist/scripts/prepack.js +49 -0
  530. package/dist/signals/bus.d.ts +64 -0
  531. package/dist/signals/bus.d.ts.map +1 -0
  532. package/dist/signals/bus.js +102 -0
  533. package/dist/signals/bus.js.map +1 -0
  534. package/dist/signals/index.d.ts +11 -0
  535. package/dist/signals/index.d.ts.map +1 -0
  536. package/dist/signals/sanitizer.d.ts +54 -0
  537. package/dist/signals/sanitizer.d.ts.map +1 -0
  538. package/dist/signals/sanitizer.js +111 -0
  539. package/dist/signals/sanitizer.js.map +1 -0
  540. package/dist/smrt-knowledge.json +335 -0
  541. package/dist/system/compatibility.d.ts +8 -0
  542. package/dist/system/compatibility.d.ts.map +1 -0
  543. package/dist/system/compatibility.js +409 -0
  544. package/dist/system/compatibility.js.map +1 -0
  545. package/dist/system/index.d.ts +9 -0
  546. package/dist/system/index.d.ts.map +1 -0
  547. package/dist/system/schema.d.ts +69 -0
  548. package/dist/system/schema.d.ts.map +1 -0
  549. package/dist/system/schema.js +271 -0
  550. package/dist/system/schema.js.map +1 -0
  551. package/dist/system/types.d.ts +135 -0
  552. package/dist/system/types.d.ts.map +1 -0
  553. package/dist/system-fields.d.ts +44 -0
  554. package/dist/system-fields.d.ts.map +1 -0
  555. package/dist/system-fields.js +55 -0
  556. package/dist/system-fields.js.map +1 -0
  557. package/dist/table-cache.d.ts +28 -0
  558. package/dist/table-cache.d.ts.map +1 -0
  559. package/dist/table-cache.js +21 -0
  560. package/dist/table-cache.js.map +1 -0
  561. package/dist/test-utils.d.ts +140 -0
  562. package/dist/test-utils.d.ts.map +1 -0
  563. package/dist/testing/database.d.ts +73 -0
  564. package/dist/testing/database.d.ts.map +1 -0
  565. package/dist/testing/database.js +204 -0
  566. package/dist/testing/database.js.map +1 -0
  567. package/dist/testing/index.d.ts +21 -0
  568. package/dist/testing/index.d.ts.map +1 -0
  569. package/dist/testing.d.ts +6 -0
  570. package/dist/testing.d.ts.map +1 -0
  571. package/dist/testing.js +5 -0
  572. package/dist/testing.js.map +1 -0
  573. package/dist/tools/index.d.ts +8 -0
  574. package/dist/tools/index.d.ts.map +1 -0
  575. package/dist/tools/tool-executor.d.ts +101 -0
  576. package/dist/tools/tool-executor.d.ts.map +1 -0
  577. package/dist/tools/tool-executor.js +142 -0
  578. package/dist/tools/tool-executor.js.map +1 -0
  579. package/dist/tools/tool-generator.d.ts +54 -0
  580. package/dist/tools/tool-generator.d.ts.map +1 -0
  581. package/dist/tools/tool-generator.js +121 -0
  582. package/dist/tools/tool-generator.js.map +1 -0
  583. package/dist/utils/chunk.d.ts +32 -0
  584. package/dist/utils/chunk.d.ts.map +1 -0
  585. package/dist/utils/chunk.js +14 -0
  586. package/dist/utils/chunk.js.map +1 -0
  587. package/dist/utils/import-workspace-module.d.ts +8 -0
  588. package/dist/utils/import-workspace-module.d.ts.map +1 -0
  589. package/dist/utils/import-workspace-module.js +81 -0
  590. package/dist/utils/import-workspace-module.js.map +1 -0
  591. package/dist/utils/json.d.ts +102 -0
  592. package/dist/utils/json.d.ts.map +1 -0
  593. package/dist/utils/json.js +43 -0
  594. package/dist/utils/json.js.map +1 -0
  595. package/dist/utils/lru-cache.d.ts +69 -0
  596. package/dist/utils/lru-cache.d.ts.map +1 -0
  597. package/dist/utils/lru-cache.js +100 -0
  598. package/dist/utils/lru-cache.js.map +1 -0
  599. package/dist/utils/naming.d.ts +16 -0
  600. package/dist/utils/naming.d.ts.map +1 -0
  601. package/dist/utils/naming.js +23 -0
  602. package/dist/utils/naming.js.map +1 -0
  603. package/dist/utils/qualified-names.d.ts +122 -0
  604. package/dist/utils/qualified-names.d.ts.map +1 -0
  605. package/dist/utils/qualified-names.js +82 -0
  606. package/dist/utils/qualified-names.js.map +1 -0
  607. package/dist/utils/scanner-module.d.ts +37 -0
  608. package/dist/utils/scanner-module.d.ts.map +1 -0
  609. package/dist/utils.d.ts +177 -0
  610. package/dist/utils.d.ts.map +1 -0
  611. package/dist/utils.js +185 -0
  612. package/dist/utils.js.map +1 -0
  613. package/dist/vite-plugin/import-build-aware.d.ts +68 -0
  614. package/dist/vite-plugin/import-build-aware.d.ts.map +1 -0
  615. package/dist/vite-plugin/import-build-aware.js +72 -0
  616. package/dist/vite-plugin/import-build-aware.js.map +1 -0
  617. package/dist/vite-plugin/index.d.ts +59 -0
  618. package/dist/vite-plugin/index.d.ts.map +1 -0
  619. package/dist/vite-plugin/index.js +1400 -0
  620. package/dist/vite-plugin/index.js.map +1 -0
  621. package/dist/vite-plugin/sveltekit-generator.d.ts +66 -0
  622. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -0
  623. package/dist/vite-plugin/sveltekit-generator.js +1375 -0
  624. package/dist/vite-plugin/sveltekit-generator.js.map +1 -0
  625. package/dist/vite-plugin/templates/default-ui.ts +432 -0
  626. package/dist/vite-plugin/templates/default.html +206 -0
  627. package/dist/vite-plugin.d.ts +8 -0
  628. package/dist/vite-plugin.d.ts.map +1 -0
  629. package/dist/vite-plugin.js +11 -0
  630. package/dist/vite-plugin.js.map +1 -0
  631. package/package.json +208 -0
@@ -0,0 +1,23 @@
1
+ import { AiUsageHandler, AiUsageSnapshot, SmrtAiUsageEvent } from '@happyvertical/smrt-types';
2
+ import { DatabaseInterface } from '@happyvertical/sql';
3
+ /**
4
+ * Collects normalized AI usage events in memory for quick inspection.
5
+ */
6
+ export declare class AiUsageCollector implements AiUsageHandler {
7
+ private byModel;
8
+ private byClass;
9
+ private totalCalls;
10
+ private startTime;
11
+ handle(event: SmrtAiUsageEvent): Promise<void>;
12
+ getSnapshot(): AiUsageSnapshot;
13
+ reset(): void;
14
+ }
15
+ /**
16
+ * Persists normalized AI usage events into the framework system table.
17
+ */
18
+ export declare class AiUsagePersistenceHandler implements AiUsageHandler {
19
+ private readonly db;
20
+ constructor(db: DatabaseInterface);
21
+ handle(event: SmrtAiUsageEvent): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=ai-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-usage.d.ts","sourceRoot":"","sources":["../../src/adapters/ai-usage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAwB5D;;GAEG;AACH,qBAAa,gBAAiB,YAAW,cAAc;IACrD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAc;IAEzB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD,WAAW,IAAI,eAAe;IAoB9B,KAAK,IAAI,IAAI;CAMd;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BrD"}
@@ -0,0 +1,105 @@
1
+ function emptyStats(timestamp) {
2
+ return {
3
+ callCount: 0,
4
+ promptTokens: 0,
5
+ completionTokens: 0,
6
+ totalTokens: 0,
7
+ totalDuration: 0,
8
+ estimatedCost: 0,
9
+ lastUsed: timestamp
10
+ };
11
+ }
12
+ function updateStats(stats, event) {
13
+ stats.callCount++;
14
+ stats.promptTokens += event.usage?.promptTokens ?? 0;
15
+ stats.completionTokens += event.usage?.completionTokens ?? 0;
16
+ stats.totalTokens += event.usage?.totalTokens ?? 0;
17
+ stats.totalDuration += event.duration ?? 0;
18
+ stats.estimatedCost += event.estimatedCost ?? 0;
19
+ stats.lastUsed = event.timestamp.getTime();
20
+ }
21
+ class AiUsageCollector {
22
+ byModel = /* @__PURE__ */ new Map();
23
+ byClass = /* @__PURE__ */ new Map();
24
+ totalCalls = 0;
25
+ startTime = Date.now();
26
+ async handle(event) {
27
+ this.totalCalls++;
28
+ const timestamp = event.timestamp.getTime();
29
+ const modelKey = `${event.provider}:${event.model}`;
30
+ const classKey = `${event.className ?? "unknown"}:${event.operation}`;
31
+ let modelStats = this.byModel.get(modelKey);
32
+ if (!modelStats) {
33
+ modelStats = emptyStats(timestamp);
34
+ this.byModel.set(modelKey, modelStats);
35
+ }
36
+ let classStats = this.byClass.get(classKey);
37
+ if (!classStats) {
38
+ classStats = emptyStats(timestamp);
39
+ this.byClass.set(classKey, classStats);
40
+ }
41
+ updateStats(modelStats, event);
42
+ updateStats(classStats, event);
43
+ }
44
+ getSnapshot() {
45
+ const byModel = {};
46
+ const byClass = {};
47
+ for (const [key, stats] of this.byModel.entries()) {
48
+ byModel[key] = { ...stats };
49
+ }
50
+ for (const [key, stats] of this.byClass.entries()) {
51
+ byClass[key] = { ...stats };
52
+ }
53
+ return {
54
+ byModel,
55
+ byClass,
56
+ totalCalls: this.totalCalls,
57
+ startTime: this.startTime
58
+ };
59
+ }
60
+ reset() {
61
+ this.byModel.clear();
62
+ this.byClass.clear();
63
+ this.totalCalls = 0;
64
+ this.startTime = Date.now();
65
+ }
66
+ }
67
+ class AiUsagePersistenceHandler {
68
+ constructor(db) {
69
+ this.db = db;
70
+ }
71
+ db;
72
+ async handle(event) {
73
+ try {
74
+ await this.db.query(
75
+ `INSERT INTO _smrt_ai_usage
76
+ (id, provider, model, operation, prompt_tokens, completion_tokens,
77
+ total_tokens, estimated_cost, duration, class_name, tenant_id, tags, created_at)
78
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`,
79
+ crypto.randomUUID(),
80
+ event.provider,
81
+ event.model,
82
+ event.operation,
83
+ event.usage?.promptTokens ?? null,
84
+ event.usage?.completionTokens ?? null,
85
+ event.usage?.totalTokens ?? null,
86
+ event.estimatedCost ?? null,
87
+ event.duration,
88
+ event.className ?? null,
89
+ event.tenantId ?? null,
90
+ event.tags ? JSON.stringify(event.tags) : null,
91
+ event.timestamp.toISOString()
92
+ );
93
+ } catch (error) {
94
+ throw new Error(
95
+ `Failed to persist AI usage event for ${event.provider}:${event.model}: ${error instanceof Error ? error.message : String(error)}`,
96
+ { cause: error }
97
+ );
98
+ }
99
+ }
100
+ }
101
+ export {
102
+ AiUsageCollector,
103
+ AiUsagePersistenceHandler
104
+ };
105
+ //# sourceMappingURL=ai-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-usage.js","sources":["../../src/adapters/ai-usage.ts"],"sourcesContent":["/**\n * In-memory AI usage tracking adapters.\n */\n\nimport type {\n AiUsageHandler,\n AiUsageSnapshot,\n AiUsageStats,\n SmrtAiUsageEvent,\n} from '@happyvertical/smrt-types';\nimport type { DatabaseInterface } from '@happyvertical/sql';\n\nfunction emptyStats(timestamp: number): AiUsageStats {\n return {\n callCount: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n totalDuration: 0,\n estimatedCost: 0,\n lastUsed: timestamp,\n };\n}\n\nfunction updateStats(stats: AiUsageStats, event: SmrtAiUsageEvent): void {\n stats.callCount++;\n stats.promptTokens += event.usage?.promptTokens ?? 0;\n stats.completionTokens += event.usage?.completionTokens ?? 0;\n stats.totalTokens += event.usage?.totalTokens ?? 0;\n stats.totalDuration += event.duration ?? 0;\n stats.estimatedCost += event.estimatedCost ?? 0;\n stats.lastUsed = event.timestamp.getTime();\n}\n\n/**\n * Collects normalized AI usage events in memory for quick inspection.\n */\nexport class AiUsageCollector implements AiUsageHandler {\n private byModel = new Map<string, AiUsageStats>();\n private byClass = new Map<string, AiUsageStats>();\n private totalCalls = 0;\n private startTime = Date.now();\n\n async handle(event: SmrtAiUsageEvent): Promise<void> {\n this.totalCalls++;\n\n const timestamp = event.timestamp.getTime();\n const modelKey = `${event.provider}:${event.model}`;\n const classKey = `${event.className ?? 'unknown'}:${event.operation}`;\n\n let modelStats = this.byModel.get(modelKey);\n if (!modelStats) {\n modelStats = emptyStats(timestamp);\n this.byModel.set(modelKey, modelStats);\n }\n\n let classStats = this.byClass.get(classKey);\n if (!classStats) {\n classStats = emptyStats(timestamp);\n this.byClass.set(classKey, classStats);\n }\n\n updateStats(modelStats, event);\n updateStats(classStats, event);\n }\n\n getSnapshot(): AiUsageSnapshot {\n const byModel: AiUsageSnapshot['byModel'] = {};\n const byClass: AiUsageSnapshot['byClass'] = {};\n\n for (const [key, stats] of this.byModel.entries()) {\n byModel[key] = { ...stats };\n }\n\n for (const [key, stats] of this.byClass.entries()) {\n byClass[key] = { ...stats };\n }\n\n return {\n byModel,\n byClass,\n totalCalls: this.totalCalls,\n startTime: this.startTime,\n };\n }\n\n reset(): void {\n this.byModel.clear();\n this.byClass.clear();\n this.totalCalls = 0;\n this.startTime = Date.now();\n }\n}\n\n/**\n * Persists normalized AI usage events into the framework system table.\n */\nexport class AiUsagePersistenceHandler implements AiUsageHandler {\n constructor(private readonly db: DatabaseInterface) {}\n\n async handle(event: SmrtAiUsageEvent): Promise<void> {\n try {\n await this.db.query(\n `INSERT INTO _smrt_ai_usage\n (id, provider, model, operation, prompt_tokens, completion_tokens,\n total_tokens, estimated_cost, duration, class_name, tenant_id, tags, created_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)`,\n crypto.randomUUID(),\n event.provider,\n event.model,\n event.operation,\n event.usage?.promptTokens ?? null,\n event.usage?.completionTokens ?? null,\n event.usage?.totalTokens ?? null,\n event.estimatedCost ?? null,\n event.duration,\n event.className ?? null,\n event.tenantId ?? null,\n event.tags ? JSON.stringify(event.tags) : null,\n event.timestamp.toISOString(),\n );\n } catch (error) {\n throw new Error(\n `Failed to persist AI usage event for ${event.provider}:${event.model}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error },\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { AiTokenUsage } from '@happyvertical/smrt-types';
2
+ /**
3
+ * Cost rates are expressed in USD per 1K tokens.
4
+ *
5
+ * These defaults are intentionally small and best-effort. Applications can
6
+ * override them via configuration when they need stricter billing accuracy.
7
+ * Snapshot captured on 2026-03-12 from provider pricing pages.
8
+ */
9
+ export declare const DEFAULT_AI_COST_RATES: Record<string, {
10
+ input: number;
11
+ output: number;
12
+ }>;
13
+ /**
14
+ * Estimate the cost of a single AI usage event.
15
+ */
16
+ export declare function estimateAiUsageCost(provider: string, model: string, usage?: AiTokenUsage, customRates?: Record<string, {
17
+ input: number;
18
+ output: number;
19
+ }>): number | undefined;
20
+ //# sourceMappingURL=cost-rates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-rates.d.ts","sourceRoot":"","sources":["../../src/adapters/cost-rates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAM9D;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CASlC,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9D,MAAM,GAAG,SAAS,CA8BpB"}
@@ -0,0 +1,40 @@
1
+ import { createLogger } from "@happyvertical/logger";
2
+ const logger = createLogger({ level: "info" });
3
+ const missingRateWarnings = /* @__PURE__ */ new Set();
4
+ const DEFAULT_AI_COST_RATES = {
5
+ "openai:gpt-4o": { input: 25e-4, output: 0.01 },
6
+ "openai:gpt-4o-mini": { input: 15e-5, output: 6e-4 },
7
+ "anthropic:claude-sonnet-4.5": { input: 3e-3, output: 0.015 },
8
+ "anthropic:claude-haiku-4.5": { input: 1e-3, output: 5e-3 },
9
+ "anthropic:claude-3-5-sonnet-latest": { input: 3e-3, output: 0.015 },
10
+ "anthropic:claude-3-5-haiku-latest": { input: 8e-4, output: 4e-3 },
11
+ "google:gemini-2.5-flash": { input: 3e-4, output: 25e-4 }
12
+ };
13
+ function estimateAiUsageCost(provider, model, usage, customRates) {
14
+ if (!usage) return void 0;
15
+ const rates = {
16
+ ...DEFAULT_AI_COST_RATES,
17
+ ...customRates ?? {}
18
+ };
19
+ const exactKey = `${provider}:${model}`;
20
+ const fallbackKey = model;
21
+ const rate = rates[exactKey] ?? rates[fallbackKey];
22
+ if (!rate) {
23
+ const warningKey = exactKey;
24
+ if (!missingRateWarnings.has(warningKey)) {
25
+ missingRateWarnings.add(warningKey);
26
+ logger.warn(
27
+ `[smrt] No AI usage cost rate configured for ${warningKey}. Cost estimation will be skipped for this model.`
28
+ );
29
+ }
30
+ return void 0;
31
+ }
32
+ const promptTokens = usage.promptTokens ?? 0;
33
+ const completionTokens = usage.completionTokens ?? 0;
34
+ return promptTokens / 1e3 * rate.input + completionTokens / 1e3 * rate.output;
35
+ }
36
+ export {
37
+ DEFAULT_AI_COST_RATES,
38
+ estimateAiUsageCost
39
+ };
40
+ //# sourceMappingURL=cost-rates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-rates.js","sources":["../../src/adapters/cost-rates.ts"],"sourcesContent":["import { createLogger } from '@happyvertical/logger';\nimport type { AiTokenUsage } from '@happyvertical/smrt-types';\n\nconst logger = createLogger({ level: 'info' });\n\nconst missingRateWarnings = new Set<string>();\n\n/**\n * Cost rates are expressed in USD per 1K tokens.\n *\n * These defaults are intentionally small and best-effort. Applications can\n * override them via configuration when they need stricter billing accuracy.\n * Snapshot captured on 2026-03-12 from provider pricing pages.\n */\nexport const DEFAULT_AI_COST_RATES: Record<\n string,\n { input: number; output: number }\n> = {\n 'openai:gpt-4o': { input: 0.0025, output: 0.01 },\n 'openai:gpt-4o-mini': { input: 0.00015, output: 0.0006 },\n 'anthropic:claude-sonnet-4.5': { input: 0.003, output: 0.015 },\n 'anthropic:claude-haiku-4.5': { input: 0.001, output: 0.005 },\n 'anthropic:claude-3-5-sonnet-latest': { input: 0.003, output: 0.015 },\n 'anthropic:claude-3-5-haiku-latest': { input: 0.0008, output: 0.004 },\n 'google:gemini-2.5-flash': { input: 0.0003, output: 0.0025 },\n};\n\n/**\n * Estimate the cost of a single AI usage event.\n */\nexport function estimateAiUsageCost(\n provider: string,\n model: string,\n usage?: AiTokenUsage,\n customRates?: Record<string, { input: number; output: number }>,\n): number | undefined {\n if (!usage) return undefined;\n\n const rates = {\n ...DEFAULT_AI_COST_RATES,\n ...(customRates ?? {}),\n };\n\n const exactKey = `${provider}:${model}`;\n const fallbackKey = model;\n const rate = rates[exactKey] ?? rates[fallbackKey];\n\n if (!rate) {\n const warningKey = exactKey;\n if (!missingRateWarnings.has(warningKey)) {\n missingRateWarnings.add(warningKey);\n logger.warn(\n `[smrt] No AI usage cost rate configured for ${warningKey}. ` +\n `Cost estimation will be skipped for this model.`,\n );\n }\n return undefined;\n }\n\n const promptTokens = usage.promptTokens ?? 0;\n const completionTokens = usage.completionTokens ?? 0;\n\n return (\n (promptTokens / 1000) * rate.input + (completionTokens / 1000) * rate.output\n );\n}\n"],"names":[],"mappings":";AAGA,MAAM,SAAS,aAAa,EAAE,OAAO,QAAQ;AAE7C,MAAM,0CAA0B,IAAA;AASzB,MAAM,wBAGT;AAAA,EACF,iBAAiB,EAAE,OAAO,OAAQ,QAAQ,KAAA;AAAA,EAC1C,sBAAsB,EAAE,OAAO,OAAS,QAAQ,KAAA;AAAA,EAChD,+BAA+B,EAAE,OAAO,MAAO,QAAQ,MAAA;AAAA,EACvD,8BAA8B,EAAE,OAAO,MAAO,QAAQ,KAAA;AAAA,EACtD,sCAAsC,EAAE,OAAO,MAAO,QAAQ,MAAA;AAAA,EAC9D,qCAAqC,EAAE,OAAO,MAAQ,QAAQ,KAAA;AAAA,EAC9D,2BAA2B,EAAE,OAAO,MAAQ,QAAQ,MAAA;AACtD;AAKO,SAAS,oBACd,UACA,OACA,OACA,aACoB;AACpB,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,GAAI,eAAe,CAAA;AAAA,EAAC;AAGtB,QAAM,WAAW,GAAG,QAAQ,IAAI,KAAK;AACrC,QAAM,cAAc;AACpB,QAAM,OAAO,MAAM,QAAQ,KAAK,MAAM,WAAW;AAEjD,MAAI,CAAC,MAAM;AACT,UAAM,aAAa;AACnB,QAAI,CAAC,oBAAoB,IAAI,UAAU,GAAG;AACxC,0BAAoB,IAAI,UAAU;AAClC,aAAO;AAAA,QACL,+CAA+C,UAAU;AAAA,MAAA;AAAA,IAG7D;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,mBAAmB,MAAM,oBAAoB;AAEnD,SACG,eAAe,MAAQ,KAAK,QAAS,mBAAmB,MAAQ,KAAK;AAE1E;"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Built-in Adapters & Usage Handlers
3
+ *
4
+ * Pre-built components for common observability and communication patterns:
5
+ * - AiUsageCollector / AiUsagePersistenceHandler: AI usage handlers for
6
+ * normalized telemetry collection and persistence
7
+ * - MetricsAdapter: Signal adapter for execution metrics
8
+ * (Prometheus-compatible)
9
+ * - PubSubAdapter: Signal adapter to broadcast signals to subscribers
10
+ * (WebSocket/SSE)
11
+ */
12
+ export type { AiUsageSnapshot, AiUsageStats } from '@happyvertical/smrt-types';
13
+ export { AiUsageCollector, AiUsagePersistenceHandler } from './ai-usage.js';
14
+ export { DEFAULT_AI_COST_RATES, estimateAiUsageCost, } from './cost-rates.js';
15
+ export type { MethodMetrics, MetricsSnapshot, } from './metrics.js';
16
+ export { MetricsAdapter } from './metrics.js';
17
+ export type { SignalFilter, SignalSubscriber, Subscription, } from './pubsub.js';
18
+ export { PubSubAdapter } from './pubsub.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { Signal, SignalAdapter } from '@happyvertical/smrt-types';
2
+ /**
3
+ * Execution metrics for a specific method
4
+ */
5
+ export interface MethodMetrics {
6
+ /** Total number of executions */
7
+ count: number;
8
+ /** Number of successful executions */
9
+ successCount: number;
10
+ /** Number of failed executions */
11
+ errorCount: number;
12
+ /** Total execution time across all calls (ms) */
13
+ totalDuration: number;
14
+ /** Minimum execution time (ms) */
15
+ minDuration: number;
16
+ /** Maximum execution time (ms) */
17
+ maxDuration: number;
18
+ /** Last execution timestamp */
19
+ lastExecuted: number;
20
+ }
21
+ /**
22
+ * Aggregated metrics storage
23
+ */
24
+ export interface MetricsSnapshot {
25
+ /** Metrics per class.method combination */
26
+ methods: Record<string, MethodMetrics>;
27
+ /** Total signals processed */
28
+ totalSignals: number;
29
+ /** Metrics collection start time */
30
+ startTime: number;
31
+ }
32
+ /**
33
+ * Metrics Adapter - Tracks execution metrics for observability
34
+ *
35
+ * Provides Prometheus-style metrics for SMRT method executions:
36
+ * - Execution counts (total, success, error)
37
+ * - Duration statistics (min, max, avg)
38
+ * - Success/error rates
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * const metrics = new MetricsAdapter();
43
+ * signalBus.register(metrics);
44
+ *
45
+ * // Later, get metrics snapshot
46
+ * const snapshot = metrics.getMetrics();
47
+ * console.log(snapshot.methods['Product.analyze']);
48
+ * ```
49
+ */
50
+ export declare class MetricsAdapter implements SignalAdapter {
51
+ private metrics;
52
+ private totalSignals;
53
+ private startTime;
54
+ /**
55
+ * Handle a signal and update metrics
56
+ *
57
+ * @param signal - Signal to process
58
+ */
59
+ handle(signal: Signal): Promise<void>;
60
+ /**
61
+ * Get current metrics snapshot
62
+ *
63
+ * @returns Snapshot of all collected metrics
64
+ */
65
+ getMetrics(): MetricsSnapshot;
66
+ /**
67
+ * Get metrics for a specific method
68
+ *
69
+ * @param className - Class name
70
+ * @param methodName - Method name
71
+ * @returns Metrics for the method, or undefined if not found
72
+ */
73
+ getMethodMetrics(className: string, methodName: string): MethodMetrics | undefined;
74
+ /**
75
+ * Get average duration for a method
76
+ *
77
+ * @param className - Class name
78
+ * @param methodName - Method name
79
+ * @returns Average duration in ms, or 0 if no executions
80
+ */
81
+ getAverageDuration(className: string, methodName: string): number;
82
+ /**
83
+ * Get success rate for a method
84
+ *
85
+ * @param className - Class name
86
+ * @param methodName - Method name
87
+ * @returns Success rate (0-1), or 0 if no executions
88
+ */
89
+ getSuccessRate(className: string, methodName: string): number;
90
+ /**
91
+ * Get error rate for a method
92
+ *
93
+ * @param className - Class name
94
+ * @param methodName - Method name
95
+ * @returns Error rate (0-1), or 0 if no executions
96
+ */
97
+ getErrorRate(className: string, methodName: string): number;
98
+ /**
99
+ * Export metrics in Prometheus text format
100
+ *
101
+ * @returns Prometheus-compatible metrics text
102
+ */
103
+ toPrometheusFormat(): string;
104
+ /**
105
+ * Reset all metrics
106
+ *
107
+ * Clears all collected metrics and resets counters.
108
+ */
109
+ reset(): void;
110
+ }
111
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/adapters/metrics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAc;IAE/B;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD3C;;;;OAIG;IACH,UAAU,IAAI,eAAe;IAc7B;;;;;;OAMG;IACH,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,aAAa,GAAG,SAAS;IAM5B;;;;;;OAMG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQjE;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQ7D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAQ3D;;;;OAIG;IACH,kBAAkB,IAAI,MAAM;IAgD5B;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,169 @@
1
+ class MetricsAdapter {
2
+ metrics = /* @__PURE__ */ new Map();
3
+ totalSignals = 0;
4
+ startTime = Date.now();
5
+ /**
6
+ * Handle a signal and update metrics
7
+ *
8
+ * @param signal - Signal to process
9
+ */
10
+ async handle(signal) {
11
+ this.totalSignals++;
12
+ if (signal.type !== "end" && signal.type !== "error") {
13
+ return;
14
+ }
15
+ const key = `${signal.className}.${signal.method}`;
16
+ let methodMetrics = this.metrics.get(key);
17
+ if (!methodMetrics) {
18
+ methodMetrics = {
19
+ count: 0,
20
+ successCount: 0,
21
+ errorCount: 0,
22
+ totalDuration: 0,
23
+ minDuration: Number.POSITIVE_INFINITY,
24
+ maxDuration: 0,
25
+ lastExecuted: 0
26
+ };
27
+ this.metrics.set(key, methodMetrics);
28
+ }
29
+ methodMetrics.count++;
30
+ if (signal.type === "end") {
31
+ methodMetrics.successCount++;
32
+ } else {
33
+ methodMetrics.errorCount++;
34
+ }
35
+ if (signal.duration !== void 0) {
36
+ methodMetrics.totalDuration += signal.duration;
37
+ methodMetrics.minDuration = Math.min(
38
+ methodMetrics.minDuration,
39
+ signal.duration
40
+ );
41
+ methodMetrics.maxDuration = Math.max(
42
+ methodMetrics.maxDuration,
43
+ signal.duration
44
+ );
45
+ }
46
+ methodMetrics.lastExecuted = signal.timestamp.getTime();
47
+ }
48
+ /**
49
+ * Get current metrics snapshot
50
+ *
51
+ * @returns Snapshot of all collected metrics
52
+ */
53
+ getMetrics() {
54
+ const methods = {};
55
+ for (const [key, metrics] of this.metrics.entries()) {
56
+ methods[key] = { ...metrics };
57
+ }
58
+ return {
59
+ methods,
60
+ totalSignals: this.totalSignals,
61
+ startTime: this.startTime
62
+ };
63
+ }
64
+ /**
65
+ * Get metrics for a specific method
66
+ *
67
+ * @param className - Class name
68
+ * @param methodName - Method name
69
+ * @returns Metrics for the method, or undefined if not found
70
+ */
71
+ getMethodMetrics(className, methodName) {
72
+ const key = `${className}.${methodName}`;
73
+ const metrics = this.metrics.get(key);
74
+ return metrics ? { ...metrics } : void 0;
75
+ }
76
+ /**
77
+ * Get average duration for a method
78
+ *
79
+ * @param className - Class name
80
+ * @param methodName - Method name
81
+ * @returns Average duration in ms, or 0 if no executions
82
+ */
83
+ getAverageDuration(className, methodName) {
84
+ const metrics = this.getMethodMetrics(className, methodName);
85
+ if (!metrics || metrics.count === 0) {
86
+ return 0;
87
+ }
88
+ return metrics.totalDuration / metrics.count;
89
+ }
90
+ /**
91
+ * Get success rate for a method
92
+ *
93
+ * @param className - Class name
94
+ * @param methodName - Method name
95
+ * @returns Success rate (0-1), or 0 if no executions
96
+ */
97
+ getSuccessRate(className, methodName) {
98
+ const metrics = this.getMethodMetrics(className, methodName);
99
+ if (!metrics || metrics.count === 0) {
100
+ return 0;
101
+ }
102
+ return metrics.successCount / metrics.count;
103
+ }
104
+ /**
105
+ * Get error rate for a method
106
+ *
107
+ * @param className - Class name
108
+ * @param methodName - Method name
109
+ * @returns Error rate (0-1), or 0 if no executions
110
+ */
111
+ getErrorRate(className, methodName) {
112
+ const metrics = this.getMethodMetrics(className, methodName);
113
+ if (!metrics || metrics.count === 0) {
114
+ return 0;
115
+ }
116
+ return metrics.errorCount / metrics.count;
117
+ }
118
+ /**
119
+ * Export metrics in Prometheus text format
120
+ *
121
+ * @returns Prometheus-compatible metrics text
122
+ */
123
+ toPrometheusFormat() {
124
+ const lines = [];
125
+ lines.push("# HELP smrt_method_executions_total Total method executions");
126
+ lines.push("# TYPE smrt_method_executions_total counter");
127
+ lines.push("# HELP smrt_method_duration_seconds Method execution duration");
128
+ lines.push("# TYPE smrt_method_duration_seconds histogram");
129
+ lines.push("# HELP smrt_method_errors_total Total method errors");
130
+ lines.push("# TYPE smrt_method_errors_total counter");
131
+ for (const [key, metrics] of this.metrics.entries()) {
132
+ const [className, methodName] = key.split(".");
133
+ const labels = `class="${className}",method="${methodName}"`;
134
+ lines.push(`smrt_method_executions_total{${labels}} ${metrics.count}`);
135
+ lines.push(
136
+ `smrt_method_executions_total{${labels},status="success"} ${metrics.successCount}`
137
+ );
138
+ lines.push(`smrt_method_errors_total{${labels}} ${metrics.errorCount}`);
139
+ const avgDuration = metrics.totalDuration / metrics.count / 1e3;
140
+ const minDuration = metrics.minDuration / 1e3;
141
+ const maxDuration = metrics.maxDuration / 1e3;
142
+ lines.push(
143
+ `smrt_method_duration_seconds{${labels},quantile="0.0"} ${minDuration}`
144
+ );
145
+ lines.push(
146
+ `smrt_method_duration_seconds{${labels},quantile="0.5"} ${avgDuration}`
147
+ );
148
+ lines.push(
149
+ `smrt_method_duration_seconds{${labels},quantile="1.0"} ${maxDuration}`
150
+ );
151
+ }
152
+ return `${lines.join("\n")}
153
+ `;
154
+ }
155
+ /**
156
+ * Reset all metrics
157
+ *
158
+ * Clears all collected metrics and resets counters.
159
+ */
160
+ reset() {
161
+ this.metrics.clear();
162
+ this.totalSignals = 0;
163
+ this.startTime = Date.now();
164
+ }
165
+ }
166
+ export {
167
+ MetricsAdapter
168
+ };
169
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sources":["../../src/adapters/metrics.ts"],"sourcesContent":["/**\n * Metrics Adapter for Signal System\n *\n * Tracks execution metrics for SMRT objects in Prometheus-compatible format.\n * Collects counts, durations, error rates, and success rates.\n */\n\nimport type { Signal, SignalAdapter } from '@happyvertical/smrt-types';\n\n/**\n * Execution metrics for a specific method\n */\nexport interface MethodMetrics {\n /** Total number of executions */\n count: number;\n /** Number of successful executions */\n successCount: number;\n /** Number of failed executions */\n errorCount: number;\n /** Total execution time across all calls (ms) */\n totalDuration: number;\n /** Minimum execution time (ms) */\n minDuration: number;\n /** Maximum execution time (ms) */\n maxDuration: number;\n /** Last execution timestamp */\n lastExecuted: number;\n}\n\n/**\n * Aggregated metrics storage\n */\nexport interface MetricsSnapshot {\n /** Metrics per class.method combination */\n methods: Record<string, MethodMetrics>;\n /** Total signals processed */\n totalSignals: number;\n /** Metrics collection start time */\n startTime: number;\n}\n\n/**\n * Metrics Adapter - Tracks execution metrics for observability\n *\n * Provides Prometheus-style metrics for SMRT method executions:\n * - Execution counts (total, success, error)\n * - Duration statistics (min, max, avg)\n * - Success/error rates\n *\n * @example\n * ```typescript\n * const metrics = new MetricsAdapter();\n * signalBus.register(metrics);\n *\n * // Later, get metrics snapshot\n * const snapshot = metrics.getMetrics();\n * console.log(snapshot.methods['Product.analyze']);\n * ```\n */\nexport class MetricsAdapter implements SignalAdapter {\n private metrics: Map<string, MethodMetrics> = new Map();\n private totalSignals = 0;\n private startTime = Date.now();\n\n /**\n * Handle a signal and update metrics\n *\n * @param signal - Signal to process\n */\n async handle(signal: Signal): Promise<void> {\n this.totalSignals++;\n\n // Only track end and error signals (they have duration)\n if (signal.type !== 'end' && signal.type !== 'error') {\n return;\n }\n\n const key = `${signal.className}.${signal.method}`;\n let methodMetrics = this.metrics.get(key);\n\n // Initialize metrics for new method\n if (!methodMetrics) {\n methodMetrics = {\n count: 0,\n successCount: 0,\n errorCount: 0,\n totalDuration: 0,\n minDuration: Number.POSITIVE_INFINITY,\n maxDuration: 0,\n lastExecuted: 0,\n };\n this.metrics.set(key, methodMetrics);\n }\n\n // Update counts\n methodMetrics.count++;\n if (signal.type === 'end') {\n methodMetrics.successCount++;\n } else {\n methodMetrics.errorCount++;\n }\n\n // Update duration statistics\n if (signal.duration !== undefined) {\n methodMetrics.totalDuration += signal.duration;\n methodMetrics.minDuration = Math.min(\n methodMetrics.minDuration,\n signal.duration,\n );\n methodMetrics.maxDuration = Math.max(\n methodMetrics.maxDuration,\n signal.duration,\n );\n }\n\n methodMetrics.lastExecuted = signal.timestamp.getTime();\n }\n\n /**\n * Get current metrics snapshot\n *\n * @returns Snapshot of all collected metrics\n */\n getMetrics(): MetricsSnapshot {\n const methods: Record<string, MethodMetrics> = {};\n\n for (const [key, metrics] of this.metrics.entries()) {\n methods[key] = { ...metrics };\n }\n\n return {\n methods,\n totalSignals: this.totalSignals,\n startTime: this.startTime,\n };\n }\n\n /**\n * Get metrics for a specific method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Metrics for the method, or undefined if not found\n */\n getMethodMetrics(\n className: string,\n methodName: string,\n ): MethodMetrics | undefined {\n const key = `${className}.${methodName}`;\n const metrics = this.metrics.get(key);\n return metrics ? { ...metrics } : undefined;\n }\n\n /**\n * Get average duration for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Average duration in ms, or 0 if no executions\n */\n getAverageDuration(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.totalDuration / metrics.count;\n }\n\n /**\n * Get success rate for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Success rate (0-1), or 0 if no executions\n */\n getSuccessRate(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.successCount / metrics.count;\n }\n\n /**\n * Get error rate for a method\n *\n * @param className - Class name\n * @param methodName - Method name\n * @returns Error rate (0-1), or 0 if no executions\n */\n getErrorRate(className: string, methodName: string): number {\n const metrics = this.getMethodMetrics(className, methodName);\n if (!metrics || metrics.count === 0) {\n return 0;\n }\n return metrics.errorCount / metrics.count;\n }\n\n /**\n * Export metrics in Prometheus text format\n *\n * @returns Prometheus-compatible metrics text\n */\n toPrometheusFormat(): string {\n const lines: string[] = [];\n\n // Add help and type declarations\n lines.push('# HELP smrt_method_executions_total Total method executions');\n lines.push('# TYPE smrt_method_executions_total counter');\n\n lines.push('# HELP smrt_method_duration_seconds Method execution duration');\n lines.push('# TYPE smrt_method_duration_seconds histogram');\n\n lines.push('# HELP smrt_method_errors_total Total method errors');\n lines.push('# TYPE smrt_method_errors_total counter');\n\n // Generate metrics for each method\n for (const [key, metrics] of this.metrics.entries()) {\n const [className, methodName] = key.split('.');\n const labels = `class=\"${className}\",method=\"${methodName}\"`;\n\n // Execution count\n lines.push(`smrt_method_executions_total{${labels}} ${metrics.count}`);\n\n // Success count\n lines.push(\n `smrt_method_executions_total{${labels},status=\"success\"} ${metrics.successCount}`,\n );\n\n // Error count\n lines.push(`smrt_method_errors_total{${labels}} ${metrics.errorCount}`);\n\n // Duration statistics (convert to seconds for Prometheus)\n const avgDuration = metrics.totalDuration / metrics.count / 1000;\n const minDuration = metrics.minDuration / 1000;\n const maxDuration = metrics.maxDuration / 1000;\n\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"0.0\"} ${minDuration}`,\n );\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"0.5\"} ${avgDuration}`,\n );\n lines.push(\n `smrt_method_duration_seconds{${labels},quantile=\"1.0\"} ${maxDuration}`,\n );\n }\n\n return `${lines.join('\\n')}\\n`;\n }\n\n /**\n * Reset all metrics\n *\n * Clears all collected metrics and resets counters.\n */\n reset(): void {\n this.metrics.clear();\n this.totalSignals = 0;\n this.startTime = Date.now();\n }\n}\n"],"names":[],"mappings":"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"}