langwatch 0.5.1 → 0.7.1

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 (122) hide show
  1. package/README.md +19 -0
  2. package/dist/{add-4WXEWG5H.js → add-5QV3TEWC.js} +28 -32
  3. package/dist/add-5QV3TEWC.js.map +1 -0
  4. package/dist/{add-D2WVVKIP.mjs → add-HWFRMAQX.mjs} +14 -18
  5. package/dist/add-HWFRMAQX.mjs.map +1 -0
  6. package/dist/{chunk-CAZONSXV.js → chunk-36XAYVMC.js} +186 -76
  7. package/dist/chunk-36XAYVMC.js.map +1 -0
  8. package/dist/{chunk-QCYYSMCU.js → chunk-5HAVK64Q.js} +2 -2
  9. package/dist/chunk-5HAVK64Q.js.map +1 -0
  10. package/dist/{chunk-ZIULPOMQ.mjs → chunk-7MG7DGPP.mjs} +4 -4
  11. package/dist/{chunk-YKFTFYKK.mjs → chunk-7VHZNB2S.mjs} +2 -2
  12. package/dist/chunk-7VHZNB2S.mjs.map +1 -0
  13. package/dist/{chunk-DLJO7AK5.mjs → chunk-AD7QRYIJ.mjs} +2 -2
  14. package/dist/{chunk-DISMHYXC.js → chunk-CKIZDPIJ.js} +24 -22
  15. package/dist/chunk-CKIZDPIJ.js.map +1 -0
  16. package/dist/{chunk-SVXNUWZI.js → chunk-D7UAKYVI.js} +345 -154
  17. package/dist/chunk-D7UAKYVI.js.map +1 -0
  18. package/dist/{chunk-7OZKH5K2.js → chunk-DZH6SY3Z.js} +10 -10
  19. package/dist/{chunk-7OZKH5K2.js.map → chunk-DZH6SY3Z.js.map} +1 -1
  20. package/dist/{chunk-H5PON53W.mjs → chunk-EPGKOTSN.mjs} +334 -143
  21. package/dist/chunk-EPGKOTSN.mjs.map +1 -0
  22. package/dist/{chunk-N2V6J3U2.mjs → chunk-FEL5FLHA.mjs} +2 -2
  23. package/dist/{chunk-YNQ44U6D.mjs → chunk-I2SOBPAF.mjs} +23 -21
  24. package/dist/chunk-I2SOBPAF.mjs.map +1 -0
  25. package/dist/{chunk-P4SQTYGN.js → chunk-J55AV2YW.js} +32 -32
  26. package/dist/{chunk-P4SQTYGN.js.map → chunk-J55AV2YW.js.map} +1 -1
  27. package/dist/{chunk-OXBO24RB.js → chunk-OHM7JUMR.js} +15 -2
  28. package/dist/chunk-OHM7JUMR.js.map +1 -0
  29. package/dist/chunk-PYVDTUA6.mjs +352 -0
  30. package/dist/chunk-PYVDTUA6.mjs.map +1 -0
  31. package/dist/{chunk-YH5TIVK2.js → chunk-SNDTNU3T.js} +2 -2
  32. package/dist/{chunk-YH5TIVK2.js.map → chunk-SNDTNU3T.js.map} +1 -1
  33. package/dist/{chunk-QZGTM76F.mjs → chunk-UNMZPS55.mjs} +7 -3
  34. package/dist/chunk-UNMZPS55.mjs.map +1 -0
  35. package/dist/{chunk-CU3443HD.mjs → chunk-URTD2WOC.mjs} +14 -1
  36. package/dist/{chunk-ECOC36EA.js → chunk-VMZUN4EF.js} +16 -12
  37. package/dist/chunk-VMZUN4EF.js.map +1 -0
  38. package/dist/cli/index.js +8 -8
  39. package/dist/cli/index.mjs +8 -8
  40. package/dist/{create-OQEMO4MU.mjs → create-LXQB4EFB.mjs} +4 -5
  41. package/dist/{create-OQEMO4MU.mjs.map → create-LXQB4EFB.mjs.map} +1 -1
  42. package/dist/{create-4LG4N2A4.js → create-S5RDGF3H.js} +9 -10
  43. package/dist/create-S5RDGF3H.js.map +1 -0
  44. package/dist/{implementation-BIlL6-SW.d.ts → implementation-DsHp9FYU.d.ts} +1 -1
  45. package/dist/{implementation-fAgqv8OM.d.mts → implementation-nE9dgTwc.d.mts} +1 -1
  46. package/dist/{index-DTEZr0Jn.d.mts → index-D7rKIGrO.d.mts} +12 -12
  47. package/dist/{index-DTEZr0Jn.d.ts → index-D7rKIGrO.d.ts} +12 -12
  48. package/dist/index.d.mts +256 -11
  49. package/dist/index.d.ts +256 -11
  50. package/dist/index.js +135 -12
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.mjs +133 -10
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/{init-MQXXHCNT.mjs → init-T4YDPHBA.mjs} +4 -5
  55. package/dist/{init-MQXXHCNT.mjs.map → init-T4YDPHBA.mjs.map} +1 -1
  56. package/dist/init-UADBKUJU.js +15 -0
  57. package/dist/init-UADBKUJU.js.map +1 -0
  58. package/dist/{list-PFWV7IU6.mjs → list-BQXECLEM.mjs} +13 -14
  59. package/dist/list-BQXECLEM.mjs.map +1 -0
  60. package/dist/{list-GIAXAAH5.js → list-HSCIBC4Z.js} +14 -15
  61. package/dist/list-HSCIBC4Z.js.map +1 -0
  62. package/dist/{login-BYLXS23I.mjs → login-3IM3PYSJ.mjs} +3 -3
  63. package/dist/{login-3STX2FAO.js → login-EUDCIJRM.js} +4 -4
  64. package/dist/{login-3STX2FAO.js.map → login-EUDCIJRM.js.map} +1 -1
  65. package/dist/observability-sdk/index.d.mts +4 -3
  66. package/dist/observability-sdk/index.d.ts +4 -3
  67. package/dist/observability-sdk/index.js +7 -7
  68. package/dist/observability-sdk/index.mjs +6 -6
  69. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +2 -1
  70. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +2 -1
  71. package/dist/observability-sdk/instrumentation/langchain/index.js +19 -19
  72. package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -3
  73. package/dist/observability-sdk/setup/node/index.d.mts +1 -1
  74. package/dist/observability-sdk/setup/node/index.d.ts +1 -1
  75. package/dist/observability-sdk/setup/node/index.js +15 -15
  76. package/dist/observability-sdk/setup/node/index.mjs +4 -4
  77. package/dist/{remove-FTF3EBYV.mjs → remove-IVFQAHNT.mjs} +9 -10
  78. package/dist/{remove-FTF3EBYV.mjs.map → remove-IVFQAHNT.mjs.map} +1 -1
  79. package/dist/{remove-U3PILQDV.js → remove-VDQ4M6JF.js} +17 -18
  80. package/dist/remove-VDQ4M6JF.js.map +1 -0
  81. package/dist/{sync-FOW7DHAH.mjs → sync-2MVHHWCX.mjs} +16 -20
  82. package/dist/sync-2MVHHWCX.mjs.map +1 -0
  83. package/dist/{sync-T3T22GVZ.js → sync-KUMBMGJS.js} +31 -35
  84. package/dist/sync-KUMBMGJS.js.map +1 -0
  85. package/dist/{types-DyUmlaDx.d.ts → types-B9772cUR.d.ts} +98 -29
  86. package/dist/{types-jrEEZt9d.d.mts → types-DbPAi4US.d.mts} +98 -29
  87. package/package.json +16 -11
  88. package/dist/add-4WXEWG5H.js.map +0 -1
  89. package/dist/add-D2WVVKIP.mjs.map +0 -1
  90. package/dist/chunk-CAZONSXV.js.map +0 -1
  91. package/dist/chunk-CKVDNVFL.mjs +0 -242
  92. package/dist/chunk-CKVDNVFL.mjs.map +0 -1
  93. package/dist/chunk-DISMHYXC.js.map +0 -1
  94. package/dist/chunk-DSIQSULK.js +0 -152
  95. package/dist/chunk-DSIQSULK.js.map +0 -1
  96. package/dist/chunk-ECOC36EA.js.map +0 -1
  97. package/dist/chunk-H5PON53W.mjs.map +0 -1
  98. package/dist/chunk-OXBO24RB.js.map +0 -1
  99. package/dist/chunk-QCYYSMCU.js.map +0 -1
  100. package/dist/chunk-QZGTM76F.mjs.map +0 -1
  101. package/dist/chunk-R6FBJN7K.js +0 -115
  102. package/dist/chunk-R6FBJN7K.js.map +0 -1
  103. package/dist/chunk-SVXNUWZI.js.map +0 -1
  104. package/dist/chunk-V5M3HUBV.mjs +0 -115
  105. package/dist/chunk-V5M3HUBV.mjs.map +0 -1
  106. package/dist/chunk-YEGQXDTE.mjs +0 -152
  107. package/dist/chunk-YEGQXDTE.mjs.map +0 -1
  108. package/dist/chunk-YKFTFYKK.mjs.map +0 -1
  109. package/dist/chunk-YNQ44U6D.mjs.map +0 -1
  110. package/dist/create-4LG4N2A4.js.map +0 -1
  111. package/dist/init-EKNL2SQE.js +0 -16
  112. package/dist/init-EKNL2SQE.js.map +0 -1
  113. package/dist/list-GIAXAAH5.js.map +0 -1
  114. package/dist/list-PFWV7IU6.mjs.map +0 -1
  115. package/dist/remove-U3PILQDV.js.map +0 -1
  116. package/dist/sync-FOW7DHAH.mjs.map +0 -1
  117. package/dist/sync-T3T22GVZ.js.map +0 -1
  118. /package/dist/{chunk-ZIULPOMQ.mjs.map → chunk-7MG7DGPP.mjs.map} +0 -0
  119. /package/dist/{chunk-DLJO7AK5.mjs.map → chunk-AD7QRYIJ.mjs.map} +0 -0
  120. /package/dist/{chunk-N2V6J3U2.mjs.map → chunk-FEL5FLHA.mjs.map} +0 -0
  121. /package/dist/{chunk-CU3443HD.mjs.map → chunk-URTD2WOC.mjs.map} +0 -0
  122. /package/dist/{login-BYLXS23I.mjs.map → login-3IM3PYSJ.mjs.map} +0 -0
