langwatch 0.4.2 → 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 (128) hide show
  1. package/README.md +19 -0
  2. package/dist/{add-SV662KZU.js → add-CGTO6GC2.js} +65 -40
  3. package/dist/add-CGTO6GC2.js.map +1 -0
  4. package/dist/{add-SMYALCQG.mjs → add-XCI65PVN.mjs} +53 -28
  5. package/dist/add-XCI65PVN.mjs.map +1 -0
  6. package/dist/{chunk-NVKMXXNP.js → chunk-2GYC6KEA.js} +32 -32
  7. package/dist/{chunk-NVKMXXNP.js.map → chunk-2GYC6KEA.js.map} +1 -1
  8. package/dist/{chunk-P5F63PAW.js → chunk-36XAYVMC.js} +186 -76
  9. package/dist/chunk-36XAYVMC.js.map +1 -0
  10. package/dist/{chunk-ENSRDEDA.mjs → chunk-3P4ROGZJ.mjs} +4 -4
  11. package/dist/{chunk-K4ICRI7W.mjs → chunk-AD7QRYIJ.mjs} +2 -2
  12. package/dist/{chunk-I5NDMIK5.js → chunk-AZHZ4NB4.js} +1 -1
  13. package/dist/{chunk-I5NDMIK5.js.map → chunk-AZHZ4NB4.js.map} +1 -1
  14. package/dist/{chunk-YQVVPMKH.mjs → chunk-BTBSMJTY.mjs} +1 -1
  15. package/dist/chunk-BTBSMJTY.mjs.map +1 -0
  16. package/dist/{chunk-DISMHYXC.js → chunk-CKIZDPIJ.js} +24 -22
  17. package/dist/chunk-CKIZDPIJ.js.map +1 -0
  18. package/dist/{chunk-ZZLIF3DE.js → chunk-DZH6SY3Z.js} +10 -10
  19. package/dist/{chunk-ZZLIF3DE.js.map → chunk-DZH6SY3Z.js.map} +1 -1
  20. package/dist/{chunk-N2V6J3U2.mjs → chunk-FEL5FLHA.mjs} +2 -2
  21. package/dist/{chunk-5ZKAT4KI.mjs → chunk-GAFUPYJ3.mjs} +336 -162
  22. package/dist/chunk-GAFUPYJ3.mjs.map +1 -0
  23. package/dist/{chunk-NFM6RB4R.js → chunk-HVW45GST.js} +347 -173
  24. package/dist/chunk-HVW45GST.js.map +1 -0
  25. package/dist/{chunk-YNQ44U6D.mjs → chunk-I2SOBPAF.mjs} +23 -21
  26. package/dist/chunk-I2SOBPAF.mjs.map +1 -0
  27. package/dist/{chunk-ILTCLEIF.js → chunk-J7B7BNDN.js} +17 -17
  28. package/dist/chunk-J7B7BNDN.js.map +1 -0
  29. package/dist/{chunk-VILW5FYO.mjs → chunk-JPWKINZP.mjs} +8 -8
  30. package/dist/{chunk-VILW5FYO.mjs.map → chunk-JPWKINZP.mjs.map} +1 -1
  31. package/dist/{chunk-OXBO24RB.js → chunk-OHM7JUMR.js} +15 -2
  32. package/dist/chunk-OHM7JUMR.js.map +1 -0
  33. package/dist/chunk-PYVDTUA6.mjs +352 -0
  34. package/dist/chunk-PYVDTUA6.mjs.map +1 -0
  35. package/dist/{chunk-YH5TIVK2.js → chunk-SNDTNU3T.js} +2 -2
  36. package/dist/{chunk-YH5TIVK2.js.map → chunk-SNDTNU3T.js.map} +1 -1
  37. package/dist/{chunk-CU3443HD.mjs → chunk-URTD2WOC.mjs} +14 -1
  38. package/dist/{chunk-CAVBDSBT.mjs → chunk-WOBPYIKO.mjs} +2 -2
  39. package/dist/chunk-WOBPYIKO.mjs.map +1 -0
  40. package/dist/{chunk-VI5NJ53L.js → chunk-Z3NTWVVA.js} +2 -2
  41. package/dist/chunk-Z3NTWVVA.js.map +1 -0
  42. package/dist/cli/index.js +10 -10
  43. package/dist/cli/index.mjs +9 -9
  44. package/dist/{create-BHWZP6YD.mjs → create-LXQB4EFB.mjs} +22 -12
  45. package/dist/create-LXQB4EFB.mjs.map +1 -0
  46. package/dist/{create-GUY3HZM2.js → create-S5RDGF3H.js} +27 -17
  47. package/dist/create-S5RDGF3H.js.map +1 -0
  48. package/dist/{implementation--7B7PUww.d.ts → implementation-DsHp9FYU.d.ts} +1 -1
  49. package/dist/{implementation-D7LzdQop.d.mts → implementation-nE9dgTwc.d.mts} +1 -1
  50. package/dist/{index-DTEZr0Jn.d.mts → index-D7rKIGrO.d.mts} +12 -12
  51. package/dist/{index-DTEZr0Jn.d.ts → index-D7rKIGrO.d.ts} +12 -12
  52. package/dist/index.d.mts +256 -11
  53. package/dist/index.d.ts +256 -11
  54. package/dist/index.js +135 -12
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs +133 -10
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/init-T4YDPHBA.mjs +15 -0
  59. package/dist/{init-RDW2F4G3.mjs.map → init-T4YDPHBA.mjs.map} +1 -1
  60. package/dist/init-UADBKUJU.js +15 -0
  61. package/dist/init-UADBKUJU.js.map +1 -0
  62. package/dist/{list-GZGLSJ52.js → list-GRKVAGJS.js} +14 -15
  63. package/dist/list-GRKVAGJS.js.map +1 -0
  64. package/dist/{list-32BRZ6RS.mjs → list-XHXVFN24.mjs} +13 -14
  65. package/dist/list-XHXVFN24.mjs.map +1 -0
  66. package/dist/{login-IAP4RFUM.js → login-4GWM5I6F.js} +4 -4
  67. package/dist/{login-IAP4RFUM.js.map → login-4GWM5I6F.js.map} +1 -1
  68. package/dist/{login-VXLW2OXR.mjs → login-EKE7SFN3.mjs} +3 -3
  69. package/dist/observability-sdk/index.d.mts +4 -3
  70. package/dist/observability-sdk/index.d.ts +4 -3
  71. package/dist/observability-sdk/index.js +7 -7
  72. package/dist/observability-sdk/index.mjs +6 -6
  73. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +2 -1
  74. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +2 -1
  75. package/dist/observability-sdk/instrumentation/langchain/index.js +19 -19
  76. package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -3
  77. package/dist/observability-sdk/setup/node/index.d.mts +2 -2
  78. package/dist/observability-sdk/setup/node/index.d.ts +2 -2
  79. package/dist/observability-sdk/setup/node/index.js +15 -15
  80. package/dist/observability-sdk/setup/node/index.mjs +4 -4
  81. package/dist/{remove-N3324KHS.js → remove-7EXB2Z6R.js} +18 -19
  82. package/dist/remove-7EXB2Z6R.js.map +1 -0
  83. package/dist/{remove-JUVM6M7G.mjs → remove-W44FQ5MF.mjs} +10 -11
  84. package/dist/{remove-JUVM6M7G.mjs.map → remove-W44FQ5MF.mjs.map} +1 -1
  85. package/dist/{sync-E32H3H52.js → sync-V7WRMNJV.js} +41 -40
  86. package/dist/sync-V7WRMNJV.js.map +1 -0
  87. package/dist/{sync-B4YK6QYX.mjs → sync-XGFABFAW.mjs} +28 -27
  88. package/dist/sync-XGFABFAW.mjs.map +1 -0
  89. package/dist/{types-D6Cs1385.d.ts → types-B9772cUR.d.ts} +146 -27
  90. package/dist/{types-D61S7yPU.d.mts → types-DbPAi4US.d.mts} +146 -27
  91. package/package.json +9 -7
  92. package/dist/add-SMYALCQG.mjs.map +0 -1
  93. package/dist/add-SV662KZU.js.map +0 -1
  94. package/dist/chunk-5ZKAT4KI.mjs.map +0 -1
  95. package/dist/chunk-7ZRAJ52N.mjs +0 -242
  96. package/dist/chunk-7ZRAJ52N.mjs.map +0 -1
  97. package/dist/chunk-CAVBDSBT.mjs.map +0 -1
  98. package/dist/chunk-DISMHYXC.js.map +0 -1
  99. package/dist/chunk-ILTCLEIF.js.map +0 -1
  100. package/dist/chunk-LXVDGQA4.mjs +0 -101
  101. package/dist/chunk-LXVDGQA4.mjs.map +0 -1
  102. package/dist/chunk-NFM6RB4R.js.map +0 -1
  103. package/dist/chunk-OXBO24RB.js.map +0 -1
  104. package/dist/chunk-P5F63PAW.js.map +0 -1
  105. package/dist/chunk-PUHM465C.js +0 -101
  106. package/dist/chunk-PUHM465C.js.map +0 -1
  107. package/dist/chunk-RBZNMZTF.mjs +0 -155
  108. package/dist/chunk-RBZNMZTF.mjs.map +0 -1
  109. package/dist/chunk-T7FQHOLK.js +0 -155
  110. package/dist/chunk-T7FQHOLK.js.map +0 -1
  111. package/dist/chunk-VI5NJ53L.js.map +0 -1
  112. package/dist/chunk-YNQ44U6D.mjs.map +0 -1
  113. package/dist/chunk-YQVVPMKH.mjs.map +0 -1
  114. package/dist/create-BHWZP6YD.mjs.map +0 -1
  115. package/dist/create-GUY3HZM2.js.map +0 -1
  116. package/dist/init-OO2BUJ6V.js +0 -16
  117. package/dist/init-OO2BUJ6V.js.map +0 -1
  118. package/dist/init-RDW2F4G3.mjs +0 -16
  119. package/dist/list-32BRZ6RS.mjs.map +0 -1
  120. package/dist/list-GZGLSJ52.js.map +0 -1
  121. package/dist/remove-N3324KHS.js.map +0 -1
  122. package/dist/sync-B4YK6QYX.mjs.map +0 -1
  123. package/dist/sync-E32H3H52.js.map +0 -1
  124. /package/dist/{chunk-ENSRDEDA.mjs.map → chunk-3P4ROGZJ.mjs.map} +0 -0
  125. /package/dist/{chunk-K4ICRI7W.mjs.map → chunk-AD7QRYIJ.mjs.map} +0 -0
  126. /package/dist/{chunk-N2V6J3U2.mjs.map → chunk-FEL5FLHA.mjs.map} +0 -0
  127. /package/dist/{chunk-CU3443HD.mjs.map → chunk-URTD2WOC.mjs.map} +0 -0
  128. /package/dist/{login-VXLW2OXR.mjs.map → login-EKE7SFN3.mjs.map} +0 -0
