langwatch 0.5.1 → 0.6.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 (120) hide show
  1. package/README.md +19 -0
  2. package/dist/{add-4WXEWG5H.js → add-CGTO6GC2.js} +28 -32
  3. package/dist/add-CGTO6GC2.js.map +1 -0
  4. package/dist/{add-D2WVVKIP.mjs → add-XCI65PVN.mjs} +14 -18
  5. package/dist/add-XCI65PVN.mjs.map +1 -0
  6. package/dist/{chunk-P4SQTYGN.js → chunk-2GYC6KEA.js} +32 -32
  7. package/dist/{chunk-P4SQTYGN.js.map → chunk-2GYC6KEA.js.map} +1 -1
  8. package/dist/{chunk-CAZONSXV.js → chunk-36XAYVMC.js} +186 -76
  9. package/dist/chunk-36XAYVMC.js.map +1 -0
  10. package/dist/{chunk-ZIULPOMQ.mjs → chunk-3P4ROGZJ.mjs} +4 -4
  11. package/dist/{chunk-DLJO7AK5.mjs → chunk-AD7QRYIJ.mjs} +2 -2
  12. package/dist/{chunk-DISMHYXC.js → chunk-CKIZDPIJ.js} +24 -22
  13. package/dist/chunk-CKIZDPIJ.js.map +1 -0
  14. package/dist/{chunk-7OZKH5K2.js → chunk-DZH6SY3Z.js} +10 -10
  15. package/dist/{chunk-7OZKH5K2.js.map → chunk-DZH6SY3Z.js.map} +1 -1
  16. package/dist/{chunk-N2V6J3U2.mjs → chunk-FEL5FLHA.mjs} +2 -2
  17. package/dist/{chunk-H5PON53W.mjs → chunk-GAFUPYJ3.mjs} +334 -143
  18. package/dist/chunk-GAFUPYJ3.mjs.map +1 -0
  19. package/dist/{chunk-SVXNUWZI.js → chunk-HVW45GST.js} +345 -154
  20. package/dist/chunk-HVW45GST.js.map +1 -0
  21. package/dist/{chunk-YNQ44U6D.mjs → chunk-I2SOBPAF.mjs} +23 -21
  22. package/dist/chunk-I2SOBPAF.mjs.map +1 -0
  23. package/dist/{chunk-ECOC36EA.js → chunk-J7B7BNDN.js} +11 -11
  24. package/dist/{chunk-ECOC36EA.js.map → chunk-J7B7BNDN.js.map} +1 -1
  25. package/dist/{chunk-QZGTM76F.mjs → chunk-JPWKINZP.mjs} +2 -2
  26. package/dist/{chunk-OXBO24RB.js → chunk-OHM7JUMR.js} +15 -2
  27. package/dist/chunk-OHM7JUMR.js.map +1 -0
  28. package/dist/chunk-PYVDTUA6.mjs +352 -0
  29. package/dist/chunk-PYVDTUA6.mjs.map +1 -0
  30. package/dist/{chunk-YH5TIVK2.js → chunk-SNDTNU3T.js} +2 -2
  31. package/dist/{chunk-YH5TIVK2.js.map → chunk-SNDTNU3T.js.map} +1 -1
  32. package/dist/{chunk-CU3443HD.mjs → chunk-URTD2WOC.mjs} +14 -1
  33. package/dist/{chunk-YKFTFYKK.mjs → chunk-WOBPYIKO.mjs} +2 -2
  34. package/dist/chunk-WOBPYIKO.mjs.map +1 -0
  35. package/dist/{chunk-QCYYSMCU.js → chunk-Z3NTWVVA.js} +2 -2
  36. package/dist/chunk-Z3NTWVVA.js.map +1 -0
  37. package/dist/cli/index.js +8 -8
  38. package/dist/cli/index.mjs +8 -8
  39. package/dist/{create-OQEMO4MU.mjs → create-LXQB4EFB.mjs} +4 -5
  40. package/dist/{create-OQEMO4MU.mjs.map → create-LXQB4EFB.mjs.map} +1 -1
  41. package/dist/{create-4LG4N2A4.js → create-S5RDGF3H.js} +9 -10
  42. package/dist/create-S5RDGF3H.js.map +1 -0
  43. package/dist/{implementation-BIlL6-SW.d.ts → implementation-DsHp9FYU.d.ts} +1 -1
  44. package/dist/{implementation-fAgqv8OM.d.mts → implementation-nE9dgTwc.d.mts} +1 -1
  45. package/dist/{index-DTEZr0Jn.d.mts → index-D7rKIGrO.d.mts} +12 -12
  46. package/dist/{index-DTEZr0Jn.d.ts → index-D7rKIGrO.d.ts} +12 -12
  47. package/dist/index.d.mts +256 -11
  48. package/dist/index.d.ts +256 -11
  49. package/dist/index.js +135 -12
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +133 -10
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/{init-MQXXHCNT.mjs → init-T4YDPHBA.mjs} +4 -5
  54. package/dist/{init-MQXXHCNT.mjs.map → init-T4YDPHBA.mjs.map} +1 -1
  55. package/dist/init-UADBKUJU.js +15 -0
  56. package/dist/init-UADBKUJU.js.map +1 -0
  57. package/dist/{list-GIAXAAH5.js → list-GRKVAGJS.js} +14 -15
  58. package/dist/list-GRKVAGJS.js.map +1 -0
  59. package/dist/{list-PFWV7IU6.mjs → list-XHXVFN24.mjs} +13 -14
  60. package/dist/list-XHXVFN24.mjs.map +1 -0
  61. package/dist/{login-3STX2FAO.js → login-4GWM5I6F.js} +4 -4
  62. package/dist/{login-3STX2FAO.js.map → login-4GWM5I6F.js.map} +1 -1
  63. package/dist/{login-BYLXS23I.mjs → login-EKE7SFN3.mjs} +3 -3
  64. package/dist/observability-sdk/index.d.mts +4 -3
  65. package/dist/observability-sdk/index.d.ts +4 -3
  66. package/dist/observability-sdk/index.js +7 -7
  67. package/dist/observability-sdk/index.mjs +6 -6
  68. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +2 -1
  69. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +2 -1
  70. package/dist/observability-sdk/instrumentation/langchain/index.js +19 -19
  71. package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -3
  72. package/dist/observability-sdk/setup/node/index.d.mts +1 -1
  73. package/dist/observability-sdk/setup/node/index.d.ts +1 -1
  74. package/dist/observability-sdk/setup/node/index.js +15 -15
  75. package/dist/observability-sdk/setup/node/index.mjs +4 -4
  76. package/dist/{remove-U3PILQDV.js → remove-7EXB2Z6R.js} +17 -18
  77. package/dist/remove-7EXB2Z6R.js.map +1 -0
  78. package/dist/{remove-FTF3EBYV.mjs → remove-W44FQ5MF.mjs} +9 -10
  79. package/dist/{remove-FTF3EBYV.mjs.map → remove-W44FQ5MF.mjs.map} +1 -1
  80. package/dist/{sync-T3T22GVZ.js → sync-V7WRMNJV.js} +31 -35
  81. package/dist/sync-V7WRMNJV.js.map +1 -0
  82. package/dist/{sync-FOW7DHAH.mjs → sync-XGFABFAW.mjs} +16 -20
  83. package/dist/sync-XGFABFAW.mjs.map +1 -0
  84. package/dist/{types-DyUmlaDx.d.ts → types-B9772cUR.d.ts} +98 -29
  85. package/dist/{types-jrEEZt9d.d.mts → types-DbPAi4US.d.mts} +98 -29
  86. package/package.json +4 -3
  87. package/dist/add-4WXEWG5H.js.map +0 -1
  88. package/dist/add-D2WVVKIP.mjs.map +0 -1
  89. package/dist/chunk-CAZONSXV.js.map +0 -1
  90. package/dist/chunk-CKVDNVFL.mjs +0 -242
  91. package/dist/chunk-CKVDNVFL.mjs.map +0 -1
  92. package/dist/chunk-DISMHYXC.js.map +0 -1
  93. package/dist/chunk-DSIQSULK.js +0 -152
  94. package/dist/chunk-DSIQSULK.js.map +0 -1
  95. package/dist/chunk-H5PON53W.mjs.map +0 -1
  96. package/dist/chunk-OXBO24RB.js.map +0 -1
  97. package/dist/chunk-QCYYSMCU.js.map +0 -1
  98. package/dist/chunk-R6FBJN7K.js +0 -115
  99. package/dist/chunk-R6FBJN7K.js.map +0 -1
  100. package/dist/chunk-SVXNUWZI.js.map +0 -1
  101. package/dist/chunk-V5M3HUBV.mjs +0 -115
  102. package/dist/chunk-V5M3HUBV.mjs.map +0 -1
  103. package/dist/chunk-YEGQXDTE.mjs +0 -152
  104. package/dist/chunk-YEGQXDTE.mjs.map +0 -1
  105. package/dist/chunk-YKFTFYKK.mjs.map +0 -1
  106. package/dist/chunk-YNQ44U6D.mjs.map +0 -1
  107. package/dist/create-4LG4N2A4.js.map +0 -1
  108. package/dist/init-EKNL2SQE.js +0 -16
  109. package/dist/init-EKNL2SQE.js.map +0 -1
  110. package/dist/list-GIAXAAH5.js.map +0 -1
  111. package/dist/list-PFWV7IU6.mjs.map +0 -1
  112. package/dist/remove-U3PILQDV.js.map +0 -1
  113. package/dist/sync-FOW7DHAH.mjs.map +0 -1
  114. package/dist/sync-T3T22GVZ.js.map +0 -1
  115. /package/dist/{chunk-ZIULPOMQ.mjs.map → chunk-3P4ROGZJ.mjs.map} +0 -0
  116. /package/dist/{chunk-DLJO7AK5.mjs.map → chunk-AD7QRYIJ.mjs.map} +0 -0
  117. /package/dist/{chunk-N2V6J3U2.mjs.map → chunk-FEL5FLHA.mjs.map} +0 -0
  118. /package/dist/{chunk-QZGTM76F.mjs.map → chunk-JPWKINZP.mjs.map} +0 -0
  119. /package/dist/{chunk-CU3443HD.mjs.map → chunk-URTD2WOC.mjs.map} +0 -0
  120. /package/dist/{login-BYLXS23I.mjs.map → login-EKE7SFN3.mjs.map} +0 -0
