langwatch 0.4.1 → 0.5.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 (108) hide show
  1. package/dist/{add-RGWB3264.js → add-4WXEWG5H.js} +63 -34
  2. package/dist/add-4WXEWG5H.js.map +1 -0
  3. package/dist/{add-WLUMK5VQ.mjs → add-D2WVVKIP.mjs} +48 -19
  4. package/dist/add-D2WVVKIP.mjs.map +1 -0
  5. package/dist/{chunk-K64Y6YUG.js → chunk-7OZKH5K2.js} +59 -19
  6. package/dist/chunk-7OZKH5K2.js.map +1 -0
  7. package/dist/{chunk-HA3LI5IK.js → chunk-AZHZ4NB4.js} +1 -1
  8. package/dist/{chunk-HA3LI5IK.js.map → chunk-AZHZ4NB4.js.map} +1 -1
  9. package/dist/{chunk-4NRLVT2U.mjs → chunk-BTBSMJTY.mjs} +1 -1
  10. package/dist/chunk-BTBSMJTY.mjs.map +1 -0
  11. package/dist/{chunk-D2CSG4SJ.js → chunk-CAZONSXV.js} +5 -5
  12. package/dist/{chunk-D2CSG4SJ.js.map → chunk-CAZONSXV.js.map} +1 -1
  13. package/dist/{chunk-HUI45ULC.mjs → chunk-CKVDNVFL.mjs} +3 -3
  14. package/dist/{chunk-ECUXLXFT.mjs → chunk-DLJO7AK5.mjs} +53 -13
  15. package/dist/chunk-DLJO7AK5.mjs.map +1 -0
  16. package/dist/{chunk-AZELEDOV.js → chunk-DSIQSULK.js} +15 -18
  17. package/dist/chunk-DSIQSULK.js.map +1 -0
  18. package/dist/{chunk-M4VUHTT2.js → chunk-ECOC36EA.js} +11 -11
  19. package/dist/chunk-ECOC36EA.js.map +1 -0
  20. package/dist/{chunk-IZ2U3ABC.mjs → chunk-H5PON53W.mjs} +67 -127
  21. package/dist/chunk-H5PON53W.mjs.map +1 -0
  22. package/dist/{chunk-4TF2O2TH.js → chunk-P4SQTYGN.js} +14 -14
  23. package/dist/{chunk-4TF2O2TH.js.map → chunk-P4SQTYGN.js.map} +1 -1
  24. package/dist/{chunk-DEVJ7BPE.js → chunk-QCYYSMCU.js} +2 -2
  25. package/dist/chunk-QCYYSMCU.js.map +1 -0
  26. package/dist/{chunk-EJWJXTPU.mjs → chunk-QZGTM76F.mjs} +8 -8
  27. package/dist/chunk-QZGTM76F.mjs.map +1 -0
  28. package/dist/{chunk-SGNJDRCT.js → chunk-R6FBJN7K.js} +22 -7
  29. package/dist/chunk-R6FBJN7K.js.map +1 -0
  30. package/dist/{chunk-5N5BUR2Z.js → chunk-SVXNUWZI.js} +68 -128
  31. package/dist/chunk-SVXNUWZI.js.map +1 -0
  32. package/dist/{chunk-SYMZPWZE.mjs → chunk-V5M3HUBV.mjs} +22 -7
  33. package/dist/chunk-V5M3HUBV.mjs.map +1 -0
  34. package/dist/{chunk-4ILMGMAP.mjs → chunk-YEGQXDTE.mjs} +5 -8
  35. package/dist/{chunk-4ILMGMAP.mjs.map → chunk-YEGQXDTE.mjs.map} +1 -1
  36. package/dist/{chunk-FQSWUK5N.mjs → chunk-YKFTFYKK.mjs} +2 -2
  37. package/dist/chunk-YKFTFYKK.mjs.map +1 -0
  38. package/dist/{chunk-ZJZ3MIWE.mjs → chunk-ZIULPOMQ.mjs} +2 -2
  39. package/dist/cli/index.js +9 -9
  40. package/dist/cli/index.mjs +8 -8
  41. package/dist/{create-7K2CC4KQ.js → create-4LG4N2A4.js} +27 -16
  42. package/dist/create-4LG4N2A4.js.map +1 -0
  43. package/dist/{create-MK7NEGCM.mjs → create-OQEMO4MU.mjs} +22 -11
  44. package/dist/create-OQEMO4MU.mjs.map +1 -0
  45. package/dist/{implementation-CzemP9jY.d.ts → implementation-BIlL6-SW.d.ts} +1 -1
  46. package/dist/{implementation-C4lvooSg.d.mts → implementation-fAgqv8OM.d.mts} +1 -1
  47. package/dist/index.d.mts +2 -2
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +7 -7
  50. package/dist/index.mjs +6 -6
  51. package/dist/init-EKNL2SQE.js +16 -0
  52. package/dist/{init-GDKJICSS.js.map → init-EKNL2SQE.js.map} +1 -1
  53. package/dist/{init-RINSTP4L.mjs → init-MQXXHCNT.mjs} +5 -5
  54. package/dist/{list-DBUK47MA.js → list-GIAXAAH5.js} +10 -10
  55. package/dist/list-GIAXAAH5.js.map +1 -0
  56. package/dist/{list-ZOMRKOBV.mjs → list-PFWV7IU6.mjs} +7 -7
  57. package/dist/list-PFWV7IU6.mjs.map +1 -0
  58. package/dist/{login-A7LEPNBR.js → login-3STX2FAO.js} +3 -3
  59. package/dist/{login-A7LEPNBR.js.map → login-3STX2FAO.js.map} +1 -1
  60. package/dist/{login-ULPHWIAX.mjs → login-BYLXS23I.mjs} +2 -2
  61. package/dist/observability-sdk/index.d.mts +3 -3
  62. package/dist/observability-sdk/index.d.ts +3 -3
  63. package/dist/observability-sdk/index.js +4 -4
  64. package/dist/observability-sdk/index.mjs +3 -3
  65. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
  66. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
  67. package/dist/observability-sdk/instrumentation/langchain/index.js +3 -3
  68. package/dist/observability-sdk/instrumentation/langchain/index.mjs +1 -1
  69. package/dist/observability-sdk/setup/node/index.d.mts +1 -1
  70. package/dist/observability-sdk/setup/node/index.d.ts +1 -1
  71. package/dist/observability-sdk/setup/node/index.js +10 -10
  72. package/dist/observability-sdk/setup/node/index.mjs +2 -2
  73. package/dist/{remove-RAJBGHQQ.mjs → remove-FTF3EBYV.mjs} +8 -8
  74. package/dist/{remove-ODTJLFWR.js → remove-U3PILQDV.js} +16 -16
  75. package/dist/{remove-ODTJLFWR.js.map → remove-U3PILQDV.js.map} +1 -1
  76. package/dist/{sync-2IXPWN64.mjs → sync-FOW7DHAH.mjs} +27 -19
  77. package/dist/sync-FOW7DHAH.mjs.map +1 -0
  78. package/dist/{sync-PBOL5ODF.js → sync-T3T22GVZ.js} +45 -37
  79. package/dist/sync-T3T22GVZ.js.map +1 -0
  80. package/dist/{types-C9k5gGhU.d.ts → types-DyUmlaDx.d.ts} +973 -533
  81. package/dist/{types-1q5wIYP5.d.mts → types-jrEEZt9d.d.mts} +973 -533
  82. package/package.json +16 -14
  83. package/dist/add-RGWB3264.js.map +0 -1
  84. package/dist/add-WLUMK5VQ.mjs.map +0 -1
  85. package/dist/chunk-4NRLVT2U.mjs.map +0 -1
  86. package/dist/chunk-5N5BUR2Z.js.map +0 -1
  87. package/dist/chunk-AZELEDOV.js.map +0 -1
  88. package/dist/chunk-DEVJ7BPE.js.map +0 -1
  89. package/dist/chunk-ECUXLXFT.mjs.map +0 -1
  90. package/dist/chunk-EJWJXTPU.mjs.map +0 -1
  91. package/dist/chunk-FQSWUK5N.mjs.map +0 -1
  92. package/dist/chunk-IZ2U3ABC.mjs.map +0 -1
  93. package/dist/chunk-K64Y6YUG.js.map +0 -1
  94. package/dist/chunk-M4VUHTT2.js.map +0 -1
  95. package/dist/chunk-SGNJDRCT.js.map +0 -1
  96. package/dist/chunk-SYMZPWZE.mjs.map +0 -1
  97. package/dist/create-7K2CC4KQ.js.map +0 -1
  98. package/dist/create-MK7NEGCM.mjs.map +0 -1
  99. package/dist/init-GDKJICSS.js +0 -16
  100. package/dist/list-DBUK47MA.js.map +0 -1
  101. package/dist/list-ZOMRKOBV.mjs.map +0 -1
  102. package/dist/sync-2IXPWN64.mjs.map +0 -1
  103. package/dist/sync-PBOL5ODF.js.map +0 -1
  104. /package/dist/{chunk-HUI45ULC.mjs.map → chunk-CKVDNVFL.mjs.map} +0 -0
  105. /package/dist/{chunk-ZJZ3MIWE.mjs.map → chunk-ZIULPOMQ.mjs.map} +0 -0
  106. /package/dist/{init-RINSTP4L.mjs.map → init-MQXXHCNT.mjs.map} +0 -0
  107. /package/dist/{login-ULPHWIAX.mjs.map → login-BYLXS23I.mjs.map} +0 -0
  108. /package/dist/{remove-RAJBGHQQ.mjs.map → remove-FTF3EBYV.mjs.map} +0 -0
