langwatch 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/dist/{add-WLIE6XEG.mjs → add-HDTFJTR3.mjs} +10 -7
  2. package/dist/{add-WLIE6XEG.mjs.map → add-HDTFJTR3.mjs.map} +1 -1
  3. package/dist/{add-OYRTMKQO.js → add-WJ3GGNII.js} +13 -10
  4. package/dist/add-WJ3GGNII.js.map +1 -0
  5. package/dist/assign-4RE6OK5Z.mjs +50 -0
  6. package/dist/assign-4RE6OK5Z.mjs.map +1 -0
  7. package/dist/assign-DYJ67ZWP.js +50 -0
  8. package/dist/assign-DYJ67ZWP.js.map +1 -0
  9. package/dist/chunk-2VVANTLB.js +68 -0
  10. package/dist/chunk-2VVANTLB.js.map +1 -0
  11. package/dist/{chunk-L5Z7F7MG.mjs → chunk-43STSE3B.mjs} +2 -2
  12. package/dist/{chunk-MPOVGCVD.mjs → chunk-6DI23E36.mjs} +3 -3
  13. package/dist/chunk-6VJ2UBYR.mjs +33 -0
  14. package/dist/chunk-6VJ2UBYR.mjs.map +1 -0
  15. package/dist/{chunk-HYPS247A.mjs → chunk-AARKNSIH.mjs} +8 -6
  16. package/dist/{chunk-HYPS247A.mjs.map → chunk-AARKNSIH.mjs.map} +1 -1
  17. package/dist/chunk-AGHEWK62.mjs +59 -0
  18. package/dist/chunk-AGHEWK62.mjs.map +1 -0
  19. package/dist/{chunk-CCDYGS72.mjs → chunk-BORL2BGW.mjs} +10 -8
  20. package/dist/chunk-BORL2BGW.mjs.map +1 -0
  21. package/dist/chunk-BWMZJ4JY.js +59 -0
  22. package/dist/chunk-BWMZJ4JY.js.map +1 -0
  23. package/dist/chunk-CLYXJJ6C.js +66 -0
  24. package/dist/chunk-CLYXJJ6C.js.map +1 -0
  25. package/dist/chunk-COMOCQA6.mjs +13 -0
  26. package/dist/chunk-COMOCQA6.mjs.map +1 -0
  27. package/dist/{chunk-5LYWRKDF.js → chunk-DB6OJGP4.js} +2 -60
  28. package/dist/chunk-DB6OJGP4.js.map +1 -0
  29. package/dist/chunk-DRU3H2VX.mjs +85 -0
  30. package/dist/chunk-DRU3H2VX.mjs.map +1 -0
  31. package/dist/chunk-DTEKJ3UD.mjs +66 -0
  32. package/dist/chunk-DTEKJ3UD.mjs.map +1 -0
  33. package/dist/{chunk-FMYG6IOZ.mjs → chunk-FARZEN6T.mjs} +2 -2
  34. package/dist/chunk-FFNSKOV2.js +85 -0
  35. package/dist/chunk-FFNSKOV2.js.map +1 -0
  36. package/dist/chunk-FG3JQBJB.mjs +68 -0
  37. package/dist/chunk-FG3JQBJB.mjs.map +1 -0
  38. package/dist/chunk-FXOQFCAQ.js +674 -0
  39. package/dist/chunk-FXOQFCAQ.js.map +1 -0
  40. package/dist/{chunk-IJWZY7FY.js → chunk-FYWUIW7K.js} +12 -10
  41. package/dist/chunk-FYWUIW7K.js.map +1 -0
  42. package/dist/{chunk-HZAW7WTJ.js → chunk-GYYRDOFU.js} +17 -17
  43. package/dist/{chunk-HZAW7WTJ.js.map → chunk-GYYRDOFU.js.map} +1 -1
  44. package/dist/{chunk-VCC7F6B7.js → chunk-H6F5OGSL.js} +11 -11
  45. package/dist/{chunk-VCC7F6B7.js.map → chunk-H6F5OGSL.js.map} +1 -1
  46. package/dist/{chunk-44V235QR.js → chunk-HV75NBGG.js} +2 -2
  47. package/dist/{chunk-44V235QR.js.map → chunk-HV75NBGG.js.map} +1 -1
  48. package/dist/{chunk-22J3GPSB.js → chunk-K5RFDRTR.js} +110 -111
  49. package/dist/chunk-K5RFDRTR.js.map +1 -0
  50. package/dist/chunk-M3WJZUOE.js +13 -0
  51. package/dist/chunk-M3WJZUOE.js.map +1 -0
  52. package/dist/{chunk-JVIQJFUE.mjs → chunk-M4IBRWUC.mjs} +2 -60
  53. package/dist/chunk-M4IBRWUC.mjs.map +1 -0
  54. package/dist/chunk-MUSWAQMZ.mjs +46 -0
  55. package/dist/chunk-MUSWAQMZ.mjs.map +1 -0
  56. package/dist/{chunk-CIMNUH6E.mjs → chunk-NKL37OJU.mjs} +14 -7
  57. package/dist/chunk-NKL37OJU.mjs.map +1 -0
  58. package/dist/chunk-OAAMDWSK.js +65 -0
  59. package/dist/chunk-OAAMDWSK.js.map +1 -0
  60. package/dist/chunk-QATD3MYQ.mjs +674 -0
  61. package/dist/chunk-QATD3MYQ.mjs.map +1 -0
  62. package/dist/{chunk-DCKVBP6R.mjs → chunk-QCUJJSWS.mjs} +2 -2
  63. package/dist/{chunk-DCKVBP6R.mjs.map → chunk-QCUJJSWS.mjs.map} +1 -1
  64. package/dist/chunk-R2N4RS3O.js +33 -0
  65. package/dist/chunk-R2N4RS3O.js.map +1 -0
  66. package/dist/{chunk-JSD3JAHK.js → chunk-RFWYQPGX.js} +16 -14
  67. package/dist/chunk-RFWYQPGX.js.map +1 -0
  68. package/dist/chunk-RKJDDUGQ.mjs +65 -0
  69. package/dist/chunk-RKJDDUGQ.mjs.map +1 -0
  70. package/dist/{chunk-SPEPSXKI.js → chunk-TXLQ67D3.js} +16 -9
  71. package/dist/chunk-TXLQ67D3.js.map +1 -0
  72. package/dist/chunk-U3QHT2XN.js +46 -0
  73. package/dist/chunk-U3QHT2XN.js.map +1 -0
  74. package/dist/{chunk-QD7BOTQC.mjs → chunk-W6LLLSCE.mjs} +104 -105
  75. package/dist/chunk-W6LLLSCE.mjs.map +1 -0
  76. package/dist/{chunk-QNT5P6VV.js → chunk-ZZL6VZZU.js} +2 -2
  77. package/dist/{chunk-QNT5P6VV.js.map → chunk-ZZL6VZZU.js.map} +1 -1
  78. package/dist/cli/index.js +172 -16
  79. package/dist/cli/index.js.map +1 -1
  80. package/dist/cli/index.mjs +172 -16
  81. package/dist/cli/index.mjs.map +1 -1
  82. package/dist/create-KRWNLZSG.js +47 -0
  83. package/dist/create-KRWNLZSG.js.map +1 -0
  84. package/dist/create-NU7AQCFV.js +38 -0
  85. package/dist/create-NU7AQCFV.js.map +1 -0
  86. package/dist/create-QWQSNPTO.js +18 -0
  87. package/dist/create-QWQSNPTO.js.map +1 -0
  88. package/dist/create-RAZZO2W2.mjs +38 -0
  89. package/dist/create-RAZZO2W2.mjs.map +1 -0
  90. package/dist/create-TCQDVSGM.mjs +47 -0
  91. package/dist/create-TCQDVSGM.mjs.map +1 -0
  92. package/dist/create-TH7EZWKS.mjs +18 -0
  93. package/dist/delete-5AYFLOXU.js +62 -0
  94. package/dist/delete-5AYFLOXU.js.map +1 -0
  95. package/dist/delete-JDWOOZ3V.mjs +36 -0
  96. package/dist/delete-JDWOOZ3V.mjs.map +1 -0
  97. package/dist/delete-JGQJZMYH.js +55 -0
  98. package/dist/delete-JGQJZMYH.js.map +1 -0
  99. package/dist/delete-JTABVSQ3.mjs +55 -0
  100. package/dist/delete-JTABVSQ3.mjs.map +1 -0
  101. package/dist/delete-OP2UOPWZ.js +36 -0
  102. package/dist/delete-OP2UOPWZ.js.map +1 -0
  103. package/dist/delete-R65HWSNX.mjs +62 -0
  104. package/dist/delete-R65HWSNX.mjs.map +1 -0
  105. package/dist/download-NJBXSCJA.js +96 -0
  106. package/dist/download-NJBXSCJA.js.map +1 -0
  107. package/dist/download-W6M43RXJ.mjs +96 -0
  108. package/dist/download-W6M43RXJ.mjs.map +1 -0
  109. package/dist/get-7LNIOD7J.js +82 -0
  110. package/dist/get-7LNIOD7J.js.map +1 -0
  111. package/dist/get-B3IEMUXD.mjs +82 -0
  112. package/dist/get-B3IEMUXD.mjs.map +1 -0
  113. package/dist/get-K6TMIWQK.js +81 -0
  114. package/dist/get-K6TMIWQK.js.map +1 -0
  115. package/dist/get-QNJG5KQI.mjs +81 -0
  116. package/dist/get-QNJG5KQI.mjs.map +1 -0
  117. package/dist/{implementation-8fGNr_Mq.d.ts → implementation-Bhxy8sNw.d.ts} +1 -1
  118. package/dist/{implementation-DPQ9ez-J.d.mts → implementation-D3RUOFRX.d.mts} +1 -1
  119. package/dist/index.d.mts +390 -28
  120. package/dist/index.d.ts +390 -28
  121. package/dist/index.js +49 -196
  122. package/dist/index.js.map +1 -1
  123. package/dist/index.mjs +38 -185
  124. package/dist/index.mjs.map +1 -1
  125. package/dist/list-ESCIURJG.mjs +45 -0
  126. package/dist/list-ESCIURJG.mjs.map +1 -0
  127. package/dist/list-GR5TWKOC.mjs +70 -0
  128. package/dist/list-GR5TWKOC.mjs.map +1 -0
  129. package/dist/list-HFRDNM2A.js +81 -0
  130. package/dist/list-HFRDNM2A.js.map +1 -0
  131. package/dist/{list-TVCERIYC.js → list-MTDELPPO.js} +28 -71
  132. package/dist/list-MTDELPPO.js.map +1 -0
  133. package/dist/list-Q4PHG7X6.js +45 -0
  134. package/dist/list-Q4PHG7X6.js.map +1 -0
  135. package/dist/list-SB6HQETV.mjs +81 -0
  136. package/dist/list-SB6HQETV.mjs.map +1 -0
  137. package/dist/{list-LZTSDYZO.mjs → list-SDQ4LZU7.mjs} +24 -67
  138. package/dist/list-SDQ4LZU7.mjs.map +1 -0
  139. package/dist/list-YFJPNGR6.js +70 -0
  140. package/dist/list-YFJPNGR6.js.map +1 -0
  141. package/dist/{login-IC7I2IMY.mjs → login-IK3G3RQU.mjs} +2 -2
  142. package/dist/{login-2SBOQ62B.js → login-YTDM7X4O.js} +3 -3
  143. package/dist/{login-2SBOQ62B.js.map → login-YTDM7X4O.js.map} +1 -1
  144. package/dist/observability-sdk/index.d.mts +3 -3
  145. package/dist/observability-sdk/index.d.ts +3 -3
  146. package/dist/observability-sdk/index.js +8 -6
  147. package/dist/observability-sdk/index.js.map +1 -1
  148. package/dist/observability-sdk/index.mjs +13 -11
  149. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
  150. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
  151. package/dist/observability-sdk/instrumentation/langchain/index.js +17 -16
  152. package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
  153. package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -2
  154. package/dist/observability-sdk/instrumentation/langchain/index.mjs.map +1 -1
  155. package/dist/observability-sdk/setup/node/index.js +6 -5
  156. package/dist/observability-sdk/setup/node/index.js.map +1 -1
  157. package/dist/observability-sdk/setup/node/index.mjs +5 -4
  158. package/dist/pull-4JNOLLDT.js +23 -0
  159. package/dist/pull-4JNOLLDT.js.map +1 -0
  160. package/dist/pull-S7VIDGCP.mjs +23 -0
  161. package/dist/push-5SDFS745.mjs +23 -0
  162. package/dist/push-5SDFS745.mjs.map +1 -0
  163. package/dist/push-OM2UJSDQ.js +23 -0
  164. package/dist/push-OM2UJSDQ.js.map +1 -0
  165. package/dist/records-add-FFWQKH7L.js +82 -0
  166. package/dist/records-add-FFWQKH7L.js.map +1 -0
  167. package/dist/records-add-HK35CE5Y.mjs +82 -0
  168. package/dist/records-add-HK35CE5Y.mjs.map +1 -0
  169. package/dist/records-delete-CPDG57RE.js +42 -0
  170. package/dist/records-delete-CPDG57RE.js.map +1 -0
  171. package/dist/records-delete-OUTZGP2T.mjs +42 -0
  172. package/dist/records-delete-OUTZGP2T.mjs.map +1 -0
  173. package/dist/records-list-3WD7NOL2.js +81 -0
  174. package/dist/records-list-3WD7NOL2.js.map +1 -0
  175. package/dist/records-list-TNPIGZHJ.mjs +81 -0
  176. package/dist/records-list-TNPIGZHJ.mjs.map +1 -0
  177. package/dist/records-update-JBBGKLI3.mjs +49 -0
  178. package/dist/records-update-JBBGKLI3.mjs.map +1 -0
  179. package/dist/records-update-PSQTQQM5.js +49 -0
  180. package/dist/records-update-PSQTQQM5.js.map +1 -0
  181. package/dist/{remove-AIXQHYLS.js → remove-6PRYZKKI.js} +12 -9
  182. package/dist/remove-6PRYZKKI.js.map +1 -0
  183. package/dist/{remove-P3V4V2YO.mjs → remove-RU3NILCE.mjs} +10 -7
  184. package/dist/{remove-P3V4V2YO.mjs.map → remove-RU3NILCE.mjs.map} +1 -1
  185. package/dist/rename-R526CR2K.js +38 -0
  186. package/dist/rename-R526CR2K.js.map +1 -0
  187. package/dist/rename-XWNYLJ7Y.mjs +38 -0
  188. package/dist/rename-XWNYLJ7Y.mjs.map +1 -0
  189. package/dist/{sync-53MALFUS.mjs → sync-DTJZCK67.mjs} +12 -9
  190. package/dist/{sync-53MALFUS.mjs.map → sync-DTJZCK67.mjs.map} +1 -1
  191. package/dist/{sync-KQW7FUGI.js → sync-N6UBIABB.js} +16 -13
  192. package/dist/sync-N6UBIABB.js.map +1 -0
  193. package/dist/{types-DQiByKdr.d.ts → types-2lYnPqzr.d.ts} +854 -5
  194. package/dist/{types-CoHIwxng.d.mts → types-BUnPGSWo.d.mts} +854 -5
  195. package/dist/update-7DVLJOW5.mjs +64 -0
  196. package/dist/update-7DVLJOW5.mjs.map +1 -0
  197. package/dist/update-YID5H7KM.js +64 -0
  198. package/dist/update-YID5H7KM.js.map +1 -0
  199. package/dist/upload-QFNUIOI6.js +73 -0
  200. package/dist/upload-QFNUIOI6.js.map +1 -0
  201. package/dist/upload-TUW6TDEC.mjs +73 -0
  202. package/dist/upload-TUW6TDEC.mjs.map +1 -0
  203. package/package.json +5 -5
  204. package/dist/add-OYRTMKQO.js.map +0 -1
  205. package/dist/chunk-22J3GPSB.js.map +0 -1
  206. package/dist/chunk-5LYWRKDF.js.map +0 -1
  207. package/dist/chunk-CCDYGS72.mjs.map +0 -1
  208. package/dist/chunk-CIMNUH6E.mjs.map +0 -1
  209. package/dist/chunk-IJWZY7FY.js.map +0 -1
  210. package/dist/chunk-JSD3JAHK.js.map +0 -1
  211. package/dist/chunk-JVIQJFUE.mjs.map +0 -1
  212. package/dist/chunk-QD7BOTQC.mjs.map +0 -1
  213. package/dist/chunk-SPEPSXKI.js.map +0 -1
  214. package/dist/list-LZTSDYZO.mjs.map +0 -1
  215. package/dist/list-TVCERIYC.js.map +0 -1
  216. package/dist/pull-KXRSK5HG.mjs +0 -20
  217. package/dist/pull-UFR3NBC7.js +0 -20
  218. package/dist/pull-UFR3NBC7.js.map +0 -1
  219. package/dist/push-73ABYK6C.js +0 -20
  220. package/dist/push-73ABYK6C.js.map +0 -1
  221. package/dist/push-KFRI5YNG.mjs +0 -20
  222. package/dist/remove-AIXQHYLS.js.map +0 -1
  223. package/dist/sync-KQW7FUGI.js.map +0 -1
  224. /package/dist/{chunk-L5Z7F7MG.mjs.map → chunk-43STSE3B.mjs.map} +0 -0
  225. /package/dist/{chunk-MPOVGCVD.mjs.map → chunk-6DI23E36.mjs.map} +0 -0
  226. /package/dist/{chunk-FMYG6IOZ.mjs.map → chunk-FARZEN6T.mjs.map} +0 -0
  227. /package/dist/{pull-KXRSK5HG.mjs.map → create-TH7EZWKS.mjs.map} +0 -0
  228. /package/dist/{login-IC7I2IMY.mjs.map → login-IK3G3RQU.mjs.map} +0 -0
  229. /package/dist/{push-KFRI5YNG.mjs.map → pull-S7VIDGCP.mjs.map} +0 -0
