@mastra/laminar 1.0.0-beta.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -0
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/tracing.d.ts +6 -0
- package/dist/tracing.d.ts.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# @mastra/laminar
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- Initial add of @mastra/laminar observability exporter ([#11758](https://github.com/mastra-ai/mastra/pull/11758))
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Added `flush()` method to observability exporters and instances for serverless environments ([#12003](https://github.com/mastra-ai/mastra/pull/12003))
|
|
12
|
+
|
|
13
|
+
This feature allows flushing buffered spans without shutting down the exporter, which is useful in serverless environments like Vercel's fluid compute where runtime instances can be reused across multiple requests.
|
|
14
|
+
|
|
15
|
+
**New API:**
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// Flush all exporters via the observability instance
|
|
19
|
+
const observability = mastra.getObservability();
|
|
20
|
+
await observability.flush();
|
|
21
|
+
|
|
22
|
+
// Or flush individual exporters
|
|
23
|
+
const exporters = observability.getExporters();
|
|
24
|
+
await exporters[0].flush();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Why this matters:**
|
|
28
|
+
|
|
29
|
+
In serverless environments, you may need to ensure all spans are exported before the runtime instance is terminated, while keeping the exporter active for future requests. Unlike shutdown(), flush() does not release resources or prevent future exports.
|
|
30
|
+
|
|
31
|
+
Closes #11372
|
|
32
|
+
|
|
33
|
+
- Updated dependencies [[`ac0d2f4`](https://github.com/mastra-ai/mastra/commit/ac0d2f4ff8831f72c1c66c2be809706d17f65789), [`2319326`](https://github.com/mastra-ai/mastra/commit/2319326f8c64e503a09bbcf14be2dd65405445e0), [`d2d3e22`](https://github.com/mastra-ai/mastra/commit/d2d3e22a419ee243f8812a84e3453dd44365ecb0), [`08766f1`](https://github.com/mastra-ai/mastra/commit/08766f15e13ac0692fde2a8bd366c2e16e4321df), [`72df8ae`](https://github.com/mastra-ai/mastra/commit/72df8ae595584cdd7747d5c39ffaca45e4507227), [`6c59a40`](https://github.com/mastra-ai/mastra/commit/6c59a40e0ad160467bd13d63a8a287028d75b02d), [`ebae12a`](https://github.com/mastra-ai/mastra/commit/ebae12a2dd0212e75478981053b148a2c246962d), [`c8417b4`](https://github.com/mastra-ai/mastra/commit/c8417b41d9f3486854dc7842d977fbe5e2166264), [`bc72b52`](https://github.com/mastra-ai/mastra/commit/bc72b529ee4478fe89ecd85a8be47ce0127b82a0), [`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`c61a0a5`](https://github.com/mastra-ai/mastra/commit/c61a0a5de4904c88fd8b3718bc26d1be1c2ec6e7), [`05b8bee`](https://github.com/mastra-ai/mastra/commit/05b8bee9e50e6c2a4a2bf210eca25ee212ca24fa), [`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`3d93a15`](https://github.com/mastra-ai/mastra/commit/3d93a15796b158c617461c8b98bede476ebb43e2), [`9198899`](https://github.com/mastra-ai/mastra/commit/91988995c427b185c33714b7f3be955367911324), [`ed3e3dd`](https://github.com/mastra-ai/mastra/commit/ed3e3ddec69d564fe2b125e083437f76331f1283), [`c59e13c`](https://github.com/mastra-ai/mastra/commit/c59e13c7688284bd96b2baee3e314335003548de), [`c042bd0`](https://github.com/mastra-ai/mastra/commit/c042bd0b743e0e86199d0cb83344ca7690e34a9c), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`21a15de`](https://github.com/mastra-ai/mastra/commit/21a15de369fe82aac26bb642ed7be73505475e8b), [`e54953e`](https://github.com/mastra-ai/mastra/commit/e54953ed8ce1b28c0d62a19950163039af7834b4), [`ae8baf7`](https://github.com/mastra-ai/mastra/commit/ae8baf7d8adcb0ff9dac11880400452bc49b33ff), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`940a2b2`](https://github.com/mastra-ai/mastra/commit/940a2b27480626ed7e74f55806dcd2181c1dd0c2), [`1a0d3fc`](https://github.com/mastra-ai/mastra/commit/1a0d3fc811482c9c376cdf79ee615c23bae9b2d6), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`d5ed981`](https://github.com/mastra-ai/mastra/commit/d5ed981c8701c1b8a27a5f35a9a2f7d9244e695f), [`85a628b`](https://github.com/mastra-ai/mastra/commit/85a628b1224a8f64cd82ea7f033774bf22df7a7e), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`33a4d2e`](https://github.com/mastra-ai/mastra/commit/33a4d2e4ed8af51f69256232f00c34d6b6b51d48), [`9650cce`](https://github.com/mastra-ai/mastra/commit/9650cce52a1d917ff9114653398e2a0f5c3ba808), [`6c049d9`](https://github.com/mastra-ai/mastra/commit/6c049d94063fdcbd5b81c4912a2bf82a92c9cc0b), [`910db9e`](https://github.com/mastra-ai/mastra/commit/910db9e0312888495eb5617b567f247d03303814), [`2f897df`](https://github.com/mastra-ai/mastra/commit/2f897df208508f46f51b7625e5dd20c37f93e0e3), [`d629361`](https://github.com/mastra-ai/mastra/commit/d629361a60f6565b5bfb11976fdaf7308af858e2), [`4f94ed8`](https://github.com/mastra-ai/mastra/commit/4f94ed8177abfde3ec536e3574883e075423350c), [`feb7ee4`](https://github.com/mastra-ai/mastra/commit/feb7ee4d09a75edb46c6669a3beaceec78811747), [`4aaa844`](https://github.com/mastra-ai/mastra/commit/4aaa844a4f19d054490f43638a990cc57bda8d2f), [`c237233`](https://github.com/mastra-ai/mastra/commit/c23723399ccedf7f5744b3f40997b79246bfbe64), [`38380b6`](https://github.com/mastra-ai/mastra/commit/38380b60fca905824bdf6b43df307a58efb1aa15), [`6833c69`](https://github.com/mastra-ai/mastra/commit/6833c69607418d257750bbcdd84638993d343539), [`932d63d`](https://github.com/mastra-ai/mastra/commit/932d63dd51be9c8bf1e00e3671fe65606c6fb9cd), [`4a1a6cb`](https://github.com/mastra-ai/mastra/commit/4a1a6cb3facad54b2bb6780b00ce91d6de1edc08), [`08c31c1`](https://github.com/mastra-ai/mastra/commit/08c31c188ebccd598acaf55e888b6397d01f7eae), [`919a22b`](https://github.com/mastra-ai/mastra/commit/919a22b25876f9ed5891efe5facbe682c30ff497), [`15f9e21`](https://github.com/mastra-ai/mastra/commit/15f9e216177201ea6e3f6d0bfb063fcc0953444f), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`69136e7`](https://github.com/mastra-ai/mastra/commit/69136e748e32f57297728a4e0f9a75988462f1a7), [`b0e2ea5`](https://github.com/mastra-ai/mastra/commit/b0e2ea5b52c40fae438b9e2f7baee6f0f89c5442), [`f0a07e0`](https://github.com/mastra-ai/mastra/commit/f0a07e0111b3307c5fabfa4094c5c2cfb734fbe6), [`ff94dea`](https://github.com/mastra-ai/mastra/commit/ff94dea935f4e34545c63bcb6c29804732698809), [`0d41fe2`](https://github.com/mastra-ai/mastra/commit/0d41fe245355dfc66d61a0d9c85d9400aac351ff), [`b760b73`](https://github.com/mastra-ai/mastra/commit/b760b731aca7c8a3f041f61d57a7f125ae9cb215), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`449aed2`](https://github.com/mastra-ai/mastra/commit/449aed2ba9d507b75bf93d427646ea94f734dfd1), [`eb648a2`](https://github.com/mastra-ai/mastra/commit/eb648a2cc1728f7678768dd70cd77619b448dab9), [`695a621`](https://github.com/mastra-ai/mastra/commit/695a621528bdabeb87f83c2277cf2bb084c7f2b4), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`ac3cc23`](https://github.com/mastra-ai/mastra/commit/ac3cc2397d1966bc0fc2736a223abc449d3c7719), [`c456e01`](https://github.com/mastra-ai/mastra/commit/c456e0149e3c176afcefdbd9bb1d2c5917723725), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`a86f4df`](https://github.com/mastra-ai/mastra/commit/a86f4df0407311e0d2ea49b9a541f0938810d6a9), [`dd1c38d`](https://github.com/mastra-ai/mastra/commit/dd1c38d1b75f1b695c27b40d8d9d6ed00d5e0f6f), [`5948e6a`](https://github.com/mastra-ai/mastra/commit/5948e6a5146c83666ba3f294b2be576c82a513fb), [`5b2ff46`](https://github.com/mastra-ai/mastra/commit/5b2ff4651df70c146523a7fca773f8eb0a2272f8), [`edb07e4`](https://github.com/mastra-ai/mastra/commit/edb07e49283e0c28bd094a60e03439bf6ecf0221), [`e0941c3`](https://github.com/mastra-ai/mastra/commit/e0941c3d7fc75695d5d258e7008fd5d6e650800c), [`db41688`](https://github.com/mastra-ai/mastra/commit/db4168806d007417e2e60b4f68656dca4e5f40c9), [`2b459f4`](https://github.com/mastra-ai/mastra/commit/2b459f466fd91688eeb2a44801dc23f7f8a887ab), [`798d0c7`](https://github.com/mastra-ai/mastra/commit/798d0c740232653b1d754870e6b43a55c364ffe2), [`0c0580a`](https://github.com/mastra-ai/mastra/commit/0c0580a42f697cd2a7d5973f25bfe7da9055038a), [`83b08dc`](https://github.com/mastra-ai/mastra/commit/83b08dcf1bfcc915efab23c09207df90fa247908), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`f0f8f12`](https://github.com/mastra-ai/mastra/commit/f0f8f125c308f2d0fd36942ef652fd852df7522f), [`ab035c2`](https://github.com/mastra-ai/mastra/commit/ab035c2ef6d8cc7bb25f06f1a38508bd9e6f126b), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`103586c`](https://github.com/mastra-ai/mastra/commit/103586cb23ebcd2466c7f68a71674d37cc10e263), [`0131105`](https://github.com/mastra-ai/mastra/commit/0131105532e83bdcbb73352fc7d0879eebf140dc), [`5ca599d`](https://github.com/mastra-ai/mastra/commit/5ca599d0bb59a1595f19f58473fcd67cc71cef58), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`47b1c16`](https://github.com/mastra-ai/mastra/commit/47b1c16a01c7ffb6765fe1e499b49092f8b7eba3), [`4c6b492`](https://github.com/mastra-ai/mastra/commit/4c6b492c4dd591c6a592520c1f6855d6e936d71f), [`bff1145`](https://github.com/mastra-ai/mastra/commit/bff114556b3cbadad9b2768488708f8ad0e91475), [`dff01d8`](https://github.com/mastra-ai/mastra/commit/dff01d81ce1f4e4087cfac20fa868e6db138dd14), [`9d5059e`](https://github.com/mastra-ai/mastra/commit/9d5059eae810829935fb08e81a9bb7ecd5b144a7), [`ffe84d5`](https://github.com/mastra-ai/mastra/commit/ffe84d54f3b0f85167fe977efd027dba027eb998), [`5c8ca24`](https://github.com/mastra-ai/mastra/commit/5c8ca247094e0cc2cdbd7137822fb47241f86e77), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`a64d16a`](https://github.com/mastra-ai/mastra/commit/a64d16aedafe57ee5707bdcc25f96e07fa1a0233), [`24b76d8`](https://github.com/mastra-ai/mastra/commit/24b76d8e17656269c8ed09a0c038adb9cc2ae95a), [`31d13d5`](https://github.com/mastra-ai/mastra/commit/31d13d5fdc2e2380e2e3ee3ec9fb29d2a00f265d), [`ef756c6`](https://github.com/mastra-ai/mastra/commit/ef756c65f82d16531c43f49a27290a416611e526), [`e191844`](https://github.com/mastra-ai/mastra/commit/e1918444ca3f80e82feef1dad506cd4ec6e2875f), [`243a823`](https://github.com/mastra-ai/mastra/commit/243a8239c5906f5c94e4f78b54676793f7510ae3), [`b00ccd3`](https://github.com/mastra-ai/mastra/commit/b00ccd325ebd5d9e37e34dd0a105caae67eb568f), [`28f5f89`](https://github.com/mastra-ai/mastra/commit/28f5f89705f2409921e3c45178796c0e0d0bbb64), [`22553f1`](https://github.com/mastra-ai/mastra/commit/22553f11c63ee5e966a9c034a349822249584691), [`4c62166`](https://github.com/mastra-ai/mastra/commit/4c621669f4a29b1f443eca3ba70b814afa286266), [`e601b27`](https://github.com/mastra-ai/mastra/commit/e601b272c70f3a5ecca610373aa6223012704892), [`7d56d92`](https://github.com/mastra-ai/mastra/commit/7d56d9213886e8353956d7d40df10045fd12b299), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7bcbf10`](https://github.com/mastra-ai/mastra/commit/7bcbf10133516e03df964b941f9a34e9e4ab4177), [`029540c`](https://github.com/mastra-ai/mastra/commit/029540ca1e582fc2dd8d288ecd4a9b0f31a954ef), [`7237163`](https://github.com/mastra-ai/mastra/commit/72371635dbf96a87df4b073cc48fc655afbdce3d), [`2500740`](https://github.com/mastra-ai/mastra/commit/2500740ea23da067d6e50ec71c625ab3ce275e64), [`4353600`](https://github.com/mastra-ai/mastra/commit/43536005a65988a8eede236f69122e7f5a284ba2), [`653e65a`](https://github.com/mastra-ai/mastra/commit/653e65ae1f9502c2958a32f47a5a2df11e612a92), [`873ecbb`](https://github.com/mastra-ai/mastra/commit/873ecbb517586aa17d2f1e99283755b3ebb2863f), [`6986fb0`](https://github.com/mastra-ai/mastra/commit/6986fb064f5db6ecc24aa655e1d26529087b43b3), [`3d3366f`](https://github.com/mastra-ai/mastra/commit/3d3366f31683e7137d126a3a57174a222c5801fb), [`5a4953f`](https://github.com/mastra-ai/mastra/commit/5a4953f7d25bb15ca31ed16038092a39cb3f98b3), [`4f9bbe5`](https://github.com/mastra-ai/mastra/commit/4f9bbe5968f42c86f4930b8193de3c3c17e5bd36), [`efe406a`](https://github.com/mastra-ai/mastra/commit/efe406a1353c24993280ebc2ed61dd9f65b84b26), [`eb9e522`](https://github.com/mastra-ai/mastra/commit/eb9e522ce3070a405e5b949b7bf5609ca51d7fe2), [`fd3d338`](https://github.com/mastra-ai/mastra/commit/fd3d338a2c362174ed5b383f1f011ad9fb0302aa), [`20e6f19`](https://github.com/mastra-ai/mastra/commit/20e6f1971d51d3ff6dd7accad8aaaae826d540ed), [`053e979`](https://github.com/mastra-ai/mastra/commit/053e9793b28e970086b0507f7f3b76ea32c1e838), [`02e51fe`](https://github.com/mastra-ai/mastra/commit/02e51feddb3d4155cfbcc42624fd0d0970d032c0), [`51fec93`](https://github.com/mastra-ai/mastra/commit/51fec93ffd2f167b1247c23e5c04ed24e369ff75), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`3bdfa75`](https://github.com/mastra-ai/mastra/commit/3bdfa7507a91db66f176ba8221aa28dd546e464a), [`119e5c6`](https://github.com/mastra-ai/mastra/commit/119e5c65008f3e5cfca954eefc2eb85e3bf40da4), [`c6fd6fe`](https://github.com/mastra-ai/mastra/commit/c6fd6fedd09e9cf8004b03a80925f5e94826ad7e), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`8a6734a`](https://github.com/mastra-ai/mastra/commit/8a6734a9b3eb192ada1f723d248b08b2258dd6b3), [`fdac646`](https://github.com/mastra-ai/mastra/commit/fdac646033a0930a1a4e00d13aa64c40bb7f1e02), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`8f3fa3a`](https://github.com/mastra-ai/mastra/commit/8f3fa3a652bb77da092f913ec51ae46e3a7e27dc), [`d07b568`](https://github.com/mastra-ai/mastra/commit/d07b5687819ea8cb1dffa776d0c1765faf4aa1ae), [`e770de9`](https://github.com/mastra-ai/mastra/commit/e770de941a287a49b1964d44db5a5763d19890a6), [`e26dc9c`](https://github.com/mastra-ai/mastra/commit/e26dc9c3ccfec54ae3dc3e2b2589f741f9ae60a6), [`55edf73`](https://github.com/mastra-ai/mastra/commit/55edf7302149d6c964fbb7908b43babfc2b52145), [`c30400a`](https://github.com/mastra-ai/mastra/commit/c30400a49b994b1b97256fe785eb6c906fc2b232), [`486352b`](https://github.com/mastra-ai/mastra/commit/486352b66c746602b68a95839f830de14c7fb8c0), [`00f4921`](https://github.com/mastra-ai/mastra/commit/00f4921dd2c91a1e5446799599ef7116a8214a1a), [`1a46a56`](https://github.com/mastra-ai/mastra/commit/1a46a566f45a3fcbadc1cf36bf86d351f264bfa3), [`ca8041c`](https://github.com/mastra-ai/mastra/commit/ca8041cce0379fda22ed293a565bcb5b6ddca68a), [`b5dc973`](https://github.com/mastra-ai/mastra/commit/b5dc9733a5158850298dfb103acb3babdba8a318), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`f1bbc94`](https://github.com/mastra-ai/mastra/commit/f1bbc941934a4806f5512b3fb1507c77420336b1), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`52e2716`](https://github.com/mastra-ai/mastra/commit/52e2716b42df6eff443de72360ae83e86ec23993), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`4f0b3c6`](https://github.com/mastra-ai/mastra/commit/4f0b3c66f196c06448487f680ccbb614d281e2f7), [`27b4040`](https://github.com/mastra-ai/mastra/commit/27b4040bfa1a95d92546f420a02a626b1419a1d6), [`c61fac3`](https://github.com/mastra-ai/mastra/commit/c61fac3add96f0dcce0208c07415279e2537eb62), [`6f14f70`](https://github.com/mastra-ai/mastra/commit/6f14f706ccaaf81b69544b6c1b75ab66a41e5317), [`69e0a87`](https://github.com/mastra-ai/mastra/commit/69e0a878896a2da9494945d86e056a5f8f05b851), [`cd29ad2`](https://github.com/mastra-ai/mastra/commit/cd29ad23a255534e8191f249593849ed29160886), [`bdf4d8c`](https://github.com/mastra-ai/mastra/commit/bdf4d8cdc656d8a2c21d81834bfa3bfa70f56c16), [`854e3da`](https://github.com/mastra-ai/mastra/commit/854e3dad5daac17a91a20986399d3a51f54bf68b), [`ce18d38`](https://github.com/mastra-ai/mastra/commit/ce18d38678c65870350d123955014a8432075fd9), [`3cf540b`](https://github.com/mastra-ai/mastra/commit/3cf540b9fbfea8f4fc8d3a2319a4e6c0b0cbfd52), [`352a5d6`](https://github.com/mastra-ai/mastra/commit/352a5d625cfe09849b21e8f52a24c9f0366759d5), [`1c6ce51`](https://github.com/mastra-ai/mastra/commit/1c6ce51f875915ab57fd36873623013699a2a65d), [`74c4f22`](https://github.com/mastra-ai/mastra/commit/74c4f22ed4c71e72598eacc346ba95cdbc00294f), [`3a76a80`](https://github.com/mastra-ai/mastra/commit/3a76a80284cb71a0faa975abb3d4b2a9631e60cd), [`898a972`](https://github.com/mastra-ai/mastra/commit/898a9727d286c2510d6b702dfd367e6aaf5c6b0f), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`09e4bae`](https://github.com/mastra-ai/mastra/commit/09e4bae18dd5357d2ae078a4a95a2af32168ab08), [`026b848`](https://github.com/mastra-ai/mastra/commit/026b8483fbf5b6d977be8f7e6aac8d15c75558ac), [`2c212e7`](https://github.com/mastra-ai/mastra/commit/2c212e704c90e2db83d4109e62c03f0f6ebd2667), [`a97003a`](https://github.com/mastra-ai/mastra/commit/a97003aa1cf2f4022a41912324a1e77263b326b8), [`f9a2509`](https://github.com/mastra-ai/mastra/commit/f9a25093ea72d210a5e52cfcb3bcc8b5e02dc25c), [`66741d1`](https://github.com/mastra-ai/mastra/commit/66741d1a99c4f42cf23a16109939e8348ac6852e), [`ccc141e`](https://github.com/mastra-ai/mastra/commit/ccc141ed27da0abc3a3fc28e9e5128152e8e37f4), [`27c0009`](https://github.com/mastra-ai/mastra/commit/27c0009777a6073d7631b0eb7b481d94e165b5ca), [`01f8878`](https://github.com/mastra-ai/mastra/commit/01f88783de25e4de048c1c8aace43e26373c6ea5), [`dee388d`](https://github.com/mastra-ai/mastra/commit/dee388dde02f2e63c53385ae69252a47ab6825cc), [`610a70b`](https://github.com/mastra-ai/mastra/commit/610a70bdad282079f0c630e0d7bb284578f20151), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`b7e17d3`](https://github.com/mastra-ai/mastra/commit/b7e17d3f5390bb5a71efc112204413656fcdc18d), [`4c77209`](https://github.com/mastra-ai/mastra/commit/4c77209e6c11678808b365d545845918c40045c8), [`a854ede`](https://github.com/mastra-ai/mastra/commit/a854ede62bf5ac0945a624ac48913dd69c73aabf), [`fe3b897`](https://github.com/mastra-ai/mastra/commit/fe3b897c2ccbcd2b10e81b099438c7337feddf89), [`c576fc0`](https://github.com/mastra-ai/mastra/commit/c576fc0b100b2085afded91a37c97a0ea0ec09c7), [`3defc80`](https://github.com/mastra-ai/mastra/commit/3defc80cf2b88a1b7fc1cc4ddcb91e982a614609), [`f111eac`](https://github.com/mastra-ai/mastra/commit/f111eac5de509b2e5fccfc1882e7f74cda264c74), [`00123ba`](https://github.com/mastra-ai/mastra/commit/00123ba96dc9e5cd0b110420ebdba56d8f237b25), [`16153fe`](https://github.com/mastra-ai/mastra/commit/16153fe7eb13c99401f48e6ca32707c965ee28b9), [`9f4a683`](https://github.com/mastra-ai/mastra/commit/9f4a6833e88b52574665c028fd5508ad5c2f6004), [`bc94344`](https://github.com/mastra-ai/mastra/commit/bc943444a1342d8a662151b7bce1df7dae32f59c), [`4ca4306`](https://github.com/mastra-ai/mastra/commit/4ca430614daa5fa04730205a302a43bf4accfe9f), [`cccf9c8`](https://github.com/mastra-ai/mastra/commit/cccf9c8b2d2dfc1a5e63919395b83d78c89682a0), [`74e504a`](https://github.com/mastra-ai/mastra/commit/74e504a3b584eafd2f198001c6a113bbec589fd3), [`29c4309`](https://github.com/mastra-ai/mastra/commit/29c4309f818b24304c041bcb4a8f19b5f13f6b62), [`16785ce`](https://github.com/mastra-ai/mastra/commit/16785ced928f6f22638f4488cf8a125d99211799), [`57d157f`](https://github.com/mastra-ai/mastra/commit/57d157f0b163a95c3e6c9eae31bdb11d1bfc64f9), [`61a5705`](https://github.com/mastra-ai/mastra/commit/61a570551278b6743e64243b3ce7d73de915ca8a), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`3f3fc30`](https://github.com/mastra-ai/mastra/commit/3f3fc3096f24c4a26cffeecfe73085928f72aa63), [`d827d08`](https://github.com/mastra-ai/mastra/commit/d827d0808ffe1f3553a84e975806cc989b9735dd), [`e33fdbd`](https://github.com/mastra-ai/mastra/commit/e33fdbd07b33920d81e823122331b0c0bee0bb59), [`4524734`](https://github.com/mastra-ai/mastra/commit/45247343e384717a7c8404296275c56201d6470f), [`7a010c5`](https://github.com/mastra-ai/mastra/commit/7a010c56b846a313a49ae42fccd3d8de2b9f292d), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`2a53598`](https://github.com/mastra-ai/mastra/commit/2a53598c6d8cfeb904a7fc74e57e526d751c8fa6), [`81b6a8f`](https://github.com/mastra-ai/mastra/commit/81b6a8ff79f49a7549d15d66624ac1a0b8f5f971), [`8538a0d`](https://github.com/mastra-ai/mastra/commit/8538a0d232619bf55dad7ddc2a8b0ca77c679a87), [`d90ea65`](https://github.com/mastra-ai/mastra/commit/d90ea6536f7aa51c6545a4e9215b55858e98e16d), [`db70a48`](https://github.com/mastra-ai/mastra/commit/db70a48aeeeeb8e5f92007e8ede52c364ce15287), [`261473a`](https://github.com/mastra-ai/mastra/commit/261473ac637e633064a22076671e2e02b002214d), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`de8239b`](https://github.com/mastra-ai/mastra/commit/de8239bdcb1d8c0cfa06da21f1569912a66bbc8a), [`e4d366a`](https://github.com/mastra-ai/mastra/commit/e4d366aeb500371dd4210d6aa8361a4c21d87034), [`23c10a1`](https://github.com/mastra-ai/mastra/commit/23c10a1efdd9a693c405511ab2dc8a1236603162), [`b5e6cd7`](https://github.com/mastra-ai/mastra/commit/b5e6cd77fc8c8e64e0494c1d06cee3d84e795d1e), [`d171e55`](https://github.com/mastra-ai/mastra/commit/d171e559ead9f52ec728d424844c8f7b164c4510), [`f0fdc14`](https://github.com/mastra-ai/mastra/commit/f0fdc14ee233d619266b3d2bbdeea7d25cfc6d13), [`a4f010b`](https://github.com/mastra-ai/mastra/commit/a4f010b22e4355a5fdee70a1fe0f6e4a692cc29e), [`c7cd3c7`](https://github.com/mastra-ai/mastra/commit/c7cd3c7a187d7aaf79e2ca139de328bf609a14b4), [`db18bc9`](https://github.com/mastra-ai/mastra/commit/db18bc9c3825e2c1a0ad9a183cc9935f6691bfa1), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`68ec97d`](https://github.com/mastra-ai/mastra/commit/68ec97d4c07c6393fcf95c2481fc5d73da99f8c8), [`8dc7f55`](https://github.com/mastra-ai/mastra/commit/8dc7f55900395771da851dc7d78d53ae84fe34ec), [`cfabdd4`](https://github.com/mastra-ai/mastra/commit/cfabdd4aae7a726b706942d6836eeca110fb6267), [`9b37b56`](https://github.com/mastra-ai/mastra/commit/9b37b565e1f2a76c24f728945cc740c2b09be9da), [`01b20fe`](https://github.com/mastra-ai/mastra/commit/01b20fefb7c67c2b7d79417598ef4e60256d1225), [`dd4f34c`](https://github.com/mastra-ai/mastra/commit/dd4f34c78cbae24063463475b0619575c415f9b8), [`8379099`](https://github.com/mastra-ai/mastra/commit/8379099fc467af6bef54dd7f80c9bd75bf8bbddf), [`0dbf199`](https://github.com/mastra-ai/mastra/commit/0dbf199110f22192ce5c95b1c8148d4872b4d119), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`41a23c3`](https://github.com/mastra-ai/mastra/commit/41a23c32f9877d71810f37e24930515df2ff7a0f), [`a1bd7b8`](https://github.com/mastra-ai/mastra/commit/a1bd7b8571db16b94eb01588f451a74758c96d65), [`b06be72`](https://github.com/mastra-ai/mastra/commit/b06be7223d5ef23edc98c01a67ef713c6cc039f9), [`d78b38d`](https://github.com/mastra-ai/mastra/commit/d78b38d898fce285260d3bbb4befade54331617f), [`a0a5b4b`](https://github.com/mastra-ai/mastra/commit/a0a5b4bbebe6c701ebbadf744873aa0d5ca01371), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`5d171ad`](https://github.com/mastra-ai/mastra/commit/5d171ad9ef340387276b77c2bb3e83e83332d729), [`0633100`](https://github.com/mastra-ai/mastra/commit/0633100a911ad22f5256471bdf753da21c104742), [`3759cb0`](https://github.com/mastra-ai/mastra/commit/3759cb064935b5f74c65ac2f52a1145f7352899d), [`929f69c`](https://github.com/mastra-ai/mastra/commit/929f69c3436fa20dd0f0e2f7ebe8270bd82a1529), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`10c2735`](https://github.com/mastra-ai/mastra/commit/10c27355edfdad1ee2b826b897df74125eb81fb8), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`8c0ec25`](https://github.com/mastra-ai/mastra/commit/8c0ec25646c8a7df253ed1e5ff4863a0d3f1316c), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`69ea758`](https://github.com/mastra-ai/mastra/commit/69ea758358edd7117f191c2e69c8bb5fc79e7a1a), [`73b0bb3`](https://github.com/mastra-ai/mastra/commit/73b0bb394dba7c9482eb467a97ab283dbc0ef4db), [`651e772`](https://github.com/mastra-ai/mastra/commit/651e772eb1475fb13e126d3fcc01751297a88214), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`f03ae60`](https://github.com/mastra-ai/mastra/commit/f03ae60500fe350c9d828621006cdafe1975fdd8), [`6b3ba91`](https://github.com/mastra-ai/mastra/commit/6b3ba91494cc10394df96782f349a4f7b1e152cc), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`993ad98`](https://github.com/mastra-ai/mastra/commit/993ad98d7ad3bebda9ecef5fec5c94349a0d04bc), [`676ccc7`](https://github.com/mastra-ai/mastra/commit/676ccc7fe92468d2d45d39c31a87825c89fd1ea0), [`3ff2c17`](https://github.com/mastra-ai/mastra/commit/3ff2c17a58e312fad5ea37377262c12d92ca0908), [`a0e437f`](https://github.com/mastra-ai/mastra/commit/a0e437fac561b28ee719e0302d72b2f9b4c138f0), [`d1e74a0`](https://github.com/mastra-ai/mastra/commit/d1e74a0a293866dece31022047f5dbab65a304d0), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`5627a8c`](https://github.com/mastra-ai/mastra/commit/5627a8c6dc11fe3711b3fa7a6ffd6eb34100a306), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`c10398d`](https://github.com/mastra-ai/mastra/commit/c10398d5b88f1d4af556f4267ff06f1d11e89179), [`3ff45d1`](https://github.com/mastra-ai/mastra/commit/3ff45d10e0c80c5335a957ab563da72feb623520), [`f0f8f12`](https://github.com/mastra-ai/mastra/commit/f0f8f125c308f2d0fd36942ef652fd852df7522f), [`b61b93f`](https://github.com/mastra-ai/mastra/commit/b61b93f9e058b11dd2eec169853175d31dbdd567), [`bae33d9`](https://github.com/mastra-ai/mastra/commit/bae33d91a63fbb64d1e80519e1fc1acaed1e9013), [`39e7869`](https://github.com/mastra-ai/mastra/commit/39e7869bc7d0ee391077ce291474d8a84eedccff), [`0d7618b`](https://github.com/mastra-ai/mastra/commit/0d7618bc650bf2800934b243eca5648f4aeed9c2), [`7b763e5`](https://github.com/mastra-ai/mastra/commit/7b763e52fc3eaf699c2a99f2adf418dd46e4e9a5), [`251df45`](https://github.com/mastra-ai/mastra/commit/251df4531407dfa46d805feb40ff3fb49769f455), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`f894d14`](https://github.com/mastra-ai/mastra/commit/f894d148946629af7b1f452d65a9cf864cec3765), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`1924cf0`](https://github.com/mastra-ai/mastra/commit/1924cf06816e5e4d4d5333065ec0f4bb02a97799), [`c0b731f`](https://github.com/mastra-ai/mastra/commit/c0b731fb27d712dc8582e846df5c0332a6a0c5ba), [`5761926`](https://github.com/mastra-ai/mastra/commit/57619260c4a2cdd598763abbacd90de594c6bc76), [`0bada2f`](https://github.com/mastra-ai/mastra/commit/0bada2f2c1234932cf30c1c47a719ffb64b801c5), [`c2b9547`](https://github.com/mastra-ai/mastra/commit/c2b9547bf435f56339f23625a743b2147ab1c7a6), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`c900fdd`](https://github.com/mastra-ai/mastra/commit/c900fdd504c41348efdffb205cfe80d48c38fa33), [`9312dcd`](https://github.com/mastra-ai/mastra/commit/9312dcd1c6f5b321929e7d382e763d95fdc030f5), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`5d7000f`](https://github.com/mastra-ai/mastra/commit/5d7000f757cd65ea9dc5b05e662fd83dfd44e932), [`43ca8f2`](https://github.com/mastra-ai/mastra/commit/43ca8f2c7334851cc7b4d3d2f037d8784bfbdd5f), [`d6d49f7`](https://github.com/mastra-ai/mastra/commit/d6d49f7b8714fa19a52ff9c7cf7fb7e73751901e), [`00c2387`](https://github.com/mastra-ai/mastra/commit/00c2387f5f04a365316f851e58666ac43f8c4edf), [`a534e95`](https://github.com/mastra-ai/mastra/commit/a534e9591f83b3cc1ebff99c67edf4cda7bf81d3), [`9d0e7fe`](https://github.com/mastra-ai/mastra/commit/9d0e7feca8ed98de959f53476ee1456073673348), [`53d927c`](https://github.com/mastra-ai/mastra/commit/53d927cc6f03bff33655b7e2b788da445a08731d), [`ad6250d`](https://github.com/mastra-ai/mastra/commit/ad6250dbdaad927e29f74a27b83f6c468b50a705), [`580b592`](https://github.com/mastra-ai/mastra/commit/580b5927afc82fe460dfdf9a38a902511b6b7e7f), [`604a79f`](https://github.com/mastra-ai/mastra/commit/604a79fecf276e26a54a3fe01bb94e65315d2e0e), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`5a632bd`](https://github.com/mastra-ai/mastra/commit/5a632bdf7b78953b664f5e038e98d4ba5f971e47), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`ff4d9a6`](https://github.com/mastra-ai/mastra/commit/ff4d9a6704fc87b31a380a76ed22736fdedbba5a), [`50fd320`](https://github.com/mastra-ai/mastra/commit/50fd320003d0d93831c230ef531bef41f5ba7b3a), [`847c212`](https://github.com/mastra-ai/mastra/commit/847c212caba7df0d6f2fc756b494ac3c75c3720d), [`69821ef`](https://github.com/mastra-ai/mastra/commit/69821ef806482e2c44e2197ac0b050c3fe3a5285), [`3a73998`](https://github.com/mastra-ai/mastra/commit/3a73998fa4ebeb7f3dc9301afe78095fc63e7999), [`ffa553a`](https://github.com/mastra-ai/mastra/commit/ffa553a3edc1bd17d73669fba66d6b6f4ac10897), [`cc60ff6`](https://github.com/mastra-ai/mastra/commit/cc60ff616541a3b0fb531a7e469bf9ae7bb90528), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`58e3931`](https://github.com/mastra-ai/mastra/commit/58e3931af9baa5921688566210f00fb0c10479fa), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`0bed332`](https://github.com/mastra-ai/mastra/commit/0bed332843f627202c6520eaf671771313cd20f3), [`887f0b4`](https://github.com/mastra-ai/mastra/commit/887f0b4746cdbd7cb7d6b17ac9f82aeb58037ea5), [`2562143`](https://github.com/mastra-ai/mastra/commit/256214336b4faa78646c9c1776612393790d8784), [`b7959e6`](https://github.com/mastra-ai/mastra/commit/b7959e6e25a46b480f9ea2217c4c6c588c423791), [`a7ce182`](https://github.com/mastra-ai/mastra/commit/a7ce1822a8785ce45d62dd5c911af465e144f7d7), [`bda6370`](https://github.com/mastra-ai/mastra/commit/bda637009360649aaf579919e7873e33553c273e), [`d7acd8e`](https://github.com/mastra-ai/mastra/commit/d7acd8e987b5d7eff4fd98b0906c17c06a2e83d5), [`c7f1f7d`](https://github.com/mastra-ai/mastra/commit/c7f1f7d24f61f247f018cc2d1f33bf63212959a7), [`0bddc6d`](https://github.com/mastra-ai/mastra/commit/0bddc6d8dbd6f6008c0cba2e4960a2da75a55af1), [`bec5efd`](https://github.com/mastra-ai/mastra/commit/bec5efde96653ccae6604e68c696d1bc6c1a0bf5), [`5947fcd`](https://github.com/mastra-ai/mastra/commit/5947fcdd425531f29f9422026d466c2ee3113c93), [`4aa55b3`](https://github.com/mastra-ai/mastra/commit/4aa55b383cf06043943359ea316572fd969861a7), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`7907fd1`](https://github.com/mastra-ai/mastra/commit/7907fd1c5059813b7b870b81ca71041dc807331b), [`1ed5716`](https://github.com/mastra-ai/mastra/commit/1ed5716830867b3774c4a1b43cc0d82935f32b96), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`2ca67cc`](https://github.com/mastra-ai/mastra/commit/2ca67cc3bb1f6a617353fdcab197d9efebe60d6f), [`9eedf7d`](https://github.com/mastra-ai/mastra/commit/9eedf7de1d6e0022a2f4e5e9e6fe1ec468f9b43c), [`b339816`](https://github.com/mastra-ai/mastra/commit/b339816df0984d0243d944ac2655d6ba5f809cde), [`e16d553`](https://github.com/mastra-ai/mastra/commit/e16d55338403c7553531cc568125c63d53653dff), [`6f941c4`](https://github.com/mastra-ai/mastra/commit/6f941c438ca5f578619788acc7608fc2e23bd176), [`4186bdd`](https://github.com/mastra-ai/mastra/commit/4186bdd00731305726fa06adba0b076a1d50b49f), [`08bb631`](https://github.com/mastra-ai/mastra/commit/08bb631ae2b14684b2678e3549d0b399a6f0561e), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`4f0331a`](https://github.com/mastra-ai/mastra/commit/4f0331a79bf6eb5ee598a5086e55de4b5a0ada03), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b), [`cc34739`](https://github.com/mastra-ai/mastra/commit/cc34739c34b6266a91bea561119240a7acf47887), [`c218bd3`](https://github.com/mastra-ai/mastra/commit/c218bd3759e32423735b04843a09404572631014), [`9e67002`](https://github.com/mastra-ai/mastra/commit/9e67002b52c9be19936c420a489dbee9c5fd6a78), [`7aaf973`](https://github.com/mastra-ai/mastra/commit/7aaf973f83fbbe9521f1f9e7a4fd99b8de464617), [`2c4438b`](https://github.com/mastra-ai/mastra/commit/2c4438b87817ab7eed818c7990fef010475af1a3), [`35edc49`](https://github.com/mastra-ai/mastra/commit/35edc49ac0556db609189641d6341e76771b81fc), [`4d59f58`](https://github.com/mastra-ai/mastra/commit/4d59f58de2d90d6e2810a19d4518e38ddddb9038), [`ef11a61`](https://github.com/mastra-ai/mastra/commit/ef11a61920fa0ed08a5b7ceedd192875af119749), [`2b8893c`](https://github.com/mastra-ai/mastra/commit/2b8893cb108ef9acb72ee7835cd625610d2c1a4a), [`8e5c75b`](https://github.com/mastra-ai/mastra/commit/8e5c75bdb1d08a42d45309a4c72def4b6890230f), [`e1bb9c9`](https://github.com/mastra-ai/mastra/commit/e1bb9c94b4eb68b019ae275981be3feb769b5365), [`351a11f`](https://github.com/mastra-ai/mastra/commit/351a11fcaf2ed1008977fa9b9a489fc422e51cd4), [`8a73529`](https://github.com/mastra-ai/mastra/commit/8a73529ca01187f604b1f3019d0a725ac63ae55f), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`4fba91b`](https://github.com/mastra-ai/mastra/commit/4fba91bec7c95911dc28e369437596b152b04cd0), [`465ac05`](https://github.com/mastra-ai/mastra/commit/465ac0526a91d175542091c675181f1a96c98c46), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`8a000da`](https://github.com/mastra-ai/mastra/commit/8a000da0c09c679a2312f6b3aa05b2ca78ca7393), [`e7266a2`](https://github.com/mastra-ai/mastra/commit/e7266a278db02035c97a5e9cd9d1669a6b7a535d), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019), [`12b0cc4`](https://github.com/mastra-ai/mastra/commit/12b0cc4077d886b1a552637dedb70a7ade93528c), [`3bf6c5f`](https://github.com/mastra-ai/mastra/commit/3bf6c5f104c25226cd84e0c77f9dec15f2cac2db)]:
|
|
34
|
+
- @mastra/core@1.0.0
|
|
35
|
+
- @mastra/observability@1.0.0
|
|
36
|
+
|
|
37
|
+
## 1.0.0-beta.4
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- Added `flush()` method to observability exporters and instances for serverless environments ([#12003](https://github.com/mastra-ai/mastra/pull/12003))
|
|
42
|
+
|
|
43
|
+
This feature allows flushing buffered spans without shutting down the exporter, which is useful in serverless environments like Vercel's fluid compute where runtime instances can be reused across multiple requests.
|
|
44
|
+
|
|
45
|
+
**New API:**
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// Flush all exporters via the observability instance
|
|
49
|
+
const observability = mastra.getObservability();
|
|
50
|
+
await observability.flush();
|
|
51
|
+
|
|
52
|
+
// Or flush individual exporters
|
|
53
|
+
const exporters = observability.getExporters();
|
|
54
|
+
await exporters[0].flush();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Why this matters:**
|
|
58
|
+
|
|
59
|
+
In serverless environments, you may need to ensure all spans are exported before the runtime instance is terminated, while keeping the exporter active for future requests. Unlike shutdown(), flush() does not release resources or prevent future exports.
|
|
60
|
+
|
|
61
|
+
Closes #11372
|
|
62
|
+
|
|
63
|
+
- Updated dependencies [[`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`1dbd8c7`](https://github.com/mastra-ai/mastra/commit/1dbd8c729fb6536ec52f00064d76b80253d346e9), [`c59e13c`](https://github.com/mastra-ai/mastra/commit/c59e13c7688284bd96b2baee3e314335003548de), [`f9a2509`](https://github.com/mastra-ai/mastra/commit/f9a25093ea72d210a5e52cfcb3bcc8b5e02dc25c), [`7a010c5`](https://github.com/mastra-ai/mastra/commit/7a010c56b846a313a49ae42fccd3d8de2b9f292d)]:
|
|
64
|
+
- @mastra/core@1.0.0-beta.24
|
|
65
|
+
- @mastra/observability@1.0.0-beta.13
|
|
66
|
+
|
|
3
67
|
## 1.0.0-beta.3
|
|
4
68
|
|
|
5
69
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -263,6 +263,20 @@ var LaminarExporter = class extends observability.BaseExporter {
|
|
|
263
263
|
});
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* Force flush any buffered spans without shutting down the exporter.
|
|
268
|
+
* This is useful in serverless environments where you need to ensure spans
|
|
269
|
+
* are exported before the runtime instance is terminated.
|
|
270
|
+
*/
|
|
271
|
+
async flush() {
|
|
272
|
+
if (this.isDisabled || !this.processor) return;
|
|
273
|
+
try {
|
|
274
|
+
await this.processor.forceFlush();
|
|
275
|
+
this.logger.debug("[LaminarExporter] Flushed pending spans");
|
|
276
|
+
} catch (error) {
|
|
277
|
+
this.logger.error("[LaminarExporter] Error flushing spans", { error });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
266
280
|
async shutdown() {
|
|
267
281
|
try {
|
|
268
282
|
await this.processor?.shutdown();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tracing.ts"],"names":["BaseExporter","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TracingEventType","TraceFlags","OTLPTraceExporter","SimpleSpanProcessor","BatchSpanProcessor","SpanType","SpanStatusCode","SpanKind"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: true,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n\n private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/g, '');\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tracing.ts"],"names":["BaseExporter","resourceFromAttributes","ATTR_SERVICE_NAME","ATTR_SERVICE_VERSION","ATTR_TELEMETRY_SDK_NAME","ATTR_TELEMETRY_SDK_VERSION","ATTR_TELEMETRY_SDK_LANGUAGE","TracingEventType","TraceFlags","OTLPTraceExporter","SimpleSpanProcessor","BatchSpanProcessor","SpanType","SpanStatusCode","SpanKind"],"mappings":";;;;;;;;;;;AAiCA,IAAM,eAAA,GAAkB,iBAAA;AACxB,IAAM,gBAAA,GAAmB,kBAAA;AACzB,IAAM,cAAA,GAAiB,gBAAA;AACvB,IAAM,cAAA,GAAiB,gBAAA;AACvB,IAAM,kBAAA,GAAqB,oBAAA;AAC3B,IAAM,gCAAA,GAAmC,kCAAA;AACzC,IAAM,qBAAA,GAAwB,uBAAA;AAC9B,IAAM,0BAAA,GAA6B,4BAAA;AAEnC,IAAM,uBAAA,GAA0B,6BAAA;AAChC,IAAM,eAAA,GAAkB,GAAG,uBAAuB,CAAA,WAAA,CAAA;AAClD,IAAM,YAAA,GAAe,GAAG,uBAAuB,CAAA,QAAA,CAAA;AAC/C,IAAM,SAAA,GAAY,GAAG,uBAAuB,CAAA,KAAA,CAAA;AAG5C,IAAM,aAAA,GAAgB,eAAA;AACtB,IAAM,oBAAA,GAAuB,sBAAA;AAC7B,IAAM,qBAAA,GAAwB,uBAAA;AAC9B,IAAM,yBAAA,GAA4B,2BAAA;AAClC,IAAM,0BAAA,GAA6B,4BAAA;AACnC,IAAM,+BAAA,GAAkC,0CAAA;AACxC,IAAM,8BAAA,GAAiC,sCAAA;AA+DhC,IAAM,eAAA,GAAN,cAA8BA,0BAAA,CAAa;AAAA,EAChD,IAAA,GAAO,SAAA;AAAA,EAEC,MAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAAwB;AAAA,EAEvC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EAElB,WAAA,CAAY,MAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,oBAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,WAAA;AAAA,QACH;AAAA,OACF;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,CAAI,gBAAA;AAChC,IAAA,MAAM,UAAU,kBAAA,CAAmB,MAAA,CAAO,WAAW,OAAA,CAAQ,GAAA,CAAI,iBAAiB,qBAAqB,CAAA;AACvG,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,WAAA,IAAe,GAAG,OAAO,CAAA,UAAA,CAAA;AAE7D,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,GAAG,MAAA,CAAO,OAAA;AAAA,MACV,aAAA,EAAe,UAAU,MAAM,CAAA;AAAA,KACjC;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,MAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU,OAAO,QAAA,IAAY,KAAA;AAAA,MAC7B,YAAA,EAAc,OAAO,YAAA,IAAgB,KAAA;AAAA,MACrC,SAAA,EAAW,OAAO,SAAA,IAAa,GAAA;AAAA,MAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB;AAAA,KACzC;AAAA,EACF;AAAA,EAEA,KAAK,OAAA,EAAoC;AAEvC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,WAAA,IAAe,gBAAA;AAEnD,IAAA,IAAA,CAAK,WAAWC,gCAAA,CAAuB;AAAA,MACrC,CAACC,qCAAiB,GAAG,WAAA;AAAA,MACrB,CAACC,wCAAoB,GAAG,SAAA;AAAA,MACxB,CAACC,2CAAuB,GAAG,iBAAA;AAAA,MAC3B,CAACC,8CAA0B,GAAG,SAAA;AAAA,MAC9B,CAACC,+CAA2B,GAAG;AAAA,KAChC,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,KAAA,EAAoC;AAEtE,IAAA,IAAI,MAAM,IAAA,KAASC,gCAAA,CAAiB,gBAAgB,CAAC,KAAA,CAAM,aAAa,OAAA,EAAS;AAC/E,MAAA,IAAA,CAAK,iBAAA,CAAkB,MAAM,YAAY,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,IAAA,KAASA,gCAAA,CAAiB,UAAA,EAAY;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,YAAY,CAAA;AAAA,EAC/C;AAAA,EAEQ,kBAAkB,IAAA,EAA6B;AACrD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAC1D,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,IAAA,MAAM,aAAa,QAAA,GAAW,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AACtE,IAAA,MAAM,gBAAgB,QAAA,GAAW,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAE5E,IAAA,MAAM,QAAA,GAAW,aAAa,CAAC,GAAG,YAAY,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,CAAC,GAAG,eAAe,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAC,CAAA,GAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAC,CAAA;AAE9G,IAAA,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAC7C,IAAA,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,WAAW,CAAA;AACnD,IAAA,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,EACtC;AAAA,EAEA,MAAc,gBAAgB,IAAA,EAAsC;AAClE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,aAAA,EAAc;AAEzB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,QAAA,EAAU;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAG1D,IAAA,IAAI,CAAC,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAC,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACrF,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,MAAA,MAAM,aAAa,QAAA,GAAW,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AACtE,MAAA,MAAM,gBAAgB,QAAA,GAAW,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAE5E,MAAA,MAAM,QAAA,GAAW,aAAa,CAAC,GAAG,YAAY,IAAI,CAAA,GAAI,CAAC,IAAI,CAAA;AAC3D,MAAA,MAAM,WAAA,GAAc,aAAA,GAAgB,CAAC,GAAG,eAAe,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAC,CAAA,GAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAC,CAAA;AAE9G,MAAA,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAC7C,MAAA,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,WAAW,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,UAAU,CAAA;AACxD,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,QAAQ,CAAA;AAE7B,MAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,QAAA,MAAM,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,MAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,yCAAA,EAA2C,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IAChH,CAAA,SAAE;AAEA,MAAA,UAAA,CAAW,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAEvC,MAAA,IAAI,UAAA,CAAW,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG;AACvC,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAAA,EAA6B;AACzD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,UAAU,OAAO,QAAA;AAErB,IAAA,MAAM,OAAA,GAAsB;AAAA,MAC1B,YAAA,sBAAkB,GAAA,EAAI;AAAA,MACtB,eAAA,sBAAqB,GAAA,EAAI;AAAA,MACzB,aAAA,sBAAmB,GAAA;AAAI,KACzB;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAClC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,MAAuB,UAAA,EAAsC;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,CAAC,KAAK,KAAA,EAAO;AAEjC,MAAA,IAAA,CAAK,WAAWN,gCAAA,CAAuB;AAAA,QACrC,CAACC,qCAAiB,GAAG,gBAAA;AAAA,QACrB,CAACC,wCAAoB,GAAG,SAAA;AAAA,QACxB,CAACC,2CAAuB,GAAG,iBAAA;AAAA,QAC3B,CAACC,8CAA0B,GAAG,SAAA;AAAA,QAC9B,CAACC,+CAA2B,GAAG;AAAA,OAChC,CAAA;AACD,MAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAS,SAAA,EAAU;AAAA,IAC7D;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAElC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AAC7C,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,SAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,SAAA,EAAW,KAAK,OAAO,CAAA;AAE7D,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,oBAAA,CAAqB,MAAM,SAAS,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,EAAE,CAAA;AAEtC,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAYE,cAAA,CAAW,OAAA;AAAA,MACvB,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,MAAM,iBAAA,GAAoB,KAAK,YAAA,GAC3B;AAAA,MACE,OAAA;AAAA,MACA,MAAA,EAAQ,eAAA,CAAgB,IAAA,CAAK,YAAY,CAAA;AAAA,MACzC,YAAYA,cAAA,CAAW,OAAA;AAAA,MACvB,QAAA,EAAU;AAAA,KACZ,GACA,MAAA;AAEJ,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,IAAA,EAAM,UAAU,CAAA;AAE1D,IAAA,MAAM,QAAgB,EAAC;AAEvB,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,IAAA;AAAA,MACA,IAAA;AAAA,MACA,aAAa,MAAM,WAAA;AAAA,MACnB,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,sBAAsB,IAAA,CAAK,KAAA;AAAA,MAC3B,sBAAA,EAAwB,CAAA;AAAA,MACxB,kBAAA,EAAoB,CAAA;AAAA,MACpB,iBAAA,EAAmB;AAAA,KACrB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,aAAA,GAA+B;AAC3C,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,EAAQ;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIC,wCAAA,CAAkB;AAAA,MACpC,GAAA,EAAK,KAAK,MAAA,CAAO,QAAA;AAAA,MACjB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,aAAA,EAAe,KAAK,MAAA,CAAO;AAAA,KAC5B,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,YAAA,GACzB,IAAIC,gCAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,GACrC,IAAIC,+BAAA,CAAmB,IAAA,CAAK,QAAA,EAAU;AAAA,MACpC,kBAAA,EAAoB,KAAK,MAAA,CAAO,SAAA;AAAA,MAChC,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,KAClC,CAAA;AAEL,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACjB;AAAA,EAEA,MAAM,gBAAA,CAAiB;AAAA,IACrB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,EAOkB;AAChB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,IAAA,EAAM,UAAA;AAAA,MACN,KAAA;AAAA,MACA,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,EAAE,GAAI,QAAA,IAAY,EAAC,EAAI,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC;AAAG,KACjE;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,MAAA,GAAS,iBAAiB,MAAM,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,OAAA,GAAU,kBAAkB,OAAO,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAuC;AAAA,QAC3C,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,QAC3C,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,mBAAmB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA,oBAAA,CAAA,EAAwB;AAAA,QAC7F,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,YAAA;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wDAAA,EAA0D;AAAA,UACzE,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,OAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uDAAA,EAAyD;AAAA,QACzE,KAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,SAAA,EAAW;AAExC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,UAAA,EAAW;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yCAAyC,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,EAAE,OAAO,CAAA;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,WAAW,QAAA,EAAS;AAAA,IACjC,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,MAAA,MAAM,MAAM,QAAA,EAAS;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,sBAAA,CAAuB,MAAuB,UAAA,EAAoC;AACzF,EAAA,MAAM,aAAyB,EAAC;AAEhC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,YAAA,CAAa,GAAA,CAAI,KAAK,EAAE,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,eAAA,CAAgB,GAAA,CAAI,KAAK,EAAE,CAAA;AAE1D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,UAAA,CAAW,cAAc,CAAA,GAAI,QAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,UAAA,CAAW,kBAAkB,CAAA,GAAI,WAAA;AAAA,EACnC;AAEA,EAAA,UAAA,CAAW,cAAc,CAAA,GAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACzD,EAAA,UAAA,CAAW,gCAAgC,CAAA,GAAI,YAAA;AAG/C,EAAA,UAAA,CAAW,qBAAqB,CAAA,GAAI,SAAA;AACpC,EAAA,UAAA,CAAW,0BAA0B,IAAI,OAAA,CAAQ,OAAA;AAGjD,EAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAU,SAAA;AACjC,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,SAAS,CAAA,EAAG;AACzD,IAAA,UAAA,CAAW,eAAe,CAAA,GAAI,SAAA;AAAA,EAChC;AAEA,EAAA,MAAM,MAAA,GAAS,KAAK,QAAA,EAAU,MAAA;AAC9B,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACnD,IAAA,UAAA,CAAW,YAAY,CAAA,GAAI,MAAA;AAAA,EAC7B;AAIA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxD,MAAA,IAAI,QAAQ,WAAA,IAAe,GAAA,KAAQ,YAAY,KAAA,KAAU,MAAA,IAAa,UAAU,IAAA,EAAM;AACpF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,wBAAwB,KAAK,CAAA;AACpD,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,CAAA,EAAG,uBAAuB,CAAA,UAAA,EAAa,GAAG,EAAE,CAAA,GAAI,cAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ;AACxC,IAAA,UAAA,CAAW,SAAS,IAAI,IAAA,CAAK,IAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,UAAA,CAAW,eAAe,CAAA,GAAI,mBAAA,CAAoB,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,IAAA,UAAA,CAAW,gBAAgB,CAAA,GAAI,mBAAA,CAAoB,IAAA,CAAK,MAAM,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,IAAA,CAAK,IAAA,KAASC,wBAAA,CAAS,gBAAA,EAAkB;AAC3C,IAAA,MAAM,UAAA,GAAc,IAAA,CAAK,UAAA,IAAc,EAAC;AAExC,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,UAAA,CAAW,aAAa,CAAA,GAAI,iBAAA,CAAkB,UAAA,CAAW,QAAQ,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,UAAA,CAAW,oBAAoB,IAAI,UAAA,CAAW,KAAA;AAAA,IAChD;AAEA,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,UAAA,CAAW,qBAAqB,IAAI,UAAA,CAAW,aAAA;AAAA,IACjD;AAEA,IAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,kBAAA,CAAmB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBAAmB,QAAA,EAAqC;AAC/D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAKA,wBAAA,CAAS,gBAAA;AAAA,IACd,KAAKA,wBAAA,CAAS,UAAA;AAAA,IACd,KAAKA,wBAAA,CAAS,WAAA;AACZ,MAAA,OAAO,KAAA;AAAA,IACT,KAAKA,wBAAA,CAAS,SAAA;AAAA,IACd,KAAKA,wBAAA,CAAS,aAAA;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,mBAAmB,KAAA,EAAgC;AAC1D,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAM,MAAkB,EAAC;AAEzB,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,GAAA,CAAI,yBAAyB,IAAI,KAAA,CAAM,WAAA;AAAA,EACzC;AAEA,EAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAW;AACpC,IAAA,GAAA,CAAI,0BAA0B,IAAI,KAAA,CAAM,YAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,UAAA,KAAe,MAAA,EAAW;AAChD,IAAA,GAAA,CAAI,+BAA+B,CAAA,GAAI,KAAA,CAAM,YAAA,CAAa,UAAA;AAAA,EAC5D;AAEA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,SAAA,KAAc,MAAA,EAAW;AAC/C,IAAA,GAAA,CAAI,8BAA8B,CAAA,GAAI,KAAA,CAAM,YAAA,CAAa,SAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,oBAAoB,KAAA,EAAwB;AACnD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,kBAAA;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,IAAA,EAAgC;AAG3D,EAAA,IAAI,IAAA,CAAK,IAAA,KAASA,wBAAA,CAAS,gBAAA,EAAkB;AAC3C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAiB,KAAA,CAAiC,QAAA;AACxD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,GAAI,aAAA,GAAgB,KAAA;AACxD;AAEA,SAAS,wBAAwB,KAAA,EAAgD;AAC/E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AACxF,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,aAAA,GACJ,MAAM,KAAA,CAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,KACtC,KAAA,CAAM,KAAA,CAAM,OAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,IACtC,KAAA,CAAM,MAAM,CAAA,CAAA,KAAK,OAAO,MAAM,SAAS,CAAA;AACzC,IAAA,IAAI,eAAe,OAAO,KAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,oBAAoB,KAAK,CAAA;AAClC;AAKA,SAAS,aAAa,IAAA,EAAoB;AACxC,EAAA,MAAM,EAAA,GAAK,KAAK,OAAA,EAAQ;AACxB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACpC,EAAA,MAAM,WAAA,GAAe,KAAK,GAAA,GAAQ,GAAA;AAClC,EAAA,OAAO,CAAC,SAAS,WAAW,CAAA;AAC9B;AAEA,SAAS,eAAA,CAAgB,OAAa,GAAA,EAAoB;AACxD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,CAAC,GAAG,CAAC,CAAA;AACtB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,EAAQ,GAAI,MAAM,OAAA,EAAQ;AAC7C,EAAA,OAAO,CAAC,KAAK,KAAA,CAAM,MAAA,GAAS,GAAI,CAAA,EAAI,MAAA,GAAS,MAAQ,GAAS,CAAA;AAChE;AAEA,SAAS,oBAAA,CACP,MACA,WAAA,EAC8C;AAC9C,EAAA,MAAM,SAAuB,EAAC;AAE9B,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,MAAMC,kBAAA,CAAe,KAAA;AAAA,MACrB,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,KAC1B;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,WAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,mBAAA,EAAqB,KAAK,SAAA,CAAU,OAAA;AAAA,QACpC,gBAAA,EAAkB,OAAA;AAAA,QAClB,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAA,IAAS;AAAA,UACnC,sBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ;AAAA;AACjD,OACF;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,sBAAA,EAAwB;AAAA,KACzB,CAAA;AAED,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA,EAC1B;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,IAAA,EAAMA,kBAAA,CAAe,EAAA,EAAG;AAAA,IAClC;AAAA,GACF;AACF;AAEA,SAAS,YAAY,IAAA,EAA0B;AAC7C,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAKD,wBAAA,CAAS,gBAAA;AAAA,IACd,KAAKA,wBAAA,CAAS,aAAA;AACZ,MAAA,OAAOE,YAAA,CAAS,MAAA;AAAA,IAClB;AACE,MAAA,OAAOA,YAAA,CAAS,QAAA;AAAA;AAEtB;AAEA,SAAS,mBAAmB,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAChC;AAEA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,IAAI,EAAA,GAAK,QAAQ,WAAA,EAAY;AAC7B,EAAA,IAAI,GAAG,UAAA,CAAW,IAAI,GAAG,EAAA,GAAK,EAAA,CAAG,MAAM,CAAC,CAAA;AACxC,EAAA,OAAO,GAAG,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA,CAAE,MAAM,GAAG,CAAA;AACvC;AAEA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,IAAI,EAAA,GAAK,OAAO,WAAA,EAAY;AAC5B,EAAA,IAAI,GAAG,UAAA,CAAW,IAAI,GAAG,EAAA,GAAK,EAAA,CAAG,MAAM,CAAC,CAAA;AACxC,EAAA,OAAO,GAAG,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA,CAAE,MAAM,GAAG,CAAA;AACvC;AAEO,SAAS,iBAAiB,MAAA,EAAwB;AACvD,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AACzC,EAAA,OAAO,WACJ,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA,CAChB,OAAA,CAAQ,wEAAwE,gBAAgB,CAAA;AACrG;AAEO,SAAS,kBAAkB,OAAA,EAAyB;AACzD,EAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,sEAAA,EAAwE,gBAAgB,CAAA;AACpH;AAEA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,EAAM,EAAG,WAAA,EAAY,CAAE,IAAA,EAAK,IAAK,QAAA,CAAS,WAAA,GAAc,IAAA,EAAK;AAC1F","file":"index.cjs","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: true,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n\n private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/g, '');\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -261,6 +261,20 @@ var LaminarExporter = class extends BaseExporter {
|
|
|
261
261
|
});
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Force flush any buffered spans without shutting down the exporter.
|
|
266
|
+
* This is useful in serverless environments where you need to ensure spans
|
|
267
|
+
* are exported before the runtime instance is terminated.
|
|
268
|
+
*/
|
|
269
|
+
async flush() {
|
|
270
|
+
if (this.isDisabled || !this.processor) return;
|
|
271
|
+
try {
|
|
272
|
+
await this.processor.forceFlush();
|
|
273
|
+
this.logger.debug("[LaminarExporter] Flushed pending spans");
|
|
274
|
+
} catch (error) {
|
|
275
|
+
this.logger.error("[LaminarExporter] Error flushing spans", { error });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
264
278
|
async shutdown() {
|
|
265
279
|
try {
|
|
266
280
|
await this.processor?.shutdown();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: true,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n\n private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/g, '');\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tracing.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Laminar Exporter for Mastra Observability\n *\n * This exporter sends observability data to Laminar via OTLP/HTTP (protobuf).\n * It also implements addScoreToTrace() to attach scorer results in Laminar.\n */\n\nimport type {\n AnyExportedSpan,\n InitExporterOptions,\n ModelGenerationAttributes,\n TracingEvent,\n UsageStats,\n} from '@mastra/core/observability';\nimport { SpanType, TracingEventType } from '@mastra/core/observability';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport { SpanKind, SpanStatusCode, TraceFlags } from '@opentelemetry/api';\nimport type { Attributes, HrTime, Link, SpanContext, SpanStatus } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { Resource } from '@opentelemetry/resources';\nimport { BatchSpanProcessor, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type { ReadableSpan, SpanExporter, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\n// Laminar span attributes\nconst LMNR_SPAN_INPUT = 'lmnr.span.input';\nconst LMNR_SPAN_OUTPUT = 'lmnr.span.output';\nconst LMNR_SPAN_TYPE = 'lmnr.span.type';\nconst LMNR_SPAN_PATH = 'lmnr.span.path';\nconst LMNR_SPAN_IDS_PATH = 'lmnr.span.ids_path';\nconst LMNR_SPAN_INSTRUMENTATION_SOURCE = 'lmnr.span.instrumentation_source';\nconst LMNR_SPAN_SDK_VERSION = 'lmnr.span.sdk_version';\nconst LMNR_SPAN_LANGUAGE_VERSION = 'lmnr.span.language_version';\n\nconst LMNR_ASSOCIATION_PREFIX = 'lmnr.association.properties';\nconst LMNR_SESSION_ID = `${LMNR_ASSOCIATION_PREFIX}.session_id`;\nconst LMNR_USER_ID = `${LMNR_ASSOCIATION_PREFIX}.user_id`;\nconst LMNR_TAGS = `${LMNR_ASSOCIATION_PREFIX}.tags`;\n\n// Laminar GenAI attributes (as used by Laminar backend)\nconst GEN_AI_SYSTEM = 'gen_ai.system';\nconst GEN_AI_REQUEST_MODEL = 'gen_ai.request.model';\nconst GEN_AI_RESPONSE_MODEL = 'gen_ai.response.model';\nconst GEN_AI_USAGE_INPUT_TOKENS = 'gen_ai.usage.input_tokens';\nconst GEN_AI_USAGE_OUTPUT_TOKENS = 'gen_ai.usage.output_tokens';\nconst GEN_AI_CACHE_WRITE_INPUT_TOKENS = 'gen_ai.usage.cache_creation_input_tokens';\nconst GEN_AI_CACHE_READ_INPUT_TOKENS = 'gen_ai.usage.cache_read_input_tokens';\n\ntype LaminarSpanType = 'DEFAULT' | 'LLM' | 'TOOL';\n\ntype TraceState = {\n spanPathById: Map<string, string[]>;\n spanIdsPathById: Map<string, string[]>;\n activeSpanIds: Set<string>;\n};\n\ntype InstrumentationScope = {\n name: string;\n version?: string;\n schemaUrl?: string;\n};\n\nexport interface LaminarExporterConfig extends BaseExporterConfig {\n /**\n * Laminar project API key. Defaults to `process.env.LMNR_PROJECT_API_KEY`.\n */\n apiKey?: string;\n /**\n * Base URL for Laminar APIs. Defaults to `process.env.LMNR_BASE_URL` or `https://api.lmnr.ai`.\n *\n * Used for:\n * - trace exports (if `endpoint`/`LAMINAR_ENDPOINT` are not set)\n * - evaluator scoring (`/v1/evaluators/score`)\n */\n baseUrl?: string;\n /**\n * Full OTLP/HTTP traces endpoint. Defaults to `process.env.LAMINAR_ENDPOINT` or `${baseUrl}/v1/traces`.\n */\n endpoint?: string;\n /**\n * Additional headers to include in OTLP requests.\n */\n headers?: Record<string, string>;\n /**\n * Flush after each span for near-realtime visibility.\n */\n realtime?: boolean;\n /**\n * Disable batching (uses SimpleSpanProcessor).\n */\n disableBatch?: boolean;\n /**\n * Max spans to export per batch (BatchSpanProcessor only).\n */\n batchSize?: number;\n /**\n * OTLP export timeout in milliseconds.\n */\n timeoutMillis?: number;\n}\n\ntype ResolvedLaminarConfig = Required<Pick<LaminarExporterConfig, 'realtime' | 'disableBatch' | 'batchSize'>> & {\n apiKey: string;\n baseUrl: string;\n endpoint: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n};\n\nexport class LaminarExporter extends BaseExporter {\n name = 'laminar';\n\n private config: ResolvedLaminarConfig | null;\n private traceMap = new Map<string, TraceState>();\n\n private resource?: Resource;\n private scope?: InstrumentationScope;\n private processor?: BatchSpanProcessor | SimpleSpanProcessor;\n private exporter?: SpanExporter;\n private isSetup = false;\n\n constructor(config: LaminarExporterConfig = {}) {\n super(config);\n\n const apiKey = config.apiKey ?? process.env.LMNR_PROJECT_API_KEY;\n if (!apiKey) {\n this.setDisabled(\n 'Missing required API key. Set LMNR_PROJECT_API_KEY environment variable or pass apiKey in config.',\n );\n this.config = null;\n return;\n }\n\n const envEndpoint = process.env.LAMINAR_ENDPOINT;\n const baseUrl = stripTrailingSlash(config.baseUrl ?? process.env.LMNR_BASE_URL ?? 'https://api.lmnr.ai');\n const endpoint = config.endpoint ?? envEndpoint ?? `${baseUrl}/v1/traces`;\n\n const headers: Record<string, string> = {\n ...config.headers,\n Authorization: `Bearer ${apiKey}`,\n };\n\n this.config = {\n apiKey,\n baseUrl,\n endpoint,\n headers,\n realtime: config.realtime ?? false,\n disableBatch: config.disableBatch ?? false,\n batchSize: config.batchSize ?? 512,\n timeoutMillis: config.timeoutMillis ?? 30000,\n };\n }\n\n init(options: InitExporterOptions): void {\n // Build resource & scope lazily so we can include serviceName.\n const serviceName = options.config?.serviceName || 'mastra-service';\n\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: serviceName,\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n\n this.scope = {\n name: '@mastra/laminar',\n version: 'unknown',\n };\n }\n\n protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n // Track hierarchy on span start to build lmnr.span.path/ids_path for child spans.\n if (event.type === TracingEventType.SPAN_STARTED && !event.exportedSpan.isEvent) {\n this.handleSpanStarted(event.exportedSpan);\n return;\n }\n\n // Only export when the span is ended (including event spans).\n if (event.type !== TracingEventType.SPAN_ENDED) {\n return;\n }\n\n await this.handleSpanEnded(event.exportedSpan);\n }\n\n private handleSpanStarted(span: AnyExportedSpan): void {\n const traceState = this.getOrCreateTraceState(span.traceId);\n const name = span.name;\n\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n traceState.activeSpanIds.add(span.id);\n }\n\n private async handleSpanEnded(span: AnyExportedSpan): Promise<void> {\n if (!this.config) {\n return;\n }\n\n await this.setupIfNeeded();\n\n if (!this.processor || !this.exporter) {\n return;\n }\n\n const traceState = this.getOrCreateTraceState(span.traceId);\n\n // Ensure we have path data even for event spans (which never emit SPAN_STARTED).\n if (!traceState.spanPathById.has(span.id) || !traceState.spanIdsPathById.has(span.id)) {\n const name = span.name;\n const parentId = span.parentSpanId;\n const parentPath = parentId ? traceState.spanPathById.get(parentId) : undefined;\n const parentIdsPath = parentId ? traceState.spanIdsPathById.get(parentId) : undefined;\n\n const spanPath = parentPath ? [...parentPath, name] : [name];\n const spanIdsPath = parentIdsPath ? [...parentIdsPath, otelSpanIdToUUID(span.id)] : [otelSpanIdToUUID(span.id)];\n\n traceState.spanPathById.set(span.id, spanPath);\n traceState.spanIdsPathById.set(span.id, spanIdsPath);\n }\n\n try {\n const otelSpan = this.convertSpanToOtel(span, traceState);\n this.processor.onEnd(otelSpan);\n\n if (this.config.realtime) {\n await this.processor.forceFlush();\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Failed to export span', { error, spanId: span.id, traceId: span.traceId });\n } finally {\n // Refcount cleanup (non-event spans only; event spans never enter active set)\n traceState.activeSpanIds.delete(span.id);\n\n if (traceState.activeSpanIds.size === 0) {\n this.traceMap.delete(span.traceId);\n }\n }\n }\n\n private getOrCreateTraceState(traceId: string): TraceState {\n const existing = this.traceMap.get(traceId);\n if (existing) return existing;\n\n const created: TraceState = {\n spanPathById: new Map(),\n spanIdsPathById: new Map(),\n activeSpanIds: new Set(),\n };\n this.traceMap.set(traceId, created);\n return created;\n }\n\n private convertSpanToOtel(span: AnyExportedSpan, traceState: TraceState): ReadableSpan {\n if (!this.resource || !this.scope) {\n // init() is optional; fall back to defaults if it wasn't called for some reason.\n this.resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: 'mastra-service',\n [ATTR_SERVICE_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_NAME]: '@mastra/laminar',\n [ATTR_TELEMETRY_SDK_VERSION]: 'unknown',\n [ATTR_TELEMETRY_SDK_LANGUAGE]: 'nodejs',\n });\n this.scope = { name: '@mastra/laminar', version: 'unknown' };\n }\n\n const name = span.name;\n const kind = getSpanKind(span.type);\n\n const startTime = dateToHrTime(span.startTime);\n const endTime = span.endTime ? dateToHrTime(span.endTime) : startTime;\n const duration = computeDuration(span.startTime, span.endTime);\n\n const { status, events } = buildStatusAndEvents(span, startTime);\n\n const traceId = normalizeTraceId(span.traceId);\n const spanId = normalizeSpanId(span.id);\n\n const spanContext: SpanContext = {\n traceId,\n spanId,\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n };\n\n const parentSpanContext = span.parentSpanId\n ? {\n traceId,\n spanId: normalizeSpanId(span.parentSpanId),\n traceFlags: TraceFlags.SAMPLED,\n isRemote: false,\n }\n : undefined;\n\n const attributes = buildLaminarAttributes(span, traceState);\n\n const links: Link[] = [];\n\n const readable: ReadableSpan = {\n name,\n kind,\n spanContext: () => spanContext,\n parentSpanContext,\n startTime,\n endTime,\n status,\n attributes,\n links,\n events,\n duration,\n ended: true,\n resource: this.resource,\n instrumentationScope: this.scope,\n droppedAttributesCount: 0,\n droppedEventsCount: 0,\n droppedLinksCount: 0,\n };\n\n return readable;\n }\n\n private async setupIfNeeded(): Promise<void> {\n if (this.isSetup || !this.config) {\n return;\n }\n\n this.exporter = new OTLPTraceExporter({\n url: this.config.endpoint,\n headers: this.config.headers,\n timeoutMillis: this.config.timeoutMillis,\n });\n\n this.processor = this.config.disableBatch\n ? new SimpleSpanProcessor(this.exporter)\n : new BatchSpanProcessor(this.exporter, {\n maxExportBatchSize: this.config.batchSize,\n exportTimeoutMillis: this.config.timeoutMillis,\n });\n\n this.isSetup = true;\n }\n\n async _addScoreToTrace({\n traceId,\n spanId,\n score,\n reason,\n scorerName,\n metadata,\n }: {\n traceId: string;\n spanId?: string;\n score: number;\n reason?: string;\n scorerName: string;\n metadata?: Record<string, any>;\n }): Promise<void> {\n if (!this.config) return;\n\n const payload: Record<string, unknown> = {\n name: scorerName,\n score,\n source: 'Code',\n metadata: { ...(metadata ?? {}), ...(reason ? { reason } : {}) },\n };\n\n if (spanId) {\n payload.spanId = otelSpanIdToUUID(spanId);\n } else {\n payload.traceId = otelTraceIdToUUID(traceId);\n }\n\n try {\n const scoreHeaders: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n 'content-type': 'application/json',\n };\n\n const response = await fetch(`${stripTrailingSlash(this.config.baseUrl)}/v1/evaluators/score`, {\n method: 'POST',\n headers: scoreHeaders,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n this.logger.warn('[LaminarExporter] Failed to attach score to trace/span', {\n status: response.status,\n statusText: response.statusText,\n traceId,\n spanId,\n scorerName,\n });\n }\n } catch (error) {\n this.logger.error('[LaminarExporter] Error attaching score to trace/span', {\n error,\n traceId,\n spanId,\n scorerName,\n });\n }\n }\n\n /**\n * Force flush any buffered spans without shutting down the exporter.\n * This is useful in serverless environments where you need to ensure spans\n * are exported before the runtime instance is terminated.\n */\n async flush(): Promise<void> {\n if (this.isDisabled || !this.processor) return;\n\n try {\n await this.processor.forceFlush();\n this.logger.debug('[LaminarExporter] Flushed pending spans');\n } catch (error) {\n this.logger.error('[LaminarExporter] Error flushing spans', { error });\n }\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.processor?.shutdown();\n } finally {\n this.traceMap.clear();\n await super.shutdown();\n }\n }\n}\n\nfunction buildLaminarAttributes(span: AnyExportedSpan, traceState: TraceState): Attributes {\n const attributes: Attributes = {};\n\n const spanPath = traceState.spanPathById.get(span.id);\n const spanIdsPath = traceState.spanIdsPathById.get(span.id);\n\n if (spanPath) {\n attributes[LMNR_SPAN_PATH] = spanPath;\n }\n\n if (spanIdsPath) {\n attributes[LMNR_SPAN_IDS_PATH] = spanIdsPath;\n }\n\n attributes[LMNR_SPAN_TYPE] = mapLaminarSpanType(span.type);\n attributes[LMNR_SPAN_INSTRUMENTATION_SOURCE] = 'javascript';\n\n // These attributes are optional in Laminar, but helpful for debugging.\n attributes[LMNR_SPAN_SDK_VERSION] = 'unknown';\n attributes[LMNR_SPAN_LANGUAGE_VERSION] = process.version;\n\n // Association properties\n const sessionId = span.metadata?.sessionId;\n if (typeof sessionId === 'string' && sessionId.length > 0) {\n attributes[LMNR_SESSION_ID] = sessionId;\n }\n\n const userId = span.metadata?.userId;\n if (typeof userId === 'string' && userId.length > 0) {\n attributes[LMNR_USER_ID] = userId;\n }\n\n // Attach Mastra metadata as Laminar trace/span metadata (best-effort, scalar/array-only)\n // Laminar treats `lmnr.association.properties.metadata.*` as freeform metadata.\n if (span.metadata) {\n for (const [key, value] of Object.entries(span.metadata)) {\n if (key === 'sessionId' || key === 'userId' || value === undefined || value === null) {\n continue;\n }\n\n const attributeValue = toLaminarAttributeValue(value);\n if (attributeValue === undefined) {\n continue;\n }\n\n attributes[`${LMNR_ASSOCIATION_PREFIX}.metadata.${key}`] = attributeValue;\n }\n }\n\n if (span.isRootSpan && span.tags?.length) {\n attributes[LMNR_TAGS] = span.tags;\n }\n\n // Span input/output (Laminar prefers these over gen_ai.* / other conventions)\n if (span.input !== undefined) {\n attributes[LMNR_SPAN_INPUT] = serializeForLaminar(getLaminarSpanInput(span));\n }\n\n if (span.output !== undefined) {\n attributes[LMNR_SPAN_OUTPUT] = serializeForLaminar(span.output);\n }\n\n if (span.type === SpanType.MODEL_GENERATION) {\n const modelAttrs = (span.attributes ?? {}) as ModelGenerationAttributes;\n\n if (modelAttrs.provider) {\n attributes[GEN_AI_SYSTEM] = normalizeProvider(modelAttrs.provider);\n }\n\n if (modelAttrs.model) {\n attributes[GEN_AI_REQUEST_MODEL] = modelAttrs.model;\n }\n\n if (modelAttrs.responseModel) {\n attributes[GEN_AI_RESPONSE_MODEL] = modelAttrs.responseModel;\n }\n\n Object.assign(attributes, formatLaminarUsage(modelAttrs.usage));\n }\n\n return attributes;\n}\n\nfunction mapLaminarSpanType(spanType: SpanType): LaminarSpanType {\n switch (spanType) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MODEL_STEP:\n case SpanType.MODEL_CHUNK:\n return 'LLM';\n case SpanType.TOOL_CALL:\n case SpanType.MCP_TOOL_CALL:\n return 'TOOL';\n default:\n return 'DEFAULT';\n }\n}\n\nfunction formatLaminarUsage(usage?: UsageStats): Attributes {\n if (!usage) return {};\n\n const out: Attributes = {};\n\n if (usage.inputTokens !== undefined) {\n out[GEN_AI_USAGE_INPUT_TOKENS] = usage.inputTokens;\n }\n\n if (usage.outputTokens !== undefined) {\n out[GEN_AI_USAGE_OUTPUT_TOKENS] = usage.outputTokens;\n }\n\n if (usage.inputDetails?.cacheWrite !== undefined) {\n out[GEN_AI_CACHE_WRITE_INPUT_TOKENS] = usage.inputDetails.cacheWrite;\n }\n\n if (usage.inputDetails?.cacheRead !== undefined) {\n out[GEN_AI_CACHE_READ_INPUT_TOKENS] = usage.inputDetails.cacheRead;\n }\n\n return out;\n}\n\nfunction serializeForLaminar(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction getLaminarSpanInput(span: AnyExportedSpan): unknown {\n // Mastra MODEL_GENERATION spans commonly use `{ messages, ... }` as input.\n // Laminar can render rich chat views when `lmnr.span.input` is a message list.\n if (span.type !== SpanType.MODEL_GENERATION) {\n return span.input;\n }\n\n const input = span.input;\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return input;\n }\n\n const maybeMessages = (input as { messages?: unknown }).messages;\n return Array.isArray(maybeMessages) ? maybeMessages : input;\n}\n\nfunction toLaminarAttributeValue(value: unknown): Attributes[string] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n const isHomogeneous =\n value.every(v => typeof v === 'string') ||\n value.every(v => typeof v === 'number') ||\n value.every(v => typeof v === 'boolean');\n if (isHomogeneous) return value;\n }\n\n return serializeForLaminar(value);\n}\n\n/**\n * Convert JavaScript Date to hrtime format\n */\nfunction dateToHrTime(date: Date): HrTime {\n const ms = date.getTime();\n const seconds = Math.floor(ms / 1000);\n const nanoseconds = (ms % 1000) * 1_000_000;\n return [seconds, nanoseconds];\n}\n\nfunction computeDuration(start: Date, end?: Date): HrTime {\n if (!end) return [0, 0];\n const diffMs = end.getTime() - start.getTime();\n return [Math.floor(diffMs / 1000), (diffMs % 1000) * 1_000_000];\n}\n\nfunction buildStatusAndEvents(\n span: AnyExportedSpan,\n defaultTime: HrTime,\n): { status: SpanStatus; events: TimedEvent[] } {\n const events: TimedEvent[] = [];\n\n if (span.errorInfo) {\n const status: SpanStatus = {\n code: SpanStatusCode.ERROR,\n message: span.errorInfo.message,\n };\n\n events.push({\n name: 'exception',\n attributes: {\n 'exception.message': span.errorInfo.message,\n 'exception.type': 'Error',\n ...(span.errorInfo.details?.stack && {\n 'exception.stacktrace': span.errorInfo.details.stack as string,\n }),\n },\n time: defaultTime,\n droppedAttributesCount: 0,\n });\n\n return { status, events };\n }\n\n return {\n status: { code: SpanStatusCode.OK },\n events,\n };\n}\n\nfunction getSpanKind(type: SpanType): SpanKind {\n switch (type) {\n case SpanType.MODEL_GENERATION:\n case SpanType.MCP_TOOL_CALL:\n return SpanKind.CLIENT;\n default:\n return SpanKind.INTERNAL;\n }\n}\n\nfunction stripTrailingSlash(url: string): string {\n return url.replace(/\\/+$/g, '');\n}\n\nfunction normalizeTraceId(traceId: string): string {\n let id = traceId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(32, '0').slice(-32);\n}\n\nfunction normalizeSpanId(spanId: string): string {\n let id = spanId.toLowerCase();\n if (id.startsWith('0x')) id = id.slice(2);\n return id.padStart(16, '0').slice(-16);\n}\n\nexport function otelSpanIdToUUID(spanId: string): string {\n const normalized = normalizeSpanId(spanId);\n return normalized\n .padStart(32, '0')\n .replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nexport function otelTraceIdToUUID(traceId: string): string {\n const normalized = normalizeTraceId(traceId);\n return normalized.replace(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '$1-$2-$3-$4-$5');\n}\n\nfunction normalizeProvider(provider: string): string {\n return provider.split('.').shift()?.toLowerCase().trim() || provider.toLowerCase().trim();\n}\n"]}
|
package/dist/tracing.d.ts
CHANGED
|
@@ -70,6 +70,12 @@ export declare class LaminarExporter extends BaseExporter {
|
|
|
70
70
|
scorerName: string;
|
|
71
71
|
metadata?: Record<string, any>;
|
|
72
72
|
}): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Force flush any buffered spans without shutting down the exporter.
|
|
75
|
+
* This is useful in serverless environments where you need to ensure spans
|
|
76
|
+
* are exported before the runtime instance is terminated.
|
|
77
|
+
*/
|
|
78
|
+
flush(): Promise<void>;
|
|
73
79
|
shutdown(): Promise<void>;
|
|
74
80
|
}
|
|
75
81
|
export declare function otelSpanIdToUUID(spanId: string): string;
|
package/dist/tracing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,YAAY,EAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsDhE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,IAAI,SAAa;IAEjB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAiC;IAEjD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,qBAA0B;IAiC9C,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;cAkBxB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,OAAO,CAAC,iBAAiB;YAgBX,eAAe;IA8C7B,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;YAoEX,aAAa;IAqBrB,gBAAgB,CAAC,EACrB,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,GACT,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../src/tracing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAEV,mBAAmB,EAEnB,YAAY,EAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsDhE,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAUD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,IAAI,SAAa;IAEjB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAiC;IAEjD,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,qBAA0B;IAiC9C,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;cAkBxB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,OAAO,CAAC,iBAAiB;YAgBX,eAAe;IA8C7B,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,iBAAiB;YAoEX,aAAa;IAqBrB,gBAAgB,CAAC,EACrB,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,GACT,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAQhC;AAuPD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/laminar",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Laminar observability provider for Mastra - tracing + scoring export",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"@opentelemetry/resources": "^2.1.0",
|
|
30
30
|
"@opentelemetry/sdk-trace-base": "^2.1.0",
|
|
31
31
|
"@opentelemetry/semantic-conventions": "1.38.0",
|
|
32
|
-
"@mastra/observability": "1.0.0
|
|
32
|
+
"@mastra/observability": "1.0.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "22.13.17",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"tsup": "^8.5.0",
|
|
40
40
|
"typescript": "^5.9.3",
|
|
41
41
|
"vitest": "4.0.16",
|
|
42
|
-
"@internal/lint": "0.0.
|
|
43
|
-
"@internal/types-builder": "0.0.
|
|
44
|
-
"@mastra/core": "1.0.0
|
|
42
|
+
"@internal/lint": "0.0.54",
|
|
43
|
+
"@internal/types-builder": "0.0.29",
|
|
44
|
+
"@mastra/core": "1.0.0"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|