@@ -2,27 +2,26 @@ import {
2
2
  checkApiKey
3
3
  } from "./chunk-DHJKJVY7.mjs";
4
4
  import {
5
- LangWatch
6
- } from "./chunk-RBZNMZTF.mjs";
7
- import {
5
+ PromptsApiService,
8
6
  PromptsError
9
- } from "./chunk-5ZKAT4KI.mjs";
10
- import "./chunk-N2V6J3U2.mjs";
11
- import "./chunk-VILW5FYO.mjs";
12
- import "./chunk-ENSRDEDA.mjs";
13
- import "./chunk-CAVBDSBT.mjs";
14
- import "./chunk-YNQ44U6D.mjs";
7
+ } from "./chunk-GAFUPYJ3.mjs";
8
+ import "./chunk-FEL5FLHA.mjs";
9
+ import "./chunk-JPWKINZP.mjs";
10
+ import "./chunk-3P4ROGZJ.mjs";
11
+ import "./chunk-WOBPYIKO.mjs";
12
+ import "./chunk-I2SOBPAF.mjs";
15
13
  import {
16
14
  ensureProjectInitialized
17
- } from "./chunk-K4ICRI7W.mjs";
18
- import {
19
- FileManager
20
- } from "./chunk-7ZRAJ52N.mjs";
15
+ } from "./chunk-AD7QRYIJ.mjs";
21
16
  import {
17
+ FileManager,
22
18
  PromptConverter
23
- } from "./chunk-LXVDGQA4.mjs";
24
- import "./chunk-YQVVPMKH.mjs";
25
- import "./chunk-CU3443HD.mjs";
19
+ } from "./chunk-PYVDTUA6.mjs";
20
+ import "./chunk-BTBSMJTY.mjs";
21
+ import {
22
+ __spreadProps,
23
+ __spreadValues
24
+ } from "./chunk-URTD2WOC.mjs";
26
25
 