@@ -4,12 +4,15 @@ import {
4
4
  import {
5
5
  PromptsApiService,
6
6
  PromptsError
7
- } from "./chunk-QD7BOTQC.mjs";
8
- import "./chunk-FMYG6IOZ.mjs";
9
- import "./chunk-L5Z7F7MG.mjs";
10
- import "./chunk-MPOVGCVD.mjs";
11
- import "./chunk-DCKVBP6R.mjs";
12
- import "./chunk-JVIQJFUE.mjs";
7
+ } from "./chunk-W6LLLSCE.mjs";
8
+ import "./chunk-FG3JQBJB.mjs";
9
+ import "./chunk-6VJ2UBYR.mjs";
10
+ import "./chunk-FARZEN6T.mjs";
11
+ import "./chunk-6DI23E36.mjs";
12
+ import "./chunk-QCUJJSWS.mjs";
13
+ import "./chunk-43STSE3B.mjs";
14
+ import "./chunk-RKJDDUGQ.mjs";
15
+ import "./chunk-M4IBRWUC.mjs";
13
16
  import {
14
17
  ensureProjectInitialized
15
18
  } from "./chunk-W3V3NX7P.mjs";
@@ -143,4 +146,4 @@ var addCommand = async (name, options) => {
143
146
  export {
144
147
  addCommand
145
148
  };
146
- //# sourceMappingURL=add-WLIE6XEG.mjs.map
149
+ //# sourceMappingURL=add-HDTFJTR3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/add.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsApiService, PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const promptsApiService = new PromptsApiService();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await promptsApiService.get(name, { version });\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/add.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsApiService, PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const promptsApiService = new PromptsApiService();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await promptsApiService.get(name, { version });\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,WAAW;AAClB,OAAO,SAAS;AAYhB,IAAM,eAAe,OACnB,MACA,kBACkB;AAElB,MAAI,CAAI,cAAW,aAAa,GAAG;AACjC,YAAQ,MAAM,MAAM,IAAI,gCAAgC,aAAa,EAAE,CAAC;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,cAAc,SAAS,cAAc,GAAG;AAC3C,YAAQ;AAAA,MACN,MAAM,IAAI,oDAAoD;AAAA,IAChE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI;AACF,gBAAY,gBAAgB,aAAa;AAGzC,UAAM,yBAAyB;AAG/B,UAAM,gBAAgB,YAAY,kBAAkB;AACpD,kBAAc,QAAQ,IAAI,IAAI,QAAQ,aAAa;AACnD,gBAAY,kBAAkB,aAAa;AAG3C,UAAM,OAAO,YAAY,gBAAgB;AACzC,SAAK,QAAQ,IAAI,IAAI;AAAA,MACnB,SAAS;AAAA;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA;AAAA,IAChB;AACA,gBAAY,gBAAgB,IAAI;AAEhC,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,8BAAyB,MAAM,KAAK,IAAI,CAAC,WAAM,MAAM;AAAA,UACnD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,MAAM,IAAI,kCAAkC,CAAC;AAC3D,YAAQ;AAAA,MACN,MAAM,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,aAAa,OACxB,MACA,YACkB;AAxEpB;AAyEE,MAAI;AAEF,QAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,cAAQ,MAAM,MAAM,IAAI,oCAAoC,CAAC;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,QAAI,QAAQ,WAAW;AACrB,YAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C;AAAA,IACF;AAGA,gBAAY;AAEZ,UAAM,oBAAoB,IAAI,kBAAkB;AAChD,UAAM,WAAU,aAAQ,YAAR,YAAmB;AAGnC,UAAM,UAAU;AAAA,MACd,UAAU,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;AAAA,IAC5C,EAAE,MAAM;AAER,QAAI;AAEF,YAAM,SAAS,MAAM,kBAAkB,IAAI,MAAM,EAAE,QAAQ,CAAC;AAE5D,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK;AACb,gBAAQ,MAAM,MAAM,IAAI,kBAAkB,IAAI,aAAa,CAAC;AAC5D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,cAAQ,KAAK;AAGb,YAAM,yBAAyB;AAG/B,cAAQ,MAAM,UAAU,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,KAAK;AAG7D,YAAM,qBAAqB,gBAAgB,sBAAsB,MAAM;AACvE,YAAM,YAAY,YAAY;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,SAAS;AAG3D,YAAM,SAAS,YAAY,kBAAkB;AAC7C,YAAM,OAAO,YAAY,gBAAgB;AAEzC,aAAO,QAAQ,IAAI,IAAI;AACvB,kBAAY,gBAAgB,MAAM,MAAM,oBAAoB,SAAS;AAGrE,kBAAY,kBAAkB,MAAM;AACpC,kBAAY,gBAAgB,IAAI;AAEhC,cAAQ,QAAQ;AAGhB,YAAM,cAAc,aAAa,WAAW,IAAI,IAC5C,eACA,KAAK,YAAY;AACrB,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ,iBAAY,MAAM,KAAK,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,MAAM;AAAA,YACpD,YAAY,OAAO,OAAO;AAAA,UAC5B,CAAC,WAAM,MAAM,KAAK,WAAW,CAAC;AAAA,QAChC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK;AACb,UAAI,iBAAiB,cAAc;AACjC,gBAAQ,MAAM,MAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,MACpD,OAAO;AACL,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,wBACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,cAAQ,MAAM,MAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,IACpD,OAAO;AACL,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ,qBACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
@@ -4,12 +4,15 @@ var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
4
4
 
5
5
 
6
6
 
7
- var _chunk22J3GPSBjs = require('./chunk-22J3GPSB.js');
8
- require('./chunk-QNT5P6VV.js');
9
- require('./chunk-VCC7F6B7.js');
10
- require('./chunk-HZAW7WTJ.js');
11
- require('./chunk-44V235QR.js');
12
- require('./chunk-5LYWRKDF.js');
7
+ var _chunkK5RFDRTRjs = require('./chunk-K5RFDRTR.js');
8
+ require('./chunk-2VVANTLB.js');
9
+ require('./chunk-R2N4RS3O.js');
10
+ require('./chunk-ZZL6VZZU.js');
11
+ require('./chunk-GYYRDOFU.js');
12
+ require('./chunk-HV75NBGG.js');
13
+ require('./chunk-H6F5OGSL.js');
14
+ require('./chunk-OAAMDWSK.js');
15
+ require('./chunk-DB6OJGP4.js');
13
16
 
14
17
 
15
18
  var _chunkBYG3QS2Xjs = require('./chunk-BYG3QS2X.js');
@@ -78,7 +81,7 @@ var addCommand = async (name, options) => {
78
81
  return;
79
82
  }
80
83
  _chunkF6E4XQQUjs.checkApiKey.call(void 0, );
81
- const promptsApiService = new (0, _chunk22J3GPSBjs.PromptsApiService)();
84
+ const promptsApiService = new (0, _chunkK5RFDRTRjs.PromptsApiService)();
82
85
  const version = (_a = options.version) != null ? _a : "latest";
83
86
  const spinner = _ora2.default.call(void 0,
84
87
  `Adding ${_chalk2.default.cyan(`${name}@${version}`)}...`
@@ -116,7 +119,7 @@ var addCommand = async (name, options) => {
116
119
  );
117
120
  } catch (error) {
118
121
  spinner.fail();
119
- if (error instanceof _chunk22J3GPSBjs.PromptsError) {
122
+ if (error instanceof _chunkK5RFDRTRjs.PromptsError) {
120
123
  console.error(_chalk2.default.red(`Error: ${error.message}`));
121
124
  } else {
122
125
  console.error(
@@ -128,7 +131,7 @@ var addCommand = async (name, options) => {
128
131
  process.exit(1);
129
132
  }
130
133
  } catch (error) {
131
- if (error instanceof _chunk22J3GPSBjs.PromptsError) {
134
+ if (error instanceof _chunkK5RFDRTRjs.PromptsError) {
132
135
  console.error(_chalk2.default.red(`Error: ${error.message}`));
133
136
  } else {
134
137
  console.error(
@@ -143,4 +146,4 @@ var addCommand = async (name, options) => {
143
146
 
144
147
 
145
148
  exports.addCommand = addCommand;
146
- //# sourceMappingURL=add-OYRTMKQO.js.map
149
+ //# sourceMappingURL=add-WJ3GGNII.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-WJ3GGNII.js","../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACzBA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAClB,oEAAgB;AAYhB,IAAM,aAAA,EAAe,MAAA,CACnB,IAAA,EACA,aAAA,EAAA,GACkB;AAElB,EAAA,GAAA,CAAI,CAAI,EAAA,CAAA,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,6BAAA,EAAgC,aAAa,CAAA,CAAA;AACvD,IAAA;AAChB,EAAA;AAE6C,EAAA;AACnC,IAAA;AACwD,MAAA;AAChE,IAAA;AACc,IAAA;AAChB,EAAA;AAGI,EAAA;AACuC,IAAA;AAGV,IAAA;AAGqB,IAAA;AACD,IAAA;AACR,IAAA;AAGF,IAAA;AACpB,IAAA;AACV,MAAA;AAAA;AACE,MAAA;AACG,MAAA;AAAA;AAChB,IAAA;AACgC,IAAA;AAExB,IAAA;AACA,MAAA;AACiD,QAAA;AACnD,UAAA;AACD,QAAA;AACH,MAAA;AACF,IAAA;AACc,EAAA;AAC6C,IAAA;AACnD,IAAA;AAC0D,MAAA;AAClE,IAAA;AACc,IAAA;AAChB,EAAA;AACF;AAKoB;AAxEpB,EAAA;AAyEM,EAAA;AAE+B,IAAA;AAC8B,MAAA;AAC/C,MAAA;AAChB,IAAA;AAGuB,IAAA;AACqB,MAAA;AAC1C,MAAA;AACF,IAAA;AAGY,IAAA;AAEoC,IAAA;AACb,IAAA;AAGnB,IAAA;AAC4B,MAAA;AACpC,IAAA;AAEJ,IAAA;AAE0D,MAAA;AAE/C,MAAA;AACE,QAAA;AAC+C,QAAA;AAC9C,QAAA;AAChB,MAAA;AAGa,MAAA;AAGkB,MAAA;AAG8B,MAAA;AAGI,MAAA;AACnC,MAAA;AAC5B,QAAA;AACA,QAAA;AACF,MAAA;AAC2D,MAAA;AAGd,MAAA;AACJ,MAAA;AAElB,MAAA;AACqC,MAAA;AAGxB,MAAA;AACJ,MAAA;AAEhB,MAAA;AAKZ,MAAA;AACI,MAAA;AACA,QAAA;AACkD,UAAA;AAC1B,YAAA;AACE,UAAA;AAChC,QAAA;AACF,MAAA;AACc,IAAA;AACD,MAAA;AACsB,MAAA;AACiB,QAAA;AAC7C,MAAA;AACG,QAAA;AACA,UAAA;AAE6B,YAAA;AAEnC,UAAA;AACF,QAAA;AACF,MAAA;AACc,MAAA;AAChB,IAAA;AACc,EAAA;AACqB,IAAA;AACiB,MAAA;AAC7C,IAAA;AACG,MAAA;AACA,QAAA;AAEuC,UAAA;AAE7C,QAAA;AACF,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AACF;ADhC0E;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-WJ3GGNII.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsApiService, PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const promptsApiService = new PromptsApiService();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await promptsApiService.get(name, { version });\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"]}
@@ -0,0 +1,50 @@
1
+ import {
2
+ checkApiKey
3
+ } from "./chunk-DHJKJVY7.mjs";
4
+ import {
5
+ PromptsApiService
6
+ } from "./chunk-W6LLLSCE.mjs";
7
+ import "./chunk-FG3JQBJB.mjs";
8
+ import "./chunk-6VJ2UBYR.mjs";
9
+ import "./chunk-FARZEN6T.mjs";
10
+ import "./chunk-6DI23E36.mjs";
11
+ import "./chunk-QCUJJSWS.mjs";
12
+ import "./chunk-43STSE3B.mjs";
13
+ import "./chunk-RKJDDUGQ.mjs";
14
+ import "./chunk-M4IBRWUC.mjs";
15
+ import "./chunk-O6D3W3PG.mjs";
16
+ import "./chunk-BTBSMJTY.mjs";
17
+ import "./chunk-URTD2WOC.mjs";
18
+
19
+ // src/cli/commands/tag/assign.ts
20
+ import chalk from "chalk";
21
+ var tagAssignCommand = async (promptHandle, tagName, options) => {
22
+ if ((options == null ? void 0 : options.version) !== void 0 && !/^[1-9]\d*$/.test(options.version)) {
23
+ console.error(
24
+ chalk.red("Error: --version must be a positive integer")
25
+ );
26
+ process.exit(1);
27
+ }
28
+ checkApiKey();
29
+ const service = new PromptsApiService();
30
+ const getOptions = {};
31
+ if ((options == null ? void 0 : options.version) !== void 0) {
32
+ getOptions.version = options.version;
33
+ }
34
+ const prompt = await service.get(promptHandle, getOptions);
35
+ if (!prompt) {
36
+ console.error(chalk.red(`Error: Prompt not found: ${promptHandle}`));
37
+ process.exit(1);
38
+ }
39
+ const versionId = prompt.versionId;
40
+ await service.assignTag({ id: promptHandle, tag: tagName, versionId });
41
+ console.log(
42
+ chalk.green(
43
+ `\u2713 Assigned tag '${tagName}' to ${promptHandle}@${prompt.version} (versionId: ${versionId})`
44
+ )
45
+ );
46
+ };
47
+ export {
48
+ tagAssignCommand
49
+ };
50
+ //# sourceMappingURL=assign-4RE6OK5Z.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/tag/assign.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { PromptsApiService } from \"@/client-sdk/services/prompts\";\nimport { checkApiKey } from \"../../utils/apiKey\";\n\n/**\n * Assigns a tag to a prompt version.\n * @param promptHandle The prompt handle/id.\n * @param tagName The tag name to assign.\n * @param options Optional parameters.\n * @param options.version Specific version number to tag (defaults to latest).\n */\nexport const tagAssignCommand = async (\n promptHandle: string,\n tagName: string,\n options?: { version?: string },\n): Promise<void> => {\n if (options?.version !== undefined && !/^[1-9]\\d*$/.test(options.version)) {\n console.error(\n chalk.red(\"Error: --version must be a positive integer\"),\n );\n process.exit(1);\n }\n\n checkApiKey();\n const service = new PromptsApiService();\n\n const getOptions: { version?: string } = {};\n if (options?.version !== undefined) {\n getOptions.version = options.version;\n }\n\n const prompt = await service.get(promptHandle, getOptions);\n\n if (!prompt) {\n console.error(chalk.red(`Error: Prompt not found: ${promptHandle}`));\n process.exit(1);\n }\n\n const versionId = prompt.versionId;\n await service.assignTag({ id: promptHandle, tag: tagName, versionId });\n\n console.log(\n chalk.green(\n `✓ Assigned tag '${tagName}' to ${promptHandle}@${prompt.version} (versionId: ${versionId})`,\n ),\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,WAAW;AAWX,IAAM,mBAAmB,OAC9B,cACA,SACA,YACkB;AAClB,OAAI,mCAAS,aAAY,UAAa,CAAC,aAAa,KAAK,QAAQ,OAAO,GAAG;AACzE,YAAQ;AAAA,MACN,MAAM,IAAI,6CAA6C;AAAA,IACzD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,cAAY;AACZ,QAAM,UAAU,IAAI,kBAAkB;AAEtC,QAAM,aAAmC,CAAC;AAC1C,OAAI,mCAAS,aAAY,QAAW;AAClC,eAAW,UAAU,QAAQ;AAAA,EAC/B;AAEA,QAAM,SAAS,MAAM,QAAQ,IAAI,cAAc,UAAU;AAEzD,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,MAAM,IAAI,4BAA4B,YAAY,EAAE,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,OAAO;AACzB,QAAM,QAAQ,UAAU,EAAE,IAAI,cAAc,KAAK,SAAS,UAAU,CAAC;AAErE,UAAQ;AAAA,IACN,MAAM;AAAA,MACJ,wBAAmB,OAAO,QAAQ,YAAY,IAAI,OAAO,OAAO,gBAAgB,SAAS;AAAA,IAC3F;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+
3
+ var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
4
+
5
+
6
+ var _chunkK5RFDRTRjs = require('./chunk-K5RFDRTR.js');
7
+ require('./chunk-2VVANTLB.js');
8
+ require('./chunk-R2N4RS3O.js');
9
+ require('./chunk-ZZL6VZZU.js');
10
+ require('./chunk-GYYRDOFU.js');
11
+ require('./chunk-HV75NBGG.js');
12
+ require('./chunk-H6F5OGSL.js');
13
+ require('./chunk-OAAMDWSK.js');
14
+ require('./chunk-DB6OJGP4.js');
15
+ require('./chunk-WAAQLJ67.js');
16
+ require('./chunk-AZHZ4NB4.js');
17
+ require('./chunk-OHM7JUMR.js');
18
+
19
+ // src/cli/commands/tag/assign.ts
20
+ var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
21
+ var tagAssignCommand = async (promptHandle, tagName, options) => {
22
+ if ((options == null ? void 0 : options.version) !== void 0 && !/^[1-9]\d*$/.test(options.version)) {
23
+ console.error(
24
+ _chalk2.default.red("Error: --version must be a positive integer")
25
+ );
26
+ process.exit(1);
27
+ }
28
+ _chunkF6E4XQQUjs.checkApiKey.call(void 0, );
29
+ const service = new (0, _chunkK5RFDRTRjs.PromptsApiService)();
30
+ const getOptions = {};
31
+ if ((options == null ? void 0 : options.version) !== void 0) {
32
+ getOptions.version = options.version;
33
+ }
34
+ const prompt = await service.get(promptHandle, getOptions);
35
+ if (!prompt) {
36
+ console.error(_chalk2.default.red(`Error: Prompt not found: ${promptHandle}`));
37
+ process.exit(1);
38
+ }
39
+ const versionId = prompt.versionId;
40
+ await service.assignTag({ id: promptHandle, tag: tagName, versionId });
41
+ console.log(
42
+ _chalk2.default.green(
43
+ `\u2713 Assigned tag '${tagName}' to ${promptHandle}@${prompt.version} (versionId: ${versionId})`
44
+ )
45
+ );
46
+ };
47
+
48
+
49
+ exports.tagAssignCommand = tagAssignCommand;
50
+ //# sourceMappingURL=assign-DYJ67ZWP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/assign-DYJ67ZWP.js","../src/cli/commands/tag/assign.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;AClBA,4EAAkB;AAWX,IAAM,iBAAA,EAAmB,MAAA,CAC9B,YAAA,EACA,OAAA,EACA,OAAA,EAAA,GACkB;AAClB,EAAA,GAAA,CAAA,CAAI,QAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS,OAAA,EAAA,IAAY,KAAA,EAAA,GAAa,CAAC,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,EAAG;AACzE,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,eAAA,CAAM,GAAA,CAAI,6CAA6C;AAAA,IACzD,CAAA;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,0CAAA,CAAY;AACZ,EAAA,MAAM,QAAA,EAAU,IAAI,uCAAA,CAAkB,CAAA;AAEtC,EAAA,MAAM,WAAA,EAAmC,CAAC,CAAA;AAC1C,EAAA,GAAA,CAAA,CAAI,QAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS,OAAA,EAAA,IAAY,KAAA,CAAA,EAAW;AAClC,IAAA,UAAA,CAAW,QAAA,EAAU,OAAA,CAAQ,OAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,OAAA,EAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,UAAU,CAAA;AAEzD,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,yBAAA,EAA4B,YAAY,CAAA,CAAA;AAClD,IAAA;AAChB,EAAA;AAEyB,EAAA;AACiC,EAAA;AAElD,EAAA;AACA,IAAA;AACqD,MAAA;AAC3D,IAAA;AACF,EAAA;AACF;ADAqE;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/assign-DYJ67ZWP.js","sourcesContent":[null,"import chalk from \"chalk\";\nimport { PromptsApiService } from \"@/client-sdk/services/prompts\";\nimport { checkApiKey } from \"../../utils/apiKey\";\n\n/**\n * Assigns a tag to a prompt version.\n * @param promptHandle The prompt handle/id.\n * @param tagName The tag name to assign.\n * @param options Optional parameters.\n * @param options.version Specific version number to tag (defaults to latest).\n */\nexport const tagAssignCommand = async (\n promptHandle: string,\n tagName: string,\n options?: { version?: string },\n): Promise<void> => {\n if (options?.version !== undefined && !/^[1-9]\\d*$/.test(options.version)) {\n console.error(\n chalk.red(\"Error: --version must be a positive integer\"),\n );\n process.exit(1);\n }\n\n checkApiKey();\n const service = new PromptsApiService();\n\n const getOptions: { version?: string } = {};\n if (options?.version !== undefined) {\n getOptions.version = options.version;\n }\n\n const prompt = await service.get(promptHandle, getOptions);\n\n if (!prompt) {\n console.error(chalk.red(`Error: Prompt not found: ${promptHandle}`));\n process.exit(1);\n }\n\n const versionId = prompt.versionId;\n await service.assignTag({ id: promptHandle, tag: tagName, versionId });\n\n console.log(\n chalk.green(\n `✓ Assigned tag '${tagName}' to ${promptHandle}@${prompt.version} (versionId: ${versionId})`,\n ),\n );\n};\n"]}
@@ -0,0 +1,68 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/client-sdk/tracing/create-tracing-proxy.ts
2
+ var _api = require('@opentelemetry/api');
3
+ function createTracingProxy(target, tracer, DecoratorClass) {
4
+ const decorator = DecoratorClass ? new DecoratorClass(target) : null;
5
+ return new Proxy(target, {
6
+ get(target2, prop, receiver) {
7
+ const value = Reflect.get(target2, prop, receiver);
8
+ if (typeof value !== "function") {
9
+ return value;
10
+ }
11
+ if (typeof prop === "string" && !prop.startsWith("_") && // Skip private methods
12
+ !isGetterOrSetter(target2, prop) && // Skip actual getters/setters
13
+ !isBuiltInMethod(prop)) {
14
+ return (...args) => {
15
+ const spanName = `${target2.constructor.name}.${prop}`;
16
+ return tracer.withActiveSpan(spanName, {
17
+ kind: _api.SpanKind.CLIENT,
18
+ attributes: {
19
+ "code.function": prop,
20
+ "code.namespace": target2.constructor.name
21
+ }
22
+ }, (span) => {
23
+ if (decorator && prop in decorator) {
24
+ const decoratorMethod = decorator[prop];
25
+ if (typeof decoratorMethod === "function") {
26
+ return decoratorMethod.apply(decorator, [span, ...args]);
27
+ }
28
+ }
29
+ return value.apply(target2, args);
30
+ });
31
+ };
32
+ }
33
+ return typeof value === "function" ? value.bind(target2) : value;
34
+ }
35
+ });
36
+ }
37
+ var isGetterOrSetter = (target, prop) => {
38
+ var _a;
39
+ let descriptor = Object.getOwnPropertyDescriptor(target, prop);
40
+ if (!descriptor) {
41
+ const prototype = Object.getPrototypeOf(target);
42
+ if (prototype) {
43
+ descriptor = Object.getOwnPropertyDescriptor(prototype, prop);
44
+ }
45
+ }
46
+ return !!((_a = descriptor == null ? void 0 : descriptor.get) != null ? _a : descriptor == null ? void 0 : descriptor.set);
47
+ };
48
+ var isBuiltInMethod = (prop) => {
49
+ if (typeof prop !== "string") {
50
+ return false;
51
+ }
52
+ const builtInMethods = [
53
+ "toString",
54
+ "valueOf",
55
+ "toJSON",
56
+ "toLocaleString",
57
+ "hasOwnProperty",
58
+ "isPrototypeOf",
59
+ "propertyIsEnumerable",
60
+ "constructor"
61
+ ];
62
+ return builtInMethods.includes(prop);
63
+ };
64
+
65
+
66
+
67
+ exports.createTracingProxy = createTracingProxy;
68
+ //# sourceMappingURL=chunk-2VVANTLB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-2VVANTLB.js","../src/client-sdk/tracing/create-tracing-proxy.ts"],"names":["target"],"mappings":"AAAA;ACCA,yCAAyB;AAuBlB,SAAS,kBAAA,CAId,MAAA,EACA,MAAA,EACA,cAAA,EACG;AACH,EAAA,MAAM,UAAA,EAAY,eAAA,EAAiB,IAAI,cAAA,CAAe,MAAM,EAAA,EAAI,IAAA;AAEhE,EAAA,OAAO,IAAI,KAAA,CAAM,MAAA,EAAQ;AAAA,IACvB,GAAA,CAAIA,OAAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,MAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAIA,OAAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAGhD,MAAA,GAAA,CAAI,OAAO,MAAA,IAAU,UAAA,EAAY;AAC/B,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,GAAA,CACE,OAAO,KAAA,IAAS,SAAA,GAChB,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,EAAA;AAAA,MACpB,CAAC,gBAAA,CAAiBA,OAAAA,EAAQ,IAAI,EAAA;AAAA,MAC9B,CAAC,eAAA,CAAgB,IAAI,CAAA,EACrB;AACA,QAAA,OAAO,CAAA,GAAI,IAAA,EAAA,GAAgB;AACzB,UAAA,MAAM,SAAA,EAAW,CAAA,EAAA;AAEH,UAAA;AACG,YAAA;AACH,YAAA;AACV,cAAA;AACA,cAAA;AACF,YAAA;AACW,UAAA;AAEP,YAAA;AACI,cAAA;AACK,cAAA;AACF,gBAAA;AACT,cAAA;AACF,YAAA;AAGa,YAAA;AACd,UAAA;AACH,QAAA;AACF,MAAA;AAEc,MAAA;AAChB,IAAA;AACD,EAAA;AACH;AAG0B;AAhF1B,EAAA;AAkF0B,EAAA;AAGP,EAAA;AACG,IAAA;AACH,IAAA;AACO,MAAA;AACtB,IAAA;AACF,EAAA;AAGU,EAAA;AACZ;AAGyB;AACH,EAAA;AACX,IAAA;AACT,EAAA;AAGuB,EAAA;AACrB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAEsB,EAAA;AACxB;ADpD4B;AACA;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-2VVANTLB.js","sourcesContent":[null,"import { type LangWatchTracer } from \"@/observability-sdk\";\nimport { SpanKind } from \"@opentelemetry/api\";\n\n// Type for decorator methods that receive span as first parameter\ntype DecoratorMethodWithSpan<T extends (...args: any[]) => any> =\n (span: any, ...args: Parameters<T>) => ReturnType<T>;\n\n// Type for decorator class that maps original methods to span-aware versions\n// Only requires methods that are actually implemented in the decorator\ntype DecoratorClass<T> = new (target: T) => Partial<{\n [K in keyof T]: T[K] extends (...args: any[]) => any\n ? DecoratorMethodWithSpan<T[K]>\n : T[K];\n }>;\n\n/**\n * Creates a proxy that always creates spans for public methods.\n * Decorators can access the span as the first parameter to add additional attributes.\n *\n * @param target - The target to wrap\n * @param tracer - The tracer instance to use\n * @param DecoratorClass - Optional decorator class for custom logic\n * @returns A proxy that wraps the target with consistent tracing\n */\nexport function createTracingProxy<\n T extends object,\n D extends DecoratorClass<T> | undefined = undefined\n>(\n target: T,\n tracer: LangWatchTracer,\n DecoratorClass?: D,\n): T {\n const decorator = DecoratorClass ? new DecoratorClass(target) : null;\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // If it's not a function, return as-is\n if (typeof value !== \"function\") {\n return value;\n }\n\n // Only trace public methods\n if (\n typeof prop === \"string\" &&\n !prop.startsWith(\"_\") && // Skip private methods\n !isGetterOrSetter(target, prop) && // Skip actual getters/setters\n !isBuiltInMethod(prop) // Skip built-in methods\n ) {\n return (...args: any[]) => {\n const spanName = `${target.constructor.name}.${prop}`;\n\n return tracer.withActiveSpan(spanName, {\n kind: SpanKind.CLIENT,\n attributes: {\n 'code.function': prop,\n 'code.namespace': target.constructor.name,\n },\n }, (span) => {\n // If decorator has this method, call it with span as first parameter\n if (decorator && prop in decorator) {\n const decoratorMethod = decorator[prop as keyof typeof decorator];\n if (typeof decoratorMethod === \"function\") {\n return decoratorMethod.apply(decorator, [span, ...args]);\n }\n }\n\n // Default: just call the original method\n return value.apply(target, args);\n });\n };\n }\n\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n });\n}\n\n// Helper function to check if a property is a getter or setter\nconst isGetterOrSetter = (target: any, prop: string | symbol): boolean => {\n // First check own properties\n let descriptor = Object.getOwnPropertyDescriptor(target, prop);\n\n // If not found on own properties, check prototype chain\n if (!descriptor) {\n const prototype = Object.getPrototypeOf(target);\n if (prototype) {\n descriptor = Object.getOwnPropertyDescriptor(prototype, prop);\n }\n }\n\n // Return true if it's a getter or setter\n return !!(descriptor?.get ?? descriptor?.set);\n};\n\n// Helper function to check if a method is a built-in method that should not be traced\nconst isBuiltInMethod = (prop: string | symbol): boolean => {\n if (typeof prop !== \"string\") {\n return false;\n }\n\n // List of built-in methods that should not be traced\n const builtInMethods = [\n 'toString',\n 'valueOf',\n 'toJSON',\n 'toLocaleString',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'constructor'\n ];\n\n return builtInMethods.includes(prop);\n};\n"]}
@@ -8,7 +8,7 @@ import {
8
8
  ATTR_LANGWATCH_PROMPT_VERSION_NUMBER,
9
9
  ATTR_LANGWATCH_RAG_CONTEXTS,
10
10
  ATTR_LANGWATCH_SPAN_TYPE
11
- } from "./chunk-JVIQJFUE.mjs";
11
+ } from "./chunk-M4IBRWUC.mjs";
12
12
  import {
13
13
  __spreadProps,
14
14
  __spreadValues
@@ -653,4 +653,4 @@ export {
653
653
  getLangWatchTracer,
654
654
  getLangWatchTracerFromProvider
655
655
  };
656
- //# sourceMappingURL=chunk-L5Z7F7MG.mjs.map
656
+ //# sourceMappingURL=chunk-43STSE3B.mjs.map
@@ -6,10 +6,10 @@ import {
6
6
  LANGWATCH_SDK_VERSION,
7
7
  LOGS_PATH,
8
8
  TRACES_PATH
9
- } from "./chunk-DCKVBP6R.mjs";
9
+ } from "./chunk-QCUJJSWS.mjs";
10
10
  import {
11
11
  shouldCaptureOutput
12
- } from "./chunk-JVIQJFUE.mjs";
12
+ } from "./chunk-RKJDDUGQ.mjs";
13
13
  import {
14
14
  __spreadProps,
15
15
  __spreadValues
@@ -293,4 +293,4 @@ export {
293
293
  getLangWatchLogger,
294
294
  getLangWatchLoggerFromProvider
295
295
  };
296
- //# sourceMappingURL=chunk-MPOVGCVD.mjs.map
296
+ //# sourceMappingURL=chunk-6DI23E36.mjs.map
@@ -0,0 +1,33 @@
1
+ import {
2
+ DEFAULT_ENDPOINT,
3
+ LANGWATCH_SDK_LANGUAGE,
4
+ LANGWATCH_SDK_NAME_OBSERVABILITY,
5
+ LANGWATCH_SDK_RUNTIME,
6
+ LANGWATCH_SDK_VERSION,
7
+ version
8
+ } from "./chunk-QCUJJSWS.mjs";
9
+ import {
10
+ __spreadProps,
11
+ __spreadValues
12
+ } from "./chunk-URTD2WOC.mjs";
13
+
14
+ // src/internal/api/client.ts
15
+ import openApiCreateClient from "openapi-fetch";
16
+ var createLangWatchApiClient = (apiKey = ((_a) => (_a = process.env.LANGWATCH_API_KEY) != null ? _a : "")(), endpoint = ((_b) => (_b = process.env.LANGWATCH_ENDPOINT) != null ? _b : DEFAULT_ENDPOINT)()) => {
17
+ return openApiCreateClient({
18
+ baseUrl: endpoint,
19
+ headers: __spreadProps(__spreadValues({}, apiKey ? { authorization: `Bearer ${apiKey}`, "x-auth-token": apiKey } : {}), {
20
+ "content-type": "application/json",
21
+ "user-agent": `langwatch-sdk-node/${version}`,
22
+ "x-langwatch-sdk-name": LANGWATCH_SDK_NAME_OBSERVABILITY,
23
+ "x-langwatch-sdk-language": LANGWATCH_SDK_LANGUAGE,
24
+ "x-langwatch-sdk-version": LANGWATCH_SDK_VERSION,
25
+ "x-langwatch-sdk-platform": LANGWATCH_SDK_RUNTIME()
26
+ })
27
+ });
28
+ };
29
+
30
+ export {
31
+ createLangWatchApiClient
32
+ };
33
+ //# sourceMappingURL=chunk-6VJ2UBYR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/api/client.ts"],"sourcesContent":["import openApiCreateClient from \"openapi-fetch\";\nimport type { paths } from \"../generated/openapi/api-client\";\nimport { version } from \"../../../package.json\";\nimport {\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n LANGWATCH_SDK_RUNTIME,\n LANGWATCH_SDK_VERSION,\n} from \"../constants\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\n\n/**\n * Creates a new LangWatch API client.\n * @param apiKey - The API key to use for authentication. Defaults to LANGWATCH_API_KEY environment variable.\n * @param endpoint - The endpoint to use for the API client. Defaults to LANGWATCH_ENDPOINT environment variable or internal DEFAULT_ENDPOINT.\n * @returns A new LangWatch API client.\n */\nexport const createLangWatchApiClient = (\n apiKey: string = process.env.LANGWATCH_API_KEY ?? \"\",\n endpoint: string = process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT,\n) => {\n return openApiCreateClient<paths>({\n baseUrl: endpoint,\n headers: {\n ...(apiKey ? { authorization: `Bearer ${apiKey}`, 'x-auth-token': apiKey } : {}),\n \"content-type\": \"application/json\",\n \"user-agent\": `langwatch-sdk-node/${version}`,\n \"x-langwatch-sdk-name\": LANGWATCH_SDK_NAME_OBSERVABILITY,\n \"x-langwatch-sdk-language\": LANGWATCH_SDK_LANGUAGE,\n \"x-langwatch-sdk-version\": LANGWATCH_SDK_VERSION,\n \"x-langwatch-sdk-platform\": LANGWATCH_SDK_RUNTIME(),\n },\n });\n};\n\n\nexport type LangwatchApiClient = ReturnType<typeof createLangWatchApiClient>;\n"],"mappings":";;;;;;;;;;;;;;AAAA,OAAO,yBAAyB;AAkBzB,IAAM,2BAA2B,CACtC,UAAiB,sBAAQ,IAAI,sBAAZ,YAAiC,OAClD,YAAmB,sBAAQ,IAAI,uBAAZ,YAAkC,wBAClD;AACH,SAAO,oBAA2B;AAAA,IAChC,SAAS;AAAA,IACT,SAAS,iCACH,SAAS,EAAE,eAAe,UAAU,MAAM,IAAI,gBAAgB,OAAO,IAAI,CAAC,IADvE;AAAA,MAEP,gBAAgB;AAAA,MAChB,cAAc,sBAAsB,OAAO;AAAA,MAC3C,wBAAwB;AAAA,MACxB,4BAA4B;AAAA,MAC5B,2BAA2B;AAAA,MAC3B,4BAA4B,sBAAsB;AAAA,IACpD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -2,21 +2,23 @@ import {
2
2
  LangWatchLogsExporter,
3
3
  LangWatchTraceExporter,
4
4
  setLangWatchLoggerProvider
5
- } from "./chunk-MPOVGCVD.mjs";
5
+ } from "./chunk-6DI23E36.mjs";
6
6
  import {
7
7
  DEFAULT_ENDPOINT,
8
8
  DEFAULT_SERVICE_NAME,
9
9
  LANGWATCH_SDK_LANGUAGE,
10
10
  LANGWATCH_SDK_NAME_OBSERVABILITY,
11
11
  LANGWATCH_SDK_VERSION
12
- } from "./chunk-DCKVBP6R.mjs";
12
+ } from "./chunk-QCUJJSWS.mjs";
13
+ import {
14
+ initializeObservabilitySdkConfig
15
+ } from "./chunk-RKJDDUGQ.mjs";
13
16
  import {
14
17
  ATTR_LANGWATCH_SDK_LANGUAGE,
15
18
  ATTR_LANGWATCH_SDK_NAME,
16
19
  ATTR_LANGWATCH_SDK_VERSION,
17
- ConsoleLogger,
18
- initializeObservabilitySdkConfig
19
- } from "./chunk-JVIQJFUE.mjs";
20
+ ConsoleLogger
21
+ } from "./chunk-M4IBRWUC.mjs";
20
22
  import {
21
23
  __spreadValues
22
24
  } from "./chunk-URTD2WOC.mjs";
@@ -329,4 +331,4 @@ export {
329
331
  setupObservability,
330
332
  ensureSetup
331
333
  };
332
- //# sourceMappingURL=chunk-HYPS247A.mjs.map
334
+ //# sourceMappingURL=chunk-AARKNSIH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/observability-sdk/setup/node/setup.ts","../src/observability-sdk/setup/utils.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { SimpleLogRecordProcessor, BatchLogRecordProcessor, type LogRecordProcessor, ConsoleLogRecordExporter, LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { createMergedResource, isConcreteProvider } from \"../utils\";\nimport { type SetupObservabilityOptions, type ObservabilityHandle } from \"./types\";\nimport { trace } from \"@opentelemetry/api\";\nimport {\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n BatchSpanProcessor,\n type SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { type Resource } from \"@opentelemetry/resources\";\nimport { LangWatchLogsExporter, LangWatchTraceExporter } from \"../../exporters\";\nimport { ConsoleLogger, type Logger } from \"../../../logger\";\nimport { initializeObservabilitySdkConfig } from \"../../config\";\nimport { setLangWatchLoggerProvider } from \"../../logger\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\n// Helper functions\nconst createNoOpHandle = (logger: Logger): ObservabilityHandle => ({\n shutdown: async () => {\n logger.debug(\"Shutdown called for LangWatch no-op. Nothing will be shutdown\");\n },\n});\n\nconst getLangWatchConfig = (options: SetupObservabilityOptions) => {\n const isDisabled = options.langwatch === 'disabled';\n const config = typeof options.langwatch === 'object' ? options.langwatch : {};\n\n return {\n disabled: isDisabled,\n apiKey: isDisabled ? void 0 : (config.apiKey ?? process.env.LANGWATCH_API_KEY),\n endpoint: isDisabled ? void 0 : (config.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT),\n processorType: config.processorType ?? 'batch'\n };\n};\n\nconst checkForEarlyExit = (options: SetupObservabilityOptions, logger: Logger): ObservabilityHandle | null => {\n if (options.advanced?.disabled) {\n logger.debug(\"Observability disabled via advanced.disabled\");\n return createNoOpHandle(logger);\n }\n\n if (options.advanced?.skipOpenTelemetrySetup) {\n logger.debug(\"Skipping OpenTelemetry setup\");\n return createNoOpHandle(logger);\n }\n\n const globalProvider = trace.getTracerProvider();\n const alreadySetup = isConcreteProvider(globalProvider);\n\n if (alreadySetup && !options.advanced?.UNSAFE_forceOpenTelemetryReinitialization) {\n logger.error(\n `OpenTelemetry is already set up in this process.\\n` +\n `Spans will NOT be sent to LangWatch unless you add the LangWatch span processor or exporter to your existing OpenTelemetry setup.\\n` +\n `You must either:\\n` +\n ` 1. Remove your existing OpenTelemetry setup and only use LangWatch,\\n` +\n ` 2. Add the LangWatch span processor to your existing setup, or replace the existing exporter with the LangWatch exporter.\\n` +\n `\\nFor step-by-step instructions, see the LangWatch docs and check out the integration guide for your framework:\\n` +\n ` https://docs.langwatch.ai/integration/typescript/guide\\n` +\n `\\nSee also: https://github.com/open-telemetry/opentelemetry-js/issues/5299`,\n );\n return createNoOpHandle(logger);\n }\n\n if (alreadySetup) {\n logger.warn(\n \"OpenTelemetry is already set up, but UNSAFE_forceOpenTelemetryReinitialization=true. \" +\n \"Proceeding with reinitialization. This may cause conflicts.\"\n );\n }\n\n return null;\n};\n\nconst warnIfMisconfigured = (options: SetupObservabilityOptions, langwatch: ReturnType<typeof getLangWatchConfig>, logger: Logger) => {\n // Check if LangWatch is disabled but no alternative export mechanisms are provided\n // Note: If we reach this function, we know advanced.disabled and advanced.skipOpenTelemetrySetup are false\n // because those are handled as early exits in setupObservability()\n if (langwatch.disabled) {\n const hasAlternativeExport =\n options.spanProcessors?.length ??\n options.logRecordProcessors?.length ??\n options.debug?.consoleTracing ??\n options.debug?.consoleLogging ??\n options.traceExporter;\n\n if (!hasAlternativeExport) {\n const errorMessage =\n \"LangWatch integration is disabled but no custom span processors, trace exporters, or console tracing is configured. \" +\n \"OpenTelemetry will be set up but traces will not be exported anywhere. \" +\n \"Either:\\n\" +\n \" 1. Enable LangWatch integration (remove langwatch: 'disabled')\\n\" +\n \" 2. Provide custom spanProcessors, logRecordProcessors, or traceExporter\\n\" +\n \" 3. Enable debug.consoleTracing or debug.consoleLogging for development\\n\" +\n \" 4. Use advanced.disabled to completely disable observability\\n\" +\n \" 5. Use advanced.skipOpenTelemetrySetup to handle OpenTelemetry setup yourself\";\n\n if (options.advanced?.throwOnSetupError) {\n throw new Error(errorMessage);\n } else {\n logger.error(errorMessage);\n }\n }\n }\n};\n\nexport function setupObservability(options: SetupObservabilityOptions = {}): ObservabilityHandle {\n const logger = options.debug?.logger ?? new ConsoleLogger({\n level: options.debug?.logLevel ?? 'warn',\n prefix: \"LangWatch Observability SDK\",\n });\n\n initializeObservabilitySdkConfig({\n logger,\n dataCapture: options.dataCapture,\n });\n\n const earlyExit = checkForEarlyExit(options, logger);\n if (earlyExit) return earlyExit;\n\n try {\n const sdk = createAndStartNodeSdk(options, logger, createMergedResource(\n options.attributes,\n options.serviceName,\n options.resource,\n ));\n\n logger.info(\"LangWatch Observability SDK setup completed successfully\");\n\n return {\n shutdown: async () => {\n logger.debug(\"Shutting down NodeSDK\");\n await sdk?.shutdown();\n logger.info(\"NodeSDK shutdown complete\");\n },\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to initialize NodeSDK: ${errorMessage}`);\n\n if (err instanceof Error && err.stack) {\n logger.debug(`Stack trace: ${err.stack}`);\n }\n\n if (options.advanced?.throwOnSetupError) throw err;\n return createNoOpHandle(logger);\n }\n}\n\nexport function createAndStartNodeSdk(\n options: SetupObservabilityOptions,\n logger: Logger,\n resource: Resource,\n): NodeSDK {\n const langwatch = getLangWatchConfig(options);\n\n if (langwatch.disabled) {\n logger.warn(\"LangWatch integration disabled, using user-provided SpanProcessors and LogRecordProcessors\");\n } else {\n logger.info(`Using LangWatch ${langwatch.processorType} processors for tracing and logging`);\n }\n\n const spanProcessors: SpanProcessor[] = [];\n const logProcessors: LogRecordProcessor[] = [];\n\n // Console processors\n if (options.debug?.consoleTracing) {\n spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n logger.debug(\"Console tracing enabled; adding console span exporter\");\n }\n if (options.debug?.consoleLogging) {\n logProcessors.push(new SimpleLogRecordProcessor(new ConsoleLogRecordExporter()));\n logger.debug(\"Console recording of logs enabled; adding console log record processor\");\n }\n\n if (!langwatch.disabled) {\n const traceExporter = new LangWatchTraceExporter({\n apiKey: langwatch.apiKey,\n endpoint: langwatch.endpoint,\n });\n const logExporter = new LangWatchLogsExporter({\n apiKey: langwatch.apiKey,\n endpoint: langwatch.endpoint,\n });\n\n if (langwatch.processorType === 'batch') {\n spanProcessors.push(new BatchSpanProcessor(traceExporter));\n logProcessors.push(new BatchLogRecordProcessor(logExporter));\n logger.debug(`Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`);\n } else {\n spanProcessors.push(new SimpleSpanProcessor(traceExporter));\n logProcessors.push(new SimpleLogRecordProcessor(logExporter));\n logger.debug(`Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`);\n }\n }\n\n if (options.traceExporter) {\n spanProcessors.push(new SimpleSpanProcessor(options.traceExporter));\n logger.debug(`Added user-provided SpanProcessor to SDK`);\n }\n\n if (options.spanProcessors?.length) {\n spanProcessors.push(...options.spanProcessors);\n logger.debug(`Added user-provided ${options.spanProcessors.length} SpanProcessors to SDK`);\n }\n if (options.logRecordProcessors?.length) {\n logProcessors.push(...options.logRecordProcessors);\n logger.debug(`Added user-provided ${options.logRecordProcessors.length} LogRecordProcessors to SDK`);\n }\n\n warnIfMisconfigured(options, langwatch, logger);\n\n // Create logger provider\n const loggerProvider = logProcessors.length ? new LoggerProvider({\n resource,\n processors: logProcessors,\n }) : void 0;\n\n if (loggerProvider) {\n logger.debug(\"Created LangWatch logger provider\");\n }\n\n const sdk = new NodeSDK({\n resource,\n serviceName: options.serviceName,\n autoDetectResources: options.autoDetectResources,\n contextManager: options.contextManager,\n textMapPropagator: options.textMapPropagator,\n metricReader: options.metricReader,\n views: options.views,\n resourceDetectors: options.resourceDetectors,\n sampler: options.sampler,\n spanProcessors,\n logRecordProcessors: logProcessors,\n spanLimits: options.spanLimits,\n idGenerator: options.idGenerator,\n instrumentations: options.instrumentations,\n });\n\n sdk.start();\n logger.info(\"NodeSDK started successfully\");\n\n // Fix for Next.js 15: Explicitly verify and register provider if still proxy\n // See: https://github.com/langwatch/langwatch/issues/753\n if (process.env.NEXT_RUNTIME === 'nodejs') {\n // Wait a tick to ensure SDK initialization completes\n setImmediate(() => {\n const globalProvider = trace.getTracerProvider();\n\n // Check if provider is still a proxy (Next.js 15 issue)\n if (globalProvider.constructor.name === 'ProxyTracerProvider') {\n logger.warn('Global provider is still ProxyTracerProvider after SDK start - applying Next.js 15 workaround');\n\n // Access the real provider from the delegate\n const realProvider = (globalProvider as any)._delegate;\n\n if (realProvider?.constructor.name === 'NodeTracerProvider') {\n // Explicitly register the real provider globally\n trace.setGlobalTracerProvider(realProvider);\n logger.info('Successfully registered NodeTracerProvider globally for Next.js 15');\n } else {\n logger.error('Could not find NodeTracerProvider in proxy delegate - spans may not be exported');\n }\n } else {\n logger.debug(`Provider registered correctly: ${globalProvider.constructor.name}`);\n }\n });\n }\n\n if (loggerProvider) {\n setLangWatchLoggerProvider(loggerProvider);\n logger.debug(\"Set LangWatch logger provider\");\n }\n\n if (!options.advanced?.disableAutoShutdown) {\n let isShuttingDown = false;\n\n const gracefulShutdown = async ({ signal, exitAfter }: { signal: string; exitAfter: boolean }) => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n\n logger.debug(`${signal}: shutting down OpenTelemetry...`);\n try {\n await sdk.shutdown();\n logger.debug('OpenTelemetry shutdown complete');\n } catch (err) {\n logger.error('Error shutting down OpenTelemetry', err);\n } finally {\n if (exitAfter) {\n process.exit(0);\n }\n }\n };\n\n // Normal process exit when event loop drains (e.g. CLI scripts, one-shot programs)\n process.on('beforeExit', () => {\n void gracefulShutdown({ signal: 'beforeExit', exitAfter: false });\n });\n\n // Ctrl+C\n process.on('SIGINT', () => {\n void gracefulShutdown({ signal: 'SIGINT', exitAfter: true });\n });\n\n // External kill / Docker stop / k8s pod termination\n process.on('SIGTERM', () => {\n void gracefulShutdown({ signal: 'SIGTERM', exitAfter: true });\n });\n }\n\n return sdk;\n}\n\n/**\n * Ensure observability is set up, but only if not already configured.\n * \n * This is an idempotent function that:\n * - Does nothing if OpenTelemetry is already configured (by you or another library)\n * - Sets up LangWatch observability if no tracer provider exists\n * - Does nothing if LANGWATCH_API_KEY is not set\n * \n * This is useful for libraries/SDKs that want to ensure tracing is available\n * without conflicting with user's existing observability setup.\n * \n * @example\n * ```typescript\n * import { ensureSetup } from \"langwatch/observability/node\";\n * \n * // Safe to call - won't conflict with existing setup\n * ensureSetup();\n * \n * // Now you can use tracing\n * const tracer = trace.getTracer(\"my-app\");\n * ```\n */\nexport const ensureSetup = (): ObservabilityHandle => {\n const globalProvider = trace.getTracerProvider();\n const alreadySetup = isConcreteProvider(globalProvider);\n \n // If already set up, return no-op handle (don't log error, just silently skip)\n if (alreadySetup) {\n return {\n shutdown: async () => {\n // No-op - we didn't set up anything\n },\n };\n }\n \n // If no API key, return no-op handle (can't set up without it)\n if (!process.env.LANGWATCH_API_KEY) {\n return {\n shutdown: async () => {\n // No-op - no API key available\n },\n };\n }\n \n // Set up observability with defaults\n return setupObservability();\n};\n","import {\n defaultResource,\n type Resource,\n resourceFromAttributes,\n} from \"@opentelemetry/resources\";\nimport { type Attributes } from \"@opentelemetry/api\";\nimport * as semconv from \"@opentelemetry/semantic-conventions/incubating\";\nimport {\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_VERSION,\n DEFAULT_SERVICE_NAME,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n} from \"../../internal/constants\";\nimport {\n ATTR_LANGWATCH_SDK_NAME,\n ATTR_LANGWATCH_SDK_VERSION,\n ATTR_LANGWATCH_SDK_LANGUAGE,\n} from \"../semconv/attributes\";\n\n/**\n * Creates a merged resource from the given attributes, service name, and given resource.\n */\nexport function createMergedResource(\n attributes: Attributes | undefined,\n serviceName: string | undefined,\n givenResource: Resource | undefined,\n): Resource {\n const langwatchResource = resourceFromAttributes({\n [ATTR_LANGWATCH_SDK_NAME]: LANGWATCH_SDK_NAME_OBSERVABILITY,\n [ATTR_LANGWATCH_SDK_LANGUAGE]: LANGWATCH_SDK_LANGUAGE,\n [ATTR_LANGWATCH_SDK_VERSION]: LANGWATCH_SDK_VERSION,\n });\n\n const userResource = resourceFromAttributes({\n [semconv.ATTR_SERVICE_NAME]: serviceName ?? DEFAULT_SERVICE_NAME,\n ...(attributes ?? {}),\n });\n\n return (givenResource ?? defaultResource())\n .merge(langwatchResource)\n .merge(userResource);\n}\n\n/**\n * Returns the concrete OpenTelemetry provider (NodeTracerProvider or BasicTracerProvider),\n * either from the given provider or its delegate, or undefined if not found.\n */\nexport function getConcreteProvider(provider: unknown): unknown {\n if (!provider || typeof provider !== \"object\") return undefined;\n\n // Check provider itself\n const constructorName = (provider as any).constructor?.name;\n if ([\"NodeTracerProvider\", \"BasicTracerProvider\"].includes(constructorName)) {\n return provider;\n }\n if (typeof (provider as any).addSpanProcessor === \"function\") {\n return provider;\n }\n\n // Check one level of delegate (ProxyTracerProvider pattern)\n let delegate;\n if (typeof (provider as any).getDelegate === \"function\") {\n delegate = (provider as any).getDelegate();\n } else if ((provider as any).delegate) {\n delegate = (provider as any).delegate;\n } else if ((provider as any)._delegate) {\n // Also check for _delegate (OpenTelemetry's actual property name)\n // See: https://github.com/langwatch/langwatch/issues/753\n delegate = (provider as any)._delegate;\n }\n\n if (delegate && typeof delegate === \"object\") {\n const delegateConstructorName = delegate.constructor?.name;\n if ([\"NodeTracerProvider\", \"BasicTracerProvider\"].includes(delegateConstructorName)) {\n return delegate;\n }\n if (typeof delegate.addSpanProcessor === \"function\") {\n return delegate;\n }\n }\n\n return void 0;\n}\n\n/**\n * Returns true if the given provider (or its delegate) is a concrete OpenTelemetry provider.\n */\nexport function isConcreteProvider(provider: unknown): boolean {\n return !!getConcreteProvider(provider);\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAe;AACxB,SAAS,0BAA0B,yBAAkD,0BAA0B,sBAAsB;;;ACDrI;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAEP,YAAY,aAAa;AAgBlB,SAAS,qBACd,YACA,aACA,eACU;AACV,QAAM,oBAAoB,uBAAuB;AAAA,IAC/C,CAAC,uBAAuB,GAAG;AAAA,IAC3B,CAAC,2BAA2B,GAAG;AAAA,IAC/B,CAAC,0BAA0B,GAAG;AAAA,EAChC,CAAC;AAED,QAAM,eAAe,uBAAuB;AAAA,IAC1C,CAAS,yBAAiB,GAAG,oCAAe;AAAA,KACxC,kCAAc,CAAC,EACpB;AAED,UAAQ,wCAAiB,gBAAgB,GACtC,MAAM,iBAAiB,EACvB,MAAM,YAAY;AACvB;AAMO,SAAS,oBAAoB,UAA4B;AA/ChE;AAgDE,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,QAAM,mBAAmB,cAAiB,gBAAjB,mBAA8B;AACvD,MAAI,CAAC,sBAAsB,qBAAqB,EAAE,SAAS,eAAe,GAAG;AAC3E,WAAO;AAAA,EACT;AACA,MAAI,OAAQ,SAAiB,qBAAqB,YAAY;AAC5D,WAAO;AAAA,EACT;AAGA,MAAI;AACJ,MAAI,OAAQ,SAAiB,gBAAgB,YAAY;AACvD,eAAY,SAAiB,YAAY;AAAA,EAC3C,WAAY,SAAiB,UAAU;AACrC,eAAY,SAAiB;AAAA,EAC/B,WAAY,SAAiB,WAAW;AAGtC,eAAY,SAAiB;AAAA,EAC/B;AAEA,MAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,UAAM,2BAA0B,cAAS,gBAAT,mBAAsB;AACtD,QAAI,CAAC,sBAAsB,qBAAqB,EAAE,SAAS,uBAAuB,GAAG;AACnF,aAAO;AAAA,IACT;AACA,QAAI,OAAO,SAAS,qBAAqB,YAAY;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,UAA4B;AAC7D,SAAO,CAAC,CAAC,oBAAoB,QAAQ;AACvC;;;ADrFA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AASP,IAAM,mBAAmB,CAAC,YAAyC;AAAA,EACjE,UAAU,YAAY;AACpB,WAAO,MAAM,+DAA+D;AAAA,EAC9E;AACF;AAEA,IAAM,qBAAqB,CAAC,YAAuC;AAzBnE;AA0BE,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,OAAO,QAAQ,cAAc,WAAW,QAAQ,YAAY,CAAC;AAE5E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa,UAAU,YAAO,WAAP,YAAiB,QAAQ,IAAI;AAAA,IAC5D,UAAU,aAAa,UAAU,kBAAO,aAAP,YAAmB,QAAQ,IAAI,uBAA/B,YAAqD;AAAA,IACtF,gBAAe,YAAO,kBAAP,YAAwB;AAAA,EACzC;AACF;AAEA,IAAM,oBAAoB,CAAC,SAAoC,WAA+C;AArC9G;AAsCE,OAAI,aAAQ,aAAR,mBAAkB,UAAU;AAC9B,WAAO,MAAM,8CAA8C;AAC3D,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,OAAI,aAAQ,aAAR,mBAAkB,wBAAwB;AAC5C,WAAO,MAAM,8BAA8B;AAC3C,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,QAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAM,eAAe,mBAAmB,cAAc;AAEtD,MAAI,gBAAgB,GAAC,aAAQ,aAAR,mBAAkB,4CAA2C;AAChF,WAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQF;AACA,WAAO,iBAAiB,MAAM;AAAA,EAChC;AAEA,MAAI,cAAc;AAChB,WAAO;AAAA,MACL;AAAA,IAEF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,SAAoC,WAAkD,WAAmB;AA3EtI;AA+EE,MAAI,UAAU,UAAU;AACtB,UAAM,wBACJ,qCAAQ,mBAAR,mBAAwB,WAAxB,aACA,aAAQ,wBAAR,mBAA6B,WAD7B,aAEA,aAAQ,UAAR,mBAAe,mBAFf,aAGA,aAAQ,UAAR,mBAAe,mBAHf,YAIA,QAAQ;AAEV,QAAI,CAAC,sBAAsB;AACzB,YAAM,eACJ;AASF,WAAI,aAAQ,aAAR,mBAAkB,mBAAmB;AACvC,cAAM,IAAI,MAAM,YAAY;AAAA,MAC9B,OAAO;AACL,eAAO,MAAM,YAAY;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,UAAqC,CAAC,GAAwB;AA3GjG;AA4GE,QAAM,UAAS,mBAAQ,UAAR,mBAAe,WAAf,YAAyB,IAAI,cAAc;AAAA,IACxD,QAAO,mBAAQ,UAAR,mBAAe,aAAf,YAA2B;AAAA,IAClC,QAAQ;AAAA,EACV,CAAC;AAED,mCAAiC;AAAA,IAC/B;AAAA,IACA,aAAa,QAAQ;AAAA,EACvB,CAAC;AAED,QAAM,YAAY,kBAAkB,SAAS,MAAM;AACnD,MAAI,UAAW,QAAO;AAEtB,MAAI;AACF,UAAM,MAAM,sBAAsB,SAAS,QAAQ;AAAA,MACjD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,KAAK,0DAA0D;AAEtE,WAAO;AAAA,MACL,UAAU,YAAY;AACpB,eAAO,MAAM,uBAAuB;AACpC,eAAM,2BAAK;AACX,eAAO,KAAK,2BAA2B;AAAA,MACzC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACpE,WAAO,MAAM,iCAAiC,YAAY,EAAE;AAE5D,QAAI,eAAe,SAAS,IAAI,OAAO;AACrC,aAAO,MAAM,gBAAgB,IAAI,KAAK,EAAE;AAAA,IAC1C;AAEA,SAAI,aAAQ,aAAR,mBAAkB,kBAAmB,OAAM;AAC/C,WAAO,iBAAiB,MAAM;AAAA,EAChC;AACF;AAEO,SAAS,sBACd,SACA,QACA,UACS;AA1JX;AA2JE,QAAM,YAAY,mBAAmB,OAAO;AAE5C,MAAI,UAAU,UAAU;AACtB,WAAO,KAAK,4FAA4F;AAAA,EAC1G,OAAO;AACL,WAAO,KAAK,mBAAmB,UAAU,aAAa,qCAAqC;AAAA,EAC7F;AAEA,QAAM,iBAAkC,CAAC;AACzC,QAAM,gBAAsC,CAAC;AAG7C,OAAI,aAAQ,UAAR,mBAAe,gBAAgB;AACjC,mBAAe,KAAK,IAAI,oBAAoB,IAAI,oBAAoB,CAAC,CAAC;AACtE,WAAO,MAAM,uDAAuD;AAAA,EACtE;AACA,OAAI,aAAQ,UAAR,mBAAe,gBAAgB;AACjC,kBAAc,KAAK,IAAI,yBAAyB,IAAI,yBAAyB,CAAC,CAAC;AAC/E,WAAO,MAAM,wEAAwE;AAAA,EACvF;AAEA,MAAI,CAAC,UAAU,UAAU;AACvB,UAAM,gBAAgB,IAAI,uBAAuB;AAAA,MAC/C,QAAQ,UAAU;AAAA,MAClB,UAAU,UAAU;AAAA,IACtB,CAAC;AACD,UAAM,cAAc,IAAI,sBAAsB;AAAA,MAC5C,QAAQ,UAAU;AAAA,MAClB,UAAU,UAAU;AAAA,IACtB,CAAC;AAED,QAAI,UAAU,kBAAkB,SAAS;AACvC,qBAAe,KAAK,IAAI,mBAAmB,aAAa,CAAC;AACzD,oBAAc,KAAK,IAAI,wBAAwB,WAAW,CAAC;AAC3D,aAAO,MAAM,mBAAmB,UAAU,aAAa,8CAA8C;AAAA,IACvG,OAAO;AACL,qBAAe,KAAK,IAAI,oBAAoB,aAAa,CAAC;AAC1D,oBAAc,KAAK,IAAI,yBAAyB,WAAW,CAAC;AAC5D,aAAO,MAAM,mBAAmB,UAAU,aAAa,8CAA8C;AAAA,IACvG;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe;AACzB,mBAAe,KAAK,IAAI,oBAAoB,QAAQ,aAAa,CAAC;AAClE,WAAO,MAAM,0CAA0C;AAAA,EACzD;AAEA,OAAI,aAAQ,mBAAR,mBAAwB,QAAQ;AAClC,mBAAe,KAAK,GAAG,QAAQ,cAAc;AAC7C,WAAO,MAAM,uBAAuB,QAAQ,eAAe,MAAM,wBAAwB;AAAA,EAC3F;AACA,OAAI,aAAQ,wBAAR,mBAA6B,QAAQ;AACvC,kBAAc,KAAK,GAAG,QAAQ,mBAAmB;AACjD,WAAO,MAAM,uBAAuB,QAAQ,oBAAoB,MAAM,6BAA6B;AAAA,EACrG;AAEA,sBAAoB,SAAS,WAAW,MAAM;AAG9C,QAAM,iBAAiB,cAAc,SAAS,IAAI,eAAe;AAAA,IAC/D;AAAA,IACA,YAAY;AAAA,EACd,CAAC,IAAI;AAEL,MAAI,gBAAgB;AAClB,WAAO,MAAM,mCAAmC;AAAA,EAClD;AAEA,QAAM,MAAM,IAAI,QAAQ;AAAA,IACtB;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,qBAAqB,QAAQ;AAAA,IAC7B,gBAAgB,QAAQ;AAAA,IACxB,mBAAmB,QAAQ;AAAA,IAC3B,cAAc,QAAQ;AAAA,IACtB,OAAO,QAAQ;AAAA,IACf,mBAAmB,QAAQ;AAAA,IAC3B,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,qBAAqB;AAAA,IACrB,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,kBAAkB,QAAQ;AAAA,EAC5B,CAAC;AAED,MAAI,MAAM;AACV,SAAO,KAAK,8BAA8B;AAI1C,MAAI,QAAQ,IAAI,iBAAiB,UAAU;AAEzC,iBAAa,MAAM;AACjB,YAAM,iBAAiB,MAAM,kBAAkB;AAG/C,UAAI,eAAe,YAAY,SAAS,uBAAuB;AAC7D,eAAO,KAAK,+FAA+F;AAG3G,cAAM,eAAgB,eAAuB;AAE7C,aAAI,6CAAc,YAAY,UAAS,sBAAsB;AAE3D,gBAAM,wBAAwB,YAAY;AAC1C,iBAAO,KAAK,oEAAoE;AAAA,QAClF,OAAO;AACL,iBAAO,MAAM,iFAAiF;AAAA,QAChG;AAAA,MACF,OAAO;AACL,eAAO,MAAM,kCAAkC,eAAe,YAAY,IAAI,EAAE;AAAA,MAClF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB;AAClB,+BAA2B,cAAc;AACzC,WAAO,MAAM,+BAA+B;AAAA,EAC9C;AAEA,MAAI,GAAC,aAAQ,aAAR,mBAAkB,sBAAqB;AAC1C,QAAI,iBAAiB;AAErB,UAAM,mBAAmB,OAAO,EAAE,QAAQ,UAAU,MAA8C;AAChG,UAAI,eAAgB;AACpB,uBAAiB;AAEjB,aAAO,MAAM,GAAG,MAAM,kCAAkC;AACxD,UAAI;AACF,cAAM,IAAI,SAAS;AACnB,eAAO,MAAM,iCAAiC;AAAA,MAChD,SAAS,KAAK;AACZ,eAAO,MAAM,qCAAqC,GAAG;AAAA,MACvD,UAAE;AACA,YAAI,WAAW;AACb,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAGA,YAAQ,GAAG,cAAc,MAAM;AAC7B,WAAK,iBAAiB,EAAE,QAAQ,cAAc,WAAW,MAAM,CAAC;AAAA,IAClE,CAAC;AAGD,YAAQ,GAAG,UAAU,MAAM;AACzB,WAAK,iBAAiB,EAAE,QAAQ,UAAU,WAAW,KAAK,CAAC;AAAA,IAC7D,CAAC;AAGD,YAAQ,GAAG,WAAW,MAAM;AAC1B,WAAK,iBAAiB,EAAE,QAAQ,WAAW,WAAW,KAAK,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAwBO,IAAM,cAAc,MAA2B;AACpD,QAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAM,eAAe,mBAAmB,cAAc;AAGtD,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,UAAU,YAAY;AAAA,MAEtB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,IAAI,mBAAmB;AAClC,WAAO;AAAA,MACL,UAAU,YAAY;AAAA,MAEtB;AAAA,IACF;AAAA,EACF;AAGA,SAAO,mBAAmB;AAC5B;","names":[]}
1
+ {"version":3,"sources":["../src/observability-sdk/setup/node/setup.ts","../src/observability-sdk/setup/utils.ts"],"sourcesContent":["import { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport { SimpleLogRecordProcessor, BatchLogRecordProcessor, type LogRecordProcessor, ConsoleLogRecordExporter, LoggerProvider } from \"@opentelemetry/sdk-logs\";\nimport { createMergedResource, isConcreteProvider } from \"../utils\";\nimport { type SetupObservabilityOptions, type ObservabilityHandle } from \"./types\";\nimport { trace } from \"@opentelemetry/api\";\nimport {\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n BatchSpanProcessor,\n type SpanProcessor,\n} from \"@opentelemetry/sdk-trace-base\";\nimport { type Resource } from \"@opentelemetry/resources\";\nimport { LangWatchLogsExporter, LangWatchTraceExporter } from \"../../exporters\";\nimport { ConsoleLogger, type Logger } from \"../../../logger\";\nimport { initializeObservabilitySdkConfig } from \"../../config\";\nimport { setLangWatchLoggerProvider } from \"../../logger\";\nimport { DEFAULT_ENDPOINT } from \"@/internal/constants\";\n\n// Helper functions\nconst createNoOpHandle = (logger: Logger): ObservabilityHandle => ({\n shutdown: async () => {\n logger.debug(\"Shutdown called for LangWatch no-op. Nothing will be shutdown\");\n },\n});\n\nconst getLangWatchConfig = (options: SetupObservabilityOptions) => {\n const isDisabled = options.langwatch === 'disabled';\n const config = typeof options.langwatch === 'object' ? options.langwatch : {};\n\n return {\n disabled: isDisabled,\n apiKey: isDisabled ? void 0 : (config.apiKey ?? process.env.LANGWATCH_API_KEY),\n endpoint: isDisabled ? void 0 : (config.endpoint ?? process.env.LANGWATCH_ENDPOINT ?? DEFAULT_ENDPOINT),\n processorType: config.processorType ?? 'batch'\n };\n};\n\nconst checkForEarlyExit = (options: SetupObservabilityOptions, logger: Logger): ObservabilityHandle | null => {\n if (options.advanced?.disabled) {\n logger.debug(\"Observability disabled via advanced.disabled\");\n return createNoOpHandle(logger);\n }\n\n if (options.advanced?.skipOpenTelemetrySetup) {\n logger.debug(\"Skipping OpenTelemetry setup\");\n return createNoOpHandle(logger);\n }\n\n const globalProvider = trace.getTracerProvider();\n const alreadySetup = isConcreteProvider(globalProvider);\n\n if (alreadySetup && !options.advanced?.UNSAFE_forceOpenTelemetryReinitialization) {\n logger.error(\n `OpenTelemetry is already set up in this process.\\n` +\n `Spans will NOT be sent to LangWatch unless you add the LangWatch span processor or exporter to your existing OpenTelemetry setup.\\n` +\n `You must either:\\n` +\n ` 1. Remove your existing OpenTelemetry setup and only use LangWatch,\\n` +\n ` 2. Add the LangWatch span processor to your existing setup, or replace the existing exporter with the LangWatch exporter.\\n` +\n `\\nFor step-by-step instructions, see the LangWatch docs and check out the integration guide for your framework:\\n` +\n ` https://docs.langwatch.ai/integration/typescript/guide\\n` +\n `\\nSee also: https://github.com/open-telemetry/opentelemetry-js/issues/5299`,\n );\n return createNoOpHandle(logger);\n }\n\n if (alreadySetup) {\n logger.warn(\n \"OpenTelemetry is already set up, but UNSAFE_forceOpenTelemetryReinitialization=true. \" +\n \"Proceeding with reinitialization. This may cause conflicts.\"\n );\n }\n\n return null;\n};\n\nconst warnIfMisconfigured = (options: SetupObservabilityOptions, langwatch: ReturnType<typeof getLangWatchConfig>, logger: Logger) => {\n // Check if LangWatch is disabled but no alternative export mechanisms are provided\n // Note: If we reach this function, we know advanced.disabled and advanced.skipOpenTelemetrySetup are false\n // because those are handled as early exits in setupObservability()\n if (langwatch.disabled) {\n const hasAlternativeExport =\n options.spanProcessors?.length ??\n options.logRecordProcessors?.length ??\n options.debug?.consoleTracing ??\n options.debug?.consoleLogging ??\n options.traceExporter;\n\n if (!hasAlternativeExport) {\n const errorMessage =\n \"LangWatch integration is disabled but no custom span processors, trace exporters, or console tracing is configured. \" +\n \"OpenTelemetry will be set up but traces will not be exported anywhere. \" +\n \"Either:\\n\" +\n \" 1. Enable LangWatch integration (remove langwatch: 'disabled')\\n\" +\n \" 2. Provide custom spanProcessors, logRecordProcessors, or traceExporter\\n\" +\n \" 3. Enable debug.consoleTracing or debug.consoleLogging for development\\n\" +\n \" 4. Use advanced.disabled to completely disable observability\\n\" +\n \" 5. Use advanced.skipOpenTelemetrySetup to handle OpenTelemetry setup yourself\";\n\n if (options.advanced?.throwOnSetupError) {\n throw new Error(errorMessage);\n } else {\n logger.error(errorMessage);\n }\n }\n }\n};\n\nexport function setupObservability(options: SetupObservabilityOptions = {}): ObservabilityHandle {\n const logger = options.debug?.logger ?? new ConsoleLogger({\n level: options.debug?.logLevel ?? 'warn',\n prefix: \"LangWatch Observability SDK\",\n });\n\n initializeObservabilitySdkConfig({\n logger,\n dataCapture: options.dataCapture,\n });\n\n const earlyExit = checkForEarlyExit(options, logger);\n if (earlyExit) return earlyExit;\n\n try {\n const sdk = createAndStartNodeSdk(options, logger, createMergedResource(\n options.attributes,\n options.serviceName,\n options.resource,\n ));\n\n logger.info(\"LangWatch Observability SDK setup completed successfully\");\n\n return {\n shutdown: async () => {\n logger.debug(\"Shutting down NodeSDK\");\n await sdk?.shutdown();\n logger.info(\"NodeSDK shutdown complete\");\n },\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n logger.error(`Failed to initialize NodeSDK: ${errorMessage}`);\n\n if (err instanceof Error && err.stack) {\n logger.debug(`Stack trace: ${err.stack}`);\n }\n\n if (options.advanced?.throwOnSetupError) throw err;\n return createNoOpHandle(logger);\n }\n}\n\nexport function createAndStartNodeSdk(\n options: SetupObservabilityOptions,\n logger: Logger,\n resource: Resource,\n): NodeSDK {\n const langwatch = getLangWatchConfig(options);\n\n if (langwatch.disabled) {\n logger.warn(\"LangWatch integration disabled, using user-provided SpanProcessors and LogRecordProcessors\");\n } else {\n logger.info(`Using LangWatch ${langwatch.processorType} processors for tracing and logging`);\n }\n\n const spanProcessors: SpanProcessor[] = [];\n const logProcessors: LogRecordProcessor[] = [];\n\n // Console processors\n if (options.debug?.consoleTracing) {\n spanProcessors.push(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n logger.debug(\"Console tracing enabled; adding console span exporter\");\n }\n if (options.debug?.consoleLogging) {\n logProcessors.push(new SimpleLogRecordProcessor(new ConsoleLogRecordExporter()));\n logger.debug(\"Console recording of logs enabled; adding console log record processor\");\n }\n\n if (!langwatch.disabled) {\n const traceExporter = new LangWatchTraceExporter({\n apiKey: langwatch.apiKey,\n endpoint: langwatch.endpoint,\n });\n const logExporter = new LangWatchLogsExporter({\n apiKey: langwatch.apiKey,\n endpoint: langwatch.endpoint,\n });\n\n if (langwatch.processorType === 'batch') {\n spanProcessors.push(new BatchSpanProcessor(traceExporter));\n logProcessors.push(new BatchLogRecordProcessor(logExporter));\n logger.debug(`Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`);\n } else {\n spanProcessors.push(new SimpleSpanProcessor(traceExporter));\n logProcessors.push(new SimpleLogRecordProcessor(logExporter));\n logger.debug(`Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`);\n }\n }\n\n if (options.traceExporter) {\n spanProcessors.push(new SimpleSpanProcessor(options.traceExporter));\n logger.debug(`Added user-provided SpanProcessor to SDK`);\n }\n\n if (options.spanProcessors?.length) {\n spanProcessors.push(...options.spanProcessors);\n logger.debug(`Added user-provided ${options.spanProcessors.length} SpanProcessors to SDK`);\n }\n if (options.logRecordProcessors?.length) {\n logProcessors.push(...options.logRecordProcessors);\n logger.debug(`Added user-provided ${options.logRecordProcessors.length} LogRecordProcessors to SDK`);\n }\n\n warnIfMisconfigured(options, langwatch, logger);\n\n // Create logger provider\n const loggerProvider = logProcessors.length ? new LoggerProvider({\n resource,\n processors: logProcessors,\n }) : void 0;\n\n if (loggerProvider) {\n logger.debug(\"Created LangWatch logger provider\");\n }\n\n const sdk = new NodeSDK({\n resource,\n serviceName: options.serviceName,\n autoDetectResources: options.autoDetectResources,\n contextManager: options.contextManager,\n textMapPropagator: options.textMapPropagator,\n metricReader: options.metricReader,\n views: options.views,\n resourceDetectors: options.resourceDetectors,\n sampler: options.sampler,\n spanProcessors,\n logRecordProcessors: logProcessors,\n spanLimits: options.spanLimits,\n idGenerator: options.idGenerator,\n instrumentations: options.instrumentations,\n });\n\n sdk.start();\n logger.info(\"NodeSDK started successfully\");\n\n // Fix for Next.js 15: Explicitly verify and register provider if still proxy\n // See: https://github.com/langwatch/langwatch/issues/753\n if (process.env.NEXT_RUNTIME === 'nodejs') {\n // Wait a tick to ensure SDK initialization completes\n setImmediate(() => {\n const globalProvider = trace.getTracerProvider();\n\n // Check if provider is still a proxy (Next.js 15 issue)\n if (globalProvider.constructor.name === 'ProxyTracerProvider') {\n logger.warn('Global provider is still ProxyTracerProvider after SDK start - applying Next.js 15 workaround');\n\n // Access the real provider from the delegate\n const realProvider = (globalProvider as any)._delegate;\n\n if (realProvider?.constructor.name === 'NodeTracerProvider') {\n // Explicitly register the real provider globally\n trace.setGlobalTracerProvider(realProvider);\n logger.info('Successfully registered NodeTracerProvider globally for Next.js 15');\n } else {\n logger.error('Could not find NodeTracerProvider in proxy delegate - spans may not be exported');\n }\n } else {\n logger.debug(`Provider registered correctly: ${globalProvider.constructor.name}`);\n }\n });\n }\n\n if (loggerProvider) {\n setLangWatchLoggerProvider(loggerProvider);\n logger.debug(\"Set LangWatch logger provider\");\n }\n\n if (!options.advanced?.disableAutoShutdown) {\n let isShuttingDown = false;\n\n const gracefulShutdown = async ({ signal, exitAfter }: { signal: string; exitAfter: boolean }) => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n\n logger.debug(`${signal}: shutting down OpenTelemetry...`);\n try {\n await sdk.shutdown();\n logger.debug('OpenTelemetry shutdown complete');\n } catch (err) {\n logger.error('Error shutting down OpenTelemetry', err);\n } finally {\n if (exitAfter) {\n process.exit(0);\n }\n }\n };\n\n // Normal process exit when event loop drains (e.g. CLI scripts, one-shot programs)\n process.on('beforeExit', () => {\n void gracefulShutdown({ signal: 'beforeExit', exitAfter: false });\n });\n\n // Ctrl+C\n process.on('SIGINT', () => {\n void gracefulShutdown({ signal: 'SIGINT', exitAfter: true });\n });\n\n // External kill / Docker stop / k8s pod termination\n process.on('SIGTERM', () => {\n void gracefulShutdown({ signal: 'SIGTERM', exitAfter: true });\n });\n }\n\n return sdk;\n}\n\n/**\n * Ensure observability is set up, but only if not already configured.\n * \n * This is an idempotent function that:\n * - Does nothing if OpenTelemetry is already configured (by you or another library)\n * - Sets up LangWatch observability if no tracer provider exists\n * - Does nothing if LANGWATCH_API_KEY is not set\n * \n * This is useful for libraries/SDKs that want to ensure tracing is available\n * without conflicting with user's existing observability setup.\n * \n * @example\n * ```typescript\n * import { ensureSetup } from \"langwatch/observability/node\";\n * \n * // Safe to call - won't conflict with existing setup\n * ensureSetup();\n * \n * // Now you can use tracing\n * const tracer = trace.getTracer(\"my-app\");\n * ```\n */\nexport const ensureSetup = (): ObservabilityHandle => {\n const globalProvider = trace.getTracerProvider();\n const alreadySetup = isConcreteProvider(globalProvider);\n \n // If already set up, return no-op handle (don't log error, just silently skip)\n if (alreadySetup) {\n return {\n shutdown: async () => {\n // No-op - we didn't set up anything\n },\n };\n }\n \n // If no API key, return no-op handle (can't set up without it)\n if (!process.env.LANGWATCH_API_KEY) {\n return {\n shutdown: async () => {\n // No-op - no API key available\n },\n };\n }\n \n // Set up observability with defaults\n return setupObservability();\n};\n","import {\n defaultResource,\n type Resource,\n resourceFromAttributes,\n} from \"@opentelemetry/resources\";\nimport { type Attributes } from \"@opentelemetry/api\";\nimport * as semconv from \"@opentelemetry/semantic-conventions/incubating\";\nimport {\n LANGWATCH_SDK_LANGUAGE,\n LANGWATCH_SDK_VERSION,\n DEFAULT_SERVICE_NAME,\n LANGWATCH_SDK_NAME_OBSERVABILITY,\n} from \"../../internal/constants\";\nimport {\n ATTR_LANGWATCH_SDK_NAME,\n ATTR_LANGWATCH_SDK_VERSION,\n ATTR_LANGWATCH_SDK_LANGUAGE,\n} from \"../semconv/attributes\";\n\n/**\n * Creates a merged resource from the given attributes, service name, and given resource.\n */\nexport function createMergedResource(\n attributes: Attributes | undefined,\n serviceName: string | undefined,\n givenResource: Resource | undefined,\n): Resource {\n const langwatchResource = resourceFromAttributes({\n [ATTR_LANGWATCH_SDK_NAME]: LANGWATCH_SDK_NAME_OBSERVABILITY,\n [ATTR_LANGWATCH_SDK_LANGUAGE]: LANGWATCH_SDK_LANGUAGE,\n [ATTR_LANGWATCH_SDK_VERSION]: LANGWATCH_SDK_VERSION,\n });\n\n const userResource = resourceFromAttributes({\n [semconv.ATTR_SERVICE_NAME]: serviceName ?? DEFAULT_SERVICE_NAME,\n ...(attributes ?? {}),\n });\n\n return (givenResource ?? defaultResource())\n .merge(langwatchResource)\n .merge(userResource);\n}\n\n/**\n * Returns the concrete OpenTelemetry provider (NodeTracerProvider or BasicTracerProvider),\n * either from the given provider or its delegate, or undefined if not found.\n */\nexport function getConcreteProvider(provider: unknown): unknown {\n if (!provider || typeof provider !== \"object\") return undefined;\n\n // Check provider itself\n const constructorName = (provider as any).constructor?.name;\n if ([\"NodeTracerProvider\", \"BasicTracerProvider\"].includes(constructorName)) {\n return provider;\n }\n if (typeof (provider as any).addSpanProcessor === \"function\") {\n return provider;\n }\n\n // Check one level of delegate (ProxyTracerProvider pattern)\n let delegate;\n if (typeof (provider as any).getDelegate === \"function\") {\n delegate = (provider as any).getDelegate();\n } else if ((provider as any).delegate) {\n delegate = (provider as any).delegate;\n } else if ((provider as any)._delegate) {\n // Also check for _delegate (OpenTelemetry's actual property name)\n // See: https://github.com/langwatch/langwatch/issues/753\n delegate = (provider as any)._delegate;\n }\n\n if (delegate && typeof delegate === \"object\") {\n const delegateConstructorName = delegate.constructor?.name;\n if ([\"NodeTracerProvider\", \"BasicTracerProvider\"].includes(delegateConstructorName)) {\n return delegate;\n }\n if (typeof delegate.addSpanProcessor === \"function\") {\n return delegate;\n }\n }\n\n return void 0;\n}\n\n/**\n * Returns true if the given provider (or its delegate) is a concrete OpenTelemetry provider.\n */\nexport function isConcreteProvider(provider: unknown): boolean {\n return !!getConcreteProvider(provider);\n}\n\n"],"mappings":"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","names":[]}
@@ -0,0 +1,59 @@
1
+ import {
2
+ createDatasetService,
3
+ handleDatasetCommandError
4
+ } from "./chunk-MUSWAQMZ.mjs";
5
+ import {
6
+ checkApiKey
7
+ } from "./chunk-DHJKJVY7.mjs";
8
+
9
+ // src/cli/commands/dataset/create.ts
10
+ import chalk from "chalk";
11
+ import ora from "ora";
12
+ var parseColumns = (columnsStr) => {
13
+ return columnsStr.split(",").map((pair) => {
14
+ var _a, _b;
15
+ const parts = pair.trim().split(":");
16
+ if (parts.length !== 2 || !((_a = parts[0]) == null ? void 0 : _a.trim()) || !((_b = parts[1]) == null ? void 0 : _b.trim())) {
17
+ throw new Error(
18
+ `Invalid column format: "${pair.trim()}". Expected "name:type" (e.g. "input:string")`
19
+ );
20
+ }
21
+ return { name: parts[0].trim(), type: parts[1].trim() };
22
+ });
23
+ };
24
+ var createCommand = async (name, options) => {
25
+ checkApiKey();
26
+ let columnTypes = [];
27
+ if (options.columns) {
28
+ try {
29
+ columnTypes = parseColumns(options.columns);
30
+ } catch (error) {
31
+ console.error(
32
+ chalk.red(error instanceof Error ? error.message : "Invalid columns format")
33
+ );
34
+ process.exit(1);
35
+ }
36
+ }
37
+ const service = createDatasetService();
38
+ const spinner = ora(`Creating dataset "${name}"...`).start();
39
+ try {
40
+ const dataset = await service.createDataset({ name, columnTypes });
41
+ spinner.succeed(`Dataset created: ${chalk.cyan(dataset.slug)}`);
42
+ console.log();
43
+ console.log(` ${chalk.bold("ID:")} ${dataset.id}`);
44
+ console.log(` ${chalk.bold("Slug:")} ${dataset.slug}`);
45
+ if (dataset.columnTypes.length > 0) {
46
+ const colStr = dataset.columnTypes.map((c) => `${c.name}:${c.type}`).join(", ");
47
+ console.log(` ${chalk.bold("Columns:")} ${colStr}`);
48
+ }
49
+ } catch (error) {
50
+ spinner.fail("Failed to create dataset");
51
+ handleDatasetCommandError(error, "creating dataset");
52
+ }
53
+ };
54
+
55
+ export {
56
+ parseColumns,
57
+ createCommand
58
+ };
59
+ //# sourceMappingURL=chunk-AGHEWK62.mjs.map