@@ -2,38 +2,38 @@
2
2
  import {
3
3
  parsePromptSpec
4
4
  } from "../chunk-BTBSMJTY.mjs";
5
- import "../chunk-CU3443HD.mjs";
5
+ import "../chunk-URTD2WOC.mjs";
6
6
 
7
7
  // src/cli/index.ts
8
8
  import { config } from "dotenv";
9
9
  import { Command } from "commander";
10
10
  config();
11
11
  var addCommand = async (name, options) => {
12
- const { addCommand: addCommandImpl } = await import("../add-D2WVVKIP.mjs");
12
+ const { addCommand: addCommandImpl } = await import("../add-XCI65PVN.mjs");
13
13
  return addCommandImpl(name, options);
14
14
  };
15
15
  var removeCommand = async (name) => {
16
- const { removeCommand: removeCommandImpl } = await import("../remove-FTF3EBYV.mjs");
16
+ const { removeCommand: removeCommandImpl } = await import("../remove-W44FQ5MF.mjs");
17
17
  return removeCommandImpl(name);
18
18
  };
19
19
  var initCommand = async () => {
20
- const { initCommand: initCommandImpl } = await import("../init-MQXXHCNT.mjs");
20
+ const { initCommand: initCommandImpl } = await import("../init-T4YDPHBA.mjs");
21
21
  return initCommandImpl();
22
22
  };