@@ -1,17 +1,16 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
- var _chunkSVXNUWZIjs = require('./chunk-SVXNUWZI.js');
4
- require('./chunk-YH5TIVK2.js');
5
- require('./chunk-ECOC36EA.js');
6
- require('./chunk-P4SQTYGN.js');
7
- require('./chunk-QCYYSMCU.js');
8
- require('./chunk-DISMHYXC.js');
3
+ var _chunkD7UAKYVIjs = require('./chunk-D7UAKYVI.js');
4
+ require('./chunk-SNDTNU3T.js');
5
+ require('./chunk-VMZUN4EF.js');
6
+ require('./chunk-J55AV2YW.js');
7
+ require('./chunk-5HAVK64Q.js');
8
+ require('./chunk-CKIZDPIJ.js');
9
9
 
10
10
 
11
- var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
12
- require('./chunk-R6FBJN7K.js');
11
+ var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
13
12
  require('./chunk-AZHZ4NB4.js');
14
- require('./chunk-OXBO24RB.js');
13
+ require('./chunk-OHM7JUMR.js');
15
14
 
16
15
  // src/cli/commands/remove.ts
17
16
  var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
@@ -24,8 +23,8 @@ var removeCommand = async (name) => {
24
23
  console.error(_chalk2.default.red("Error: Prompt name cannot be empty"));
25
24
  process.exit(1);
26
25
  }