@@ -1,16 +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 _chunk5N5BUR2Zjs = require('./chunk-5N5BUR2Z.js');
3
+ var _chunkSVXNUWZIjs = require('./chunk-SVXNUWZI.js');
4
4
  require('./chunk-YH5TIVK2.js');
5
- require('./chunk-M4VUHTT2.js');
6
- require('./chunk-4TF2O2TH.js');
7
- require('./chunk-DEVJ7BPE.js');
5
+ require('./chunk-ECOC36EA.js');
6
+ require('./chunk-P4SQTYGN.js');
7
+ require('./chunk-QCYYSMCU.js');
8
8
  require('./chunk-DISMHYXC.js');
9
9
 
10
10
 
11
- var _chunkD2CSG4SJjs = require('./chunk-D2CSG4SJ.js');
12
- require('./chunk-SGNJDRCT.js');
13
- require('./chunk-HA3LI5IK.js');
11
+ var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
12
+ require('./chunk-R6FBJN7K.js');
13
+ require('./chunk-AZHZ4NB4.js');
14
14
  require('./chunk-OXBO24RB.js');
15
15
 
16
16
  // src/cli/commands/remove.ts
@@ -24,8 +24,8 @@ var removeCommand = async (name) => {
24
24
  console.error(_chalk2.default.red("Error: Prompt name cannot be empty"));
25
25
  process.exit(1);
26
26
  }