23
23
  var loginCommand = async () => {
24
- const { loginCommand: loginCommandImpl } = await import("../login-BYLXS23I.mjs");
24
+ const { loginCommand: loginCommandImpl } = await import("../login-EKE7SFN3.mjs");
25
25
  return loginCommandImpl();
26
26
  };
27
27
  var listCommand = async () => {
28
- const { listCommand: listCommandImpl } = await import("../list-PFWV7IU6.mjs");
28
+ const { listCommand: listCommandImpl } = await import("../list-XHXVFN24.mjs");
29
29
  return listCommandImpl();
30
30
  };
31
31
  var syncCommand = async () => {
32
- const { syncCommand: syncCommandImpl } = await import("../sync-FOW7DHAH.mjs");
32
+ const { syncCommand: syncCommandImpl } = await import("../sync-XGFABFAW.mjs");
33
33
  return syncCommandImpl();
34
34
  };
35
35
  var createCommand = async (name, options) => {
36
- const { createCommand: createCommandImpl } = await import("../create-OQEMO4MU.mjs");
36
+ const { createCommand: createCommandImpl } = await import("../create-LXQB4EFB.mjs");
37
37
  return createCommandImpl(name, options);
38
38
  };
39
39
  var program = new Command();
@@ -3,13 +3,12 @@ import {
3
3
  } from "./chunk-DHJKJVY7.mjs";
4
4
  import {
5
5
  ensureProjectInitialized
6
- } from "./chunk-DLJO7AK5.mjs";
6
+ } from "./chunk-AD7QRYIJ.mjs";
7
7
  import {
8
8
  FileManager
9
- } from "./chunk-CKVDNVFL.mjs";
10
- import "./chunk-V5M3HUBV.mjs";
9
+ } from "./chunk-PYVDTUA6.mjs";
11
10
  import "./chunk-BTBSMJTY.mjs";
12
- import "./chunk-CU3443HD.mjs";
11
+ import "./chunk-URTD2WOC.mjs";
13
12
 
14
13
  // src/cli/commands/create.ts
15
14
  import * as fs from "fs";
@@ -78,4 +77,4 @@ messages:
78
77
  export {
79
78
  createCommand
80
79
  };