27
26
  // src/cli/commands/sync.ts
28
27
  import * as fs from "fs";
@@ -33,10 +32,8 @@ import * as yaml from "js-yaml";
33
32
  import readline from "readline";
34
33
  var handleConflict = async (promptName, conflictInfo) => {
35
34
  console.log(
36
- chalk.yellow(
37
- `
38
- \u26A0 Conflict detected for prompt: ${chalk.cyan(promptName)}`
39
- )
35
+ chalk.yellow(`
36
+ \u26A0 Conflict detected for prompt: ${chalk.cyan(promptName)}`)
40
37
  );
41
38
  console.log(
42
39
  chalk.gray(
@@ -77,7 +74,7 @@ var syncCommand = async () => {
77
74
  const startTime = Date.now();
78
75
  try {
79
76
  checkApiKey();
80
- const langwatch = new LangWatch();
77
+ const promptsApiService = new PromptsApiService();
81
78
  await ensureProjectInitialized(false);
82
79
  const config = FileManager.loadPromptsConfig();
83
80
  const lock = FileManager.loadPromptsLock();
@@ -107,7 +104,7 @@ var syncCommand = async () => {
107
104
  try {
108
105
  const versionSpec = typeof dependency === "string" ? dependency : (_a = dependency.version) != null ? _a : "latest";
109
106
  const lockEntry = lock.prompts[name];
110
- const prompt = await langwatch.prompts.get(name);
107
+ const prompt = await promptsApiService.get(name);
111
108
  if (prompt) {
112
109
  const needsUpdate = !lockEntry || lockEntry.version !== prompt.version || !lockEntry.materialized || !fs.existsSync(path.resolve(lockEntry.materialized));
113
110
  if (needsUpdate) {
@@ -171,7 +168,7 @@ var syncCommand = async () => {
171
168
  inputs: [{ identifier: "input", type: "str" }],
172
169
  outputs: [{ identifier: "output", type: "str" }]
173
170
  };
174
- const syncResult = await langwatch.prompts.sync({
171
+ const syncResult = await promptsApiService.sync({
175
172
  name: promptName,
176
173
  configData,
177
174
  localVersion: currentVersion,
@@ -232,10 +229,14 @@ var syncCommand = async () => {
232
229
  materialized: filePath
233
230
  };
234
231
  } else {
232
+ const syncResult2 = await promptsApiService.update(promptName, __spreadProps(__spreadValues({}, localConfig), {
233
+ commitMessage: `Synced from local file: ${path.basename(
234
+ filePath
235
+ )}`
236
+ }));
235
237
  lock.prompts[promptName] = {
236
- version: remoteVersion + 1,
237
- versionId: "conflict_resolved",
238
- // Temporary until we get actual versionId
238
+ version: syncResult2.version,
239
+ versionId: syncResult2.versionId,
239
240
  materialized: filePath
240
241
  };
241
242
  }
@@ -410,4 +411,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
410
411
  export {
411
412
  syncCommand
412
413
  };
413
- //# sourceMappingURL=sync-B4YK6QYX.mjs.map
414
+ //# sourceMappingURL=sync-XGFABFAW.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"]}
@@ -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";
@@ -2303,7 +2304,7 @@ interface operations {
2303
2304
  type: "SCENARIO_MESSAGE_SNAPSHOT";
2304
2305
  timestamp: number;
2305
2306
  rawEvent?: unknown;
2306
- messages: ({
2307
+ messages: ((({
2307
2308
  id: string;
2308
2309
  /** @constant */
2309
2310
  role: "developer";
@@ -2342,6 +2343,51 @@ interface operations {
2342
2343
  /** @constant */
2343
2344
  role: "tool";
2344
2345
  toolCallId: string;
2346
+ }) | {
2347
+ role?: "system" | "user" | "assistant" | "function" | "tool" | "unknown";
2348
+ content?: string | ({
2349
+ /** @constant */
2350
+ type: "text";
2351
+ text?: string;
2352
+ } | {
2353
+ text: string;
2354
+ } | {
2355
+ /** @constant */
2356
+ type: "image_url";
2357
+ image_url?: {
2358
+ url: string;
2359
+ detail?: "auto" | "low" | "high";
2360
+ };
2361
+ } | {
2362
+ /** @constant */
2363
+ type: "tool_call";
2364
+ toolName?: string;
2365
+ toolCallId?: string;
2366
+ args?: string;
2367
+ } | {
2368
+ /** @constant */
2369
+ type: "tool_result";
2370
+ toolName?: string;
2371
+ toolCallId?: string;
2372
+ result?: unknown;
2373
+ })[] | null;
2374
+ function_call?: {
2375
+ name?: string;
2376
+ arguments?: string;
2377
+ } | null;
2378
+ tool_calls?: {
2379
+ id: string;
2380
+ type: string;
2381
+ function: {
2382
+ name?: string;
2383
+ arguments?: string;
2384
+ };
2385
+ }[] | null;
2386
+ tool_call_id?: string | null;
2387
+ name?: string | null;
2388
+ }) & {
2389
+ id?: string;
2390
+ trace_id?: string;
2345
2391
  })[];
2346
2392
  batchRunId: string;
2347
2393
  scenarioId: string;
@@ -2655,32 +2701,102 @@ interface operations {
2655
2701
  };
2656
2702
  }
2657
2703
 
2658
- 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
+ */
2659
2764
  type TemplateVariables = Record<string, string | number | boolean | object | null>;
2660
- declare class Prompt implements PromptResponse {
2661
- private readonly promptData;
2662
- readonly id: string;
2663
- readonly projectId: string;
2664
- readonly organizationId: string;
2665
- readonly handle: string | null;
2666
- readonly scope: "ORGANIZATION" | "PROJECT";
2667
- readonly name: string;
2668
- readonly updatedAt: string;
2669
- readonly version: number;
2670
- readonly versionId: string;
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
+
2778
+ /**
2779
+ * The Prompt class provides a standardized interface for working with prompt objects
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.
2782
+ */
2783
+ declare class Prompt {
2671
2784
  readonly model: string;
2672
- readonly prompt: string;
2673
- readonly messages: PromptResponse["messages"];
2674
- readonly responseFormat: PromptResponse["responseFormat"];
2675
- readonly authorId: string | null;
2676
- readonly createdAt: string;
2677
- readonly inputs: PromptResponse["inputs"];
2678
- readonly outputs: PromptResponse["outputs"];
2679
- constructor(promptData: PromptResponse);
2680
- /**
2681
- * Get the raw prompt data from the API
2682
- */
2683
- get raw(): PromptResponse;
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;
2684
2800
  /**
2685
2801
  * Compile the prompt template with provided variables (lenient - missing variables become empty)
2686
2802
  * @param variables - Object containing variable values for template compilation
@@ -2695,9 +2811,12 @@ declare class Prompt implements PromptResponse {
2695
2811
  */
2696
2812
  compileStrict(variables: TemplateVariables): CompiledPrompt;
2697
2813
  }
2814
+ /**
2815
+ * Represents a compiled prompt that extends Prompt with reference to the original template
2816
+ */
2698
2817
  declare class CompiledPrompt extends Prompt {
2699
2818
  readonly original: Prompt;
2700
- constructor(compiledData: PromptResponse, original: Prompt);
2819
+ constructor(compiledData: PromptData, original: Prompt);
2701
2820
  }
2702
2821
 
2703
2822
  /**
@@ -3213,4 +3332,4 @@ interface LangWatchTracer extends Tracer {
3213
3332
  withActiveSpan<F extends (span: LangWatchSpan) => unknown>(name: string, options: LangWatchSpanOptions, context: Context, fn: F): ReturnType<F>;
3214
3333
  }
3215
3334
 
3216
- 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 };
@@ -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.mjs';
3
4
 
4
5
  type ChatRole = "system" | "user" | "assistant" | "function" | "tool" | "unknown";
@@ -2303,7 +2304,7 @@ interface operations {
2303
2304
  type: "SCENARIO_MESSAGE_SNAPSHOT";
2304
2305
  timestamp: number;
2305
2306
  rawEvent?: unknown;
2306
- messages: ({
2307
+ messages: ((({
2307
2308
  id: string;
2308
2309
  /** @constant */
2309
2310
  role: "developer";
@@ -2342,6 +2343,51 @@ interface operations {
2342
2343
  /** @constant */
2343
2344
  role: "tool";
2344
2345
  toolCallId: string;
2346
+ }) | {
2347
+ role?: "system" | "user" | "assistant" | "function" | "tool" | "unknown";
2348
+ content?: string | ({
2349
+ /** @constant */
2350
+ type: "text";
2351
+ text?: string;
2352
+ } | {
2353
+ text: string;
2354
+ } | {
2355
+ /** @constant */
2356
+ type: "image_url";
2357
+ image_url?: {
2358
+ url: string;
2359
+ detail?: "auto" | "low" | "high";
2360
+ };
2361
+ } | {
2362
+ /** @constant */
2363
+ type: "tool_call";
2364
+ toolName?: string;
2365
+ toolCallId?: string;
2366
+ args?: string;
2367
+ } | {
2368
+ /** @constant */
2369
+ type: "tool_result";
2370
+ toolName?: string;
2371
+ toolCallId?: string;
2372
+ result?: unknown;
2373
+ })[] | null;
2374
+ function_call?: {
2375
+ name?: string;
2376
+ arguments?: string;
2377
+ } | null;
2378
+ tool_calls?: {
2379
+ id: string;
2380
+ type: string;
2381
+ function: {
2382
+ name?: string;
2383
+ arguments?: string;
2384
+ };
2385
+ }[] | null;
2386
+ tool_call_id?: string | null;
2387
+ name?: string | null;
2388
+ }) & {
2389
+ id?: string;
2390
+ trace_id?: string;
2345
2391
  })[];
2346
2392
  batchRunId: string;
2347
2393
  scenarioId: string;
@@ -2655,32 +2701,102 @@ interface operations {
2655
2701
  };
2656
2702
  }
2657
2703
 
2658
- 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
+ */
2659
2764
  type TemplateVariables = Record<string, string | number | boolean | object | null>;
2660
- declare class Prompt implements PromptResponse {
2661
- private readonly promptData;
2662
- readonly id: string;
2663
- readonly projectId: string;
2664
- readonly organizationId: string;
2665
- readonly handle: string | null;
2666
- readonly scope: "ORGANIZATION" | "PROJECT";
2667
- readonly name: string;
2668
- readonly updatedAt: string;
2669
- readonly version: number;
2670
- readonly versionId: string;
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
+
2778
+ /**
2779
+ * The Prompt class provides a standardized interface for working with prompt objects
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.
2782
+ */
2783
+ declare class Prompt {
2671
2784
  readonly model: string;
2672
- readonly prompt: string;
2673
- readonly messages: PromptResponse["messages"];
2674
- readonly responseFormat: PromptResponse["responseFormat"];
2675
- readonly authorId: string | null;
2676
- readonly createdAt: string;
2677
- readonly inputs: PromptResponse["inputs"];
2678
- readonly outputs: PromptResponse["outputs"];
2679
- constructor(promptData: PromptResponse);
2680
- /**
2681
- * Get the raw prompt data from the API
2682
- */
2683
- get raw(): PromptResponse;
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;
2684
2800
  /**
2685
2801
  * Compile the prompt template with provided variables (lenient - missing variables become empty)
2686
2802
  * @param variables - Object containing variable values for template compilation
@@ -2695,9 +2811,12 @@ declare class Prompt implements PromptResponse {
2695
2811
  */
2696
2812
  compileStrict(variables: TemplateVariables): CompiledPrompt;
2697
2813
  }
2814
+ /**
2815
+ * Represents a compiled prompt that extends Prompt with reference to the original template
2816
+ */
2698
2817
  declare class CompiledPrompt extends Prompt {
2699
2818
  readonly original: Prompt;
2700
- constructor(compiledData: PromptResponse, original: Prompt);
2819
+ constructor(compiledData: PromptData, original: Prompt);
2701
2820
  }
2702
2821
 
2703
2822
  /**
@@ -3213,4 +3332,4 @@ interface LangWatchTracer extends Tracer {
3213
3332
  withActiveSpan<F extends (span: LangWatchSpan) => unknown>(name: string, options: LangWatchSpanOptions, context: Context, fn: F): ReturnType<F>;
3214
3333
  }
3215
3334
 
3216
- 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "langwatch",
3
- "version": "0.4.2",
3
+ "version": "0.6.0",
4
4
  "description": "LangWatch TypeScript/JavaScript SDK. Interact with the full LangWatch API and use the LangWatch OpenTelemetry SDK to instrument your application. For more information, see https://docs.langwatch.ai/integration/typescript/guide",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -68,7 +68,9 @@
68
68
  "tsup": "^8.5.0",
69
69
  "typescript": "^5.9.2",
70
70
  "typescript-eslint": "^8.38.0",
71
- "vitest": "^3.2.4"
71
+ "vitest": "^3.2.4",
72
+ "vitest-mock-extended": "^3.1.0",
73
+ "yaml": "^2.8.1"
72
74
  },
73
75
  "dependencies": {
74
76
  "@opentelemetry/api": "^1.9.0",
@@ -100,20 +102,20 @@
100
102
  "@langchain/core": ">=0.3.0 <1.0.0",
101
103
  "@langchain/langgraph": ">=0.4.0 <1.0.0",
102
104
  "@langchain/openai": ">=0.6.0 <1.0.0",
103
- "langchain": ">=0.3.0 <1.0.0",
104
105
  "@opentelemetry/context-async-hooks": ">=1.19.0 <3.0.0",
105
106
  "@opentelemetry/context-zone": ">=1.19.0 <3.0.0",
106
107
  "@opentelemetry/sdk-node": ">=0.200.0 <1.0.0",
107
- "@opentelemetry/sdk-trace-web": ">=1.19.0 <3.0.0"
108
+ "@opentelemetry/sdk-trace-web": ">=1.19.0 <3.0.0",
109
+ "langchain": ">=0.3.0 <1.0.0"
108
110
  },
109
111
  "scripts": {
110
112
  "cli": "node dist/cli/index.js",
111
113
  "lint": "eslint .",
112
114
  "test": "vitest",
113
115
  "test:e2e": "vitest run -c ./vitest.e2e.config.mts",
114
- "prebuild": "pnpm run prepare",
115
- "build": "tsgo --noEmit && tsup",
116
- "typecheck": "tsgo --noEmit",
116
+ "prebuild": "pnpm i && pnpm run prepare",
117
+ "build": "tsc --noEmit && tsup",
118
+ "typecheck": "tsc --noEmit",
117
119
  "prepublish": "pnpm run build",
118
120
  "generate:openapi-types": "npx openapi-typescript ../langwatch/src/app/api/openapiLangWatch.json -o ./src/internal/generated/openapi/api-client.ts",
119
121
  "generate:server-types": "./copy-types.sh"