27
- const config = _chunkD2CSG4SJjs.FileManager.loadPromptsConfig();
28
- const lock = _chunkD2CSG4SJjs.FileManager.loadPromptsLock();
27
+ const config = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
28
+ const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
29
29
  if (!config.prompts[name]) {
30
30
  console.error(_chalk2.default.red(`Error: Prompt "${name}" not found in dependencies`));
31
31
  console.log(_chalk2.default.gray(`Available prompts: ${Object.keys(config.prompts).join(", ") || "none"}`));
@@ -42,7 +42,7 @@ var removeCommand = async (name) => {
42
42
  } else if (typeof dependency === "object" && dependency.file) {
43
43
  localFilePath = path.resolve(dependency.file);
44
44
  } else {
45
- localFilePath = path.join(_chunkD2CSG4SJjs.FileManager.getPromptsDir(), `${name}.prompt.yaml`);
45
+ localFilePath = path.join(_chunkCAZONSXVjs.FileManager.getPromptsDir(), `${name}.prompt.yaml`);
46
46
  }
47
47
  if (fs.existsSync(localFilePath)) {
48
48
  fs.unlinkSync(localFilePath);
@@ -61,7 +61,7 @@ var removeCommand = async (name) => {
61
61
  if (fs.existsSync(materializedPath)) {
62
62
  fs.unlinkSync(materializedPath);
63
63
  const materializedDir = path.dirname(materializedPath);
64
- const rootMaterializedDir = _chunkD2CSG4SJjs.FileManager.getMaterializedDir();
64
+ const rootMaterializedDir = _chunkCAZONSXVjs.FileManager.getMaterializedDir();
65
65
  let currentDir = materializedDir;
66
66
  while (currentDir !== rootMaterializedDir && currentDir !== path.dirname(currentDir)) {
67
67
  try {
@@ -80,15 +80,15 @@ var removeCommand = async (name) => {
80
80
  }
81
81
  delete config.prompts[name];
82
82
  delete lock.prompts[name];
83
- _chunkD2CSG4SJjs.FileManager.savePromptsConfig(config);
84
- _chunkD2CSG4SJjs.FileManager.savePromptsLock(lock);
83
+ _chunkCAZONSXVjs.FileManager.savePromptsConfig(config);
84
+ _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
85
85
  if (!isLocalPrompt) {
86
86
  spinner.succeed();
87
87
  console.log(_chalk2.default.green(`\u2713 Removed ${_chalk2.default.cyan(name)} from dependencies`));
88
88
  }
89
89
  } catch (error) {
90
90
  spinner.fail();
91
- if (error instanceof _chunk5N5BUR2Zjs.PromptsError) {
91
+ if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
92
92
  console.error(_chalk2.default.red(`Error: ${error.message}`));
93
93
  } else {
94
94
  console.error(_chalk2.default.red(`Error removing prompt: ${error instanceof Error ? error.message : "Unknown error"}`));
@@ -96,7 +96,7 @@ var removeCommand = async (name) => {
96
96
  process.exit(1);
97
97
  }
98
98
  } catch (error) {
99
- if (error instanceof _chunk5N5BUR2Zjs.PromptsError) {
99
+ if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
100
100
  console.error(_chalk2.default.red(`Error: ${error.message}`));
101
101
  } else {
102
102
  console.error(_chalk2.default.red(`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`));
@@ -107,4 +107,4 @@ var removeCommand = async (name) => {
107
107
 
108
108
 
109
109
  exports.removeCommand = removeCommand;
110
- //# sourceMappingURL=remove-ODTJLFWR.js.map
110
+ //# sourceMappingURL=remove-U3PILQDV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-ODTJLFWR.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,+BAA4B;AAC5B;AACA;ACfA,+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;ADboG;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-ODTJLFWR.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"]}
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-U3PILQDV.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,+BAA4B;AAC5B;AACA;ACfA,+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;ADboG;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-U3PILQDV.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"]}
@@ -3,26 +3,29 @@ import {
3
3
  } from "./chunk-DHJKJVY7.mjs";
4
4
  import {
5
5
  LangWatch
6
- } from "./chunk-4ILMGMAP.mjs";
6
+ } from "./chunk-YEGQXDTE.mjs";
7
7
  import {
8
8
  PromptsError
9
- } from "./chunk-IZ2U3ABC.mjs";
9
+ } from "./chunk-H5PON53W.mjs";
10
10
  import "./chunk-N2V6J3U2.mjs";
11
- import "./chunk-EJWJXTPU.mjs";
12
- import "./chunk-ZJZ3MIWE.mjs";
13
- import "./chunk-FQSWUK5N.mjs";
11
+ import "./chunk-QZGTM76F.mjs";
12
+ import "./chunk-ZIULPOMQ.mjs";
13
+ import "./chunk-YKFTFYKK.mjs";
14
14
  import "./chunk-YNQ44U6D.mjs";
15
15
  import {
16
16
  ensureProjectInitialized
17
- } from "./chunk-ECUXLXFT.mjs";
17
+ } from "./chunk-DLJO7AK5.mjs";
18
18
  import {
19
19
  FileManager
20
- } from "./chunk-HUI45ULC.mjs";
20
+ } from "./chunk-CKVDNVFL.mjs";
21
21
  import {
22
22
  PromptConverter
23
- } from "./chunk-SYMZPWZE.mjs";
24
- import "./chunk-4NRLVT2U.mjs";
25
- import "./chunk-CU3443HD.mjs";
23
+ } from "./chunk-V5M3HUBV.mjs";
24
+ import "./chunk-BTBSMJTY.mjs";
25
+ import {
26
+ __spreadProps,
27
+ __spreadValues
28
+ } from "./chunk-CU3443HD.mjs";
26
29
 
27
30
  // src/cli/commands/sync.ts
28
31
  import * as fs from "fs";
@@ -33,10 +36,8 @@ import * as yaml from "js-yaml";
33
36
  import readline from "readline";
34
37
  var handleConflict = async (promptName, conflictInfo) => {
35
38
  console.log(
36
- chalk.yellow(
37
- `
38
- \u26A0 Conflict detected for prompt: ${chalk.cyan(promptName)}`
39
- )
39
+ chalk.yellow(`
40
+ \u26A0 Conflict detected for prompt: ${chalk.cyan(promptName)}`)
40
41
  );
41
42
  console.log(
42
43
  chalk.gray(
@@ -73,6 +74,7 @@ var handleConflict = async (promptName, conflictInfo) => {
73
74
  };
74
75
  var syncCommand = async () => {
75
76
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
77
+ console.log("\u{1F504} Starting sync...");
76
78
  const startTime = Date.now();
77
79
  try {
78
80
  checkApiKey();
@@ -231,10 +233,14 @@ var syncCommand = async () => {
231
233
  materialized: filePath
232
234
  };
233
235
  } else {
236
+ const syncResult2 = await langwatch.prompts.update(promptName, __spreadProps(__spreadValues({}, localConfig), {
237
+ commitMessage: `Synced from local file: ${path.basename(
238
+ filePath
239
+ )}`
240
+ }));
234
241
  lock.prompts[promptName] = {
235
- version: remoteVersion + 1,
236
- versionId: "conflict_resolved",
237
- // Temporary until we get actual versionId
242
+ version: syncResult2.version,
243
+ versionId: syncResult2.versionId,
238
244
  materialized: filePath
239
245
  };
240
246
  }
@@ -353,7 +359,9 @@ Tip: Add these to prompts.json to include them in sync operations.`
353
359
  const localPath = `./prompts/${name}.prompt.yaml`;
354
360
  console.log(
355
361
  chalk.green(
356
- `\u2713 Pushed ${chalk.cyan(name)} ${chalk.gray(`(version ${version})`)} from ${chalk.gray(localPath)}`
362
+ `\u2713 Pushed ${chalk.cyan(name)} ${chalk.gray(
363
+ `(version ${version})`
364
+ )} from ${chalk.gray(localPath)}`
357
365
  )
358
366
  );
359
367
  }
@@ -407,4 +415,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
407
415
  export {
408
416
  syncCommand
409
417
  };
410
- //# sourceMappingURL=sync-2IXPWN64.mjs.map
418
+ //# sourceMappingURL=sync-FOW7DHAH.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 PromptsError,\n type SyncAction,\n} from \"@/client-sdk/services/prompts\";\nimport { LangWatch } from \"@/client-sdk\";\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 LangWatch client\n const langwatch = new LangWatch();\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 langwatch.prompts.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 langwatch.prompts.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 langwatch.prompts.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,OAAO,WAAW;AAClB,OAAO,SAAS;AAChB,YAAY,UAAU;AAYtB,OAAO,cAAc;AAGrB,IAAM,iBAAiB,OACrB,YACA,iBAM0C;AAC1C,UAAQ;AAAA,IACN,MAAM,OAAO;AAAA,uCAAqC,MAAM,KAAK,UAAU,CAAC,EAAE;AAAA,EAC5E;AACA,UAAQ;AAAA,IACN,MAAM;AAAA,MACJ,kBAAkB,aAAa,YAAY,qBAAqB,aAAa,aAAa;AAAA,IAC5F;AAAA,EACF;AAEA,MAAI,aAAa,YAAY,SAAS,GAAG;AACvC,YAAQ,IAAI,MAAM,OAAO,gBAAgB,CAAC;AAC1C,iBAAa,YAAY,QAAQ,CAAC,SAAS;AACzC,cAAQ,IAAI,MAAM,KAAK,YAAO,IAAI,EAAE,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,MAAM,OAAO,YAAY,CAAC;AACtC,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,kCAAkC;AAE9C,QAAM,KAAK,SAAS,gBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,OAAG,SAAS,+BAA+B,CAAC,WAAmB;AAC7D,SAAG,MAAM;AACT,YAAM,SAAS,OAAO,YAAY;AAClC,UAAI,WAAW,OAAO,WAAW,SAAS;AACxC,QAAAA,SAAQ,OAAO;AAAA,MACjB,WAAW,WAAW,OAAO,WAAW,UAAU;AAChD,QAAAA,SAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,QAAAA,SAAQ,OAAO;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,cAAc,YAA2B;AArEtD;AAsEE,UAAQ,IAAI,4BAAqB;AAEjC,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AAEF,gBAAY;AAGZ,UAAM,YAAY,IAAI,UAAU;AAGhC,UAAM,yBAAyB,KAAK;AAGpC,UAAM,SAAS,YAAY,kBAAkB;AAC7C,UAAM,OAAO,YAAY,gBAAgB;AAEzC,UAAM,SAAqB;AAAA,MACzB,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,IACX;AAGA,UAAM,aAAa,OAAO,QAAQ,OAAO,OAAO,EAAE;AAAA,MAChD,CAAC,CAAC,EAAE,UAAU,MAAM;AAElB,YAAI,OAAO,eAAe,YAAY,WAAW,MAAM;AACrD,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,eAAe,YAAY,WAAW,WAAW,OAAO,GAAG;AACpE,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,eAAe;AAAA,QACnB,YAAY,WAAW,MAAM;AAAA,MAC/B,EAAE,MAAM;AAER,iBAAW,CAAC,MAAM,UAAU,KAAK,YAAY;AAC3C,YAAI;AACF,gBAAM,cACJ,OAAO,eAAe,WAClB,cACA,gBAAW,YAAX,YAAsB;AAG5B,gBAAM,YAAY,KAAK,QAAQ,IAAI;AAGnC,gBAAM,SAAS,MAAM,UAAU,QAAQ,IAAI,IAAI;AAE/C,cAAI,QAAQ;AAEV,kBAAM,cACJ,CAAC,aACD,UAAU,YAAY,OAAO,WAC7B,CAAC,UAAU,gBACX,CAAI,cAAgB,aAAQ,UAAU,YAAY,CAAC;AAErD,gBAAI,aAAa;AAEf,oBAAM,qBACJ,gBAAgB,sBAAsB,MAAM;AAE9C,oBAAM,YAAY,YAAY;AAAA,gBAC5B;AAAA,gBACA;AAAA,cACF;AACA,oBAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,SAAS;AAC3D,qBAAO,QAAQ,KAAK;AAAA,gBAClB;AAAA,gBACA,SAAS,OAAO;AAAA,gBAChB;AAAA,cACF,CAAC;AAGD,0BAAY;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAEA,2BAAa,OAAO,WAAW,MAAM;AAAA,gBACnC,GAAG,IAAI,IAAI,WAAW;AAAA,cACxB,CAAC,IAAI,MAAM,KAAK,YAAY,OAAO,OAAO,GAAG,CAAC,WAAM,MAAM;AAAA,gBACxD;AAAA,cACF,CAAC;AAAA,YACH,OAAO;AAEL,qBAAO,UAAU,KAAK,IAAI;AAAA,YAC5B;AAAA,UACF,OAAO;AACL,mBAAO,OAAO,KAAK,EAAE,MAAM,OAAO,mBAAmB,CAAC;AAAA,UACxD;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,iBAAO,OAAO,KAAK,EAAE,MAAM,OAAO,aAAa,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,mBAAa,KAAK;AAAA,IACpB;AAGA,UAAM,gBAAgB,OAAO,QAAQ,OAAO,OAAO,EAAE;AAAA,MACnD,CAAC,CAAC,EAAE,UAAU,MAAM;AAClB,eAAO,OAAO,eAAe,YAAY,WAAW,WAAW,OAAO;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,cAAc;AAAA,QAClB,WAAW,cAAc,MAAM;AAAA,MACjC,EAAE,MAAM;AAKR,iBAAW,CAAC,YAAY,UAAU,KAAK,eAAe;AACpD,YAAI;AACF,gBAAM,WAAY,WAAsB,MAAM,CAAC;AAG/C,gBAAM,cAAc,YAAY,gBAAgB,QAAQ;AAGxD,gBAAM,kBAAiB,UAAK,QAAQ,UAAU,MAAvB,mBAA0B;AAGjD,gBAAM,aAAyB;AAAA,YAC7B,OAAO,YAAY;AAAA,YACnB,QAAQ,gBAAgB,oBAAoB,YAAY,QAAQ;AAAA,YAChE,UAAU,gBAAgB;AAAA,cACxB,YAAY;AAAA,YACd;AAAA,YAIA,cAAa,iBAAY,oBAAZ,mBAA6B;AAAA,YAC1C,aAAY,iBAAY,oBAAZ,mBAA6B;AAAA,YACzC,QAAQ,CAAC,EAAE,YAAY,SAAS,MAAM,MAAM,CAAC;AAAA,YAC7C,SAAS,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM,CAAC;AAAA,UACjD;AAGA,gBAAM,aAAa,MAAM,UAAU,QAAQ,KAAK;AAAA,YAC9C,MAAM;AAAA,YACN;AAAA,YACA,cAAc;AAAA,YACd,eAAe,2BAAgC,cAAS,QAAQ,CAAC;AAAA,UACnE,CAAC;AAED,gBAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,QAAQ;AAE1D,cAAI,qBAA0D;AAC9D,cAAI,WAAW,WAAW,YAAY;AAEpC,wBAAY,KAAK;AACjB,iCAAqB,MAAM;AAAA,cACzB;AAAA,cACA,WAAW;AAAA,YACb;AACA,gBAAI,uBAAuB,SAAS;AAClC,qBAAO,OAAO,KAAK;AAAA,gBACjB,MAAM;AAAA,gBACN,OAAO;AAAA,cACT,CAAC;AACD;AAAA,YACF;AAGA,gBAAI,uBAAuB,YAAY,WAAW,cAAc;AAE9D,oBAAM,eAAe;AAAA,gBACnB,OAAO,WAAW,aAAa,iBAAiB;AAAA,gBAChD,iBAAiB;AAAA,kBACf,aACE,WAAW,aAAa,iBAAiB;AAAA,kBAC3C,YACE,WAAW,aAAa,iBAAiB;AAAA,gBAC7C;AAAA,gBACA,UAAU;AAAA,kBACR;AAAA,oBACE,MAAM;AAAA,oBACN,SAAS,WAAW,aAAa,iBAAiB;AAAA,kBACpD;AAAA,kBACA,IAAI,gBAAW,aAAa,iBAAiB,aAAzC,YAAqD,CAAC;AAAA,gBAC5D;AAAA,cACF;AAEA,oBAAM,cAAmB,UAAK,cAAc;AAAA,gBAC1C,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,UAAU;AAAA,cACZ,CAAC;AAED,cAAG,iBAAc,UAAU,WAAW;AAAA,YACxC;AAGA,wBAAY,MAAM;AAAA,UACpB;AAGA,cAAI,WAAW,QAAQ;AACrB,iBAAK,QAAQ,UAAU,IAAI;AAAA,cACzB,SAAS,WAAW,OAAO;AAAA,cAC3B,WAAW,WAAW,OAAO;AAAA,cAC7B,cAAc;AAAA,YAChB;AAAA,UACF,WAAW,WAAW,WAAW,YAAY;AAC3C,kBAAM,iBAAgB,sBAAW,iBAAX,mBAAyB,kBAAzB,YAA0C;AAChE,gBAAI,uBAAuB,UAAU;AAEnC,mBAAK,QAAQ,UAAU,IAAI;AAAA,gBACzB,SAAS;AAAA,gBACT,WAAW;AAAA;AAAA,gBACX,cAAc;AAAA,cAChB;AAAA,YACF,OAAO;AAEL,oBAAMC,cAAa,MAAM,UAAU,QAAQ,OAAO,YAAY,iCACzD,cADyD;AAAA,gBAE5D,eAAe,2BAAgC;AAAA,kBAC7C;AAAA,gBACF,CAAC;AAAA,cACH,EAAC;AACD,mBAAK,QAAQ,UAAU,IAAI;AAAA,gBACzB,SAASA,YAAW;AAAA,gBACpB,WAAWA,YAAW;AAAA,gBACtB,cAAc;AAAA,cAChB;AAAA,YACF;AAAA,UACF;AAGA,cAAI;AACJ,cAAI,WAAW,WAAW,YAAY;AACpC,gBAAI,uBAAuB,UAAU;AACnC,2BAAa;AACb,qBAAO,QAAQ,KAAK;AAAA,gBAClB,MAAM;AAAA,gBACN,UAAS,sBAAW,iBAAX,mBAAyB,kBAAzB,YAA0C;AAAA,gBACnD,aAAa;AAAA;AAAA,cACf,CAAC;AAAA,YACH,OAAO;AACL,2BAAa;AACb,qBAAO,OAAO,KAAK;AAAA,gBACjB,MAAM;AAAA,gBACN,WAAU,sBAAW,iBAAX,mBAAyB,kBAAzB,YAA0C,KAAK;AAAA;AAAA,cAC3D,CAAC;AAAA,YACH;AAAA,UACF,WAAW,WAAW,WAAW,cAAc;AAE7C,yBAAa;AACb,mBAAO,UAAU,KAAK,UAAU;AAAA,UAClC,OAAO;AACL,kBAAM,YAAwC;AAAA,cAC5C,SAAS;AAAA,cACT,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AACA,yBAAa,UAAU,WAAW,MAAoB,KAAK;AAC3D,mBAAO,OAAO,KAAK;AAAA,cACjB,MAAM;AAAA,cACN,UAAS,sBAAW,WAAX,mBAAmB,YAAnB,YAA8B;AAAA,YACzC,CAAC;AAAA,UACH;AAEA,sBAAY,OAAO,GAAG,UAAU,IAAI,MAAM;AAAA,YACxC;AAAA,UACF,CAAC,IAAI,MAAM;AAAA,YACT,aACE,4BAAW,WAAX,mBAAmB,YAAnB,aACA,gBAAW,iBAAX,mBAAyB,kBADzB,YAEA,SACF;AAAA,UACF,CAAC,IAAI,uBAAuB,WAAW,OAAO,MAAM,IAAI,MAAM;AAAA,YAC5D;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,iBAAO,OAAO,KAAK,EAAE,MAAM,YAAY,OAAO,aAAa,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,kBAAY,gBAAgB,IAAI;AAEhC,kBAAY,KAAK;AAAA,IACnB;AAGA,UAAM,uBAAuB,YAAY,oBAAoB;AAC7D,UAAM,cAAc,qBAAqB,OAAO,CAAC,aAAa;AAC5D,YAAM,aAAa,YAAY,mBAAmB,QAAQ;AAC1D,aAAO,CAAC,OAAO,QAAQ,UAAU;AAAA,IACnC,CAAC;AAED,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,eAAa,YAAY,MAAM,sBAC7B,YAAY,SAAS,IAAI,MAAM,EACjC;AAAA,QACF;AAAA,MACF;AAEA,iBAAW,YAAY,aAAa;AAClC,cAAM,aAAa,YAAY,mBAAmB,QAAQ;AAC1D,cAAM,eAAoB,cAAS,QAAQ,IAAI,GAAG,QAAQ;AAE1D,gBAAQ,IAAI,MAAM,OAAO,KAAK,YAAY,EAAE,CAAC;AAC7C,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,6BAA6B,UAAU,YAAY,YAAY;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,sBAAsB,IAAI;AAAA,MAC9B,OAAO,KAAK,OAAO,OAAO,EAAE,OAAO,CAAC,SAAS;AAC3C,cAAM,aAAa,OAAO,QAAQ,IAAI;AAEtC,YAAI,OAAO,eAAe,YAAY,WAAW,MAAM;AACrD,iBAAO;AAAA,QACT;AACA,YAAI,OAAO,eAAe,YAAY,WAAW,WAAW,OAAO,GAAG;AACpE,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,UAAM,eACJ,YAAY,iCAAiC,mBAAmB;AAClE,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,UAAU;AACjB,kBAAY,eAAe,MAAM,YAAY;AAAA,IAC/C;AAGA,gBAAY,gBAAgB,IAAI;AAGhC,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,iBAAW,EAAE,MAAM,SAAS,YAAY,KAAK,OAAO,SAAS;AAE3D,cAAM,YAAY,KAAK,QAAQ,IAAI;AACnC,cAAM,eAAc,uCAAW,gBAC3B,KAAK,UAAU,YAAY,KAC3B,2BAA2B,IAAI;AAEnC,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,iBAAY,MAAM,KAAK,GAAG,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM;AAAA,cACxD,YAAY,OAAO;AAAA,YACrB,CAAC,WAAM,MAAM,KAAK,WAAW,CAAC;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,iBAAW,EAAE,MAAM,QAAQ,KAAK,OAAO,QAAQ;AAC7C,cAAM,YAAY,aAAa,IAAI;AACnC,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,iBAAY,MAAM,KAAK,IAAI,CAAC,IAAI,MAAM;AAAA,cACpC,YAAY,OAAO;AAAA,YACrB,CAAC,SAAS,MAAM,KAAK,SAAS,CAAC;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,iBAAW,QAAQ,OAAO,SAAS;AACjC,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ,kBAAa,MAAM,KAAK,IAAI,CAAC;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,iBAAW,EAAE,MAAM,MAAM,KAAK,OAAO,QAAQ;AAC3C,gBAAQ,IAAI,MAAM,IAAI,iBAAY,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;AAAA,MACjE;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,IAAI,IAAI,aAAa,KAAM,QAAQ,CAAC;AAC5D,UAAM,eACJ,OAAO,QAAQ,SAAS,OAAO,OAAO,SAAS,OAAO,QAAQ;AAEhE,QAAI,iBAAiB,KAAK,OAAO,OAAO,WAAW,GAAG;AACpD,cAAQ,IAAI,MAAM,KAAK,aAAa,QAAQ,eAAe,CAAC;AAAA,IAC9D,OAAO;AACL,YAAM,UAAU,CAAC;AACjB,UAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAQ,KAAK,GAAG,OAAO,QAAQ,MAAM,UAAU;AACjD,UAAI,OAAO,OAAO,SAAS;AACzB,gBAAQ,KAAK,GAAG,OAAO,OAAO,MAAM,SAAS;AAC/C,UAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAQ,KAAK,GAAG,OAAO,QAAQ,MAAM,UAAU;AACjD,UAAI,OAAO,OAAO,SAAS;AACzB,gBAAQ,KAAK,GAAG,OAAO,OAAO,MAAM,SAAS;AAE/C,cAAQ,IAAI,MAAM,KAAK,UAAU,QAAQ,KAAK,IAAI,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,IACxE;AAEA,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAc;AACjC,cAAQ,MAAM,MAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,IACpD,OAAO;AACL,cAAQ;AAAA,QACN,MAAM;AAAA,UACJ,qBACE,iBAAiB,QAAQ,MAAM,UAAU,eAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":["resolve","syncResult"]}
@@ -3,26 +3,29 @@
3
3
  var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
4
4
 
5
5
 
6
- var _chunkAZELEDOVjs = require('./chunk-AZELEDOV.js');
6
+ var _chunkDSIQSULKjs = require('./chunk-DSIQSULK.js');
7
7
 
8
8
 
9
- var _chunk5N5BUR2Zjs = require('./chunk-5N5BUR2Z.js');
9
+ var _chunkSVXNUWZIjs = require('./chunk-SVXNUWZI.js');
10
10
  require('./chunk-YH5TIVK2.js');
11
- require('./chunk-M4VUHTT2.js');
12
- require('./chunk-4TF2O2TH.js');
13
- require('./chunk-DEVJ7BPE.js');
11
+ require('./chunk-ECOC36EA.js');
12
+ require('./chunk-P4SQTYGN.js');
13
+ require('./chunk-QCYYSMCU.js');
14
14
  require('./chunk-DISMHYXC.js');
15
15
 
16
16
 
17
- var _chunkK64Y6YUGjs = require('./chunk-K64Y6YUG.js');
17
+ var _chunk7OZKH5K2js = require('./chunk-7OZKH5K2.js');
18
18
 
19
19
 
20
- var _chunkD2CSG4SJjs = require('./chunk-D2CSG4SJ.js');
20
+ var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
21
21
 
22
22
 
23
- var _chunkSGNJDRCTjs = require('./chunk-SGNJDRCT.js');
24
- require('./chunk-HA3LI5IK.js');
25
- require('./chunk-OXBO24RB.js');
23
+ var _chunkR6FBJN7Kjs = require('./chunk-R6FBJN7K.js');
24
+ require('./chunk-AZHZ4NB4.js');
25
+
26
+
27
+
28
+ var _chunkOXBO24RBjs = require('./chunk-OXBO24RB.js');
26
29
 
27
30
  // src/cli/commands/sync.ts
28
31
  var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
@@ -33,10 +36,8 @@ var _jsyaml = require('js-yaml'); var yaml = _interopRequireWildcard(_jsyaml);
33
36
  var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);
34
37
  var handleConflict = async (promptName, conflictInfo) => {
35
38
  console.log(
36
- _chalk2.default.yellow(
37
- `
38
- \u26A0 Conflict detected for prompt: ${_chalk2.default.cyan(promptName)}`
39
- )
39
+ _chalk2.default.yellow(`
40
+ \u26A0 Conflict detected for prompt: ${_chalk2.default.cyan(promptName)}`)
40
41
  );
41
42
  console.log(
42
43
  _chalk2.default.gray(
@@ -73,13 +74,14 @@ var handleConflict = async (promptName, conflictInfo) => {
73
74
  };
74
75
  var syncCommand = async () => {
75
76
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
77
+ console.log("\u{1F504} Starting sync...");
76
78
  const startTime = Date.now();
77
79
  try {
78
80
  _chunkF6E4XQQUjs.checkApiKey.call(void 0, );
79
- const langwatch = new (0, _chunkAZELEDOVjs.LangWatch)();
80
- await _chunkK64Y6YUGjs.ensureProjectInitialized.call(void 0, false);
81
- const config = _chunkD2CSG4SJjs.FileManager.loadPromptsConfig();
82
- const lock = _chunkD2CSG4SJjs.FileManager.loadPromptsLock();
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();
83
85
  const result = {
84
86
  fetched: [],
85
87
  pushed: [],
@@ -110,8 +112,8 @@ var syncCommand = async () => {
110
112
  if (prompt) {
111
113
  const needsUpdate = !lockEntry || lockEntry.version !== prompt.version || !lockEntry.materialized || !fs.existsSync(path.resolve(lockEntry.materialized));
112
114
  if (needsUpdate) {
113
- const materializedPrompt = _chunkSGNJDRCTjs.PromptConverter.fromApiToMaterialized(prompt);
114
- const savedPath = _chunkD2CSG4SJjs.FileManager.saveMaterializedPrompt(
115
+ const materializedPrompt = _chunkR6FBJN7Kjs.PromptConverter.fromApiToMaterialized(prompt);
116
+ const savedPath = _chunkCAZONSXVjs.FileManager.saveMaterializedPrompt(
115
117
  name,
116
118
  materializedPrompt
117
119
  );
@@ -121,7 +123,7 @@ var syncCommand = async () => {
121
123
  version: prompt.version,
122
124
  versionSpec
123
125
  });
124
- _chunkD2CSG4SJjs.FileManager.updateLockEntry(
126
+ _chunkCAZONSXVjs.FileManager.updateLockEntry(
125
127
  lock,
126
128
  name,
127
129
  materializedPrompt,
@@ -157,12 +159,12 @@ var syncCommand = async () => {
157
159
  for (const [promptName, dependency] of localFileRefs) {
158
160
  try {
159
161
  const filePath = dependency.slice(5);
160
- const localConfig = _chunkD2CSG4SJjs.FileManager.loadLocalPrompt(filePath);
162
+ const localConfig = _chunkCAZONSXVjs.FileManager.loadLocalPrompt(filePath);
161
163
  const currentVersion = (_b = lock.prompts[promptName]) == null ? void 0 : _b.version;
162
164
  const configData = {
163
165
  model: localConfig.model,
164
- prompt: _chunkSGNJDRCTjs.PromptConverter.extractSystemPrompt(localConfig.messages),
165
- messages: _chunkSGNJDRCTjs.PromptConverter.filterNonSystemMessages(
166
+ prompt: _chunkR6FBJN7Kjs.PromptConverter.extractSystemPrompt(localConfig.messages),
167
+ messages: _chunkR6FBJN7Kjs.PromptConverter.filterNonSystemMessages(
166
168
  localConfig.messages
167
169
  ),
168
170
  temperature: (_c = localConfig.modelParameters) == null ? void 0 : _c.temperature,
@@ -231,10 +233,14 @@ var syncCommand = async () => {
231
233
  materialized: filePath
232
234
  };
233
235
  } else {
236
+ const syncResult2 = await langwatch.prompts.update(promptName, _chunkOXBO24RBjs.__spreadProps.call(void 0, _chunkOXBO24RBjs.__spreadValues.call(void 0, {}, localConfig), {
237
+ commitMessage: `Synced from local file: ${path.basename(
238
+ filePath
239
+ )}`
240
+ }));
234
241
  lock.prompts[promptName] = {
235
- version: remoteVersion + 1,
236
- versionId: "conflict_resolved",
237
- // Temporary until we get actual versionId
242
+ version: syncResult2.version,
243
+ versionId: syncResult2.versionId,
238
244
  materialized: filePath
239
245
  };
240
246
  }
@@ -285,12 +291,12 @@ var syncCommand = async () => {
285
291
  result.errors.push({ name: promptName, error: errorMessage });
286
292
  }
287
293
  }
288
- _chunkD2CSG4SJjs.FileManager.savePromptsLock(lock);
294
+ _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
289
295
  pushSpinner.stop();
290
296
  }
291
- const discoveredLocalFiles = _chunkD2CSG4SJjs.FileManager.getLocalPromptFiles();
297
+ const discoveredLocalFiles = _chunkCAZONSXVjs.FileManager.getLocalPromptFiles();
292
298
  const orphanFiles = discoveredLocalFiles.filter((filePath) => {
293
- const promptName = _chunkD2CSG4SJjs.FileManager.promptNameFromPath(filePath);
299
+ const promptName = _chunkCAZONSXVjs.FileManager.promptNameFromPath(filePath);
294
300
  return !config.prompts[promptName];
295
301
  });
296
302
  if (orphanFiles.length > 0) {
@@ -301,7 +307,7 @@ var syncCommand = async () => {
301
307
  )
302
308
  );
303
309
  for (const filePath of orphanFiles) {
304
- const promptName = _chunkD2CSG4SJjs.FileManager.promptNameFromPath(filePath);
310
+ const promptName = _chunkCAZONSXVjs.FileManager.promptNameFromPath(filePath);
305
311
  const relativePath = path.relative(process.cwd(), filePath);
306
312
  console.log(_chalk2.default.yellow(` ${relativePath}`));
307
313
  console.log(
@@ -329,12 +335,12 @@ Tip: Add these to prompts.json to include them in sync operations.`
329
335
  return true;
330
336
  })
331
337
  );
332
- const cleanedFiles = _chunkD2CSG4SJjs.FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);
338
+ const cleanedFiles = _chunkCAZONSXVjs.FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);
333
339
  if (cleanedFiles.length > 0) {
334
340
  result.cleaned = cleanedFiles;
335
- _chunkD2CSG4SJjs.FileManager.removeFromLock(lock, cleanedFiles);
341
+ _chunkCAZONSXVjs.FileManager.removeFromLock(lock, cleanedFiles);
336
342
  }
337
- _chunkD2CSG4SJjs.FileManager.savePromptsLock(lock);
343
+ _chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
338
344
  if (result.fetched.length > 0) {
339
345
  for (const { name, version, versionSpec } of result.fetched) {
340
346
  const lockEntry = lock.prompts[name];
@@ -353,7 +359,9 @@ Tip: Add these to prompts.json to include them in sync operations.`
353
359
  const localPath = `./prompts/${name}.prompt.yaml`;
354
360
  console.log(
355
361
  _chalk2.default.green(
356
- `\u2713 Pushed ${_chalk2.default.cyan(name)} ${_chalk2.default.gray(`(version ${version})`)} from ${_chalk2.default.gray(localPath)}`
362
+ `\u2713 Pushed ${_chalk2.default.cyan(name)} ${_chalk2.default.gray(
363
+ `(version ${version})`
364
+ )} from ${_chalk2.default.gray(localPath)}`
357
365
  )
358
366
  );
359
367
  }
@@ -392,7 +400,7 @@ Tip: Add these to prompts.json to include them in sync operations.`
392
400
  process.exit(1);
393
401
  }
394
402
  } catch (error) {
395
- if (error instanceof _chunk5N5BUR2Zjs.PromptsError) {
403
+ if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
396
404
  console.error(_chalk2.default.red(`Error: ${error.message}`));
397
405
  } else {
398
406
  console.error(
@@ -407,4 +415,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
407
415
 
408
416
 
409
417
  exports.syncCommand = syncCommand;
410
- //# sourceMappingURL=sync-PBOL5ODF.js.map
418
+ //# sourceMappingURL=sync-T3T22GVZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-T3T22GVZ.js","../src/cli/commands/sync.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-T3T22GVZ.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 PromptsError,\n type SyncAction,\n} from \"@/client-sdk/services/prompts\";\nimport { LangWatch } from \"@/client-sdk\";\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 LangWatch client\n const langwatch = new LangWatch();\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 langwatch.prompts.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 langwatch.prompts.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 langwatch.prompts.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"]}