81
- //# sourceMappingURL=create-OQEMO4MU.mjs.map
80
+ //# sourceMappingURL=create-LXQB4EFB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/create.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { ensureProjectInitialized } from \"../utils/init\";\n\ntype CreateOptions = Record<string, unknown>;\n\nexport const createCommand = async (\n name: string,\n _options: CreateOptions,\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 // Check API key before doing anything else\n checkApiKey();\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Check if file already exists\n const promptPath = path.join(\n process.cwd(),\n \"prompts\",\n `${name}.prompt.yaml`,\n );\n\n if (fs.existsSync(promptPath)) {\n console.error(\n chalk.red(`Error: Prompt file already exists at ${promptPath}`),\n );\n process.exit(1);\n }\n\n // Create prompts directory if it doesn't exist\n const promptsDir = path.dirname(promptPath);\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n // Default prompt content\n const defaultContent = `model: openai/gpt-5\nmodelParameters:\n temperature: 0.7\nmessages:\n - role: system\n content: You are a helpful assistant.\n - role: user\n content: \"{{input}}\"\n`;\n\n // Write the file\n fs.writeFileSync(promptPath, defaultContent, \"utf8\");\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n const relativePath = path.relative(process.cwd(), promptPath);\n promptsConfig.prompts[name] = `file:${relativePath}`;\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: relativePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n const displayPath = `./${relativePath}`;\n console.log(\n chalk.green(`✓ Created prompt file: ${chalk.cyan(displayPath)}`),\n );\n console.log(chalk.gray(` Edit this file and then run:`));\n console.log(chalk.cyan(` langwatch prompt sync`));\n } catch (error) {\n console.error(\n chalk.red(\"Unexpected error:\"),\n error instanceof Error ? error.message : error,\n );\n process.exit(1);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,WAAW;AAOX,IAAM,gBAAgB,OAC3B,MACA,aACkB;AAClB,MAAI;AAEF,QAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,cAAQ,MAAM,MAAM,IAAI,oCAAoC,CAAC;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,gBAAY;AAGZ,UAAM,yBAAyB;AAG/B,UAAM,aAAkB;AAAA,MACtB,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA,GAAG,IAAI;AAAA,IACT;AAEA,QAAO,cAAW,UAAU,GAAG;AAC7B,cAAQ;AAAA,QACN,MAAM,IAAI,wCAAwC,UAAU,EAAE;AAAA,MAChE;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAkB,aAAQ,UAAU;AAC1C,QAAI,CAAI,cAAW,UAAU,GAAG;AAC9B,MAAG,aAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAGA,UAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvB,IAAG,iBAAc,YAAY,gBAAgB,MAAM;AAGnD,UAAM,gBAAgB,YAAY,kBAAkB;AACpD,UAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,UAAU;AAC5D,kBAAc,QAAQ,IAAI,IAAI,QAAQ,YAAY;AAClD,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,UAAM,cAAc,KAAK,YAAY;AACrC,YAAQ;AAAA,MACN,MAAM,MAAM,+BAA0B,MAAM,KAAK,WAAW,CAAC,EAAE;AAAA,IACjE;AACA,YAAQ,IAAI,MAAM,KAAK,gCAAgC,CAAC;AACxD,YAAQ,IAAI,MAAM,KAAK,yBAAyB,CAAC;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,MAAM,IAAI,mBAAmB;AAAA,MAC7B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/create.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { ensureProjectInitialized } from \"../utils/init\";\n\ntype CreateOptions = Record<string, unknown>;\n\nexport const createCommand = async (\n name: string,\n _options: CreateOptions,\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 // Check API key before doing anything else\n checkApiKey();\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Check if file already exists\n const promptPath = path.join(\n process.cwd(),\n \"prompts\",\n `${name}.prompt.yaml`,\n );\n\n if (fs.existsSync(promptPath)) {\n console.error(\n chalk.red(`Error: Prompt file already exists at ${promptPath}`),\n );\n process.exit(1);\n }\n\n // Create prompts directory if it doesn't exist\n const promptsDir = path.dirname(promptPath);\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n // Default prompt content\n const defaultContent = `model: openai/gpt-5\nmodelParameters:\n temperature: 0.7\nmessages:\n - role: system\n content: You are a helpful assistant.\n - role: user\n content: \"{{input}}\"\n`;\n\n // Write the file\n fs.writeFileSync(promptPath, defaultContent, \"utf8\");\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n const relativePath = path.relative(process.cwd(), promptPath);\n promptsConfig.prompts[name] = `file:${relativePath}`;\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: relativePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n const displayPath = `./${relativePath}`;\n console.log(\n chalk.green(`✓ Created prompt file: ${chalk.cyan(displayPath)}`),\n );\n console.log(chalk.gray(` Edit this file and then run:`));\n console.log(chalk.cyan(` langwatch prompt sync`));\n } catch (error) {\n console.error(\n chalk.red(\"Unexpected error:\"),\n error instanceof Error ? error.message : error,\n );\n process.exit(1);\n }\n};\n"],"mappings":";;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,WAAW;AAOX,IAAM,gBAAgB,OAC3B,MACA,aACkB;AAClB,MAAI;AAEF,QAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,cAAQ,MAAM,MAAM,IAAI,oCAAoC,CAAC;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,gBAAY;AAGZ,UAAM,yBAAyB;AAG/B,UAAM,aAAkB;AAAA,MACtB,QAAQ,IAAI;AAAA,MACZ;AAAA,MACA,GAAG,IAAI;AAAA,IACT;AAEA,QAAO,cAAW,UAAU,GAAG;AAC7B,cAAQ;AAAA,QACN,MAAM,IAAI,wCAAwC,UAAU,EAAE;AAAA,MAChE;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAAkB,aAAQ,UAAU;AAC1C,QAAI,CAAI,cAAW,UAAU,GAAG;AAC9B,MAAG,aAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAGA,UAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWvB,IAAG,iBAAc,YAAY,gBAAgB,MAAM;AAGnD,UAAM,gBAAgB,YAAY,kBAAkB;AACpD,UAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,UAAU;AAC5D,kBAAc,QAAQ,IAAI,IAAI,QAAQ,YAAY;AAClD,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,UAAM,cAAc,KAAK,YAAY;AACrC,YAAQ;AAAA,MACN,MAAM,MAAM,+BAA0B,MAAM,KAAK,WAAW,CAAC,EAAE;AAAA,IACjE;AACA,YAAQ,IAAI,MAAM,KAAK,gCAAgC,CAAC;AACxD,YAAQ,IAAI,MAAM,KAAK,yBAAyB,CAAC;AAAA,EACnD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,MAAM,IAAI,mBAAmB;AAAA,MAC7B,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC3C;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":[]}
@@ -3,13 +3,12 @@
3
3
  var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
4
4
 
5
5
 
6
- var _chunk7OZKH5K2js = require('./chunk-7OZKH5K2.js');
6
+ var _chunkDZH6SY3Zjs = require('./chunk-DZH6SY3Z.js');
7
7
 
8
8
 
9
- var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
10
- require('./chunk-R6FBJN7K.js');
9
+ var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
11
10
  require('./chunk-AZHZ4NB4.js');
12
- require('./chunk-OXBO24RB.js');
11
+ require('./chunk-OHM7JUMR.js');
13
12
 
14
13
  // src/cli/commands/create.ts
15
14
  var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
@@ -22,7 +21,7 @@ var createCommand = async (name, _options) => {
22
21
  process.exit(1);
23
22
  }
24
23
  _chunkF6E4XQQUjs.checkApiKey.call(void 0, );
