langwatch 0.4.2 → 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.
- package/dist/{add-SV662KZU.js → add-4WXEWG5H.js} +63 -34
- package/dist/add-4WXEWG5H.js.map +1 -0
- package/dist/{add-SMYALCQG.mjs → add-D2WVVKIP.mjs} +48 -19
- package/dist/add-D2WVVKIP.mjs.map +1 -0
- package/dist/{chunk-ZZLIF3DE.js → chunk-7OZKH5K2.js} +10 -10
- package/dist/{chunk-ZZLIF3DE.js.map → chunk-7OZKH5K2.js.map} +1 -1
- package/dist/{chunk-I5NDMIK5.js → chunk-AZHZ4NB4.js} +1 -1
- package/dist/{chunk-I5NDMIK5.js.map → chunk-AZHZ4NB4.js.map} +1 -1
- package/dist/{chunk-YQVVPMKH.mjs → chunk-BTBSMJTY.mjs} +1 -1
- package/dist/chunk-BTBSMJTY.mjs.map +1 -0
- package/dist/{chunk-P5F63PAW.js → chunk-CAZONSXV.js} +5 -5
- package/dist/{chunk-P5F63PAW.js.map → chunk-CAZONSXV.js.map} +1 -1
- package/dist/{chunk-7ZRAJ52N.mjs → chunk-CKVDNVFL.mjs} +3 -3
- package/dist/{chunk-K4ICRI7W.mjs → chunk-DLJO7AK5.mjs} +2 -2
- package/dist/{chunk-T7FQHOLK.js → chunk-DSIQSULK.js} +15 -18
- package/dist/chunk-DSIQSULK.js.map +1 -0
- package/dist/{chunk-ILTCLEIF.js → chunk-ECOC36EA.js} +7 -7
- package/dist/chunk-ECOC36EA.js.map +1 -0
- package/dist/{chunk-5ZKAT4KI.mjs → chunk-H5PON53W.mjs} +12 -29
- package/dist/chunk-H5PON53W.mjs.map +1 -0
- package/dist/{chunk-NVKMXXNP.js → chunk-P4SQTYGN.js} +14 -14
- package/dist/{chunk-NVKMXXNP.js.map → chunk-P4SQTYGN.js.map} +1 -1
- package/dist/{chunk-VI5NJ53L.js → chunk-QCYYSMCU.js} +2 -2
- package/dist/chunk-QCYYSMCU.js.map +1 -0
- package/dist/{chunk-VILW5FYO.mjs → chunk-QZGTM76F.mjs} +7 -7
- package/dist/{chunk-VILW5FYO.mjs.map → chunk-QZGTM76F.mjs.map} +1 -1
- package/dist/{chunk-PUHM465C.js → chunk-R6FBJN7K.js} +18 -4
- package/dist/chunk-R6FBJN7K.js.map +1 -0
- package/dist/{chunk-NFM6RB4R.js → chunk-SVXNUWZI.js} +15 -32
- package/dist/chunk-SVXNUWZI.js.map +1 -0
- package/dist/{chunk-LXVDGQA4.mjs → chunk-V5M3HUBV.mjs} +18 -4
- package/dist/chunk-V5M3HUBV.mjs.map +1 -0
- package/dist/{chunk-RBZNMZTF.mjs → chunk-YEGQXDTE.mjs} +5 -8
- package/dist/{chunk-RBZNMZTF.mjs.map → chunk-YEGQXDTE.mjs.map} +1 -1
- package/dist/{chunk-CAVBDSBT.mjs → chunk-YKFTFYKK.mjs} +2 -2
- package/dist/chunk-YKFTFYKK.mjs.map +1 -0
- package/dist/{chunk-ENSRDEDA.mjs → chunk-ZIULPOMQ.mjs} +2 -2
- package/dist/cli/index.js +9 -9
- package/dist/cli/index.mjs +8 -8
- package/dist/{create-GUY3HZM2.js → create-4LG4N2A4.js} +27 -16
- package/dist/create-4LG4N2A4.js.map +1 -0
- package/dist/{create-BHWZP6YD.mjs → create-OQEMO4MU.mjs} +22 -11
- package/dist/create-OQEMO4MU.mjs.map +1 -0
- package/dist/{implementation--7B7PUww.d.ts → implementation-BIlL6-SW.d.ts} +1 -1
- package/dist/{implementation-D7LzdQop.d.mts → implementation-fAgqv8OM.d.mts} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -7
- package/dist/index.mjs +6 -6
- package/dist/init-EKNL2SQE.js +16 -0
- package/dist/{init-OO2BUJ6V.js.map → init-EKNL2SQE.js.map} +1 -1
- package/dist/{init-RDW2F4G3.mjs → init-MQXXHCNT.mjs} +5 -5
- package/dist/{list-GZGLSJ52.js → list-GIAXAAH5.js} +10 -10
- package/dist/list-GIAXAAH5.js.map +1 -0
- package/dist/{list-32BRZ6RS.mjs → list-PFWV7IU6.mjs} +7 -7
- package/dist/list-PFWV7IU6.mjs.map +1 -0
- package/dist/{login-IAP4RFUM.js → login-3STX2FAO.js} +3 -3
- package/dist/{login-IAP4RFUM.js.map → login-3STX2FAO.js.map} +1 -1
- package/dist/{login-VXLW2OXR.mjs → login-BYLXS23I.mjs} +2 -2
- package/dist/observability-sdk/index.d.mts +3 -3
- package/dist/observability-sdk/index.d.ts +3 -3
- package/dist/observability-sdk/index.js +4 -4
- package/dist/observability-sdk/index.mjs +3 -3
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +1 -1
- package/dist/observability-sdk/instrumentation/langchain/index.js +3 -3
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +1 -1
- package/dist/observability-sdk/setup/node/index.d.mts +1 -1
- package/dist/observability-sdk/setup/node/index.d.ts +1 -1
- package/dist/observability-sdk/setup/node/index.js +10 -10
- package/dist/observability-sdk/setup/node/index.mjs +2 -2
- package/dist/{remove-JUVM6M7G.mjs → remove-FTF3EBYV.mjs} +8 -8
- package/dist/{remove-N3324KHS.js → remove-U3PILQDV.js} +16 -16
- package/dist/{remove-N3324KHS.js.map → remove-U3PILQDV.js.map} +1 -1
- package/dist/{sync-B4YK6QYX.mjs → sync-FOW7DHAH.mjs} +23 -18
- package/dist/sync-FOW7DHAH.mjs.map +1 -0
- package/dist/{sync-E32H3H52.js → sync-T3T22GVZ.js} +41 -36
- package/dist/sync-T3T22GVZ.js.map +1 -0
- package/dist/{types-D6Cs1385.d.ts → types-DyUmlaDx.d.ts} +71 -21
- package/dist/{types-D61S7yPU.d.mts → types-jrEEZt9d.d.mts} +71 -21
- package/package.json +6 -5
- package/dist/add-SMYALCQG.mjs.map +0 -1
- package/dist/add-SV662KZU.js.map +0 -1
- package/dist/chunk-5ZKAT4KI.mjs.map +0 -1
- package/dist/chunk-CAVBDSBT.mjs.map +0 -1
- package/dist/chunk-ILTCLEIF.js.map +0 -1
- package/dist/chunk-LXVDGQA4.mjs.map +0 -1
- package/dist/chunk-NFM6RB4R.js.map +0 -1
- package/dist/chunk-PUHM465C.js.map +0 -1
- package/dist/chunk-T7FQHOLK.js.map +0 -1
- package/dist/chunk-VI5NJ53L.js.map +0 -1
- package/dist/chunk-YQVVPMKH.mjs.map +0 -1
- package/dist/create-BHWZP6YD.mjs.map +0 -1
- package/dist/create-GUY3HZM2.js.map +0 -1
- package/dist/init-OO2BUJ6V.js +0 -16
- package/dist/list-32BRZ6RS.mjs.map +0 -1
- package/dist/list-GZGLSJ52.js.map +0 -1
- package/dist/sync-B4YK6QYX.mjs.map +0 -1
- package/dist/sync-E32H3H52.js.map +0 -1
- /package/dist/{chunk-7ZRAJ52N.mjs.map → chunk-CKVDNVFL.mjs.map} +0 -0
- /package/dist/{chunk-K4ICRI7W.mjs.map → chunk-DLJO7AK5.mjs.map} +0 -0
- /package/dist/{chunk-ENSRDEDA.mjs.map → chunk-ZIULPOMQ.mjs.map} +0 -0
- /package/dist/{init-RDW2F4G3.mjs.map → init-MQXXHCNT.mjs.map} +0 -0
- /package/dist/{login-VXLW2OXR.mjs.map → login-BYLXS23I.mjs.map} +0 -0
- /package/dist/{remove-JUVM6M7G.mjs.map → remove-FTF3EBYV.mjs.map} +0 -0
|
@@ -3,25 +3,25 @@
|
|
|
3
3
|
var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkDSIQSULKjs = require('./chunk-DSIQSULK.js');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkSVXNUWZIjs = require('./chunk-SVXNUWZI.js');
|
|
10
10
|
require('./chunk-YH5TIVK2.js');
|
|
11
|
-
require('./chunk-
|
|
12
|
-
require('./chunk-
|
|
13
|
-
require('./chunk-
|
|
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
|
|
17
|
+
var _chunk7OZKH5K2js = require('./chunk-7OZKH5K2.js');
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
24
|
-
require('./chunk-
|
|
23
|
+
var _chunkR6FBJN7Kjs = require('./chunk-R6FBJN7K.js');
|
|
24
|
+
require('./chunk-AZHZ4NB4.js');
|
|
25
25
|
require('./chunk-OXBO24RB.js');
|
|
26
26
|
|
|
27
27
|
// src/cli/commands/add.ts
|
|
@@ -35,16 +35,18 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
35
35
|
process.exit(1);
|
|
36
36
|
}
|
|
37
37
|
if (!localFilePath.endsWith(".prompt.yaml")) {
|
|
38
|
-
console.error(
|
|
38
|
+
console.error(
|
|
39
|
+
_chalk2.default.red(`Error: Local file must have .prompt.yaml extension`)
|
|
40
|
+
);
|
|
39
41
|
process.exit(1);
|
|
40
42
|
}
|
|
41
43
|
try {
|
|
42
|
-
|
|
43
|
-
await
|
|
44
|
-
const promptsConfig =
|
|
44
|
+
_chunkCAZONSXVjs.FileManager.loadLocalPrompt(localFilePath);
|
|
45
|
+
await _chunk7OZKH5K2js.ensureProjectInitialized.call(void 0, );
|
|
46
|
+
const promptsConfig = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
|
|
45
47
|
promptsConfig.prompts[name] = `file:${localFilePath}`;
|
|
46
|
-
|
|
47
|
-
const lock =
|
|
48
|
+
_chunkCAZONSXVjs.FileManager.savePromptsConfig(promptsConfig);
|
|
49
|
+
const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
|
|
48
50
|
lock.prompts[name] = {
|
|
49
51
|
version: 0,
|
|
50
52
|
// Local files start at version 0
|
|
@@ -52,11 +54,19 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
52
54
|
materialized: localFilePath
|
|
53
55
|
// Store the original file path
|
|
54
56
|
};
|
|
55
|
-
|
|
56
|
-
console.log(
|
|
57
|
+
_chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
|
|
58
|
+
console.log(
|
|
59
|
+
_chalk2.default.green(
|
|
60
|
+
`\u2713 Added local prompt: ${_chalk2.default.cyan(name)} \u2192 ${_chalk2.default.gray(
|
|
61
|
+
localFilePath
|
|
62
|
+
)}`
|
|
63
|
+
)
|
|
64
|
+
);
|
|
57
65
|
} catch (error) {
|
|
58
66
|
console.error(_chalk2.default.red("Error loading local prompt file:"));
|
|
59
|
-
console.error(
|
|
67
|
+
console.error(
|
|
68
|
+
_chalk2.default.red(error instanceof Error ? error.message : String(error))
|
|
69
|
+
);
|
|
60
70
|
process.exit(1);
|
|
61
71
|
}
|
|
62
72
|
};
|
|
@@ -72,9 +82,11 @@ var addCommand = async (name, options) => {
|
|
|
72
82
|
return;
|
|
73
83
|
}
|
|
74
84
|
_chunkF6E4XQQUjs.checkApiKey.call(void 0, );
|
|
75
|
-
const langwatch = new (0,
|
|
85
|
+
const langwatch = new (0, _chunkDSIQSULKjs.LangWatch)();
|
|
76
86
|
const version = (_a = options.version) != null ? _a : "latest";
|
|
77
|
-
const spinner = _ora2.default.call(void 0,
|
|
87
|
+
const spinner = _ora2.default.call(void 0,
|
|
88
|
+
`Adding ${_chalk2.default.cyan(`${name}@${version}`)}...`
|
|
89
|
+
).start();
|
|
78
90
|
try {
|
|
79
91
|
const prompt = await langwatch.prompts.get(name);
|
|
80
92
|
if (!prompt) {
|
|
@@ -83,34 +95,51 @@ var addCommand = async (name, options) => {
|
|
|
83
95
|
process.exit(1);
|
|
84
96
|
}
|
|
85
97
|
spinner.stop();
|
|
86
|
-
await
|
|
98
|
+
await _chunk7OZKH5K2js.ensureProjectInitialized.call(void 0, );
|
|
87
99
|
spinner.start(`Adding ${_chalk2.default.cyan(`${name}@${version}`)}...`);
|
|
88
|
-
const materializedPrompt =
|
|
89
|
-
const savedPath =
|
|
100
|
+
const materializedPrompt = _chunkR6FBJN7Kjs.PromptConverter.fromApiToMaterialized(prompt);
|
|
101
|
+
const savedPath = _chunkCAZONSXVjs.FileManager.saveMaterializedPrompt(
|
|
102
|
+
name,
|
|
103
|
+
materializedPrompt
|
|
104
|
+
);
|
|
90
105
|
const relativePath = path.relative(process.cwd(), savedPath);
|
|
91
|
-
const config =
|
|
92
|
-
const lock =
|
|
106
|
+
const config = _chunkCAZONSXVjs.FileManager.loadPromptsConfig();
|
|
107
|
+
const lock = _chunkCAZONSXVjs.FileManager.loadPromptsLock();
|
|
93
108
|
config.prompts[name] = version;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
109
|
+
_chunkCAZONSXVjs.FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);
|
|
110
|
+
_chunkCAZONSXVjs.FileManager.savePromptsConfig(config);
|
|
111
|
+
_chunkCAZONSXVjs.FileManager.savePromptsLock(lock);
|
|
97
112
|
spinner.succeed();
|
|
98
113
|
const displayPath = relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
|
|
99
|
-
console.log(
|
|
114
|
+
console.log(
|
|
115
|
+
_chalk2.default.green(
|
|
116
|
+
`\u2713 Pulled ${_chalk2.default.cyan(`${name}@${version}`)} ${_chalk2.default.gray(
|
|
117
|
+
`(version ${prompt.version})`
|
|
118
|
+
)} \u2192 ${_chalk2.default.gray(displayPath)}`
|
|
119
|
+
)
|
|
120
|
+
);
|
|
100
121
|
} catch (error) {
|
|
101
122
|
spinner.fail();
|
|
102
|
-
if (error instanceof
|
|
123
|
+
if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
|
|
103
124
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
104
125
|
} else {
|
|
105
|
-
console.error(
|
|
126
|
+
console.error(
|
|
127
|
+
_chalk2.default.red(
|
|
128
|
+
`Error adding prompt: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
129
|
+
)
|
|
130
|
+
);
|
|
106
131
|
}
|
|
107
132
|
process.exit(1);
|
|
108
133
|
}
|
|
109
134
|
} catch (error) {
|
|
110
|
-
if (error instanceof
|
|
135
|
+
if (error instanceof _chunkSVXNUWZIjs.PromptsError) {
|
|
111
136
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
112
137
|
} else {
|
|
113
|
-
console.error(
|
|
138
|
+
console.error(
|
|
139
|
+
_chalk2.default.red(
|
|
140
|
+
`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
141
|
+
)
|
|
142
|
+
);
|
|
114
143
|
}
|
|
115
144
|
process.exit(1);
|
|
116
145
|
}
|
|
@@ -118,4 +147,4 @@ var addCommand = async (name, options) => {
|
|
|
118
147
|
|
|
119
148
|
|
|
120
149
|
exports.addCommand = addCommand;
|
|
121
|
-
//# sourceMappingURL=add-
|
|
150
|
+
//# sourceMappingURL=add-4WXEWG5H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-4WXEWG5H.js","../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;AC1BA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAClB,oEAAgB;AAahB,IAAM,aAAA,EAAe,MAAA,CACnB,IAAA,EACA,aAAA,EAAA,GACkB;AAElB,EAAA,GAAA,CAAI,CAAI,EAAA,CAAA,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,6BAAA,EAAgC,aAAa,CAAA,CAAA;AACvD,IAAA;AAChB,EAAA;AAE6C,EAAA;AACnC,IAAA;AACwD,MAAA;AAChE,IAAA;AACc,IAAA;AAChB,EAAA;AAGI,EAAA;AACuC,IAAA;AAGV,IAAA;AAGqB,IAAA;AACD,IAAA;AACR,IAAA;AAGF,IAAA;AACpB,IAAA;AACV,MAAA;AAAA;AACE,MAAA;AACG,MAAA;AAAA;AAChB,IAAA;AACgC,IAAA;AAExB,IAAA;AACA,MAAA;AACiD,QAAA;AACnD,UAAA;AACD,QAAA;AACH,MAAA;AACF,IAAA;AACc,EAAA;AAC6C,IAAA;AACnD,IAAA;AAC0D,MAAA;AAClE,IAAA;AACc,IAAA;AAChB,EAAA;AACF;AAKoB;AAzEpB,EAAA;AA0EM,EAAA;AAE+B,IAAA;AAC8B,MAAA;AAC/C,MAAA;AAChB,IAAA;AAGuB,IAAA;AACqB,MAAA;AAC1C,MAAA;AACF,IAAA;AAGY,IAAA;AAEoB,IAAA;AACG,IAAA;AAGnB,IAAA;AAC4B,MAAA;AACpC,IAAA;AAEJ,IAAA;AAE6C,MAAA;AAElC,MAAA;AACE,QAAA;AAC+C,QAAA;AAC9C,QAAA;AAChB,MAAA;AAGa,MAAA;AAGkB,MAAA;AAG8B,MAAA;AAGI,MAAA;AACnC,MAAA;AAC5B,QAAA;AACA,QAAA;AACF,MAAA;AAC2D,MAAA;AAGd,MAAA;AACJ,MAAA;AAElB,MAAA;AACqC,MAAA;AAGxB,MAAA;AACJ,MAAA;AAEhB,MAAA;AAKZ,MAAA;AACI,MAAA;AACA,QAAA;AACkD,UAAA;AAC1B,YAAA;AACE,UAAA;AAChC,QAAA;AACF,MAAA;AACc,IAAA;AACD,MAAA;AACsB,MAAA;AACiB,QAAA;AAC7C,MAAA;AACG,QAAA;AACA,UAAA;AAE6B,YAAA;AAEnC,UAAA;AACF,QAAA;AACF,MAAA;AACc,MAAA;AAChB,IAAA;AACc,EAAA;AACqB,IAAA;AACiB,MAAA;AAC7C,IAAA;AACG,MAAA;AACA,QAAA;AAEuC,UAAA;AAE7C,QAAA;AACF,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AACF;ADhC0E;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/add-4WXEWG5H.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\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { LangWatch } from \"@/client-sdk\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const langwatch = new LangWatch();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await langwatch.prompts.get(name);\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"]}
|
|
@@ -3,25 +3,25 @@ import {
|
|
|
3
3
|
} from "./chunk-DHJKJVY7.mjs";
|
|
4
4
|
import {
|
|
5
5
|
LangWatch
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-YEGQXDTE.mjs";
|
|
7
7
|
import {
|
|
8
8
|
PromptsError
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-H5PON53W.mjs";
|
|
10
10
|
import "./chunk-N2V6J3U2.mjs";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
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-
|
|
17
|
+
} from "./chunk-DLJO7AK5.mjs";
|
|
18
18
|
import {
|
|
19
19
|
FileManager
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-CKVDNVFL.mjs";
|
|
21
21
|
import {
|
|
22
22
|
PromptConverter
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-V5M3HUBV.mjs";
|
|
24
|
+
import "./chunk-BTBSMJTY.mjs";
|
|
25
25
|
import "./chunk-CU3443HD.mjs";
|
|
26
26
|
|
|
27
27
|
// src/cli/commands/add.ts
|
|
@@ -35,11 +35,13 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
35
35
|
process.exit(1);
|
|
36
36
|
}
|
|
37
37
|
if (!localFilePath.endsWith(".prompt.yaml")) {
|
|
38
|
-
console.error(
|
|
38
|
+
console.error(
|
|
39
|
+
chalk.red(`Error: Local file must have .prompt.yaml extension`)
|
|
40
|
+
);
|
|
39
41
|
process.exit(1);
|
|
40
42
|
}
|
|
41
43
|
try {
|
|
42
|
-
|
|
44
|
+
FileManager.loadLocalPrompt(localFilePath);
|
|
43
45
|
await ensureProjectInitialized();
|
|
44
46
|
const promptsConfig = FileManager.loadPromptsConfig();
|
|
45
47
|
promptsConfig.prompts[name] = `file:${localFilePath}`;
|
|
@@ -53,10 +55,18 @@ var addLocalFile = async (name, localFilePath) => {
|
|
|
53
55
|
// Store the original file path
|
|
54
56
|
};
|
|
55
57
|
FileManager.savePromptsLock(lock);
|
|
56
|
-
console.log(
|
|
58
|
+
console.log(
|
|
59
|
+
chalk.green(
|
|
60
|
+
`\u2713 Added local prompt: ${chalk.cyan(name)} \u2192 ${chalk.gray(
|
|
61
|
+
localFilePath
|
|
62
|
+
)}`
|
|
63
|
+
)
|
|
64
|
+
);
|
|
57
65
|
} catch (error) {
|
|
58
66
|
console.error(chalk.red("Error loading local prompt file:"));
|
|
59
|
-
console.error(
|
|
67
|
+
console.error(
|
|
68
|
+
chalk.red(error instanceof Error ? error.message : String(error))
|
|
69
|
+
);
|
|
60
70
|
process.exit(1);
|
|
61
71
|
}
|
|
62
72
|
};
|
|
@@ -74,7 +84,9 @@ var addCommand = async (name, options) => {
|
|
|
74
84
|
checkApiKey();
|
|
75
85
|
const langwatch = new LangWatch();
|
|
76
86
|
const version = (_a = options.version) != null ? _a : "latest";
|
|
77
|
-
const spinner = ora(
|
|
87
|
+
const spinner = ora(
|
|
88
|
+
`Adding ${chalk.cyan(`${name}@${version}`)}...`
|
|
89
|
+
).start();
|
|
78
90
|
try {
|
|
79
91
|
const prompt = await langwatch.prompts.get(name);
|
|
80
92
|
if (!prompt) {
|
|
@@ -86,7 +98,10 @@ var addCommand = async (name, options) => {
|
|
|
86
98
|
await ensureProjectInitialized();
|
|
87
99
|
spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);
|
|
88
100
|
const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);
|
|
89
|
-
const savedPath = FileManager.saveMaterializedPrompt(
|
|
101
|
+
const savedPath = FileManager.saveMaterializedPrompt(
|
|
102
|
+
name,
|
|
103
|
+
materializedPrompt
|
|
104
|
+
);
|
|
90
105
|
const relativePath = path.relative(process.cwd(), savedPath);
|
|
91
106
|
const config = FileManager.loadPromptsConfig();
|
|
92
107
|
const lock = FileManager.loadPromptsLock();
|
|
@@ -96,13 +111,23 @@ var addCommand = async (name, options) => {
|
|
|
96
111
|
FileManager.savePromptsLock(lock);
|
|
97
112
|
spinner.succeed();
|
|
98
113
|
const displayPath = relativePath.startsWith("./") ? relativePath : `./${relativePath}`;
|
|
99
|
-
console.log(
|
|
114
|
+
console.log(
|
|
115
|
+
chalk.green(
|
|
116
|
+
`\u2713 Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(
|
|
117
|
+
`(version ${prompt.version})`
|
|
118
|
+
)} \u2192 ${chalk.gray(displayPath)}`
|
|
119
|
+
)
|
|
120
|
+
);
|
|
100
121
|
} catch (error) {
|
|
101
122
|
spinner.fail();
|
|
102
123
|
if (error instanceof PromptsError) {
|
|
103
124
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
104
125
|
} else {
|
|
105
|
-
console.error(
|
|
126
|
+
console.error(
|
|
127
|
+
chalk.red(
|
|
128
|
+
`Error adding prompt: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
129
|
+
)
|
|
130
|
+
);
|
|
106
131
|
}
|
|
107
132
|
process.exit(1);
|
|
108
133
|
}
|
|
@@ -110,7 +135,11 @@ var addCommand = async (name, options) => {
|
|
|
110
135
|
if (error instanceof PromptsError) {
|
|
111
136
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
112
137
|
} else {
|
|
113
|
-
console.error(
|
|
138
|
+
console.error(
|
|
139
|
+
chalk.red(
|
|
140
|
+
`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
141
|
+
)
|
|
142
|
+
);
|
|
114
143
|
}
|
|
115
144
|
process.exit(1);
|
|
116
145
|
}
|
|
@@ -118,4 +147,4 @@ var addCommand = async (name, options) => {
|
|
|
118
147
|
export {
|
|
119
148
|
addCommand
|
|
120
149
|
};
|
|
121
|
-
//# sourceMappingURL=add-
|
|
150
|
+
//# sourceMappingURL=add-D2WVVKIP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/add.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { PromptsError } from \"@/client-sdk/services/prompts\";\nimport { PromptConverter } from \"../utils/promptConverter\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport { LangWatch } from \"@/client-sdk\";\n\ninterface AddOptions {\n version?: string;\n localFile?: string;\n}\n\nconst addLocalFile = async (\n name: string,\n localFilePath: string,\n): Promise<void> => {\n // Validate that the file exists and has the right extension\n if (!fs.existsSync(localFilePath)) {\n console.error(chalk.red(`Error: Local file not found: ${localFilePath}`));\n process.exit(1);\n }\n\n if (!localFilePath.endsWith(\".prompt.yaml\")) {\n console.error(\n chalk.red(`Error: Local file must have .prompt.yaml extension`),\n );\n process.exit(1);\n }\n\n // Load and validate the YAML file\n try {\n FileManager.loadLocalPrompt(localFilePath);\n\n // Ensure project is initialized\n await ensureProjectInitialized();\n\n // Add to prompts.json as a file: dependency\n const promptsConfig = FileManager.loadPromptsConfig();\n promptsConfig.prompts[name] = `file:${localFilePath}`;\n FileManager.savePromptsConfig(promptsConfig);\n\n // Update lock file\n const lock = FileManager.loadPromptsLock();\n lock.prompts[name] = {\n version: 0, // Local files start at version 0\n versionId: \"local\",\n materialized: localFilePath, // Store the original file path\n };\n FileManager.savePromptsLock(lock);\n\n console.log(\n chalk.green(\n `✓ Added local prompt: ${chalk.cyan(name)} → ${chalk.gray(\n localFilePath,\n )}`,\n ),\n );\n } catch (error) {\n console.error(chalk.red(\"Error loading local prompt file:\"));\n console.error(\n chalk.red(error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n }\n};\n\nexport const addCommand = async (\n name: string,\n options: AddOptions,\n): Promise<void> => {\n try {\n // Validate prompt name\n if (!name || name.trim() === \"\") {\n console.error(chalk.red(\"Error: Prompt name cannot be empty\"));\n process.exit(1);\n }\n\n // Handle local file addition\n if (options.localFile) {\n await addLocalFile(name, options.localFile);\n return;\n }\n\n // Check API key before doing anything else\n checkApiKey();\n\n const langwatch = new LangWatch();\n const version = options.version ?? \"latest\";\n\n // Fetch and materialize the prompt (like sync does for individual prompts)\n const spinner = ora(\n `Adding ${chalk.cyan(`${name}@${version}`)}...`,\n ).start();\n\n try {\n // Fetch the prompt from the API\n const prompt = await langwatch.prompts.get(name);\n\n if (!prompt) {\n spinner.fail();\n console.error(chalk.red(`Error: Prompt \"${name}\" not found`));\n process.exit(1);\n }\n\n // Stop spinner before any user input prompts\n spinner.stop();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized();\n\n // Restart spinner for the actual work\n spinner.start(`Adding ${chalk.cyan(`${name}@${version}`)}...`);\n\n // Convert to MaterializedPrompt format and save\n const materializedPrompt = PromptConverter.fromApiToMaterialized(prompt);\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt,\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n\n // Load existing config and lock, add the new dependency\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n config.prompts[name] = version;\n FileManager.updateLockEntry(lock, name, materializedPrompt, savedPath);\n\n // Save the updated config and lock\n FileManager.savePromptsConfig(config);\n FileManager.savePromptsLock(lock);\n\n spinner.succeed();\n\n // Show what was done (add ./ prefix for consistency)\n const displayPath = relativePath.startsWith(\"./\")\n ? relativePath\n : `./${relativePath}`;\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${version}`)} ${chalk.gray(\n `(version ${prompt.version})`,\n )} → ${chalk.gray(displayPath)}`,\n ),\n );\n } catch (error) {\n spinner.fail();\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Error adding prompt: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n ),\n );\n }\n process.exit(1);\n }\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
3
|
+
var _chunkCAZONSXVjs = require('./chunk-CAZONSXV.js');
|
|
4
4
|
|
|
5
5
|
// src/cli/utils/init.ts
|
|
6
6
|
var _readline = require('readline'); var readline = _interopRequireWildcard(_readline);
|
|
@@ -19,14 +19,14 @@ var promptUser = (question) => {
|
|
|
19
19
|
};
|
|
20
20
|
var initializeProject = async () => {
|
|
21
21
|
console.log(_chalk2.default.blue("Initializing LangWatch prompts project..."));
|
|
22
|
-
const configResult =
|
|
22
|
+
const configResult = _chunkCAZONSXVjs.FileManager.initializePromptsConfig();
|
|
23
23
|
if (configResult.created) {
|
|
24
24
|
console.log(_chalk2.default.green(`\u2713 Created ${_chalk2.default.gray("./prompts.json")}`));
|
|
25
25
|
const shouldAddGitignore = await promptUser(
|
|
26
26
|
_chalk2.default.yellow("Add 'prompts/.materialized' to .gitignore? [Y/n]: ")
|
|
27
27
|
);
|
|
28
28
|
if (shouldAddGitignore === "" || shouldAddGitignore === "y" || shouldAddGitignore === "yes") {
|
|
29
|
-
const gitignoreResult =
|
|
29
|
+
const gitignoreResult = _chunkCAZONSXVjs.FileManager.addToGitignore(
|
|
30
30
|
"prompts/.materialized"
|
|
31
31
|
);
|
|
32
32
|
if (gitignoreResult.added) {
|
|
@@ -58,13 +58,13 @@ var initializeProject = async () => {
|
|
|
58
58
|
} else {
|
|
59
59
|
console.log(_chalk2.default.gray(`\u2022 prompts.json already exists`));
|
|
60
60
|
}
|
|
61
|
-
const lockResult =
|
|
61
|
+
const lockResult = _chunkCAZONSXVjs.FileManager.initializePromptsLock();
|
|
62
62
|
if (lockResult.created) {
|
|
63
63
|
console.log(_chalk2.default.green(`\u2713 Created ${_chalk2.default.gray("./prompts-lock.json")}`));
|
|
64
64
|
} else {
|
|
65
65
|
console.log(_chalk2.default.gray(`\u2022 prompts-lock.json already exists`));
|
|
66
66
|
}
|
|
67
|
-
|
|
67
|
+
_chunkCAZONSXVjs.FileManager.ensureDirectories();
|
|
68
68
|
console.log(
|
|
69
69
|
_chalk2.default.green(`\u2713 Created ${_chalk2.default.gray("./prompts/")} directory structure`)
|
|
70
70
|
);
|
|
@@ -74,7 +74,7 @@ var initializeProject = async () => {
|
|
|
74
74
|
console.log(_chalk2.default.gray(" langwatch prompt add <name>"));
|
|
75
75
|
};
|
|
76
76
|
var ensureProjectInitialized = async (shouldPromptForGitignore = true) => {
|
|
77
|
-
const configResult =
|
|
77
|
+
const configResult = _chunkCAZONSXVjs.FileManager.initializePromptsConfig();
|
|
78
78
|
let askedAboutGitignore = false;
|
|
79
79
|
if (configResult.created) {
|
|
80
80
|
console.log(_chalk2.default.green(`\u2713 Created ${_chalk2.default.gray("./prompts.json")}`));
|
|
@@ -84,7 +84,7 @@ var ensureProjectInitialized = async (shouldPromptForGitignore = true) => {
|
|
|
84
84
|
_chalk2.default.yellow("Add 'prompts/.materialized' to .gitignore? [Y/n]: ")
|
|
85
85
|
);
|
|
86
86
|
if (shouldAddGitignore === "" || shouldAddGitignore === "y" || shouldAddGitignore === "yes") {
|
|
87
|
-
const gitignoreResult =
|
|
87
|
+
const gitignoreResult = _chunkCAZONSXVjs.FileManager.addToGitignore(
|
|
88
88
|
"prompts/.materialized"
|
|
89
89
|
);
|
|
90
90
|
if (gitignoreResult.added) {
|
|
@@ -115,11 +115,11 @@ var ensureProjectInitialized = async (shouldPromptForGitignore = true) => {
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
const lockResult =
|
|
118
|
+
const lockResult = _chunkCAZONSXVjs.FileManager.initializePromptsLock();
|
|
119
119
|
if (lockResult.created) {
|
|
120
120
|
console.log(_chalk2.default.green(`\u2713 Created ${_chalk2.default.gray("./prompts-lock.json")}`));
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
_chunkCAZONSXVjs.FileManager.ensureDirectories();
|
|
123
123
|
return {
|
|
124
124
|
configCreated: configResult.created,
|
|
125
125
|
lockCreated: lockResult.created
|
|
@@ -130,4 +130,4 @@ var ensureProjectInitialized = async (shouldPromptForGitignore = true) => {
|
|
|
130
130
|
|
|
131
131
|
|
|
132
132
|
exports.initializeProject = initializeProject; exports.ensureProjectInitialized = ensureProjectInitialized;
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-7OZKH5K2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-7OZKH5K2.js","../src/cli/utils/init.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACA;ACJA,uFAA0B;AAC1B,4EAAkB;AAGlB,IAAM,WAAA,EAAa,CAAC,QAAA,EAAA,GAAsC;AACxD,EAAA,MAAM,GAAA,EAAc,QAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,KAAA,EAAO,OAAA,CAAQ,KAAA;AAAA,IACf,MAAA,EAAQ,OAAA,CAAQ;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAA,GAAY;AAC9B,IAAA,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,CAAC,MAAA,EAAA,GAAW;AAChC,MAAA,EAAA,CAAG,KAAA,CAAM,CAAA;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,WAAA,CAAY,CAAC,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH,CAAA;AAEO,IAAM,kBAAA,EAAoB,MAAA,CAAA,EAAA,GAA2B;AAC1D,EAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAM,IAAA,CAAK,2CAA2C,CAAC,CAAA;AAGnE,EAAA,MAAM,aAAA,EAAe,4BAAA,CAAY,uBAAA,CAAwB,CAAA;AACzD,EAAA,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAM,KAAA,CAAM,CAAA,eAAA,EAAa,eAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAGhC,IAAA;AACkC,MAAA;AACnE,IAAA;AAKE,IAAA;AAEoC,MAAA;AAClC,QAAA;AACF,MAAA;AAC2B,MAAA;AACI,QAAA;AACnB,UAAA;AACA,YAAA;AACa,cAAA;AACf,gBAAA;AACD,cAAA;AACH,YAAA;AACF,UAAA;AACK,QAAA;AACG,UAAA;AACA,YAAA;AAC+B,cAAA;AACjC,gBAAA;AACD,cAAA;AACH,YAAA;AACF,UAAA;AACF,QAAA;AACK,MAAA;AACG,QAAA;AACA,UAAA;AACoC,YAAA;AAC1C,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACK,EAAA;AACkD,IAAA;AACzD,EAAA;AAGqD,EAAA;AAC7B,EAAA;AAC0B,IAAA;AAC3C,EAAA;AACuD,IAAA;AAC9D,EAAA;AAG8B,EAAA;AACtB,EAAA;AAC2C,IAAA;AACnD,EAAA;AAEQ,EAAA;AACM,IAAA;AACd,EAAA;AACuD,EAAA;AACzD;AAIgE;AAEL,EAAA;AAC/B,EAAA;AAEA,EAAA;AACyC,IAAA;AAGX,IAAA;AAC9B,MAAA;AACW,MAAA;AACkC,QAAA;AACnE,MAAA;AAKE,MAAA;AAEoC,QAAA;AAClC,UAAA;AACF,QAAA;AAC2B,QAAA;AACI,UAAA;AACnB,YAAA;AACA,cAAA;AACa,gBAAA;AACf,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACK,UAAA;AACG,YAAA;AACA,cAAA;AAC+B,gBAAA;AACjC,kBAAA;AACD,gBAAA;AACH,cAAA;AACF,YAAA;AACF,UAAA;AACK,QAAA;AACG,UAAA;AACA,YAAA;AACoC,cAAA;AAC1C,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAGqD,EAAA;AAC7B,EAAA;AAC0B,IAAA;AAClD,EAAA;AAG8B,EAAA;AAEvB,EAAA;AACuB,IAAA;AACJ,IAAA;AAC1B,EAAA;AACF;AD7B2E;AACA;AACA;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-7OZKH5K2.js","sourcesContent":[null,"import * as readline from \"readline\";\nimport chalk from \"chalk\";\nimport { FileManager } from \"./fileManager\";\n\nconst promptUser = (question: string): Promise<string> => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase());\n });\n });\n};\n\nexport const initializeProject = async (): Promise<void> => {\n console.log(chalk.blue(\"Initializing LangWatch prompts project...\"));\n\n // Initialize prompts.json\n const configResult = FileManager.initializePromptsConfig();\n if (configResult.created) {\n console.log(chalk.green(`✓ Created ${chalk.gray(\"./prompts.json\")}`));\n\n // Ask about .gitignore\n const shouldAddGitignore = await promptUser(\n chalk.yellow(\"Add 'prompts/.materialized' to .gitignore? [Y/n]: \"),\n );\n\n if (\n shouldAddGitignore === \"\" ||\n shouldAddGitignore === \"y\" ||\n shouldAddGitignore === \"yes\"\n ) {\n const gitignoreResult = FileManager.addToGitignore(\n \"prompts/.materialized\",\n );\n if (gitignoreResult.added) {\n if (gitignoreResult.existed) {\n console.log(\n chalk.green(\n `✓ Added ${chalk.gray(\n \"prompts/.materialized\",\n )} to existing .gitignore`,\n ),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Created .gitignore with ${chalk.gray(\n \"prompts/.materialized\",\n )}`,\n ),\n );\n }\n } else {\n console.log(\n chalk.gray(\n `• ${chalk.gray(\"prompts/.materialized\")} already in .gitignore`,\n ),\n );\n }\n }\n } else {\n console.log(chalk.gray(`• prompts.json already exists`));\n }\n\n // Initialize lock file\n const lockResult = FileManager.initializePromptsLock();\n if (lockResult.created) {\n console.log(chalk.green(`✓ Created ${chalk.gray(\"./prompts-lock.json\")}`));\n } else {\n console.log(chalk.gray(`• prompts-lock.json already exists`));\n }\n\n // Ensure directories exist\n FileManager.ensureDirectories();\n console.log(\n chalk.green(`✓ Created ${chalk.gray(\"./prompts/\")} directory structure`),\n );\n\n console.log(\n chalk.green(\"\\n✨ Project initialized! You can now add prompts with:\"),\n );\n console.log(chalk.gray(\" langwatch prompt add <name>\"));\n};\n\nexport const ensureProjectInitialized = async (\n shouldPromptForGitignore = true,\n): Promise<{ configCreated: boolean; lockCreated: boolean }> => {\n // Initialize prompts.json\n const configResult = FileManager.initializePromptsConfig();\n let askedAboutGitignore = false;\n\n if (configResult.created) {\n console.log(chalk.green(`✓ Created ${chalk.gray(\"./prompts.json\")}`));\n\n // Ask about .gitignore only if we should prompt and haven't asked yet\n if (shouldPromptForGitignore && !askedAboutGitignore) {\n askedAboutGitignore = true;\n const shouldAddGitignore = await promptUser(\n chalk.yellow(\"Add 'prompts/.materialized' to .gitignore? [Y/n]: \"),\n );\n\n if (\n shouldAddGitignore === \"\" ||\n shouldAddGitignore === \"y\" ||\n shouldAddGitignore === \"yes\"\n ) {\n const gitignoreResult = FileManager.addToGitignore(\n \"prompts/.materialized\",\n );\n if (gitignoreResult.added) {\n if (gitignoreResult.existed) {\n console.log(\n chalk.green(\n `✓ Added ${chalk.gray(\n \"prompts/.materialized\",\n )} to existing .gitignore`,\n ),\n );\n } else {\n console.log(\n chalk.green(\n `✓ Created .gitignore with ${chalk.gray(\n \"prompts/.materialized\",\n )}`,\n ),\n );\n }\n } else {\n console.log(\n chalk.gray(\n `• ${chalk.gray(\"prompts/.materialized\")} already in .gitignore`,\n ),\n );\n }\n }\n }\n }\n\n // Initialize lock file\n const lockResult = FileManager.initializePromptsLock();\n if (lockResult.created) {\n console.log(chalk.green(`✓ Created ${chalk.gray(\"./prompts-lock.json\")}`));\n }\n\n // Ensure directories exist\n FileManager.ensureDirectories();\n\n return {\n configCreated: configResult.created,\n lockCreated: lockResult.created,\n };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AZHZ4NB4.js","../src/cli/types.ts"],"names":[],"mappings":"AAAA;ACAA,0BAAkB;AAcX,IAAM,wBAAA,EAA0B,MAAA,CACpC,MAAA,CAAO;AAAA,EACN,KAAA,EAAO,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,mBAAmB,CAAA;AAAA,EAC5C,eAAA,EAAiB,MAAA,CACd,MAAA,CAAO;AAAA,IACN,WAAA,EAAa,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,IACjC,UAAA,EAAY,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AAAA,EAClC,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,CACN,QAAA,CAAS,CAAA;AAAA,EACZ,QAAA,EAAU,MAAA,CACP,KAAA;AAAA,IACC,MAAA,CACG,MAAA,CAAO;AAAA,MACN,IAAA,EAAM,MAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,MAC5C,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,iCAAiC;AAAA,IAC9D,CAAC,CAAA,CACA,KAAA,CAAM;AAAA,EACX,CAAA,CACC,GAAA,CAAI,CAAA,EAAG,kCAAkC;AAC9C,CAAC,CAAA,CACA,KAAA,CAAM,CAAA;AA0CF,IAAM,gBAAA,EAAkB,CAC7B,IAAA,EAAA,GACsC;AACtC,EAAA,MAAM,QAAA,EAAU,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,GAAA,CAAI,QAAA,IAAY,CAAA,CAAA,EAAI;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA;AAClC,EAAA,MAAM,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,CAAC,CAAA;AAEtC,EAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,CAAC,OAAA,EAAS;AACrB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,IAAI,CAAA,0CAAA;AAAA,IACvC,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAQ,CAAA;AACzB,CAAA;ADlEA;AACA;AACE;AACA;AACF,qGAAC","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-AZHZ4NB4.js","sourcesContent":[null,"import { z } from \"zod\";\n\nexport type PromptDependency =\n | string\n | {\n version?: string;\n file?: string;\n };\n\nexport type PromptsConfig = {\n prompts: Record<string, PromptDependency>;\n};\n\n// Zod schema for local prompt config with permissive validation\nexport const localPromptConfigSchema = z\n .object({\n model: z.string().min(1, \"Model is required\"),\n modelParameters: z\n .object({\n temperature: z.number().optional(),\n max_tokens: z.number().optional(),\n })\n .loose()\n .optional(),\n messages: z\n .array(\n z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().min(1, \"Message content cannot be empty\"),\n })\n .loose(),\n )\n .min(1, \"At least one message is required\"),\n })\n .loose();\n\nexport type LocalPromptConfig = z.infer<typeof localPromptConfigSchema>;\n\nexport type MaterializedPrompt = {\n id: string;\n name: string;\n version: number;\n versionId: string;\n model: string;\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n prompt: string;\n temperature?: number;\n maxTokens?: number;\n inputs?: any;\n outputs?: any;\n updatedAt: string;\n};\n\nexport type SyncResult = {\n fetched: Array<{ name: string; version: number; versionSpec: string }>;\n pushed: Array<{ name: string; version: number }>;\n unchanged: string[];\n cleaned: string[];\n errors: Array<{ name: string; error: string }>;\n};\n\nexport type PromptsLockEntry = {\n version: number;\n versionId: string;\n materialized: string;\n};\n\nexport type PromptsLock = {\n lockfileVersion: number;\n prompts: Record<string, PromptsLockEntry>;\n};\n\n// Parse npm-style version specifications like \"foo@latest\" or \"bar@5\"\nexport const parsePromptSpec = (\n spec: string,\n): { name: string; version: string } => {\n const atIndex = spec.lastIndexOf(\"@\");\n if (atIndex === -1) {\n return { name: spec, version: \"latest\" };\n }\n\n const name = spec.slice(0, atIndex);\n const version = spec.slice(atIndex + 1);\n\n if (!name || !version) {\n throw new Error(\n `Invalid prompt specification: ${spec}. Use format 'name@version' or just 'name'`,\n );\n }\n\n return { name, version };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/types.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type PromptDependency =\n | string\n | {\n version?: string;\n file?: string;\n };\n\nexport type PromptsConfig = {\n prompts: Record<string, PromptDependency>;\n};\n\n// Zod schema for local prompt config with permissive validation\nexport const localPromptConfigSchema = z\n .object({\n model: z.string().min(1, \"Model is required\"),\n modelParameters: z\n .object({\n temperature: z.number().optional(),\n max_tokens: z.number().optional(),\n })\n .loose()\n .optional(),\n messages: z\n .array(\n z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().min(1, \"Message content cannot be empty\"),\n })\n .loose(),\n )\n .min(1, \"At least one message is required\"),\n })\n .loose();\n\nexport type LocalPromptConfig = z.infer<typeof localPromptConfigSchema>;\n\nexport type MaterializedPrompt = {\n id: string;\n name: string;\n version: number;\n versionId: string;\n model: string;\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n prompt: string;\n temperature?: number;\n maxTokens?: number;\n inputs?: any;\n outputs?: any;\n updatedAt: string;\n};\n\nexport type SyncResult = {\n fetched: Array<{ name: string; version: number; versionSpec: string }>;\n pushed: Array<{ name: string; version: number }>;\n unchanged: string[];\n cleaned: string[];\n errors: Array<{ name: string; error: string }>;\n};\n\nexport type PromptsLockEntry = {\n version: number;\n versionId: string;\n materialized: string;\n};\n\nexport type PromptsLock = {\n lockfileVersion: number;\n prompts: Record<string, PromptsLockEntry>;\n};\n\n// Parse npm-style version specifications like \"foo@latest\" or \"bar@5\"\nexport const parsePromptSpec = (\n spec: string,\n): { name: string; version: string } => {\n const atIndex = spec.lastIndexOf(\"@\");\n if (atIndex === -1) {\n return { name: spec, version: \"latest\" };\n }\n\n const name = spec.slice(0, atIndex);\n const version = spec.slice(atIndex + 1);\n\n if (!name || !version) {\n throw new Error(\n `Invalid prompt specification: ${spec}. Use format 'name@version' or just 'name'`,\n );\n }\n\n return { name, version };\n};\n"],"mappings":";AAAA,SAAS,SAAS;AAcX,IAAM,0BAA0B,EACpC,OAAO;AAAA,EACN,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,mBAAmB;AAAA,EAC5C,iBAAiB,EACd,OAAO;AAAA,IACN,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC,EACA,MAAM,EACN,SAAS;AAAA,EACZ,UAAU,EACP;AAAA,IACC,EACG,OAAO;AAAA,MACN,MAAM,EAAE,KAAK,CAAC,UAAU,QAAQ,WAAW,CAAC;AAAA,MAC5C,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,iCAAiC;AAAA,IAC9D,CAAC,EACA,MAAM;AAAA,EACX,EACC,IAAI,GAAG,kCAAkC;AAC9C,CAAC,EACA,MAAM;AA0CF,IAAM,kBAAkB,CAC7B,SACsC;AACtC,QAAM,UAAU,KAAK,YAAY,GAAG;AACpC,MAAI,YAAY,IAAI;AAClB,WAAO,EAAE,MAAM,MAAM,SAAS,SAAS;AAAA,EACzC;AAEA,QAAM,OAAO,KAAK,MAAM,GAAG,OAAO;AAClC,QAAM,UAAU,KAAK,MAAM,UAAU,CAAC;AAEtC,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,UAAM,IAAI;AAAA,MACR,iCAAiC,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
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
|
|
3
|
+
var _chunkR6FBJN7Kjs = require('./chunk-R6FBJN7K.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkAZHZ4NB4js = require('./chunk-AZHZ4NB4.js');
|
|
7
7
|
|
|
8
8
|
// src/cli/utils/fileManager.ts
|
|
9
9
|
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
@@ -99,7 +99,7 @@ var FileManager = class {
|
|
|
99
99
|
try {
|
|
100
100
|
const content = fs.readFileSync(fullPath, "utf-8");
|
|
101
101
|
const rawData = yaml.load(content);
|
|
102
|
-
const result =
|
|
102
|
+
const result = _chunkAZHZ4NB4js.localPromptConfigSchema.safeParse(rawData);
|
|
103
103
|
if (!result.success) {
|
|
104
104
|
const prettyError = result.error.issues.map((issue) => `\u2716 ${issue.message}${issue.path.length > 0 ? `
|
|
105
105
|
\u2192 at ${issue.path.join(".")}` : ""}`).join("\n");
|
|
@@ -127,7 +127,7 @@ ${prettyError}`
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
const filePath = path.join(materializedDir, ...parts.slice(0, -1), fileName);
|
|
130
|
-
const yamlContent =
|
|
130
|
+
const yamlContent = _chunkR6FBJN7Kjs.PromptConverter.fromMaterializedToYaml(prompt);
|
|
131
131
|
const yamlString = yaml.dump(yamlContent, {
|
|
132
132
|
lineWidth: -1,
|
|
133
133
|
noRefs: true,
|
|
@@ -239,4 +239,4 @@ FileManager.MATERIALIZED_DIR = ".materialized";
|
|
|
239
239
|
|
|
240
240
|
|
|
241
241
|
exports.FileManager = FileManager;
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
242
|
+
//# sourceMappingURL=chunk-CAZONSXV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-P5F63PAW.js","../src/cli/utils/fileManager.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-P5F63PAW.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"js-yaml\";\nimport chalk from \"chalk\";\nimport type { PromptsConfig, LocalPromptConfig, MaterializedPrompt, PromptsLock } from \"../types\";\nimport { localPromptConfigSchema } from \"../types\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\n\nexport class FileManager {\n private static readonly PROMPTS_CONFIG_FILE = \"prompts.json\";\n private static readonly PROMPTS_LOCK_FILE = \"prompts-lock.json\";\n private static readonly PROMPTS_DIR = \"prompts\";\n private static readonly MATERIALIZED_DIR = \".materialized\";\n\n static getPromptsConfigPath(): string {\n return path.join(process.cwd(), this.PROMPTS_CONFIG_FILE);\n }\n\n static getPromptsLockPath(): string {\n return path.join(process.cwd(), this.PROMPTS_LOCK_FILE);\n }\n\n static getPromptsDir(): string {\n return path.join(process.cwd(), this.PROMPTS_DIR);\n }\n\n static getMaterializedDir(): string {\n return path.join(this.getPromptsDir(), this.MATERIALIZED_DIR);\n }\n\n static ensureDirectories(): void {\n const promptsDir = this.getPromptsDir();\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n if (!fs.existsSync(materializedDir)) {\n fs.mkdirSync(materializedDir, { recursive: true });\n }\n }\n\n static loadPromptsConfig(): PromptsConfig {\n const configPath = this.getPromptsConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { prompts: {} };\n }\n\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content) as PromptsConfig;\n } catch (error) {\n throw new Error(`Failed to parse prompts.json: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static savePromptsConfig(config: PromptsConfig): void {\n const configPath = this.getPromptsConfigPath();\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n }\n\n static initializePromptsConfig(): { created: boolean; path: string } {\n const configPath = this.getPromptsConfigPath();\n const existed = fs.existsSync(configPath);\n\n if (!existed) {\n const emptyConfig: PromptsConfig = { prompts: {} };\n this.savePromptsConfig(emptyConfig);\n return { created: true, path: configPath };\n }\n\n return { created: false, path: configPath };\n }\n\n static loadPromptsLock(): PromptsLock {\n const lockPath = this.getPromptsLockPath();\n\n if (!fs.existsSync(lockPath)) {\n return {\n lockfileVersion: 1,\n prompts: {}\n };\n }\n\n try {\n const content = fs.readFileSync(lockPath, \"utf-8\");\n return JSON.parse(content) as PromptsLock;\n } catch (error) {\n throw new Error(`Failed to parse prompts-lock.json: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static savePromptsLock(lock: PromptsLock): void {\n const lockPath = this.getPromptsLockPath();\n fs.writeFileSync(lockPath, JSON.stringify(lock, null, 2) + \"\\n\");\n }\n\n static initializePromptsLock(): { created: boolean; path: string } {\n const lockPath = this.getPromptsLockPath();\n const existed = fs.existsSync(lockPath);\n\n if (!existed) {\n const emptyLock: PromptsLock = {\n lockfileVersion: 1,\n prompts: {}\n };\n this.savePromptsLock(emptyLock);\n return { created: true, path: lockPath };\n }\n\n return { created: false, path: lockPath };\n }\n\n static loadLocalPrompt(filePath: string): LocalPromptConfig {\n const fullPath = path.resolve(filePath);\n\n if (!fs.existsSync(fullPath)) {\n throw new Error(`Local prompt file not found: ${filePath}`);\n }\n\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const rawData = yaml.load(content);\n\n // Validate with zod and provide nice error messages\n const result = localPromptConfigSchema.safeParse(rawData);\n\n if (!result.success) {\n // Format zod errors nicely (manually since z.prettifyError might not be available)\n const prettyError = result.error.issues\n .map(issue => `✖ ${issue.message}${issue.path.length > 0 ? `\\n → at ${issue.path.join('.')}` : ''}`)\n .join('\\n');\n\n throw new Error(\n `Invalid prompt configuration in ${chalk.yellow(filePath)}:\\n${prettyError}`\n );\n }\n\n return result.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Invalid prompt configuration\")) {\n throw error; // Re-throw zod validation errors as-is\n }\n throw new Error(`Failed to parse local prompt file ${filePath}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static saveMaterializedPrompt(name: string, prompt: MaterializedPrompt): string {\n const materializedDir = this.getMaterializedDir();\n const parts = name.split(\"/\");\n const fileName = `${parts[parts.length - 1]}.prompt.yaml`;\n\n // Create nested directories if needed\n if (parts.length > 1) {\n const subDir = path.join(materializedDir, ...parts.slice(0, -1));\n if (!fs.existsSync(subDir)) {\n fs.mkdirSync(subDir, { recursive: true });\n }\n }\n\n const filePath = path.join(materializedDir, ...parts.slice(0, -1), fileName);\n\n // Convert to YAML format using the converter\n const yamlContent = PromptConverter.fromMaterializedToYaml(prompt);\n\n const yamlString = yaml.dump(yamlContent, {\n lineWidth: -1,\n noRefs: true,\n sortKeys: false\n });\n\n fs.writeFileSync(filePath, yamlString);\n return filePath;\n }\n\n static getLocalPromptFiles(): string[] {\n const promptsDir = this.getPromptsDir();\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(promptsDir)) {\n return [];\n }\n\n const files: string[] = [];\n\n const walkDir = (dir: string, relativePath = \"\"): void => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip the .materialized directory\n if (fullPath === materializedDir) {\n continue;\n }\n walkDir(fullPath, relativeFilePath);\n } else if (entry.isFile() && entry.name.endsWith(\".prompt.yaml\")) {\n files.push(path.join(promptsDir, relativeFilePath));\n }\n }\n };\n\n walkDir(promptsDir);\n return files;\n }\n\n static promptNameFromPath(filePath: string): string {\n const promptsDir = this.getPromptsDir();\n const relativePath = path.relative(promptsDir, filePath);\n return relativePath.replace(/\\.prompt\\.yaml$/, \"\");\n }\n\n static cleanupOrphanedMaterializedFiles(currentDependencies: Set<string>): string[] {\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(materializedDir)) {\n return [];\n }\n\n const cleaned: string[] = [];\n\n const cleanupDir = (dir: string, relativePath = \"\"): void => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n cleanupDir(fullPath, relativeFilePath);\n\n // Remove empty directories\n try {\n const dirEntries = fs.readdirSync(fullPath);\n if (dirEntries.length === 0) {\n fs.rmdirSync(fullPath);\n }\n } catch {\n // Directory not empty or other error, ignore\n }\n } else if (entry.isFile() && entry.name.endsWith(\".prompt.yaml\")) {\n // Extract prompt name from materialized file path\n const promptName = relativeFilePath.replace(/\\.prompt\\.yaml$/, \"\");\n\n if (!currentDependencies.has(promptName)) {\n fs.unlinkSync(fullPath);\n cleaned.push(promptName);\n }\n }\n }\n };\n\n cleanupDir(materializedDir);\n return cleaned;\n }\n\n static updateLockEntry(lock: PromptsLock, name: string, prompt: MaterializedPrompt, materializedPath: string): void {\n const relativePath = path.relative(process.cwd(), materializedPath);\n\n lock.prompts[name] = {\n version: prompt.version,\n versionId: prompt.versionId,\n materialized: relativePath,\n };\n }\n\n static removeFromLock(lock: PromptsLock, names: string[]): void {\n for (const name of names) {\n delete lock.prompts[name];\n }\n }\n\n static addToGitignore(entry: string): { added: boolean; existed: boolean } {\n const gitignorePath = path.join(process.cwd(), \".gitignore\");\n\n // Check if .gitignore exists\n if (!fs.existsSync(gitignorePath)) {\n // Create new .gitignore with the entry\n fs.writeFileSync(gitignorePath, `${entry}\\n`);\n return { added: true, existed: false };\n }\n\n // Read existing .gitignore\n const content = fs.readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map(line => line.trim());\n\n // Check if entry already exists\n if (lines.includes(entry)) {\n return { added: false, existed: true };\n }\n\n // Add entry to .gitignore\n const newContent = content.endsWith(\"\\n\") ? `${content}${entry}\\n` : `${content}\\n${entry}\\n`;\n fs.writeFileSync(gitignorePath, newContent);\n\n return { added: true, existed: false };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-CAZONSXV.js","../src/cli/utils/fileManager.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-CAZONSXV.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"js-yaml\";\nimport chalk from \"chalk\";\nimport type { PromptsConfig, LocalPromptConfig, MaterializedPrompt, PromptsLock } from \"../types\";\nimport { localPromptConfigSchema } from \"../types\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\n\nexport class FileManager {\n private static readonly PROMPTS_CONFIG_FILE = \"prompts.json\";\n private static readonly PROMPTS_LOCK_FILE = \"prompts-lock.json\";\n private static readonly PROMPTS_DIR = \"prompts\";\n private static readonly MATERIALIZED_DIR = \".materialized\";\n\n static getPromptsConfigPath(): string {\n return path.join(process.cwd(), this.PROMPTS_CONFIG_FILE);\n }\n\n static getPromptsLockPath(): string {\n return path.join(process.cwd(), this.PROMPTS_LOCK_FILE);\n }\n\n static getPromptsDir(): string {\n return path.join(process.cwd(), this.PROMPTS_DIR);\n }\n\n static getMaterializedDir(): string {\n return path.join(this.getPromptsDir(), this.MATERIALIZED_DIR);\n }\n\n static ensureDirectories(): void {\n const promptsDir = this.getPromptsDir();\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(promptsDir)) {\n fs.mkdirSync(promptsDir, { recursive: true });\n }\n\n if (!fs.existsSync(materializedDir)) {\n fs.mkdirSync(materializedDir, { recursive: true });\n }\n }\n\n static loadPromptsConfig(): PromptsConfig {\n const configPath = this.getPromptsConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { prompts: {} };\n }\n\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content) as PromptsConfig;\n } catch (error) {\n throw new Error(`Failed to parse prompts.json: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static savePromptsConfig(config: PromptsConfig): void {\n const configPath = this.getPromptsConfigPath();\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n }\n\n static initializePromptsConfig(): { created: boolean; path: string } {\n const configPath = this.getPromptsConfigPath();\n const existed = fs.existsSync(configPath);\n\n if (!existed) {\n const emptyConfig: PromptsConfig = { prompts: {} };\n this.savePromptsConfig(emptyConfig);\n return { created: true, path: configPath };\n }\n\n return { created: false, path: configPath };\n }\n\n static loadPromptsLock(): PromptsLock {\n const lockPath = this.getPromptsLockPath();\n\n if (!fs.existsSync(lockPath)) {\n return {\n lockfileVersion: 1,\n prompts: {}\n };\n }\n\n try {\n const content = fs.readFileSync(lockPath, \"utf-8\");\n return JSON.parse(content) as PromptsLock;\n } catch (error) {\n throw new Error(`Failed to parse prompts-lock.json: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static savePromptsLock(lock: PromptsLock): void {\n const lockPath = this.getPromptsLockPath();\n fs.writeFileSync(lockPath, JSON.stringify(lock, null, 2) + \"\\n\");\n }\n\n static initializePromptsLock(): { created: boolean; path: string } {\n const lockPath = this.getPromptsLockPath();\n const existed = fs.existsSync(lockPath);\n\n if (!existed) {\n const emptyLock: PromptsLock = {\n lockfileVersion: 1,\n prompts: {}\n };\n this.savePromptsLock(emptyLock);\n return { created: true, path: lockPath };\n }\n\n return { created: false, path: lockPath };\n }\n\n static loadLocalPrompt(filePath: string): LocalPromptConfig {\n const fullPath = path.resolve(filePath);\n\n if (!fs.existsSync(fullPath)) {\n throw new Error(`Local prompt file not found: ${filePath}`);\n }\n\n try {\n const content = fs.readFileSync(fullPath, \"utf-8\");\n const rawData = yaml.load(content);\n\n // Validate with zod and provide nice error messages\n const result = localPromptConfigSchema.safeParse(rawData);\n\n if (!result.success) {\n // Format zod errors nicely (manually since z.prettifyError might not be available)\n const prettyError = result.error.issues\n .map(issue => `✖ ${issue.message}${issue.path.length > 0 ? `\\n → at ${issue.path.join('.')}` : ''}`)\n .join('\\n');\n\n throw new Error(\n `Invalid prompt configuration in ${chalk.yellow(filePath)}:\\n${prettyError}`\n );\n }\n\n return result.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Invalid prompt configuration\")) {\n throw error; // Re-throw zod validation errors as-is\n }\n throw new Error(`Failed to parse local prompt file ${filePath}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n }\n\n static saveMaterializedPrompt(name: string, prompt: MaterializedPrompt): string {\n const materializedDir = this.getMaterializedDir();\n const parts = name.split(\"/\");\n const fileName = `${parts[parts.length - 1]}.prompt.yaml`;\n\n // Create nested directories if needed\n if (parts.length > 1) {\n const subDir = path.join(materializedDir, ...parts.slice(0, -1));\n if (!fs.existsSync(subDir)) {\n fs.mkdirSync(subDir, { recursive: true });\n }\n }\n\n const filePath = path.join(materializedDir, ...parts.slice(0, -1), fileName);\n\n // Convert to YAML format using the converter\n const yamlContent = PromptConverter.fromMaterializedToYaml(prompt);\n\n const yamlString = yaml.dump(yamlContent, {\n lineWidth: -1,\n noRefs: true,\n sortKeys: false\n });\n\n fs.writeFileSync(filePath, yamlString);\n return filePath;\n }\n\n static getLocalPromptFiles(): string[] {\n const promptsDir = this.getPromptsDir();\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(promptsDir)) {\n return [];\n }\n\n const files: string[] = [];\n\n const walkDir = (dir: string, relativePath = \"\"): void => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip the .materialized directory\n if (fullPath === materializedDir) {\n continue;\n }\n walkDir(fullPath, relativeFilePath);\n } else if (entry.isFile() && entry.name.endsWith(\".prompt.yaml\")) {\n files.push(path.join(promptsDir, relativeFilePath));\n }\n }\n };\n\n walkDir(promptsDir);\n return files;\n }\n\n static promptNameFromPath(filePath: string): string {\n const promptsDir = this.getPromptsDir();\n const relativePath = path.relative(promptsDir, filePath);\n return relativePath.replace(/\\.prompt\\.yaml$/, \"\");\n }\n\n static cleanupOrphanedMaterializedFiles(currentDependencies: Set<string>): string[] {\n const materializedDir = this.getMaterializedDir();\n\n if (!fs.existsSync(materializedDir)) {\n return [];\n }\n\n const cleaned: string[] = [];\n\n const cleanupDir = (dir: string, relativePath = \"\"): void => {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativeFilePath = path.join(relativePath, entry.name);\n\n if (entry.isDirectory()) {\n cleanupDir(fullPath, relativeFilePath);\n\n // Remove empty directories\n try {\n const dirEntries = fs.readdirSync(fullPath);\n if (dirEntries.length === 0) {\n fs.rmdirSync(fullPath);\n }\n } catch {\n // Directory not empty or other error, ignore\n }\n } else if (entry.isFile() && entry.name.endsWith(\".prompt.yaml\")) {\n // Extract prompt name from materialized file path\n const promptName = relativeFilePath.replace(/\\.prompt\\.yaml$/, \"\");\n\n if (!currentDependencies.has(promptName)) {\n fs.unlinkSync(fullPath);\n cleaned.push(promptName);\n }\n }\n }\n };\n\n cleanupDir(materializedDir);\n return cleaned;\n }\n\n static updateLockEntry(lock: PromptsLock, name: string, prompt: MaterializedPrompt, materializedPath: string): void {\n const relativePath = path.relative(process.cwd(), materializedPath);\n\n lock.prompts[name] = {\n version: prompt.version,\n versionId: prompt.versionId,\n materialized: relativePath,\n };\n }\n\n static removeFromLock(lock: PromptsLock, names: string[]): void {\n for (const name of names) {\n delete lock.prompts[name];\n }\n }\n\n static addToGitignore(entry: string): { added: boolean; existed: boolean } {\n const gitignorePath = path.join(process.cwd(), \".gitignore\");\n\n // Check if .gitignore exists\n if (!fs.existsSync(gitignorePath)) {\n // Create new .gitignore with the entry\n fs.writeFileSync(gitignorePath, `${entry}\\n`);\n return { added: true, existed: false };\n }\n\n // Read existing .gitignore\n const content = fs.readFileSync(gitignorePath, \"utf-8\");\n const lines = content.split(\"\\n\").map(line => line.trim());\n\n // Check if entry already exists\n if (lines.includes(entry)) {\n return { added: false, existed: true };\n }\n\n // Add entry to .gitignore\n const newContent = content.endsWith(\"\\n\") ? `${content}${entry}\\n` : `${content}\\n${entry}\\n`;\n fs.writeFileSync(gitignorePath, newContent);\n\n return { added: true, existed: false };\n }\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PromptConverter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-V5M3HUBV.mjs";
|
|
4
4
|
import {
|
|
5
5
|
localPromptConfigSchema
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BTBSMJTY.mjs";
|
|
7
7
|
|
|
8
8
|
// src/cli/utils/fileManager.ts
|
|
9
9
|
import * as fs from "fs";
|
|
@@ -239,4 +239,4 @@ FileManager.MATERIALIZED_DIR = ".materialized";
|
|
|
239
239
|
export {
|
|
240
240
|
FileManager
|
|
241
241
|
};
|
|
242
|
-
//# sourceMappingURL=chunk-
|
|
242
|
+
//# sourceMappingURL=chunk-CKVDNVFL.mjs.map
|