27
- const config = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
28
- const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
26
+ const config = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
27
+ const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
29
28
  if (!config.prompts[name]) {
30
29
  console.error(_chalk2.default.red(`Error: Prompt "${name}" not found in dependencies`));
31
30
  console.log(_chalk2.default.gray(`Available prompts: ${Object.keys(config.prompts).join(", ") || "none"}`));
@@ -42,7 +41,7 @@ var removeCommand = async (name) => {
42
41
  } else if (typeof dependency === "object" && dependency.file) {
43
42
  localFilePath = path.resolve(dependency.file);
44
43
  } else {
45
- localFilePath = path.join(_chunkCAZONSXVjs.FileManager.getPromptsDir(), `${name}.prompt.yaml`);
44
+ localFilePath = path.join(_chunk36XAYVMCjs.FileManager.getPromptsDir(), `${name}.prompt.yaml`);
46
45
  }
47
46
  if (fs.existsSync(localFilePath)) {
48
47
  fs.unlinkSync(localFilePath);
@@ -61,7 +60,7 @@ var removeCommand = async (name) => {
61
60
  if (fs.existsSync(materializedPath)) {
62
61
  fs.unlinkSync(materializedPath);
63
62
  const materializedDir = path.dirname(materializedPath);
64
- const rootMaterializedDir = _chunkCAZONSXVjs.FileManager.getMaterializedDir();
63
+ const rootMaterializedDir = _chunk36XAYVMCjs.FileManager.getMaterializedDir();
65
64
  let currentDir = materializedDir;
66
65
  while (currentDir !== rootMaterializedDir && currentDir !== path.dirname(currentDir)) {
67
66
  try {
@@ -80,15 +79,15 @@ var removeCommand = async (name) => {
80
79
  }
81
80
  delete config.prompts[name];
82
81
  delete lock.prompts[name];
83
- _chunkCAZONSXVjs.FileManager.savePromptsConfig(config);
84
- _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
82
+ _chunk36XAYVMCjs.FileManager.savePromptsConfig(config);
83
+ _chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
85
84
  if (!isLocalPrompt) {
86
85
  spinner.succeed();
87
86
  console.log(_chalk2.default.green(`\u2713 Removed ${_chalk2.default.cyan(name)} from dependencies`));
88
87
  }
89
88
  } catch (error) {
90
89
  spinner.fail();
91
- if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
90
+ if (error instanceof _chunkD7UAKYVIjs.PromptsError) {
92
91
  console.error(_chalk2.default.red(`Error: ${error.message}`));
93
92
  } else {
94
93
  console.error(_chalk2.default.red(`Error removing prompt: ${error instanceof Error ? error.message : "Unknown error"}`));
@@ -96,7 +95,7 @@ var removeCommand = async (name) => {
96
95
  process.exit(1);
97
96
  }
98
97
  } catch (error) {
99
- if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
98
+ if (error instanceof _chunkD7UAKYVIjs.PromptsError) {
100
99
  console.error(_chalk2.default.red(`Error: ${error.message}`));
101
100
  } else {
102
101
  console.error(_chalk2.default.red(`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`));
@@ -107,4 +106,4 @@ var removeCommand = async (name) => {
107
106
 
108
107
 
109
108
  exports.removeCommand = removeCommand;
110
- //# sourceMappingURL=remove-U3PILQDV.js.map
109
+ //# sourceMappingURL=remove-VDQ4M6JF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-VDQ4M6JF.js","../src/cli/commands/remove.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACdA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAClB,oEAAgB;AAIT,IAAM,cAAA,EAAgB,MAAA,CAAO,IAAA,EAAA,GAAgC;AAClE,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,MAAM,OAAA,EAAS,4BAAA,CAAY,iBAAA,CAAkB,CAAA;AAC7C,IAAA,MAAM,KAAA,EAAO,4BAAA,CAAY,eAAA,CAAgB,CAAA;AAGzC,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAC5E,MAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,EAAA,GAAK,MAAM,CAAA,CAAA;AAC/E,MAAA;AAChB,IAAA;AAEsC,IAAA;AAEhB,IAAA;AAEuC,IAAA;AAEzD,IAAA;AAEiB,MAAA;AACb,QAAA;AAEkE,QAAA;AACpB,UAAA;AACY,QAAA;AAChB,UAAA;AACvC,QAAA;AAEuE,UAAA;AAC9E,QAAA;AAGkC,QAAA;AACL,UAAA;AACoC,UAAA;AAC/C,UAAA;AAC2D,UAAA;AACtE,QAAA;AACW,UAAA;AACqD,UAAA;AACvE,QAAA;AAEyB,QAAA;AAC3B,MAAA;AAGmC,MAAA;AACN,MAAA;AACiC,QAAA;AACvB,QAAA;AACL,UAAA;AAGuB,UAAA;AACM,UAAA;AAE1C,UAAA;AACqE,UAAA;AAChF,YAAA;AACuC,cAAA;AACf,cAAA;AACD,gBAAA;AACa,gBAAA;AAC/B,cAAA;AACL,gBAAA;AACF,cAAA;AACM,YAAA;AACN,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AAG0B,MAAA;AACF,MAAA;AAGY,MAAA;AACJ,MAAA;AAEZ,MAAA;AACF,QAAA;AAC0D,QAAA;AAC5E,MAAA;AAEc,IAAA;AACD,MAAA;AACsB,MAAA;AACiB,QAAA;AAC7C,MAAA;AACsF,QAAA;AAC7F,MAAA;AACc,MAAA;AAChB,IAAA;AAEc,EAAA;AACqB,IAAA;AACiB,MAAA;AAC7C,IAAA;AACiF,MAAA;AACxF,IAAA;AACc,IAAA;AAChB,EAAA;AACF;ADdoG;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-VDQ4M6JF.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 { PromptsError } from \"@/client-sdk/services/prompts\";\n\nexport const removeCommand = async (name: string): 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 // Load existing config and lock\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n // Check if prompt exists in dependencies\n if (!config.prompts[name]) {\n console.error(chalk.red(`Error: Prompt \"${name}\" not found in dependencies`));\n console.log(chalk.gray(`Available prompts: ${Object.keys(config.prompts).join(', ') || 'none'}`));\n process.exit(1);\n }\n\n const dependency = config.prompts[name];\n const isLocalPrompt = (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) ||\n (typeof dependency === \"object\" && dependency.file);\n\n const spinner = ora(`Removing ${chalk.cyan(name)}...`).start();\n\n try {\n // Handle local prompts\n if (isLocalPrompt) {\n let localFilePath: string;\n\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n localFilePath = path.resolve(dependency.slice(5)); // Remove \"file:\" prefix\n } else if (typeof dependency === \"object\" && dependency.file) {\n localFilePath = path.resolve(dependency.file);\n } else {\n // Fallback: assume it's in the prompts directory\n localFilePath = path.join(FileManager.getPromptsDir(), `${name}.prompt.yaml`);\n }\n\n // Delete the local file if it exists\n if (fs.existsSync(localFilePath)) {\n fs.unlinkSync(localFilePath);\n const relativePath = path.relative(process.cwd(), localFilePath);\n spinner.succeed();\n console.log(chalk.green(`✓ Removed local file ${chalk.gray(relativePath)}`));\n } else {\n spinner.succeed();\n console.log(chalk.yellow(`⚠ Local file not found (already deleted?)`));\n }\n\n console.log(chalk.yellow(`⚠ Note: This prompt may still exist on the server. Visit LangWatch to fully delete it.`));\n }\n\n // Remove materialized file if it exists\n const lockEntry = lock.prompts[name];\n if (lockEntry?.materialized) {\n const materializedPath = path.resolve(lockEntry.materialized);\n if (fs.existsSync(materializedPath)) {\n fs.unlinkSync(materializedPath);\n\n // Clean up empty directories\n const materializedDir = path.dirname(materializedPath);\n const rootMaterializedDir = FileManager.getMaterializedDir();\n\n let currentDir = materializedDir;\n while (currentDir !== rootMaterializedDir && currentDir !== path.dirname(currentDir)) {\n try {\n const entries = fs.readdirSync(currentDir);\n if (entries.length === 0) {\n fs.rmdirSync(currentDir);\n currentDir = path.dirname(currentDir);\n } else {\n break;\n }\n } catch {\n break;\n }\n }\n }\n }\n\n // Remove from config and lock\n delete config.prompts[name];\n delete lock.prompts[name];\n\n // Save updated files\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n if (!isLocalPrompt) {\n spinner.succeed();\n console.log(chalk.green(`✓ Removed ${chalk.cyan(name)} from dependencies`));\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(chalk.red(`Error removing prompt: ${error instanceof Error ? error.message : \"Unknown error\"}`));\n }\n process.exit(1);\n }\n\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(chalk.red(`Unexpected error: ${error instanceof Error ? error.message : \"Unknown error\"}`));\n }\n process.exit(1);\n }\n};\n"]}
@@ -2,30 +2,26 @@ import {
2
2
  checkApiKey
3
3
  } from "./chunk-DHJKJVY7.mjs";
4
4
  import {
5
- LangWatch
6
- } from "./chunk-YEGQXDTE.mjs";
7
- import {
5
+ PromptsApiService,
8
6
  PromptsError
9
- } from "./chunk-H5PON53W.mjs";
10
- import "./chunk-N2V6J3U2.mjs";
11
- import "./chunk-QZGTM76F.mjs";
12
- import "./chunk-ZIULPOMQ.mjs";
13
- import "./chunk-YKFTFYKK.mjs";
14
- import "./chunk-YNQ44U6D.mjs";
7
+ } from "./chunk-EPGKOTSN.mjs";
8
+ import "./chunk-FEL5FLHA.mjs";
9
+ import "./chunk-UNMZPS55.mjs";
10
+ import "./chunk-7MG7DGPP.mjs";
11
+ import "./chunk-7VHZNB2S.mjs";
12
+ import "./chunk-I2SOBPAF.mjs";
15
13
  import {
16
14
  ensureProjectInitialized
17
- } from "./chunk-DLJO7AK5.mjs";
18
- import {
19
- FileManager
20
- } from "./chunk-CKVDNVFL.mjs";
15
+ } from "./chunk-AD7QRYIJ.mjs";
21
16
  import {
17
+ FileManager,
22
18
  PromptConverter
23
- } from "./chunk-V5M3HUBV.mjs";
19
+ } from "./chunk-PYVDTUA6.mjs";
24
20
  import "./chunk-BTBSMJTY.mjs";
25
21
  import {
26
22
  __spreadProps,
27
23
  __spreadValues
28
- } from "./chunk-CU3443HD.mjs";
24
+ } from "./chunk-URTD2WOC.mjs";
29
25
 
30
26
  // src/cli/commands/sync.ts
31
27
  import * as fs from "fs";
@@ -78,7 +74,7 @@ var syncCommand = async () => {
78
74
  const startTime = Date.now();
79
75
  try {
80
76
  checkApiKey();
81
- const langwatch = new LangWatch();
77
+ const promptsApiService = new PromptsApiService();
82
78
  await ensureProjectInitialized(false);
83
79
  const config = FileManager.loadPromptsConfig();
84
80
  const lock = FileManager.loadPromptsLock();
@@ -108,7 +104,7 @@ var syncCommand = async () => {
108
104
  try {
109
105
  const versionSpec = typeof dependency === "string" ? dependency : (_a = dependency.version) != null ? _a : "latest";
110
106
  const lockEntry = lock.prompts[name];
111
- const prompt = await langwatch.prompts.get(name);
107
+ const prompt = await promptsApiService.get(name);
112
108
  if (prompt) {
113
109
  const needsUpdate = !lockEntry || lockEntry.version !== prompt.version || !lockEntry.materialized || !fs.existsSync(path.resolve(lockEntry.materialized));
114
110
  if (needsUpdate) {
@@ -172,7 +168,7 @@ var syncCommand = async () => {
172
168
  inputs: [{ identifier: "input", type: "str" }],
173
169
  outputs: [{ identifier: "output", type: "str" }]
174
170
  };
175
- const syncResult = await langwatch.prompts.sync({
171
+ const syncResult = await promptsApiService.sync({
176
172
  name: promptName,
177
173
  configData,
178
174
  localVersion: currentVersion,
@@ -233,7 +229,7 @@ var syncCommand = async () => {
233
229
  materialized: filePath
234
230
  };
235
231
  } else {
236
- const syncResult2 = await langwatch.prompts.update(promptName, __spreadProps(__spreadValues({}, localConfig), {
232
+ const syncResult2 = await promptsApiService.update(promptName, __spreadProps(__spreadValues({}, localConfig), {
237
233
  commitMessage: `Synced from local file: ${path.basename(
238
234
  filePath
239
235
  )}`
@@ -415,4 +411,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
415
411
  export {
416
412
  syncCommand
417
413
  };
418
- //# sourceMappingURL=sync-FOW7DHAH.mjs.map
414
+ //# sourceMappingURL=sync-2MVHHWCX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/sync.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as yaml from \"js-yaml\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\nimport {\n type ConfigData,\n Prompt,\n PromptsApiService,\n PromptsError,\n type SyncAction,\n} from \"@/client-sdk/services/prompts\";\nimport type { SyncResult } from \"../types\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport readline from \"node:readline\";\n\n// Handle conflict resolution - show diff and ask user to choose\nconst handleConflict = async (\n promptName: string,\n conflictInfo: {\n localVersion: number;\n remoteVersion: number;\n differences: string[];\n remoteConfigData: any;\n }\n): Promise<\"local\" | \"remote\" | \"abort\"> => {\n console.log(\n chalk.yellow(`\\n⚠ Conflict detected for prompt: ${chalk.cyan(promptName)}`)\n );\n console.log(\n chalk.gray(\n `Local version: ${conflictInfo.localVersion}, Remote version: ${conflictInfo.remoteVersion}`\n )\n );\n\n if (conflictInfo.differences.length > 0) {\n console.log(chalk.yellow(\"\\nDifferences:\"));\n conflictInfo.differences.forEach((diff) => {\n console.log(chalk.gray(` • ${diff}`));\n });\n }\n\n console.log(chalk.yellow(\"\\nOptions:\"));\n console.log(\" [l] Use local version (overwrite remote)\");\n console.log(\" [r] Use remote version (overwrite local)\");\n console.log(\" [a] Abort sync for this prompt\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(\"Choose resolution (l/r/a): \", (answer: string) => {\n rl.close();\n const choice = answer.toLowerCase();\n if (choice === \"l\" || choice === \"local\") {\n resolve(\"local\");\n } else if (choice === \"r\" || choice === \"remote\") {\n resolve(\"remote\");\n } else {\n resolve(\"abort\");\n }\n });\n });\n};\n\nexport const syncCommand = async (): Promise<void> => {\n console.log(\"🔄 Starting sync...\");\n\n const startTime = Date.now();\n\n try {\n // Check API key before doing anything else\n checkApiKey();\n\n // Get prompts API service\n const promptsApiService = new PromptsApiService();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized(false); // Don't prompt for .gitignore in sync\n\n // Load prompts config and lock\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n const result: SyncResult = {\n fetched: [],\n pushed: [],\n unchanged: [],\n cleaned: [],\n errors: [],\n };\n\n // Process remote prompts (fetch and materialize)\n const remoteDeps = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n // Skip local file dependencies (both object format and string format)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n }\n );\n\n if (remoteDeps.length > 0) {\n const fetchSpinner = ora(\n `Checking ${remoteDeps.length} remote prompts...`\n ).start();\n\n for (const [name, dependency] of remoteDeps) {\n try {\n const versionSpec =\n typeof dependency === \"string\"\n ? dependency\n : dependency.version ?? \"latest\";\n\n // Check if we already have this prompt with the same version\n const lockEntry = lock.prompts[name];\n\n // Fetch the prompt from the API to check current version\n const prompt = await promptsApiService.get(name);\n\n if (prompt) {\n // Check if we need to update (new version or not materialized)\n const needsUpdate =\n !lockEntry ||\n lockEntry.version !== prompt.version ||\n !lockEntry.materialized ||\n !fs.existsSync(path.resolve(lockEntry.materialized));\n\n if (needsUpdate) {\n // Convert to MaterializedPrompt format using the converter\n const materializedPrompt =\n PromptConverter.fromApiToMaterialized(prompt);\n\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n result.fetched.push({\n name,\n version: prompt.version,\n versionSpec,\n });\n\n // Update lock file entry\n FileManager.updateLockEntry(\n lock,\n name,\n materializedPrompt,\n savedPath\n );\n\n fetchSpinner.text = `Fetched ${chalk.cyan(\n `${name}@${versionSpec}`\n )} ${chalk.gray(`(version ${prompt.version})`)} → ${chalk.gray(\n relativePath\n )}`;\n } else {\n // No change needed, track as unchanged\n result.unchanged.push(name);\n }\n } else {\n result.errors.push({ name, error: \"Prompt not found\" });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name, error: errorMessage });\n }\n }\n\n fetchSpinner.stop();\n }\n\n // Process local prompts (push to API) - only those explicitly declared in prompts.json\n const localFileRefs = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n return typeof dependency === \"string\" && dependency.startsWith(\"file:\");\n }\n );\n\n if (localFileRefs.length > 0) {\n const pushSpinner = ora(\n `Pushing ${localFileRefs.length} local prompts...`\n ).start();\n\n // Use the existing lock file instead of reloading it\n // const lock = FileManager.loadPromptsLock(); // Don't reload - use existing lock\n\n for (const [promptName, dependency] of localFileRefs) {\n try {\n const filePath = (dependency as string).slice(5); // Remove \"file:\" prefix\n\n // Load local prompt config\n const localConfig = FileManager.loadLocalPrompt(filePath);\n\n // Get current version from lock file\n const currentVersion = lock.prompts[promptName]?.version;\n\n // Convert local config to API configData format\n const configData: ConfigData = {\n model: localConfig.model,\n prompt: PromptConverter.extractSystemPrompt(localConfig.messages),\n messages: PromptConverter.filterNonSystemMessages(\n localConfig.messages\n ) as Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>,\n temperature: localConfig.modelParameters?.temperature,\n max_tokens: localConfig.modelParameters?.max_tokens,\n inputs: [{ identifier: \"input\", type: \"str\" }],\n outputs: [{ identifier: \"output\", type: \"str\" }],\n };\n\n // Use new sync API with conflict detection\n const syncResult = await promptsApiService.sync({\n name: promptName,\n configData,\n localVersion: currentVersion,\n commitMessage: `Synced from local file: ${path.basename(filePath)}`,\n });\n\n const relativePath = path.relative(process.cwd(), filePath);\n\n let conflictResolution: \"local\" | \"remote\" | \"abort\" | null = null;\n if (syncResult.action === \"conflict\") {\n // Handle conflict - prompt user for resolution\n pushSpinner.stop();\n conflictResolution = await handleConflict(\n promptName,\n syncResult.conflictInfo!\n );\n if (conflictResolution === \"abort\") {\n result.errors.push({\n name: promptName,\n error: \"Sync aborted due to conflict\",\n });\n continue;\n }\n\n // If user chose remote, we should pull the remote version to local file\n if (conflictResolution === \"remote\" && syncResult.conflictInfo) {\n // Update local file with remote content\n const remoteConfig = {\n model: syncResult.conflictInfo.remoteConfigData.model,\n modelParameters: {\n temperature:\n syncResult.conflictInfo.remoteConfigData.temperature,\n max_tokens:\n syncResult.conflictInfo.remoteConfigData.max_tokens,\n },\n messages: [\n {\n role: \"system\" as const,\n content: syncResult.conflictInfo.remoteConfigData.prompt,\n },\n ...(syncResult.conflictInfo.remoteConfigData.messages ?? []),\n ],\n };\n\n const yamlContent = yaml.dump(remoteConfig, {\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n });\n\n fs.writeFileSync(filePath, yamlContent);\n }\n\n // If user chose to proceed, we continue with the sync\n pushSpinner.start();\n }\n\n // Update lock file with new version info\n if (syncResult.prompt) {\n lock.prompts[promptName] = {\n version: syncResult.prompt.version,\n versionId: syncResult.prompt.versionId,\n materialized: filePath,\n };\n } else if (syncResult.action === \"conflict\") {\n const remoteVersion = syncResult.conflictInfo?.remoteVersion ?? 0;\n if (conflictResolution === \"remote\") {\n // User chose remote - use remote version\n lock.prompts[promptName] = {\n version: remoteVersion,\n versionId: \"remote_version\", // We don't have the actual versionId from conflict info\n materialized: filePath,\n };\n } else {\n // User chose local - force push\n const syncResult = await promptsApiService.update(promptName, {\n ...localConfig,\n commitMessage: `Synced from local file: ${path.basename(\n filePath\n )}`,\n });\n lock.prompts[promptName] = {\n version: syncResult.version,\n versionId: syncResult.versionId,\n materialized: filePath,\n };\n }\n }\n\n // Determine the action text based on sync result and conflict resolution\n let actionText: string;\n if (syncResult.action === \"conflict\") {\n if (conflictResolution === \"remote\") {\n actionText = \"Pulled\"; // User chose to use remote version\n result.fetched.push({\n name: promptName,\n version: syncResult.conflictInfo?.remoteVersion ?? 0,\n versionSpec: \"latest\", // Default for conflict resolution\n });\n } else {\n actionText = \"Pushed\"; // User chose to use local version (or forced push)\n result.pushed.push({\n name: promptName,\n version: (syncResult.conflictInfo?.remoteVersion ?? 0) + 1, // New version after push\n });\n }\n } else if (syncResult.action === \"up_to_date\") {\n // For up-to-date prompts, add to unchanged instead of pushed\n actionText = \"Up-to-date\";\n result.unchanged.push(promptName);\n } else {\n const actionMap: Record<SyncAction, string> = {\n created: \"Created\",\n updated: \"Updated\",\n conflict: \"Conflict resolved\",\n up_to_date: \"Up to date\",\n };\n actionText = actionMap[syncResult.action as SyncAction] || \"Pushed\";\n result.pushed.push({\n name: promptName,\n version: syncResult.prompt?.version ?? 0,\n });\n }\n\n pushSpinner.text = `${actionText} ${chalk.cyan(\n promptName\n )} ${chalk.gray(\n `(version ${\n syncResult.prompt?.version ??\n syncResult.conflictInfo?.remoteVersion ??\n \"unknown\"\n })`\n )} ${conflictResolution === \"remote\" ? \"to\" : \"from\"} ${chalk.gray(\n relativePath\n )}`;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name: promptName, error: errorMessage });\n }\n }\n\n // Save lock file with all updates\n FileManager.savePromptsLock(lock);\n\n pushSpinner.stop();\n }\n\n // Check for orphan local prompt files and show helpful warnings\n const discoveredLocalFiles = FileManager.getLocalPromptFiles();\n const orphanFiles = discoveredLocalFiles.filter((filePath) => {\n const promptName = FileManager.promptNameFromPath(filePath);\n return !config.prompts[promptName]; // Not declared in prompts.json\n });\n\n if (orphanFiles.length > 0) {\n console.log(\n chalk.yellow(\n `\\n⚠ Found ${orphanFiles.length} orphan prompt file${\n orphanFiles.length > 1 ? \"s\" : \"\"\n }:`\n )\n );\n\n for (const filePath of orphanFiles) {\n const promptName = FileManager.promptNameFromPath(filePath);\n const relativePath = path.relative(process.cwd(), filePath);\n\n console.log(chalk.yellow(` ${relativePath}`));\n console.log(\n chalk.gray(\n ` Add to prompts.json: \"${promptName}\": \"file:${relativePath}\"`\n )\n );\n }\n\n console.log(\n chalk.gray(\n `\\nTip: Add these to prompts.json to include them in sync operations.`\n )\n );\n }\n\n // Cleanup orphaned materialized files\n const currentDependencies = new Set(\n Object.keys(config.prompts).filter((name) => {\n const dependency = config.prompts[name];\n // Only include remote dependencies (not local file: dependencies)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n })\n );\n\n const cleanedFiles =\n FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);\n if (cleanedFiles.length > 0) {\n result.cleaned = cleanedFiles;\n FileManager.removeFromLock(lock, cleanedFiles);\n }\n\n // Save the updated lock file\n FileManager.savePromptsLock(lock);\n\n // Print individual results if there were actions\n if (result.fetched.length > 0) {\n for (const { name, version, versionSpec } of result.fetched) {\n // Get the actual saved path from lock file for display consistency\n const lockEntry = lock.prompts[name];\n const displayPath = lockEntry?.materialized\n ? `./${lockEntry.materialized}`\n : `./prompts/.materialized/${name}.prompt.yaml`;\n\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${versionSpec}`)} ${chalk.gray(\n `(version ${version})`\n )} → ${chalk.gray(displayPath)}`\n )\n );\n }\n }\n\n if (result.pushed.length > 0) {\n for (const { name, version } of result.pushed) {\n const localPath = `./prompts/${name}.prompt.yaml`;\n console.log(\n chalk.green(\n `✓ Pushed ${chalk.cyan(name)} ${chalk.gray(\n `(version ${version})`\n )} from ${chalk.gray(localPath)}`\n )\n );\n }\n }\n\n // Print cleaned up files\n if (result.cleaned.length > 0) {\n for (const name of result.cleaned) {\n console.log(\n chalk.yellow(\n `✓ Cleaned ${chalk.cyan(name)} (no longer in dependencies)`\n )\n );\n }\n }\n\n // Print errors\n if (result.errors.length > 0) {\n for (const { name, error } of result.errors) {\n console.log(chalk.red(`✗ Failed ${chalk.cyan(name)}: ${error}`));\n }\n }\n\n // Print summary\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n const totalActions =\n result.fetched.length + result.pushed.length + result.cleaned.length;\n\n if (totalActions === 0 && result.errors.length === 0) {\n console.log(chalk.gray(`Synced in ${duration}s, no changes`));\n } else {\n const summary = [];\n if (result.fetched.length > 0)\n summary.push(`${result.fetched.length} fetched`);\n if (result.pushed.length > 0)\n summary.push(`${result.pushed.length} pushed`);\n if (result.cleaned.length > 0)\n summary.push(`${result.cleaned.length} cleaned`);\n if (result.errors.length > 0)\n summary.push(`${result.errors.length} errors`);\n\n console.log(chalk.gray(`Synced ${summary.join(\", \")} in ${duration}s`));\n }\n\n if (result.errors.length > 0) {\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":["resolve","syncResult"]}
@@ -3,29 +3,25 @@
3
3
  var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
4
4
 
5
5
 
6
- var _chunkDSIQSULKjs = require('./chunk-DSIQSULK.js');
7
6
 
7
+ var _chunkD7UAKYVIjs = require('./chunk-D7UAKYVI.js');
8
+ require('./chunk-SNDTNU3T.js');
9
+ require('./chunk-VMZUN4EF.js');
10
+ require('./chunk-J55AV2YW.js');
11
+ require('./chunk-5HAVK64Q.js');
12
+ require('./chunk-CKIZDPIJ.js');
8
13
 
9
- var _chunkSVXNUWZIjs = require('./chunk-SVXNUWZI.js');
10
- require('./chunk-YH5TIVK2.js');
11
- require('./chunk-ECOC36EA.js');
12
- require('./chunk-P4SQTYGN.js');
13
- require('./chunk-QCYYSMCU.js');
14
- require('./chunk-DISMHYXC.js');
15
14
 
15
+ var _chunkDZH6SY3Zjs = require('./chunk-DZH6SY3Z.js');
16
16
 
17
- var _chunk7OZKH5K2js = require('./chunk-7OZKH5K2.js');
18
17
 
19
18
 
20
- var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
21
-
22
-
23
- var _chunkR6FBJN7Kjs = require('./chunk-R6FBJN7K.js');
19
+ var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
24
20
  require('./chunk-AZHZ4NB4.js');
25
21
 
26
22
 
27
23
 
28
- var _chunkOXBO24RBjs = require('./chunk-OXBO24RB.js');
24
+ var _chunkOHM7JUMRjs = require('./chunk-OHM7JUMR.js');
29
25
 
30
26
  // src/cli/commands/sync.ts
31
27
  var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
@@ -78,10 +74,10 @@ var syncCommand = async () => {
78
74
  const startTime = Date.now();
79
75
  try {
80
76
  _chunkF6E4XQQUjs.checkApiKey.call(void 0, );
81
- const langwatch = new (0, _chunkDSIQSULKjs.LangWatch)();
82
- await _chunk7OZKH5K2js.ensureProjectInitialized.call(void 0, false);
83
- const config = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
84
- const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
77
+ const promptsApiService = new (0, _chunkD7UAKYVIjs.PromptsApiService)();
78
+ await _chunkDZH6SY3Zjs.ensureProjectInitialized.call(void 0, false);
79
+ const config = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
80
+ const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
85
81
  const result = {
86
82
  fetched: [],
87
83
  pushed: [],
@@ -108,12 +104,12 @@ var syncCommand = async () => {
108
104
  try {
109
105
  const versionSpec = typeof dependency === "string" ? dependency : (_a = dependency.version) != null ? _a : "latest";
110
106
  const lockEntry = lock.prompts[name];
111
- const prompt = await langwatch.prompts.get(name);
107
+ const prompt = await promptsApiService.get(name);
112
108
  if (prompt) {
113
109
  const needsUpdate = !lockEntry || lockEntry.version !== prompt.version || !lockEntry.materialized || !fs.existsSync(path.resolve(lockEntry.materialized));
114
110
  if (needsUpdate) {
115
- const materializedPrompt = _chunkR6FBJN7Kjs.PromptConverter.fromApiToMaterialized(prompt);
116
- const savedPath = _chunkCAZONSXVjs.FileManager.saveMaterializedPrompt(
111
+ const materializedPrompt = _chunk36XAYVMCjs.PromptConverter.fromApiToMaterialized(prompt);
112
+ const savedPath = _chunk36XAYVMCjs.FileManager.saveMaterializedPrompt(
117
113
  name,
118
114
  materializedPrompt
119
115
  );
@@ -123,7 +119,7 @@ var syncCommand = async () => {
123
119
  version: prompt.version,
124
120
  versionSpec
125
121
  });
126
- _chunkCAZONSXVjs.FileManager.updateLockEntry(
122
+ _chunk36XAYVMCjs.FileManager.updateLockEntry(
127
123
  lock,
128
124
  name,
129
125
  materializedPrompt,
@@ -159,12 +155,12 @@ var syncCommand = async () => {
159
155
  for (const [promptName, dependency] of localFileRefs) {
160
156
  try {
161
157
  const filePath = dependency.slice(5);
162
- const localConfig = _chunkCAZONSXVjs.FileManager.loadLocalPrompt(filePath);
158
+ const localConfig = _chunk36XAYVMCjs.FileManager.loadLocalPrompt(filePath);
163
159
  const currentVersion = (_b = lock.prompts[promptName]) == null ? void 0 : _b.version;
164
160
  const configData = {
165
161
  model: localConfig.model,
166
- prompt: _chunkR6FBJN7Kjs.PromptConverter.extractSystemPrompt(localConfig.messages),
167
- messages: _chunkR6FBJN7Kjs.PromptConverter.filterNonSystemMessages(
162
+ prompt: _chunk36XAYVMCjs.PromptConverter.extractSystemPrompt(localConfig.messages),
163
+ messages: _chunk36XAYVMCjs.PromptConverter.filterNonSystemMessages(
168
164
  localConfig.messages
169
165
  ),
170
166
  temperature: (_c = localConfig.modelParameters) == null ? void 0 : _c.temperature,
@@ -172,7 +168,7 @@ var syncCommand = async () => {
172
168
  inputs: [{ identifier: "input", type: "str" }],
173
169
  outputs: [{ identifier: "output", type: "str" }]
174
170
  };
175
- const syncResult = await langwatch.prompts.sync({
171
+ const syncResult = await promptsApiService.sync({
176
172
  name: promptName,
177
173
  configData,
178
174
  localVersion: currentVersion,
@@ -233,7 +229,7 @@ var syncCommand = async () => {
233
229
  materialized: filePath
234
230
  };
235
231
  } else {
236
- const syncResult2 = await langwatch.prompts.update(promptName, _chunkOXBO24RBjs.__spreadProps.call(void 0, _chunkOXBO24RBjs.__spreadValues.call(void 0, {}, localConfig), {
232
+ const syncResult2 = await promptsApiService.update(promptName, _chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, localConfig), {
237
233
  commitMessage: `Synced from local file: ${path.basename(
238
234
  filePath
239
235
  )}`
@@ -291,12 +287,12 @@ var syncCommand = async () => {
291
287
  result.errors.push({ name: promptName, error: errorMessage });
292
288
  }
293
289
  }
294
- _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
290
+ _chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
295
291
  pushSpinner.stop();
296
292
  }
297
- const discoveredLocalFiles = _chunkCAZONSXVjs.FileManager.getLocalPromptFiles();
293
+ const discoveredLocalFiles = _chunk36XAYVMCjs.FileManager.getLocalPromptFiles();
298
294
  const orphanFiles = discoveredLocalFiles.filter((filePath) => {
299
- const promptName = _chunkCAZONSXVjs.FileManager.promptNameFromPath(filePath);
295
+ const promptName = _chunk36XAYVMCjs.FileManager.promptNameFromPath(filePath);
300
296
  return !config.prompts[promptName];
301
297
  });
302
298
  if (orphanFiles.length > 0) {
@@ -307,7 +303,7 @@ var syncCommand = async () => {
307
303
  )
308
304
  );
309
305
  for (const filePath of orphanFiles) {
310
- const promptName = _chunkCAZONSXVjs.FileManager.promptNameFromPath(filePath);
306
+ const promptName = _chunk36XAYVMCjs.FileManager.promptNameFromPath(filePath);
311
307
  const relativePath = path.relative(process.cwd(), filePath);
312
308
  console.log(_chalk2.default.yellow(` ${relativePath}`));
313
309
  console.log(
@@ -335,12 +331,12 @@ Tip: Add these to prompts.json to include them in sync operations.`
335
331
  return true;
336
332
  })
337
333
  );
338
- const cleanedFiles = _chunkCAZONSXVjs.FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);
334
+ const cleanedFiles = _chunk36XAYVMCjs.FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);
339
335
  if (cleanedFiles.length > 0) {
340
336
  result.cleaned = cleanedFiles;
341
- _chunkCAZONSXVjs.FileManager.removeFromLock(lock, cleanedFiles);
337
+ _chunk36XAYVMCjs.FileManager.removeFromLock(lock, cleanedFiles);
342
338
  }
343
- _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
339
+ _chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
344
340
  if (result.fetched.length > 0) {
345
341
  for (const { name, version, versionSpec } of result.fetched) {
346
342
  const lockEntry = lock.prompts[name];
@@ -400,7 +396,7 @@ Tip: Add these to prompts.json to include them in sync operations.`
400
396
  process.exit(1);
401
397
  }
402
398
  } catch (error) {
403
- if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
399
+ if (error instanceof _chunkD7UAKYVIjs.PromptsError) {
404
400
  console.error(_chalk2.default.red(`Error: ${error.message}`));
405
401
  } else {
406
402
  console.error(
@@ -415,4 +411,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
415
411
 
416
412
 
417
413
  exports.syncCommand = syncCommand;
418
- //# sourceMappingURL=sync-T3T22GVZ.js.map
414
+ //# sourceMappingURL=sync-KUMBMGJS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-KUMBMGJS.js","../src/cli/commands/sync.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-KUMBMGJS.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as yaml from \"js-yaml\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\nimport {\n type ConfigData,\n Prompt,\n PromptsApiService,\n PromptsError,\n type SyncAction,\n} from \"@/client-sdk/services/prompts\";\nimport type { SyncResult } from \"../types\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport readline from \"node:readline\";\n\n// Handle conflict resolution - show diff and ask user to choose\nconst handleConflict = async (\n promptName: string,\n conflictInfo: {\n localVersion: number;\n remoteVersion: number;\n differences: string[];\n remoteConfigData: any;\n }\n): Promise<\"local\" | \"remote\" | \"abort\"> => {\n console.log(\n chalk.yellow(`\\n⚠ Conflict detected for prompt: ${chalk.cyan(promptName)}`)\n );\n console.log(\n chalk.gray(\n `Local version: ${conflictInfo.localVersion}, Remote version: ${conflictInfo.remoteVersion}`\n )\n );\n\n if (conflictInfo.differences.length > 0) {\n console.log(chalk.yellow(\"\\nDifferences:\"));\n conflictInfo.differences.forEach((diff) => {\n console.log(chalk.gray(` • ${diff}`));\n });\n }\n\n console.log(chalk.yellow(\"\\nOptions:\"));\n console.log(\" [l] Use local version (overwrite remote)\");\n console.log(\" [r] Use remote version (overwrite local)\");\n console.log(\" [a] Abort sync for this prompt\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(\"Choose resolution (l/r/a): \", (answer: string) => {\n rl.close();\n const choice = answer.toLowerCase();\n if (choice === \"l\" || choice === \"local\") {\n resolve(\"local\");\n } else if (choice === \"r\" || choice === \"remote\") {\n resolve(\"remote\");\n } else {\n resolve(\"abort\");\n }\n });\n });\n};\n\nexport const syncCommand = async (): Promise<void> => {\n console.log(\"🔄 Starting sync...\");\n\n const startTime = Date.now();\n\n try {\n // Check API key before doing anything else\n checkApiKey();\n\n // Get prompts API service\n const promptsApiService = new PromptsApiService();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized(false); // Don't prompt for .gitignore in sync\n\n // Load prompts config and lock\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n const result: SyncResult = {\n fetched: [],\n pushed: [],\n unchanged: [],\n cleaned: [],\n errors: [],\n };\n\n // Process remote prompts (fetch and materialize)\n const remoteDeps = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n // Skip local file dependencies (both object format and string format)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n }\n );\n\n if (remoteDeps.length > 0) {\n const fetchSpinner = ora(\n `Checking ${remoteDeps.length} remote prompts...`\n ).start();\n\n for (const [name, dependency] of remoteDeps) {\n try {\n const versionSpec =\n typeof dependency === \"string\"\n ? dependency\n : dependency.version ?? \"latest\";\n\n // Check if we already have this prompt with the same version\n const lockEntry = lock.prompts[name];\n\n // Fetch the prompt from the API to check current version\n const prompt = await promptsApiService.get(name);\n\n if (prompt) {\n // Check if we need to update (new version or not materialized)\n const needsUpdate =\n !lockEntry ||\n lockEntry.version !== prompt.version ||\n !lockEntry.materialized ||\n !fs.existsSync(path.resolve(lockEntry.materialized));\n\n if (needsUpdate) {\n // Convert to MaterializedPrompt format using the converter\n const materializedPrompt =\n PromptConverter.fromApiToMaterialized(prompt);\n\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n result.fetched.push({\n name,\n version: prompt.version,\n versionSpec,\n });\n\n // Update lock file entry\n FileManager.updateLockEntry(\n lock,\n name,\n materializedPrompt,\n savedPath\n );\n\n fetchSpinner.text = `Fetched ${chalk.cyan(\n `${name}@${versionSpec}`\n )} ${chalk.gray(`(version ${prompt.version})`)} → ${chalk.gray(\n relativePath\n )}`;\n } else {\n // No change needed, track as unchanged\n result.unchanged.push(name);\n }\n } else {\n result.errors.push({ name, error: \"Prompt not found\" });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name, error: errorMessage });\n }\n }\n\n fetchSpinner.stop();\n }\n\n // Process local prompts (push to API) - only those explicitly declared in prompts.json\n const localFileRefs = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n return typeof dependency === \"string\" && dependency.startsWith(\"file:\");\n }\n );\n\n if (localFileRefs.length > 0) {\n const pushSpinner = ora(\n `Pushing ${localFileRefs.length} local prompts...`\n ).start();\n\n // Use the existing lock file instead of reloading it\n // const lock = FileManager.loadPromptsLock(); // Don't reload - use existing lock\n\n for (const [promptName, dependency] of localFileRefs) {\n try {\n const filePath = (dependency as string).slice(5); // Remove \"file:\" prefix\n\n // Load local prompt config\n const localConfig = FileManager.loadLocalPrompt(filePath);\n\n // Get current version from lock file\n const currentVersion = lock.prompts[promptName]?.version;\n\n // Convert local config to API configData format\n const configData: ConfigData = {\n model: localConfig.model,\n prompt: PromptConverter.extractSystemPrompt(localConfig.messages),\n messages: PromptConverter.filterNonSystemMessages(\n localConfig.messages\n ) as Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>,\n temperature: localConfig.modelParameters?.temperature,\n max_tokens: localConfig.modelParameters?.max_tokens,\n inputs: [{ identifier: \"input\", type: \"str\" }],\n outputs: [{ identifier: \"output\", type: \"str\" }],\n };\n\n // Use new sync API with conflict detection\n const syncResult = await promptsApiService.sync({\n name: promptName,\n configData,\n localVersion: currentVersion,\n commitMessage: `Synced from local file: ${path.basename(filePath)}`,\n });\n\n const relativePath = path.relative(process.cwd(), filePath);\n\n let conflictResolution: \"local\" | \"remote\" | \"abort\" | null = null;\n if (syncResult.action === \"conflict\") {\n // Handle conflict - prompt user for resolution\n pushSpinner.stop();\n conflictResolution = await handleConflict(\n promptName,\n syncResult.conflictInfo!\n );\n if (conflictResolution === \"abort\") {\n result.errors.push({\n name: promptName,\n error: \"Sync aborted due to conflict\",\n });\n continue;\n }\n\n // If user chose remote, we should pull the remote version to local file\n if (conflictResolution === \"remote\" && syncResult.conflictInfo) {\n // Update local file with remote content\n const remoteConfig = {\n model: syncResult.conflictInfo.remoteConfigData.model,\n modelParameters: {\n temperature:\n syncResult.conflictInfo.remoteConfigData.temperature,\n max_tokens:\n syncResult.conflictInfo.remoteConfigData.max_tokens,\n },\n messages: [\n {\n role: \"system\" as const,\n content: syncResult.conflictInfo.remoteConfigData.prompt,\n },\n ...(syncResult.conflictInfo.remoteConfigData.messages ?? []),\n ],\n };\n\n const yamlContent = yaml.dump(remoteConfig, {\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n });\n\n fs.writeFileSync(filePath, yamlContent);\n }\n\n // If user chose to proceed, we continue with the sync\n pushSpinner.start();\n }\n\n // Update lock file with new version info\n if (syncResult.prompt) {\n lock.prompts[promptName] = {\n version: syncResult.prompt.version,\n versionId: syncResult.prompt.versionId,\n materialized: filePath,\n };\n } else if (syncResult.action === \"conflict\") {\n const remoteVersion = syncResult.conflictInfo?.remoteVersion ?? 0;\n if (conflictResolution === \"remote\") {\n // User chose remote - use remote version\n lock.prompts[promptName] = {\n version: remoteVersion,\n versionId: \"remote_version\", // We don't have the actual versionId from conflict info\n materialized: filePath,\n };\n } else {\n // User chose local - force push\n const syncResult = await promptsApiService.update(promptName, {\n ...localConfig,\n commitMessage: `Synced from local file: ${path.basename(\n filePath\n )}`,\n });\n lock.prompts[promptName] = {\n version: syncResult.version,\n versionId: syncResult.versionId,\n materialized: filePath,\n };\n }\n }\n\n // Determine the action text based on sync result and conflict resolution\n let actionText: string;\n if (syncResult.action === \"conflict\") {\n if (conflictResolution === \"remote\") {\n actionText = \"Pulled\"; // User chose to use remote version\n result.fetched.push({\n name: promptName,\n version: syncResult.conflictInfo?.remoteVersion ?? 0,\n versionSpec: \"latest\", // Default for conflict resolution\n });\n } else {\n actionText = \"Pushed\"; // User chose to use local version (or forced push)\n result.pushed.push({\n name: promptName,\n version: (syncResult.conflictInfo?.remoteVersion ?? 0) + 1, // New version after push\n });\n }\n } else if (syncResult.action === \"up_to_date\") {\n // For up-to-date prompts, add to unchanged instead of pushed\n actionText = \"Up-to-date\";\n result.unchanged.push(promptName);\n } else {\n const actionMap: Record<SyncAction, string> = {\n created: \"Created\",\n updated: \"Updated\",\n conflict: \"Conflict resolved\",\n up_to_date: \"Up to date\",\n };\n actionText = actionMap[syncResult.action as SyncAction] || \"Pushed\";\n result.pushed.push({\n name: promptName,\n version: syncResult.prompt?.version ?? 0,\n });\n }\n\n pushSpinner.text = `${actionText} ${chalk.cyan(\n promptName\n )} ${chalk.gray(\n `(version ${\n syncResult.prompt?.version ??\n syncResult.conflictInfo?.remoteVersion ??\n \"unknown\"\n })`\n )} ${conflictResolution === \"remote\" ? \"to\" : \"from\"} ${chalk.gray(\n relativePath\n )}`;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name: promptName, error: errorMessage });\n }\n }\n\n // Save lock file with all updates\n FileManager.savePromptsLock(lock);\n\n pushSpinner.stop();\n }\n\n // Check for orphan local prompt files and show helpful warnings\n const discoveredLocalFiles = FileManager.getLocalPromptFiles();\n const orphanFiles = discoveredLocalFiles.filter((filePath) => {\n const promptName = FileManager.promptNameFromPath(filePath);\n return !config.prompts[promptName]; // Not declared in prompts.json\n });\n\n if (orphanFiles.length > 0) {\n console.log(\n chalk.yellow(\n `\\n⚠ Found ${orphanFiles.length} orphan prompt file${\n orphanFiles.length > 1 ? \"s\" : \"\"\n }:`\n )\n );\n\n for (const filePath of orphanFiles) {\n const promptName = FileManager.promptNameFromPath(filePath);\n const relativePath = path.relative(process.cwd(), filePath);\n\n console.log(chalk.yellow(` ${relativePath}`));\n console.log(\n chalk.gray(\n ` Add to prompts.json: \"${promptName}\": \"file:${relativePath}\"`\n )\n );\n }\n\n console.log(\n chalk.gray(\n `\\nTip: Add these to prompts.json to include them in sync operations.`\n )\n );\n }\n\n // Cleanup orphaned materialized files\n const currentDependencies = new Set(\n Object.keys(config.prompts).filter((name) => {\n const dependency = config.prompts[name];\n // Only include remote dependencies (not local file: dependencies)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n })\n );\n\n const cleanedFiles =\n FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);\n if (cleanedFiles.length > 0) {\n result.cleaned = cleanedFiles;\n FileManager.removeFromLock(lock, cleanedFiles);\n }\n\n // Save the updated lock file\n FileManager.savePromptsLock(lock);\n\n // Print individual results if there were actions\n if (result.fetched.length > 0) {\n for (const { name, version, versionSpec } of result.fetched) {\n // Get the actual saved path from lock file for display consistency\n const lockEntry = lock.prompts[name];\n const displayPath = lockEntry?.materialized\n ? `./${lockEntry.materialized}`\n : `./prompts/.materialized/${name}.prompt.yaml`;\n\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${versionSpec}`)} ${chalk.gray(\n `(version ${version})`\n )} → ${chalk.gray(displayPath)}`\n )\n );\n }\n }\n\n if (result.pushed.length > 0) {\n for (const { name, version } of result.pushed) {\n const localPath = `./prompts/${name}.prompt.yaml`;\n console.log(\n chalk.green(\n `✓ Pushed ${chalk.cyan(name)} ${chalk.gray(\n `(version ${version})`\n )} from ${chalk.gray(localPath)}`\n )\n );\n }\n }\n\n // Print cleaned up files\n if (result.cleaned.length > 0) {\n for (const name of result.cleaned) {\n console.log(\n chalk.yellow(\n `✓ Cleaned ${chalk.cyan(name)} (no longer in dependencies)`\n )\n );\n }\n }\n\n // Print errors\n if (result.errors.length > 0) {\n for (const { name, error } of result.errors) {\n console.log(chalk.red(`✗ Failed ${chalk.cyan(name)}: ${error}`));\n }\n }\n\n // Print summary\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n const totalActions =\n result.fetched.length + result.pushed.length + result.cleaned.length;\n\n if (totalActions === 0 && result.errors.length === 0) {\n console.log(chalk.gray(`Synced in ${duration}s, no changes`));\n } else {\n const summary = [];\n if (result.fetched.length > 0)\n summary.push(`${result.fetched.length} fetched`);\n if (result.pushed.length > 0)\n summary.push(`${result.pushed.length} pushed`);\n if (result.cleaned.length > 0)\n summary.push(`${result.cleaned.length} cleaned`);\n if (result.errors.length > 0)\n summary.push(`${result.errors.length} errors`);\n\n console.log(chalk.gray(`Synced ${summary.join(\", \")} in ${duration}s`));\n }\n\n if (result.errors.length > 0) {\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"]}
@@ -1,4 +1,5 @@
1
1
  import { SpanOptions, Span, AttributeValue, Tracer, Context } from '@opentelemetry/api';
2
+ import { z } from 'zod';
2
3
  import { S as SemConvAttributes } from './types-DRiQaKFG.js';
3
4
 
4
5
  type ChatRole = "system" | "user" | "assistant" | "function" | "tool" | "unknown";
@@ -2700,37 +2701,102 @@ interface operations {
2700
2701
  };
2701
2702
  }
2702
2703
 
2703
- type PromptResponse = NonNullable<paths["/api/prompts/{id}"]["get"]["responses"]["200"]["content"]["application/json"]>;
2704
+ /**
2705
+ * Zod schema for core prompt data - the essential fields needed for functionality
2706
+ */
2707
+ declare const corePromptDataSchema: z.ZodObject<{
2708
+ model: z.ZodString;
2709
+ messages: z.ZodArray<z.ZodObject<{
2710
+ role: z.ZodEnum<{
2711
+ system: "system";
2712
+ user: "user";
2713
+ assistant: "assistant";
2714
+ }>;
2715
+ content: z.ZodString;
2716
+ }, z.core.$strip>>;
2717
+ prompt: z.ZodOptional<z.ZodString>;
2718
+ temperature: z.ZodOptional<z.ZodNumber>;
2719
+ maxTokens: z.ZodOptional<z.ZodNumber>;
2720
+ responseFormat: z.ZodOptional<z.ZodObject<{
2721
+ type: z.ZodLiteral<"json_schema">;
2722
+ json_schema: z.ZodNullable<z.ZodObject<{
2723
+ name: z.ZodString;
2724
+ schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
2725
+ }, z.core.$strip>>;
2726
+ }, z.core.$strip>>;
2727
+ }, z.core.$strip>;
2728
+ /**
2729
+ * Combined schema for complete prompt data
2730
+ */
2731
+ declare const promptDataSchema: z.ZodObject<{
2732
+ id: z.ZodOptional<z.ZodString>;
2733
+ handle: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2734
+ version: z.ZodOptional<z.ZodNumber>;
2735
+ versionId: z.ZodOptional<z.ZodString>;
2736
+ scope: z.ZodOptional<z.ZodEnum<{
2737
+ ORGANIZATION: "ORGANIZATION";
2738
+ PROJECT: "PROJECT";
2739
+ }>>;
2740
+ model: z.ZodString;
2741
+ messages: z.ZodArray<z.ZodObject<{
2742
+ role: z.ZodEnum<{
2743
+ system: "system";
2744
+ user: "user";
2745
+ assistant: "assistant";
2746
+ }>;
2747
+ content: z.ZodString;
2748
+ }, z.core.$strip>>;
2749
+ prompt: z.ZodOptional<z.ZodString>;
2750
+ temperature: z.ZodOptional<z.ZodNumber>;
2751
+ maxTokens: z.ZodOptional<z.ZodNumber>;
2752
+ responseFormat: z.ZodOptional<z.ZodObject<{
2753
+ type: z.ZodLiteral<"json_schema">;
2754
+ json_schema: z.ZodNullable<z.ZodObject<{
2755
+ name: z.ZodString;
2756
+ schema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
2757
+ }, z.core.$strip>>;
2758
+ }, z.core.$strip>>;
2759
+ }, z.core.$strip>;
2760
+
2761
+ /**
2762
+ * Type for template variables - supporting common data types
2763
+ */
2704
2764
  type TemplateVariables = Record<string, string | number | boolean | object | null>;
2765
+ /**
2766
+ * Core data needed for prompt functionality
2767
+ */
2768
+ type CorePromptData = z.infer<typeof corePromptDataSchema>;
2769
+ /**
2770
+ * Combined type for creating prompts
2771
+ */
2772
+ type PromptData = z.infer<typeof promptDataSchema>;
2773
+ type CreatePromptBody = NonNullable<paths["/api/prompts"]["post"]["requestBody"]>["content"]["application/json"];
2774
+ type UpdatePromptBody = NonNullable<paths["/api/prompts/{id}"]["put"]["requestBody"]>["content"]["application/json"];
2775
+ type PromptResponse = NonNullable<paths["/api/prompts/{id}"]["get"]["responses"]["200"]["content"]["application/json"]>;
2776
+ type PromptScope = paths["/api/prompts"]["post"]["responses"]["200"]["content"]["application/json"]["scope"];
2777
+
2705
2778
  /**
2706
2779
  * The Prompt class provides a standardized interface for working with prompt objects
2707
- * within the SDK, ensuring consistent structure and behavior regardless of the underlying
2708
- * client implementation. This abstraction enables the SDK to maintain control over prompt
2709
- * handling, enforce type safety, and facilitate future enhancements without exposing
2710
- * internal details or requiring changes from client code.
2780
+ * within the SDK, focusing on core functionality needed for template compilation and execution.
2781
+ * Keeps only essential fields while maintaining compatibility with tracing and observability.
2711
2782
  */
2712
- declare class Prompt implements PromptResponse {
2713
- readonly raw: PromptResponse;
2714
- readonly id: PromptResponse["id"];
2715
- readonly handle: PromptResponse["handle"];
2716
- readonly name: PromptResponse["name"];
2717
- readonly scope: PromptResponse["scope"];
2718
- readonly projectId: PromptResponse["projectId"];
2719
- readonly organizationId: PromptResponse["organizationId"];
2720
- readonly authorId: PromptResponse["authorId"];
2721
- readonly createdAt: PromptResponse["createdAt"];
2722
- readonly updatedAt: PromptResponse["updatedAt"];
2723
- readonly version: PromptResponse["version"];
2724
- readonly versionId: PromptResponse["versionId"];
2725
- readonly model: PromptResponse["model"];
2726
- readonly temperature: PromptResponse["temperature"];
2727
- readonly maxTokens: PromptResponse["maxTokens"];
2728
- readonly responseFormat: PromptResponse["responseFormat"];
2729
- readonly prompt: PromptResponse["prompt"];
2730
- readonly messages: PromptResponse["messages"];
2731
- readonly inputs: PromptResponse["inputs"];
2732
- readonly outputs: PromptResponse["outputs"];
2733
- constructor(raw: PromptResponse);
2783
+ declare class Prompt {
2784
+ readonly model: string;
2785
+ readonly messages: Array<{
2786
+ role: "user" | "assistant" | "system";
2787
+ content: string;
2788
+ }>;
2789
+ readonly prompt?: string;
2790
+ readonly temperature?: number;
2791
+ readonly maxTokens?: number;
2792
+ readonly responseFormat?: CorePromptData["responseFormat"];
2793
+ readonly id?: string;
2794
+ readonly handle?: string | null;
2795
+ readonly version?: number;
2796
+ readonly versionId?: string;
2797
+ readonly scope?: PromptScope;
2798
+ constructor(data: PromptData);
2799
+ private extractSystemPrompt;
2734
2800
  /**
2735
2801
  * Compile the prompt template with provided variables (lenient - missing variables become empty)
2736
2802
  * @param variables - Object containing variable values for template compilation
@@ -2745,9 +2811,12 @@ declare class Prompt implements PromptResponse {
2745
2811
  */
2746
2812
  compileStrict(variables: TemplateVariables): CompiledPrompt;
2747
2813
  }
2814
+ /**
2815
+ * Represents a compiled prompt that extends Prompt with reference to the original template
2816
+ */
2748
2817
  declare class CompiledPrompt extends Prompt {
2749
2818
  readonly original: Prompt;
2750
- constructor(compiledData: PromptResponse, original: Prompt);
2819
+ constructor(compiledData: PromptData, original: Prompt);
2751
2820
  }
2752
2821
 
2753
2822
  /**
@@ -3263,4 +3332,4 @@ interface LangWatchTracer extends Tracer {
3263
3332
  withActiveSpan<F extends (span: LangWatchSpan) => unknown>(name: string, options: LangWatchSpanOptions, context: Context, fn: F): ReturnType<F>;
3264
3333
  }
3265
3334
 
3266
- export { type ChatMessage as C, type InputOutputType as I, type JsonSerializable as J, type LangWatchSpan as L, type PromptResponse as P, type SpanType as S, type LangWatchTracer as a, type LangWatchSpanMetrics as b, type LangWatchSpanRAGContext as c, type LangWatchSpanOptions as d, type SimpleChatMessage as e, INPUT_OUTPUT_TYPES as f, Prompt as g, type paths as p, spanTypes as s };
3335
+ export { type ChatMessage as C, type InputOutputType as I, type JsonSerializable as J, type LangWatchSpan as L, type PromptResponse as P, type SpanType as S, type UpdatePromptBody as U, type LangWatchTracer as a, type LangWatchSpanMetrics as b, type LangWatchSpanRAGContext as c, type LangWatchSpanOptions as d, type SimpleChatMessage as e, INPUT_OUTPUT_TYPES as f, type CreatePromptBody as g, type PromptData as h, Prompt as i, type paths as p, spanTypes as s };