25
- await _chunk7OZKH5K2js.ensureProjectInitialized.call(void 0, );
24
+ await _chunkDZH6SY3Zjs.ensureProjectInitialized.call(void 0, );
26
25
  const promptPath = path.join(
27
26
  process.cwd(),
28
27
  "prompts",
@@ -48,11 +47,11 @@ messages:
48
47
  content: "{{input}}"
49
48
  `;
50
49
  fs.writeFileSync(promptPath, defaultContent, "utf8");
51
- const promptsConfig = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
50
+ const promptsConfig = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
52
51
  const relativePath = path.relative(process.cwd(), promptPath);
53
52
  promptsConfig.prompts[name] = `file:${relativePath}`;
54
- _chunkCAZONSXVjs.FileManager.savePromptsConfig(promptsConfig);
55
- const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
53
+ _chunk36XAYVMCjs.FileManager.savePromptsConfig(promptsConfig);
54
+ const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
56
55
  lock.prompts[name] = {
57
56
  version: 0,
58
57
  // Local files start at version 0
@@ -60,7 +59,7 @@ messages:
60
59
  materialized: relativePath
61
60
  // Store the original file path
62
61
  };
63
- _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
62
+ _chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
64
63
  const displayPath = `./${relativePath}`;
65
64
  console.log(
66
65
  _chalk2.default.green(`\u2713 Created prompt file: ${_chalk2.default.cyan(displayPath)}`)
@@ -78,4 +77,4 @@ messages:
78
77
 
79
78
 
80
79
  exports.createCommand = createCommand;
81
- //# sourceMappingURL=create-4LG4N2A4.js.map
80
+ //# sourceMappingURL=create-S5RDGF3H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/create-S5RDGF3H.js","../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACZA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAOX,IAAM,cAAA,EAAgB,MAAA,CAC3B,IAAA,EACA,QAAA,EAAA,GACkB;AAClB,EAAA,IAAI;AAEF,IAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,EAAA,EAAI;AAC/B,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,oCAAoC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,0CAAA,CAAY;AAGZ,IAAA,MAAM,uDAAA,CAAyB;AAG/B,IAAA,MAAM,WAAA,EAAkB,IAAA,CAAA,IAAA;AAAA,MACtB,OAAA,CAAQ,GAAA,CAAI,CAAA;AAAA,MACZ,SAAA;AAAA,MACA,CAAA,EAAA;AACF,IAAA;AAEA,IAAA;AACE,MAAA;AAAQ,QAAA;AAER,MAAA;AACA,MAAA;AACF,IAAA;AAGA,IAAA;AACA,IAAA;AACK,MAAA;AACL,IAAA;AAGA,IAAA;AAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAA;AAGH,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAGA,IAAA;AACA,IAAA;AACE,MAAA;AAAS;AACT,MAAA;AACA,MAAA;AAAc;AAChB,IAAA;AACA,IAAA;AAEA,IAAA;AACA,IAAA;AACE,MAAA;AACF,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACE,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACF;ADZO;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/create-S5RDGF3H.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { ensureProjectInitialized } from \"../utils/init\";\n\ntype CreateOptions = Record<string, unknown>;\n\nexport const createCommand = async (\n name: string,\n _options: CreateOptions,\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 // Check API key before doing anything else\n checkApiKey();\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Check if file already exists\n const promptPath = path.join(\n process.cwd(),\n \"prompts\",\n `${name}.prompt.yaml`,\n );\n\n if (fs.existsSync(promptPath)) {\n console.error(\n chalk.red(`Error: Prompt file already exists at ${promptPath}`),\n );\n process.exit(1);\n }\n\n // Create prompts directory if it doesn't exist\n const promptsDir = path.dirname(promptPath);\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n // Default prompt content\n const defaultContent = `model: openai/gpt-5\nmodelParameters:\n temperature: 0.7\nmessages:\n - role: system\n content: You are a helpful assistant.\n - role: user\n content: \"{{input}}\"\n`;\n\n // Write the file\n fs.writeFileSync(promptPath, defaultContent, \"utf8\");\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n const relativePath = path.relative(process.cwd(), promptPath);\n promptsConfig.prompts[name] = `file:${relativePath}`;\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: relativePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n const displayPath = `./${relativePath}`;\n console.log(\n chalk.green(`✓ Created prompt file: ${chalk.cyan(displayPath)}`),\n );\n console.log(chalk.gray(` Edit this file and then run:`));\n console.log(chalk.cyan(` langwatch prompt sync`));\n } catch (error) {\n console.error(\n chalk.red(\"Unexpected error:\"),\n error instanceof Error ? error.message : error,\n );\n process.exit(1);\n }\n};\n"]}
@@ -3,7 +3,7 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
3
3
  import { Logger, LogRecord, LoggerProvider } from '@opentelemetry/api-logs';
4
4
  import { a as SemConvLogRecordAttributes, S as SemConvAttributes } from './types-DRiQaKFG.js';
5
5
  import { TracerProvider } from '@opentelemetry/api';
6
- import { a as LangWatchTracer } from './types-DyUmlaDx.js';
6
+ import { a as LangWatchTracer } from './types-B9772cUR.js';
7
7
 
8
8
  /**
9
9
  * Filterable Batch Span Exporter for OpenTelemetry
@@ -3,7 +3,7 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
3
3
  import { Logger, LogRecord, LoggerProvider } from '@opentelemetry/api-logs';
4
4
  import { a as SemConvLogRecordAttributes, S as SemConvAttributes } from './types-DRiQaKFG.mjs';
5
5
  import { TracerProvider } from '@opentelemetry/api';
6
- import { a as LangWatchTracer } from './types-jrEEZt9d.mjs';
6
+ import { a as LangWatchTracer } from './types-DbPAi4US.mjs';
7
7
 
8
8
  /**
9
9
  * Filterable Batch Span Exporter for OpenTelemetry
@@ -1,15 +1,15 @@
1
1
  type LogLevel = "debug" | "info" | "warn" | "error";
2
2
  interface Logger {
3
- debug(message: string, ...args: unknown[]): void;
4
- info(message: string, ...args: unknown[]): void;
5
- warn(message: string, ...args: unknown[]): void;
6
- error(message: string, ...args: unknown[]): void;
3
+ debug: (message: string, ...args: unknown[]) => void;
4
+ info: (message: string, ...args: unknown[]) => void;
5
+ warn: (message: string, ...args: unknown[]) => void;
6
+ error: (message: string, ...args: unknown[]) => void;
7
7
  }
8
8
  declare class NoOpLogger implements Logger {
9
- debug(): void;
10
- info(): void;
11
- warn(): void;
12
- error(): void;
9
+ debug: () => void;
10
+ info: () => void;
11
+ warn: () => void;
12
+ error: () => void;
13
13
  }
14
14
  interface ConsoleLoggerOptions {
15
15
  level: LogLevel;
@@ -25,10 +25,10 @@ declare class ConsoleLogger implements Logger {
25
25
  constructor(options?: ConsoleLoggerOptions);
26
26
  private shouldLog;
27
27
  private format;
28
- debug(message: string, ...args: unknown[]): void;
29
- info(message: string, ...args: unknown[]): void;
30
- warn(message: string, ...args: unknown[]): void;
31
- error(message: string, ...args: unknown[]): void;
28
+ debug: (message: string, ...args: unknown[]) => void;
29
+ info: (message: string, ...args: unknown[]) => void;
30
+ warn: (message: string, ...args: unknown[]) => void;
31
+ error: (message: string, ...args: unknown[]) => void;
32
32
  }
33
33
 
34
34
  export { ConsoleLogger as C, type Logger as L, NoOpLogger as N };
@@ -1,15 +1,15 @@
1
1
  type LogLevel = "debug" | "info" | "warn" | "error";
2
2
  interface Logger {
3
- debug(message: string, ...args: unknown[]): void;
4
- info(message: string, ...args: unknown[]): void;
5
- warn(message: string, ...args: unknown[]): void;
6
- error(message: string, ...args: unknown[]): void;
3
+ debug: (message: string, ...args: unknown[]) => void;
4
+ info: (message: string, ...args: unknown[]) => void;
5
+ warn: (message: string, ...args: unknown[]) => void;
6
+ error: (message: string, ...args: unknown[]) => void;
7
7
  }
8
8
  declare class NoOpLogger implements Logger {
9
- debug(): void;
10
- info(): void;
11
- warn(): void;
12
- error(): void;
9
+ debug: () => void;
10
+ info: () => void;
11
+ warn: () => void;
12
+ error: () => void;
13
13
  }
14
14
  interface ConsoleLoggerOptions {
15
15
  level: LogLevel;
@@ -25,10 +25,10 @@ declare class ConsoleLogger implements Logger {
25
25
  constructor(options?: ConsoleLoggerOptions);
26
26
  private shouldLog;
27
27
  private format;
28
- debug(message: string, ...args: unknown[]): void;
29
- info(message: string, ...args: unknown[]): void;
30
- warn(message: string, ...args: unknown[]): void;
31
- error(message: string, ...args: unknown[]): void;
28
+ debug: (message: string, ...args: unknown[]) => void;
29
+ info: (message: string, ...args: unknown[]) => void;
30
+ warn: (message: string, ...args: unknown[]) => void;
31
+ error: (message: string, ...args: unknown[]) => void;
32
32
  }
33
33
 
34
34
  export { ConsoleLogger as C, type Logger as L, NoOpLogger as N };
package/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
- import { L as Logger, C as ConsoleLogger, N as NoOpLogger } from './index-DTEZr0Jn.mjs';
2
- export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchTracer } from './implementation-fAgqv8OM.mjs';
1
+ import { L as Logger, C as ConsoleLogger, N as NoOpLogger } from './index-D7rKIGrO.mjs';
2
+ export { F as FilterableBatchSpanProcessor, L as LangWatchExporter, S as SpanProcessingExcludeRule, g as getLangWatchLogger, d as getLangWatchTracer } from './implementation-nE9dgTwc.mjs';
3
3
  export { l as attributes } from './types-DRiQaKFG.mjs';
4
- import { p as paths, P as PromptResponse, g as Prompt } from './types-jrEEZt9d.mjs';
4
+ import { p as paths, P as PromptResponse, g as CreatePromptBody, U as UpdatePromptBody, h as PromptData, i as Prompt } from './types-DbPAi4US.mjs';
5
5
  import openApiCreateClient from 'openapi-fetch';
6
+ import { z } from 'zod';
6
7
  import '@opentelemetry/sdk-trace-base';
7
8
  import '@opentelemetry/exporter-trace-otlp-http';
8
9
  import '@opentelemetry/api-logs';
@@ -10,16 +11,20 @@ import '@opentelemetry/api';
10
11
  import '@opentelemetry/semantic-conventions';
11
12
  import '@opentelemetry/semantic-conventions/incubating';
12
13
 
13
- type LangwatchApiClient = ReturnType<typeof openApiCreateClient<paths>>;
14
+ /**
15
+ * Creates a new LangWatch API client.
16
+ * @param apiKey - The API key to use for authentication. Defaults to LANGWATCH_API_KEY environment variable.
17
+ * @param endpoint - The endpoint to use for the API client. Defaults to LANGWATCH_ENDPOINT environment variable or internal DEFAULT_ENDPOINT.
18
+ * @returns A new LangWatch API client.
19
+ */
20
+ declare const createLangWatchApiClient: (apiKey?: string, endpoint?: string) => openApiCreateClient.Client<paths, `${string}/${string}`>;
21
+ type LangwatchApiClient = ReturnType<typeof createLangWatchApiClient>;
14
22
 
15
23
  interface InternalConfig {
16
24
  langwatchApiClient: LangwatchApiClient;
17
25
  logger: Logger;
18
26
  }
19
27
 
20
- type CreatePromptBody = NonNullable<paths["/api/prompts"]["post"]["requestBody"]>["content"]["application/json"];
21
- type UpdatePromptBody = NonNullable<paths["/api/prompts/{id}"]["put"]["requestBody"]>["content"]["application/json"];
22
-
23
28
  type SyncAction = "created" | "updated" | "conflict" | "up_to_date";
24
29
  type ConfigData = NonNullable<paths["/api/prompts/{id}/sync"]["post"]["requestBody"]>["content"]["application/json"]["configData"];
25
30
  interface SyncResult {
@@ -32,15 +37,255 @@ interface SyncResult {
32
37
  remoteConfigData: ConfigData;
33
38
  };
34
39
  }
40
+ /**
41
+ * Service for managing prompt resources via the Langwatch API.
42
+ * Constructor creates a proxy that wraps the service and traces all methods.
43
+ *
44
+ * Responsibilities:
45
+ * - CRUD operations for prompts
46
+ * - Creating prompt versions
47
+ * - Error handling with contextual information
48
+ *
49
+ * All methods return raw PromptResponse data from the API.
50
+ */
51
+ declare class PromptsApiService {
52
+ private readonly apiClient;
53
+ constructor(config?: Pick<InternalConfig, "langwatchApiClient">);
54
+ /**
55
+ * Handles API errors by throwing a PromptsError with operation context.
56
+ * @param operation Description of the operation being performed.
57
+ * @param error The error object returned from the API client.
58
+ * @throws {PromptsError}
59
+ */
60
+ private handleApiError;
61
+ /**
62
+ * Fetches all prompts from the API.
63
+ * @returns Array of raw PromptResponse data.
64
+ * @throws {PromptsError} If the API call fails.
65
+ */
66
+ getAll(): Promise<PromptResponse[]>;
67
+ /**
68
+ * Fetches a single prompt by its ID.
69
+ * @param id The prompt's unique identifier.
70
+ * @returns Raw PromptResponse data.
71
+ * @throws {PromptsError} If the API call fails.
72
+ */
73
+ get: (id: string, options?: {
74
+ version?: string;
75
+ }) => Promise<PromptResponse>;
76
+ /**
77
+ * Validates if a prompt exists.
78
+ * @param id The prompt's unique identifier.
79
+ * @returns True if prompt exists, false otherwise.
80
+ * @throws {PromptsError} If the API call fails (not 404).
81
+ */
82
+ exists(id: string): Promise<boolean>;
83
+ /**
84
+ * Creates a new prompt.
85
+ * @param params The prompt creation payload, matching the OpenAPI schema.
86
+ * @returns Raw PromptResponse data of the created prompt.
87
+ * @throws {PromptsError} If the API call fails.
88
+ */
89
+ create(params: CreatePromptBody): Promise<PromptResponse>;
90
+ /**
91
+ * Updates an existing prompt.
92
+ * @param id The prompt's unique identifier.
93
+ * @param params The update payload, matching the OpenAPI schema.
94
+ * @returns Raw PromptResponse data of the updated prompt.
95
+ * @throws {PromptsError} If the API call fails.
96
+ */
97
+ update(id: string, params: UpdatePromptBody): Promise<PromptResponse>;
98
+ /**
99
+ * Deletes a prompt by its ID.
100
+ * @param id The prompt's unique identifier.
101
+ * @throws {PromptsError} If the API call fails.
102
+ */
103
+ delete(id: string): Promise<{
104
+ success: boolean;
105
+ }>;
106
+ /**
107
+ * Fetches all versions for a given prompt.
108
+ * @param id The prompt's unique identifier.
109
+ * @returns Array of raw PromptResponse data for each version.
110
+ * @throws {PromptsError} If the API call fails.
111
+ */
112
+ getVersions(id: string): Promise<PromptResponse[]>;
113
+ /**
114
+ * Upserts a prompt with local configuration - creates if doesn't exist, updates version if exists.
115
+ * @param handle The prompt's handle/identifier.
116
+ * @param config Local prompt configuration.
117
+ * @returns Object with created flag and raw PromptResponse data.
118
+ * @throws {PromptsError} If the API call fails.
119
+ */
120
+ upsert(handle: string, config: {
121
+ model: string;
122
+ modelParameters?: {
123
+ temperature?: number;
124
+ max_tokens?: number;
125
+ };
126
+ messages: Array<{
127
+ role: "system" | "user" | "assistant";
128
+ content: string;
129
+ }>;
130
+ }): Promise<{
131
+ created: boolean;
132
+ prompt: PromptResponse;
133
+ }>;
134
+ /**
135
+ * Sync a prompt with local content, handling conflicts and version management
136
+ */
137
+ sync(params: {
138
+ name: string;
139
+ configData: ConfigData;
140
+ localVersion?: number;
141
+ commitMessage?: string;
142
+ }): Promise<SyncResult>;
143
+ }
144
+
145
+ type PromptDependency = string | {
146
+ version?: string;
147
+ file?: string;
148
+ };
149
+ type PromptsConfig = {
150
+ prompts: Record<string, PromptDependency>;
151
+ };
152
+ declare const localPromptConfigSchema: z.ZodObject<{
153
+ model: z.ZodString;
154
+ modelParameters: z.ZodOptional<z.ZodObject<{
155
+ temperature: z.ZodOptional<z.ZodNumber>;
156
+ max_tokens: z.ZodOptional<z.ZodNumber>;
157
+ }, z.core.$loose>>;
158
+ messages: z.ZodArray<z.ZodObject<{
159
+ role: z.ZodEnum<{
160
+ system: "system";
161
+ user: "user";
162
+ assistant: "assistant";
163
+ }>;
164
+ content: z.ZodString;
165
+ }, z.core.$loose>>;
166
+ }, z.core.$loose>;
167
+ type LocalPromptConfig = z.infer<typeof localPromptConfigSchema>;
168
+ type MaterializedPrompt = {
169
+ id: string;
170
+ name: string;
171
+ version: number;
172
+ versionId: string;
173
+ model: string;
174
+ messages: Array<{
175
+ role: "system" | "user" | "assistant";
176
+ content: string;
177
+ }>;
178
+ prompt: string;
179
+ temperature?: number;
180
+ maxTokens?: number;
181
+ inputs?: any;
182
+ outputs?: any;
183
+ updatedAt: string;
184
+ };
185
+ type PromptsLockEntry = {
186
+ version: number;
187
+ versionId: string;
188
+ materialized: string;
189
+ };
190
+ type PromptsLock = {
191
+ lockfileVersion: number;
192
+ prompts: Record<string, PromptsLockEntry>;
193
+ };
194
+
195
+ declare class FileManager {
196
+ private static readonly PROMPTS_CONFIG_FILE;
197
+ private static readonly PROMPTS_LOCK_FILE;
198
+ private static readonly PROMPTS_DIR;
199
+ private static readonly MATERIALIZED_DIR;
200
+ static getPromptsConfigPath(): string;
201
+ static getPromptsLockPath(): string;
202
+ static getPromptsDir(): string;
203
+ static getMaterializedDir(): string;
204
+ static ensureDirectories(): void;
205
+ static loadPromptsConfig(): PromptsConfig;
206
+ static savePromptsConfig(config: PromptsConfig): void;
207
+ static initializePromptsConfig(): {
208
+ created: boolean;
209
+ path: string;
210
+ };
211
+ static loadPromptsLock: () => PromptsLock;
212
+ static savePromptsLock(lock: PromptsLock): void;
213
+ static initializePromptsLock(): {
214
+ created: boolean;
215
+ path: string;
216
+ };
217
+ static loadLocalPrompt: (filePath: string) => LocalPromptConfig;
218
+ static saveMaterializedPrompt(name: string, prompt: MaterializedPrompt): string;
219
+ static getLocalPromptFiles: () => string[];
220
+ static promptNameFromPath(filePath: string): string;
221
+ static cleanupOrphanedMaterializedFiles(currentDependencies: Set<string>): string[];
222
+ static updateLockEntry(lock: PromptsLock, name: string, prompt: MaterializedPrompt, materializedPath: string): void;
223
+ static removeFromLock(lock: PromptsLock, names: string[]): void;
224
+ static addToGitignore(entry: string): {
225
+ added: boolean;
226
+ existed: boolean;
227
+ };
228
+ }
229
+
230
+ interface LocalPromptsServiceConfig {
231
+ fileManager?: typeof FileManager;
232
+ logger?: Logger;
233
+ }
234
+ /**
235
+ * Service for retrieving prompts from local filesystem sources.
236
+ *
237
+ * Searches for prompts in the following priority order:
238
+ * 1. Explicit file mapping in prompts.json config
239
+ * 2. Materialized path from prompts-lock.json
240
+ * 3. Direct file scanning in prompts directory
241
+ */
242
+ declare class LocalPromptsService {
243
+ private readonly fileManager;
244
+ private readonly logger;
245
+ constructor(config?: LocalPromptsServiceConfig);
246
+ /**
247
+ * Retrieves a prompt using the configured search strategy.
248
+ * Tries each source in priority order until found or all sources exhausted.
249
+ */
250
+ get(handleOrId: string): Promise<PromptData | null>;
251
+ /**
252
+ * Searches for prompt using explicit file mapping in prompts.json.
253
+ * Looks for dependencies with a 'file' property pointing to a specific path.
254
+ */
255
+ private getFromConfig;
256
+ /**
257
+ * Searches for prompt using materialized path from lock file.
258
+ * Lock file contains resolved paths for prompts that have been synced/materialized.
259
+ */
260
+ private getFromLockFile;
261
+ /**
262
+ * Searches for prompt by scanning all .prompt.yaml files in prompts directory.
263
+ * Extracts prompt name from file path and matches against the requested handle.
264
+ * This is the fallback method when explicit mappings don't exist.
265
+ */
266
+ private getFromLocalFiles;
267
+ /**
268
+ * Get dependency from config
269
+ */
270
+ private getDependencyFromConfig;
271
+ /**
272
+ * Converts LocalPromptConfig to PromptData format
273
+ */
274
+ private convertToPromptData;
275
+ }
35
276
 
277
+ interface PromptsFacadeDependencies {
278
+ promptsApiService: PromptsApiService;
279
+ localPromptsService: LocalPromptsService;
280
+ }
36
281
  /**
37
282
  * Facade for prompt operations in the LangWatch SDK.
38
283
  * Provides a simplified interface for common prompt management tasks.
39
284
  */
40
285
  declare class PromptsFacade {
41
- private readonly service;
42
- private readonly config;
43
- constructor(config: InternalConfig);
286
+ private readonly promptsApiService;
287
+ private readonly localPromptsService;
288
+ constructor(config: InternalConfig & PromptsFacadeDependencies);
44
289
  /**
45
290
  * Creates a new prompt.
46
291
  * @param data The prompt creation payload.
@@ -115,10 +360,10 @@ interface LangWatchConstructorOptions {
115
360
  declare class LangWatch {
116
361
  #private;
117
362
  private readonly config;
118
- private readonly tracer;
119
363
  readonly prompts: PromptsFacade;
120
364
  readonly traces: TracesFacade;
121
365
  constructor(options?: LangWatchConstructorOptions);
366
+ get apiClient(): LangwatchApiClient;
122
367
  }
123
368
 
124
369
  declare const logger: {