langwatch 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/{add-SV662KZU.js → add-CGTO6GC2.js} +65 -40
- package/dist/add-CGTO6GC2.js.map +1 -0
- package/dist/{add-SMYALCQG.mjs → add-XCI65PVN.mjs} +53 -28
- package/dist/add-XCI65PVN.mjs.map +1 -0
- package/dist/{chunk-NVKMXXNP.js → chunk-2GYC6KEA.js} +32 -32
- package/dist/{chunk-NVKMXXNP.js.map → chunk-2GYC6KEA.js.map} +1 -1
- package/dist/{chunk-P5F63PAW.js → chunk-36XAYVMC.js} +186 -76
- package/dist/chunk-36XAYVMC.js.map +1 -0
- package/dist/{chunk-ENSRDEDA.mjs → chunk-3P4ROGZJ.mjs} +4 -4
- package/dist/{chunk-K4ICRI7W.mjs → chunk-AD7QRYIJ.mjs} +2 -2
- 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-DISMHYXC.js → chunk-CKIZDPIJ.js} +24 -22
- package/dist/chunk-CKIZDPIJ.js.map +1 -0
- package/dist/{chunk-ZZLIF3DE.js → chunk-DZH6SY3Z.js} +10 -10
- package/dist/{chunk-ZZLIF3DE.js.map → chunk-DZH6SY3Z.js.map} +1 -1
- package/dist/{chunk-N2V6J3U2.mjs → chunk-FEL5FLHA.mjs} +2 -2
- package/dist/{chunk-5ZKAT4KI.mjs → chunk-GAFUPYJ3.mjs} +336 -162
- package/dist/chunk-GAFUPYJ3.mjs.map +1 -0
- package/dist/{chunk-NFM6RB4R.js → chunk-HVW45GST.js} +347 -173
- package/dist/chunk-HVW45GST.js.map +1 -0
- package/dist/{chunk-YNQ44U6D.mjs → chunk-I2SOBPAF.mjs} +23 -21
- package/dist/chunk-I2SOBPAF.mjs.map +1 -0
- package/dist/{chunk-ILTCLEIF.js → chunk-J7B7BNDN.js} +17 -17
- package/dist/chunk-J7B7BNDN.js.map +1 -0
- package/dist/{chunk-VILW5FYO.mjs → chunk-JPWKINZP.mjs} +8 -8
- package/dist/{chunk-VILW5FYO.mjs.map → chunk-JPWKINZP.mjs.map} +1 -1
- package/dist/{chunk-OXBO24RB.js → chunk-OHM7JUMR.js} +15 -2
- package/dist/chunk-OHM7JUMR.js.map +1 -0
- package/dist/chunk-PYVDTUA6.mjs +352 -0
- package/dist/chunk-PYVDTUA6.mjs.map +1 -0
- package/dist/{chunk-YH5TIVK2.js → chunk-SNDTNU3T.js} +2 -2
- package/dist/{chunk-YH5TIVK2.js.map → chunk-SNDTNU3T.js.map} +1 -1
- package/dist/{chunk-CU3443HD.mjs → chunk-URTD2WOC.mjs} +14 -1
- package/dist/{chunk-CAVBDSBT.mjs → chunk-WOBPYIKO.mjs} +2 -2
- package/dist/chunk-WOBPYIKO.mjs.map +1 -0
- package/dist/{chunk-VI5NJ53L.js → chunk-Z3NTWVVA.js} +2 -2
- package/dist/chunk-Z3NTWVVA.js.map +1 -0
- package/dist/cli/index.js +10 -10
- package/dist/cli/index.mjs +9 -9
- package/dist/{create-BHWZP6YD.mjs → create-LXQB4EFB.mjs} +22 -12
- package/dist/create-LXQB4EFB.mjs.map +1 -0
- package/dist/{create-GUY3HZM2.js → create-S5RDGF3H.js} +27 -17
- package/dist/create-S5RDGF3H.js.map +1 -0
- package/dist/{implementation--7B7PUww.d.ts → implementation-DsHp9FYU.d.ts} +1 -1
- package/dist/{implementation-D7LzdQop.d.mts → implementation-nE9dgTwc.d.mts} +1 -1
- package/dist/{index-DTEZr0Jn.d.mts → index-D7rKIGrO.d.mts} +12 -12
- package/dist/{index-DTEZr0Jn.d.ts → index-D7rKIGrO.d.ts} +12 -12
- package/dist/index.d.mts +256 -11
- package/dist/index.d.ts +256 -11
- package/dist/index.js +135 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +133 -10
- package/dist/index.mjs.map +1 -1
- package/dist/init-T4YDPHBA.mjs +15 -0
- package/dist/{init-RDW2F4G3.mjs.map → init-T4YDPHBA.mjs.map} +1 -1
- package/dist/init-UADBKUJU.js +15 -0
- package/dist/init-UADBKUJU.js.map +1 -0
- package/dist/{list-GZGLSJ52.js → list-GRKVAGJS.js} +14 -15
- package/dist/list-GRKVAGJS.js.map +1 -0
- package/dist/{list-32BRZ6RS.mjs → list-XHXVFN24.mjs} +13 -14
- package/dist/list-XHXVFN24.mjs.map +1 -0
- package/dist/{login-IAP4RFUM.js → login-4GWM5I6F.js} +4 -4
- package/dist/{login-IAP4RFUM.js.map → login-4GWM5I6F.js.map} +1 -1
- package/dist/{login-VXLW2OXR.mjs → login-EKE7SFN3.mjs} +3 -3
- package/dist/observability-sdk/index.d.mts +4 -3
- package/dist/observability-sdk/index.d.ts +4 -3
- package/dist/observability-sdk/index.js +7 -7
- package/dist/observability-sdk/index.mjs +6 -6
- package/dist/observability-sdk/instrumentation/langchain/index.d.mts +2 -1
- package/dist/observability-sdk/instrumentation/langchain/index.d.ts +2 -1
- package/dist/observability-sdk/instrumentation/langchain/index.js +19 -19
- package/dist/observability-sdk/instrumentation/langchain/index.mjs +3 -3
- package/dist/observability-sdk/setup/node/index.d.mts +2 -2
- package/dist/observability-sdk/setup/node/index.d.ts +2 -2
- package/dist/observability-sdk/setup/node/index.js +15 -15
- package/dist/observability-sdk/setup/node/index.mjs +4 -4
- package/dist/{remove-N3324KHS.js → remove-7EXB2Z6R.js} +18 -19
- package/dist/remove-7EXB2Z6R.js.map +1 -0
- package/dist/{remove-JUVM6M7G.mjs → remove-W44FQ5MF.mjs} +10 -11
- package/dist/{remove-JUVM6M7G.mjs.map → remove-W44FQ5MF.mjs.map} +1 -1
- package/dist/{sync-E32H3H52.js → sync-V7WRMNJV.js} +41 -40
- package/dist/sync-V7WRMNJV.js.map +1 -0
- package/dist/{sync-B4YK6QYX.mjs → sync-XGFABFAW.mjs} +28 -27
- package/dist/sync-XGFABFAW.mjs.map +1 -0
- package/dist/{types-D6Cs1385.d.ts → types-B9772cUR.d.ts} +146 -27
- package/dist/{types-D61S7yPU.d.mts → types-DbPAi4US.d.mts} +146 -27
- package/package.json +9 -7
- 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-7ZRAJ52N.mjs +0 -242
- package/dist/chunk-7ZRAJ52N.mjs.map +0 -1
- package/dist/chunk-CAVBDSBT.mjs.map +0 -1
- package/dist/chunk-DISMHYXC.js.map +0 -1
- package/dist/chunk-ILTCLEIF.js.map +0 -1
- package/dist/chunk-LXVDGQA4.mjs +0 -101
- package/dist/chunk-LXVDGQA4.mjs.map +0 -1
- package/dist/chunk-NFM6RB4R.js.map +0 -1
- package/dist/chunk-OXBO24RB.js.map +0 -1
- package/dist/chunk-P5F63PAW.js.map +0 -1
- package/dist/chunk-PUHM465C.js +0 -101
- package/dist/chunk-PUHM465C.js.map +0 -1
- package/dist/chunk-RBZNMZTF.mjs +0 -155
- package/dist/chunk-RBZNMZTF.mjs.map +0 -1
- package/dist/chunk-T7FQHOLK.js +0 -155
- package/dist/chunk-T7FQHOLK.js.map +0 -1
- package/dist/chunk-VI5NJ53L.js.map +0 -1
- package/dist/chunk-YNQ44U6D.mjs.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/init-OO2BUJ6V.js.map +0 -1
- package/dist/init-RDW2F4G3.mjs +0 -16
- package/dist/list-32BRZ6RS.mjs.map +0 -1
- package/dist/list-GZGLSJ52.js.map +0 -1
- package/dist/remove-N3324KHS.js.map +0 -1
- package/dist/sync-B4YK6QYX.mjs.map +0 -1
- package/dist/sync-E32H3H52.js.map +0 -1
- /package/dist/{chunk-ENSRDEDA.mjs.map → chunk-3P4ROGZJ.mjs.map} +0 -0
- /package/dist/{chunk-K4ICRI7W.mjs.map → chunk-AD7QRYIJ.mjs.map} +0 -0
- /package/dist/{chunk-N2V6J3U2.mjs.map → chunk-FEL5FLHA.mjs.map} +0 -0
- /package/dist/{chunk-CU3443HD.mjs.map → chunk-URTD2WOC.mjs.map} +0 -0
- /package/dist/{login-VXLW2OXR.mjs.map → login-EKE7SFN3.mjs.map} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as Logger } from '../../../index-
|
|
1
|
+
import { L as Logger } from '../../../index-D7rKIGrO.js';
|
|
2
2
|
import { Instrumentation } from '@opentelemetry/instrumentation';
|
|
3
3
|
import { SpanExporter, SpanProcessor, SpanLimits, Sampler, IdGenerator } from '@opentelemetry/sdk-trace-base';
|
|
4
4
|
import { ContextManager, TextMapPropagator } from '@opentelemetry/api';
|
|
@@ -58,7 +58,7 @@ interface SetupObservabilityOptions {
|
|
|
58
58
|
* LangWatch endpoint URL for sending traces and logs.
|
|
59
59
|
* Defaults to LANGWATCH_ENDPOINT environment variable or production endpoint.
|
|
60
60
|
*
|
|
61
|
-
* @default "https://
|
|
61
|
+
* @default "https://app.langwatch.ai"
|
|
62
62
|
* @default LANGWATCH_ENDPOINT environment variable
|
|
63
63
|
*/
|
|
64
64
|
endpoint?: string;
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunk2GYC6KEAjs = require('../../../chunk-2GYC6KEA.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkZ3NTWVVAjs = require('../../../chunk-Z3NTWVVA.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkCKIZDPIJjs = require('../../../chunk-CKIZDPIJ.js');
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
var
|
|
19
|
+
var _chunkOHM7JUMRjs = require('../../../chunk-OHM7JUMR.js');
|
|
20
20
|
|
|
21
21
|
// src/observability-sdk/setup/node/setup.ts
|
|
22
22
|
var _sdknode = require('@opentelemetry/sdk-node');
|
|
@@ -30,12 +30,12 @@ var _resources = require('@opentelemetry/resources');
|
|
|
30
30
|
var _incubating = require('@opentelemetry/semantic-conventions/incubating'); var semconv = _interopRequireWildcard(_incubating);
|
|
31
31
|
function createMergedResource(attributes, serviceName, givenResource) {
|
|
32
32
|
const langwatchResource = _resources.resourceFromAttributes.call(void 0, {
|
|
33
|
-
[semconv.ATTR_TELEMETRY_SDK_NAME]:
|
|
34
|
-
[semconv.ATTR_TELEMETRY_SDK_LANGUAGE]:
|
|
35
|
-
[semconv.ATTR_TELEMETRY_SDK_VERSION]:
|
|
33
|
+
[semconv.ATTR_TELEMETRY_SDK_NAME]: _chunkZ3NTWVVAjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
34
|
+
[semconv.ATTR_TELEMETRY_SDK_LANGUAGE]: _chunkZ3NTWVVAjs.LANGWATCH_SDK_LANGUAGE,
|
|
35
|
+
[semconv.ATTR_TELEMETRY_SDK_VERSION]: _chunkZ3NTWVVAjs.LANGWATCH_SDK_VERSION
|
|
36
36
|
});
|
|
37
|
-
const userResource = _resources.resourceFromAttributes.call(void 0,
|
|
38
|
-
[semconv.ATTR_SERVICE_NAME]: serviceName != null ? serviceName :
|
|
37
|
+
const userResource = _resources.resourceFromAttributes.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {
|
|
38
|
+
[semconv.ATTR_SERVICE_NAME]: serviceName != null ? serviceName : _chunkZ3NTWVVAjs.DEFAULT_SERVICE_NAME
|
|
39
39
|
}, attributes != null ? attributes : {}));
|
|
40
40
|
return (givenResource != null ? givenResource : _resources.defaultResource.call(void 0, )).merge(langwatchResource).merge(userResource);
|
|
41
41
|
}
|
|
@@ -89,7 +89,7 @@ var getLangWatchConfig = (options) => {
|
|
|
89
89
|
return {
|
|
90
90
|
disabled: isDisabled,
|
|
91
91
|
apiKey: isDisabled ? void 0 : (_a = config.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY,
|
|
92
|
-
endpoint: isDisabled ? void 0 : (_c = (_b = config.endpoint) != null ? _b : process.env.LANGWATCH_ENDPOINT) != null ? _c :
|
|
92
|
+
endpoint: isDisabled ? void 0 : (_c = (_b = config.endpoint) != null ? _b : process.env.LANGWATCH_ENDPOINT) != null ? _c : _chunkZ3NTWVVAjs.DEFAULT_ENDPOINT,
|
|
93
93
|
processorType: (_d = config.processorType) != null ? _d : "simple"
|
|
94
94
|
};
|
|
95
95
|
};
|
|
@@ -143,11 +143,11 @@ var warnIfMisconfigured = (options, langwatch, logger) => {
|
|
|
143
143
|
};
|
|
144
144
|
function setupObservability(options = {}) {
|
|
145
145
|
var _a, _b, _c, _d, _e;
|
|
146
|
-
const logger = (_d = (_a = options.debug) == null ? void 0 : _a.logger) != null ? _d : new (0,
|
|
146
|
+
const logger = (_d = (_a = options.debug) == null ? void 0 : _a.logger) != null ? _d : new (0, _chunkCKIZDPIJjs.ConsoleLogger)({
|
|
147
147
|
level: (_c = (_b = options.debug) == null ? void 0 : _b.logLevel) != null ? _c : "warn",
|
|
148
148
|
prefix: "LangWatch Observability SDK"
|
|
149
149
|
});
|
|
150
|
-
|
|
150
|
+
_chunkCKIZDPIJjs.initializeObservabilitySdkConfig.call(void 0, {
|
|
151
151
|
logger,
|
|
152
152
|
dataCapture: options.dataCapture
|
|
153
153
|
});
|
|
@@ -196,11 +196,11 @@ function createAndStartNodeSdk(options, logger, resource) {
|
|
|
196
196
|
logger.debug("Console recording of logs enabled; adding console log record processor");
|
|
197
197
|
}
|
|
198
198
|
if (!langwatch.disabled) {
|
|
199
|
-
const traceExporter = new (0,
|
|
199
|
+
const traceExporter = new (0, _chunk2GYC6KEAjs.LangWatchTraceExporter)({
|
|
200
200
|
apiKey: langwatch.apiKey,
|
|
201
201
|
endpoint: langwatch.endpoint
|
|
202
202
|
});
|
|
203
|
-
const logExporter = new (0,
|
|
203
|
+
const logExporter = new (0, _chunk2GYC6KEAjs.LangWatchLogsExporter)({
|
|
204
204
|
apiKey: langwatch.apiKey,
|
|
205
205
|
endpoint: langwatch.endpoint
|
|
206
206
|
});
|
|
@@ -253,7 +253,7 @@ function createAndStartNodeSdk(options, logger, resource) {
|
|
|
253
253
|
sdk.start();
|
|
254
254
|
logger.info("NodeSDK started successfully");
|
|
255
255
|
if (loggerProvider) {
|
|
256
|
-
|
|
256
|
+
_chunk2GYC6KEAjs.setLangWatchLoggerProvider.call(void 0, loggerProvider);
|
|
257
257
|
logger.debug("Set LangWatch logger provider");
|
|
258
258
|
}
|
|
259
259
|
if (!((_e = options.advanced) == null ? void 0 : _e.disableAutoShutdown)) {
|
|
@@ -2,21 +2,21 @@ import {
|
|
|
2
2
|
LangWatchLogsExporter,
|
|
3
3
|
LangWatchTraceExporter,
|
|
4
4
|
setLangWatchLoggerProvider
|
|
5
|
-
} from "../../../chunk-
|
|
5
|
+
} from "../../../chunk-3P4ROGZJ.mjs";
|
|
6
6
|
import {
|
|
7
7
|
DEFAULT_ENDPOINT,
|
|
8
8
|
DEFAULT_SERVICE_NAME,
|
|
9
9
|
LANGWATCH_SDK_LANGUAGE,
|
|
10
10
|
LANGWATCH_SDK_NAME_OBSERVABILITY,
|
|
11
11
|
LANGWATCH_SDK_VERSION
|
|
12
|
-
} from "../../../chunk-
|
|
12
|
+
} from "../../../chunk-WOBPYIKO.mjs";
|
|
13
13
|
import {
|
|
14
14
|
ConsoleLogger,
|
|
15
15
|
initializeObservabilitySdkConfig
|
|
16
|
-
} from "../../../chunk-
|
|
16
|
+
} from "../../../chunk-I2SOBPAF.mjs";
|
|
17
17
|
import {
|
|
18
18
|
__spreadValues
|
|
19
|
-
} from "../../../chunk-
|
|
19
|
+
} from "../../../chunk-URTD2WOC.mjs";
|
|
20
20
|
|
|
21
21
|
// src/observability-sdk/setup/node/setup.ts
|
|
22
22
|
import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
5
|
-
require('./chunk-
|
|
6
|
-
require('./chunk-
|
|
7
|
-
require('./chunk-
|
|
8
|
-
require('./chunk-
|
|
3
|
+
var _chunkHVW45GSTjs = require('./chunk-HVW45GST.js');
|
|
4
|
+
require('./chunk-SNDTNU3T.js');
|
|
5
|
+
require('./chunk-J7B7BNDN.js');
|
|
6
|
+
require('./chunk-2GYC6KEA.js');
|
|
7
|
+
require('./chunk-Z3NTWVVA.js');
|
|
8
|
+
require('./chunk-CKIZDPIJ.js');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
12
|
-
require('./chunk-
|
|
13
|
-
require('./chunk-
|
|
14
|
-
require('./chunk-OXBO24RB.js');
|
|
11
|
+
var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
|
|
12
|
+
require('./chunk-AZHZ4NB4.js');
|
|
13
|
+
require('./chunk-OHM7JUMR.js');
|
|
15
14
|
|
|
16
15
|
// src/cli/commands/remove.ts
|
|
17
16
|
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
@@ -24,8 +23,8 @@ var removeCommand = async (name) => {
|
|
|
24
23
|
console.error(_chalk2.default.red("Error: Prompt name cannot be empty"));
|
|
25
24
|
process.exit(1);
|
|
26
25
|
}
|
|
27
|
-
const config =
|
|
28
|
-
const lock =
|
|
26
|
+
const config = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
|
|
27
|
+
const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
|
|
29
28
|
if (!config.prompts[name]) {
|
|
30
29
|
console.error(_chalk2.default.red(`Error: Prompt "${name}" not found in dependencies`));
|
|
31
30
|
console.log(_chalk2.default.gray(`Available prompts: ${Object.keys(config.prompts).join(", ") || "none"}`));
|
|
@@ -42,7 +41,7 @@ var removeCommand = async (name) => {
|
|
|
42
41
|
} else if (typeof dependency === "object" && dependency.file) {
|
|
43
42
|
localFilePath = path.resolve(dependency.file);
|
|
44
43
|
} else {
|
|
45
|
-
localFilePath = path.join(
|
|
44
|
+
localFilePath = path.join(_chunk36XAYVMCjs.FileManager.getPromptsDir(), `${name}.prompt.yaml`);
|
|
46
45
|
}
|
|
47
46
|
if (fs.existsSync(localFilePath)) {
|
|
48
47
|
fs.unlinkSync(localFilePath);
|
|
@@ -61,7 +60,7 @@ var removeCommand = async (name) => {
|
|
|
61
60
|
if (fs.existsSync(materializedPath)) {
|
|
62
61
|
fs.unlinkSync(materializedPath);
|
|
63
62
|
const materializedDir = path.dirname(materializedPath);
|
|
64
|
-
const rootMaterializedDir =
|
|
63
|
+
const rootMaterializedDir = _chunk36XAYVMCjs.FileManager.getMaterializedDir();
|
|
65
64
|
let currentDir = materializedDir;
|
|
66
65
|
while (currentDir !== rootMaterializedDir && currentDir !== path.dirname(currentDir)) {
|
|
67
66
|
try {
|
|
@@ -80,15 +79,15 @@ var removeCommand = async (name) => {
|
|
|
80
79
|
}
|
|
81
80
|
delete config.prompts[name];
|
|
82
81
|
delete lock.prompts[name];
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
_chunk36XAYVMCjs.FileManager.savePromptsConfig(config);
|
|
83
|
+
_chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
|
|
85
84
|
if (!isLocalPrompt) {
|
|
86
85
|
spinner.succeed();
|
|
87
86
|
console.log(_chalk2.default.green(`\u2713 Removed ${_chalk2.default.cyan(name)} from dependencies`));
|
|
88
87
|
}
|
|
89
88
|
} catch (error) {
|
|
90
89
|
spinner.fail();
|
|
91
|
-
if (error instanceof
|
|
90
|
+
if (error instanceof _chunkHVW45GSTjs.PromptsError) {
|
|
92
91
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
93
92
|
} else {
|
|
94
93
|
console.error(_chalk2.default.red(`Error removing prompt: ${error instanceof Error ? error.message : "Unknown error"}`));
|
|
@@ -96,7 +95,7 @@ var removeCommand = async (name) => {
|
|
|
96
95
|
process.exit(1);
|
|
97
96
|
}
|
|
98
97
|
} catch (error) {
|
|
99
|
-
if (error instanceof
|
|
98
|
+
if (error instanceof _chunkHVW45GSTjs.PromptsError) {
|
|
100
99
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
101
100
|
} else {
|
|
102
101
|
console.error(_chalk2.default.red(`Unexpected error: ${error instanceof Error ? error.message : "Unknown error"}`));
|
|
@@ -107,4 +106,4 @@ var removeCommand = async (name) => {
|
|
|
107
106
|
|
|
108
107
|
|
|
109
108
|
exports.removeCommand = removeCommand;
|
|
110
|
-
//# sourceMappingURL=remove-
|
|
109
|
+
//# sourceMappingURL=remove-7EXB2Z6R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-7EXB2Z6R.js","../src/cli/commands/remove.ts"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;ACdA,+DAAoB;AACpB,uEAAsB;AACtB,4EAAkB;AAClB,oEAAgB;AAIT,IAAM,cAAA,EAAgB,MAAA,CAAO,IAAA,EAAA,GAAgC;AAClE,EAAA,IAAI;AAEF,IAAA,GAAA,CAAI,CAAC,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,EAAA,EAAI;AAC/B,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,oCAAoC,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,OAAA,EAAS,4BAAA,CAAY,iBAAA,CAAkB,CAAA;AAC7C,IAAA,MAAM,KAAA,EAAO,4BAAA,CAAY,eAAA,CAAgB,CAAA;AAGzC,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAM,GAAA,CAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAC5E,MAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,EAAA,GAAK,MAAM,CAAA,CAAA;AAC/E,MAAA;AAChB,IAAA;AAEsC,IAAA;AAEhB,IAAA;AAEuC,IAAA;AAEzD,IAAA;AAEiB,MAAA;AACb,QAAA;AAEkE,QAAA;AACpB,UAAA;AACY,QAAA;AAChB,UAAA;AACvC,QAAA;AAEuE,UAAA;AAC9E,QAAA;AAGkC,QAAA;AACL,UAAA;AACoC,UAAA;AAC/C,UAAA;AAC2D,UAAA;AACtE,QAAA;AACW,UAAA;AACqD,UAAA;AACvE,QAAA;AAEyB,QAAA;AAC3B,MAAA;AAGmC,MAAA;AACN,MAAA;AACiC,QAAA;AACvB,QAAA;AACL,UAAA;AAGuB,UAAA;AACM,UAAA;AAE1C,UAAA;AACqE,UAAA;AAChF,YAAA;AACuC,cAAA;AACf,cAAA;AACD,gBAAA;AACa,gBAAA;AAC/B,cAAA;AACL,gBAAA;AACF,cAAA;AACM,YAAA;AACN,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AAG0B,MAAA;AACF,MAAA;AAGY,MAAA;AACJ,MAAA;AAEZ,MAAA;AACF,QAAA;AAC0D,QAAA;AAC5E,MAAA;AAEc,IAAA;AACD,MAAA;AACsB,MAAA;AACiB,QAAA;AAC7C,MAAA;AACsF,QAAA;AAC7F,MAAA;AACc,MAAA;AAChB,IAAA;AAEc,EAAA;AACqB,IAAA;AACiB,MAAA;AAC7C,IAAA;AACiF,MAAA;AACxF,IAAA;AACc,IAAA;AAChB,EAAA;AACF;ADdoG;AACA;AACA","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/remove-7EXB2Z6R.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,17 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PromptsError
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-GAFUPYJ3.mjs";
|
|
4
|
+
import "./chunk-FEL5FLHA.mjs";
|
|
5
|
+
import "./chunk-JPWKINZP.mjs";
|
|
6
|
+
import "./chunk-3P4ROGZJ.mjs";
|
|
7
|
+
import "./chunk-WOBPYIKO.mjs";
|
|
8
|
+
import "./chunk-I2SOBPAF.mjs";
|
|
9
9
|
import {
|
|
10
10
|
FileManager
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-CU3443HD.mjs";
|
|
11
|
+
} from "./chunk-PYVDTUA6.mjs";
|
|
12
|
+
import "./chunk-BTBSMJTY.mjs";
|
|
13
|
+
import "./chunk-URTD2WOC.mjs";
|
|
15
14
|
|
|
16
15
|
// src/cli/commands/remove.ts
|
|
17
16
|
import * as fs from "fs";
|
|
@@ -107,4 +106,4 @@ var removeCommand = async (name) => {
|
|
|
107
106
|
export {
|
|
108
107
|
removeCommand
|
|
109
108
|
};
|
|
110
|
-
//# sourceMappingURL=remove-
|
|
109
|
+
//# sourceMappingURL=remove-W44FQ5MF.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/remove.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\";\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"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/remove.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\";\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"],"mappings":"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","names":[]}
|
|
@@ -3,26 +3,25 @@
|
|
|
3
3
|
var _chunkF6E4XQQUjs = require('./chunk-F6E4XQQU.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var _chunkT7FQHOLKjs = require('./chunk-T7FQHOLK.js');
|
|
7
6
|
|
|
7
|
+
var _chunkHVW45GSTjs = require('./chunk-HVW45GST.js');
|
|
8
|
+
require('./chunk-SNDTNU3T.js');
|
|
9
|
+
require('./chunk-J7B7BNDN.js');
|
|
10
|
+
require('./chunk-2GYC6KEA.js');
|
|
11
|
+
require('./chunk-Z3NTWVVA.js');
|
|
12
|
+
require('./chunk-CKIZDPIJ.js');
|
|
8
13
|
|
|
9
|
-
var _chunkNFM6RB4Rjs = require('./chunk-NFM6RB4R.js');
|
|
10
|
-
require('./chunk-YH5TIVK2.js');
|
|
11
|
-
require('./chunk-ILTCLEIF.js');
|
|
12
|
-
require('./chunk-NVKMXXNP.js');
|
|
13
|
-
require('./chunk-VI5NJ53L.js');
|
|
14
|
-
require('./chunk-DISMHYXC.js');
|
|
15
14
|
|
|
15
|
+
var _chunkDZH6SY3Zjs = require('./chunk-DZH6SY3Z.js');
|
|
16
16
|
|
|
17
|
-
var _chunkZZLIF3DEjs = require('./chunk-ZZLIF3DE.js');
|
|
18
17
|
|
|
19
18
|
|
|
20
|
-
var
|
|
19
|
+
var _chunk36XAYVMCjs = require('./chunk-36XAYVMC.js');
|
|
20
|
+
require('./chunk-AZHZ4NB4.js');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
require('./chunk-
|
|
25
|
-
require('./chunk-OXBO24RB.js');
|
|
23
|
+
|
|
24
|
+
var _chunkOHM7JUMRjs = require('./chunk-OHM7JUMR.js');
|
|
26
25
|
|
|
27
26
|
// src/cli/commands/sync.ts
|
|
28
27
|
var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
|
|
@@ -33,10 +32,8 @@ var _jsyaml = require('js-yaml'); var yaml = _interopRequireWildcard(_jsyaml);
|
|
|
33
32
|
var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline);
|
|
34
33
|
var handleConflict = async (promptName, conflictInfo) => {
|
|
35
34
|
console.log(
|
|
36
|
-
_chalk2.default.yellow(
|
|
37
|
-
|
|
38
|
-
\u26A0 Conflict detected for prompt: ${_chalk2.default.cyan(promptName)}`
|
|
39
|
-
)
|
|
35
|
+
_chalk2.default.yellow(`
|
|
36
|
+
\u26A0 Conflict detected for prompt: ${_chalk2.default.cyan(promptName)}`)
|
|
40
37
|
);
|
|
41
38
|
console.log(
|
|
42
39
|
_chalk2.default.gray(
|
|
@@ -77,10 +74,10 @@ var syncCommand = async () => {
|
|
|
77
74
|
const startTime = Date.now();
|
|
78
75
|
try {
|
|
79
76
|
_chunkF6E4XQQUjs.checkApiKey.call(void 0, );
|
|
80
|
-
const
|
|
81
|
-
await
|
|
82
|
-
const config =
|
|
83
|
-
const lock =
|
|
77
|
+
const promptsApiService = new (0, _chunkHVW45GSTjs.PromptsApiService)();
|
|
78
|
+
await _chunkDZH6SY3Zjs.ensureProjectInitialized.call(void 0, false);
|
|
79
|
+
const config = _chunk36XAYVMCjs.FileManager.loadPromptsConfig();
|
|
80
|
+
const lock = _chunk36XAYVMCjs.FileManager.loadPromptsLock();
|
|
84
81
|
const result = {
|
|
85
82
|
fetched: [],
|
|
86
83
|
pushed: [],
|
|
@@ -107,12 +104,12 @@ var syncCommand = async () => {
|
|
|
107
104
|
try {
|
|
108
105
|
const versionSpec = typeof dependency === "string" ? dependency : (_a = dependency.version) != null ? _a : "latest";
|
|
109
106
|
const lockEntry = lock.prompts[name];
|
|
110
|
-
const prompt = await
|
|
107
|
+
const prompt = await promptsApiService.get(name);
|
|
111
108
|
if (prompt) {
|
|
112
109
|
const needsUpdate = !lockEntry || lockEntry.version !== prompt.version || !lockEntry.materialized || !fs.existsSync(path.resolve(lockEntry.materialized));
|
|
113
110
|
if (needsUpdate) {
|
|
114
|
-
const materializedPrompt =
|
|
115
|
-
const savedPath =
|
|
111
|
+
const materializedPrompt = _chunk36XAYVMCjs.PromptConverter.fromApiToMaterialized(prompt);
|
|
112
|
+
const savedPath = _chunk36XAYVMCjs.FileManager.saveMaterializedPrompt(
|
|
116
113
|
name,
|
|
117
114
|
materializedPrompt
|
|
118
115
|
);
|
|
@@ -122,7 +119,7 @@ var syncCommand = async () => {
|
|
|
122
119
|
version: prompt.version,
|
|
123
120
|
versionSpec
|
|
124
121
|
});
|
|
125
|
-
|
|
122
|
+
_chunk36XAYVMCjs.FileManager.updateLockEntry(
|
|
126
123
|
lock,
|
|
127
124
|
name,
|
|
128
125
|
materializedPrompt,
|
|
@@ -158,12 +155,12 @@ var syncCommand = async () => {
|
|
|
158
155
|
for (const [promptName, dependency] of localFileRefs) {
|
|
159
156
|
try {
|
|
160
157
|
const filePath = dependency.slice(5);
|
|
161
|
-
const localConfig =
|
|
158
|
+
const localConfig = _chunk36XAYVMCjs.FileManager.loadLocalPrompt(filePath);
|
|
162
159
|
const currentVersion = (_b = lock.prompts[promptName]) == null ? void 0 : _b.version;
|
|
163
160
|
const configData = {
|
|
164
161
|
model: localConfig.model,
|
|
165
|
-
prompt:
|
|
166
|
-
messages:
|
|
162
|
+
prompt: _chunk36XAYVMCjs.PromptConverter.extractSystemPrompt(localConfig.messages),
|
|
163
|
+
messages: _chunk36XAYVMCjs.PromptConverter.filterNonSystemMessages(
|
|
167
164
|
localConfig.messages
|
|
168
165
|
),
|
|
169
166
|
temperature: (_c = localConfig.modelParameters) == null ? void 0 : _c.temperature,
|
|
@@ -171,7 +168,7 @@ var syncCommand = async () => {
|
|
|
171
168
|
inputs: [{ identifier: "input", type: "str" }],
|
|
172
169
|
outputs: [{ identifier: "output", type: "str" }]
|
|
173
170
|
};
|
|
174
|
-
const syncResult = await
|
|
171
|
+
const syncResult = await promptsApiService.sync({
|
|
175
172
|
name: promptName,
|
|
176
173
|
configData,
|
|
177
174
|
localVersion: currentVersion,
|
|
@@ -232,10 +229,14 @@ var syncCommand = async () => {
|
|
|
232
229
|
materialized: filePath
|
|
233
230
|
};
|
|
234
231
|
} else {
|
|
232
|
+
const syncResult2 = await promptsApiService.update(promptName, _chunkOHM7JUMRjs.__spreadProps.call(void 0, _chunkOHM7JUMRjs.__spreadValues.call(void 0, {}, localConfig), {
|
|
233
|
+
commitMessage: `Synced from local file: ${path.basename(
|
|
234
|
+
filePath
|
|
235
|
+
)}`
|
|
236
|
+
}));
|
|
235
237
|
lock.prompts[promptName] = {
|
|
236
|
-
version:
|
|
237
|
-
versionId:
|
|
238
|
-
// Temporary until we get actual versionId
|
|
238
|
+
version: syncResult2.version,
|
|
239
|
+
versionId: syncResult2.versionId,
|
|
239
240
|
materialized: filePath
|
|
240
241
|
};
|
|
241
242
|
}
|
|
@@ -286,12 +287,12 @@ var syncCommand = async () => {
|
|
|
286
287
|
result.errors.push({ name: promptName, error: errorMessage });
|
|
287
288
|
}
|
|
288
289
|
}
|
|
289
|
-
|
|
290
|
+
_chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
|
|
290
291
|
pushSpinner.stop();
|
|
291
292
|
}
|
|
292
|
-
const discoveredLocalFiles =
|
|
293
|
+
const discoveredLocalFiles = _chunk36XAYVMCjs.FileManager.getLocalPromptFiles();
|
|
293
294
|
const orphanFiles = discoveredLocalFiles.filter((filePath) => {
|
|
294
|
-
const promptName =
|
|
295
|
+
const promptName = _chunk36XAYVMCjs.FileManager.promptNameFromPath(filePath);
|
|
295
296
|
return !config.prompts[promptName];
|
|
296
297
|
});
|
|
297
298
|
if (orphanFiles.length > 0) {
|
|
@@ -302,7 +303,7 @@ var syncCommand = async () => {
|
|
|
302
303
|
)
|
|
303
304
|
);
|
|
304
305
|
for (const filePath of orphanFiles) {
|
|
305
|
-
const promptName =
|
|
306
|
+
const promptName = _chunk36XAYVMCjs.FileManager.promptNameFromPath(filePath);
|
|
306
307
|
const relativePath = path.relative(process.cwd(), filePath);
|
|
307
308
|
console.log(_chalk2.default.yellow(` ${relativePath}`));
|
|
308
309
|
console.log(
|
|
@@ -330,12 +331,12 @@ Tip: Add these to prompts.json to include them in sync operations.`
|
|
|
330
331
|
return true;
|
|
331
332
|
})
|
|
332
333
|
);
|
|
333
|
-
const cleanedFiles =
|
|
334
|
+
const cleanedFiles = _chunk36XAYVMCjs.FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);
|
|
334
335
|
if (cleanedFiles.length > 0) {
|
|
335
336
|
result.cleaned = cleanedFiles;
|
|
336
|
-
|
|
337
|
+
_chunk36XAYVMCjs.FileManager.removeFromLock(lock, cleanedFiles);
|
|
337
338
|
}
|
|
338
|
-
|
|
339
|
+
_chunk36XAYVMCjs.FileManager.savePromptsLock(lock);
|
|
339
340
|
if (result.fetched.length > 0) {
|
|
340
341
|
for (const { name, version, versionSpec } of result.fetched) {
|
|
341
342
|
const lockEntry = lock.prompts[name];
|
|
@@ -395,7 +396,7 @@ Tip: Add these to prompts.json to include them in sync operations.`
|
|
|
395
396
|
process.exit(1);
|
|
396
397
|
}
|
|
397
398
|
} catch (error) {
|
|
398
|
-
if (error instanceof
|
|
399
|
+
if (error instanceof _chunkHVW45GSTjs.PromptsError) {
|
|
399
400
|
console.error(_chalk2.default.red(`Error: ${error.message}`));
|
|
400
401
|
} else {
|
|
401
402
|
console.error(
|
|
@@ -410,4 +411,4 @@ Tip: Add these to prompts.json to include them in sync operations.`
|
|
|
410
411
|
|
|
411
412
|
|
|
412
413
|
exports.syncCommand = syncCommand;
|
|
413
|
-
//# sourceMappingURL=sync-
|
|
414
|
+
//# sourceMappingURL=sync-V7WRMNJV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-V7WRMNJV.js","../src/cli/commands/sync.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/sync-V7WRMNJV.js","sourcesContent":[null,"import * as fs from \"fs\";\nimport * as path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport * as yaml from \"js-yaml\";\nimport { PromptConverter } from \"@/cli/utils/promptConverter\";\nimport {\n type ConfigData,\n Prompt,\n PromptsApiService,\n PromptsError,\n type SyncAction,\n} from \"@/client-sdk/services/prompts\";\nimport type { SyncResult } from \"../types\";\nimport { FileManager } from \"../utils/fileManager\";\nimport { ensureProjectInitialized } from \"../utils/init\";\nimport { checkApiKey } from \"../utils/apiKey\";\nimport readline from \"node:readline\";\n\n// Handle conflict resolution - show diff and ask user to choose\nconst handleConflict = async (\n promptName: string,\n conflictInfo: {\n localVersion: number;\n remoteVersion: number;\n differences: string[];\n remoteConfigData: any;\n }\n): Promise<\"local\" | \"remote\" | \"abort\"> => {\n console.log(\n chalk.yellow(`\\n⚠ Conflict detected for prompt: ${chalk.cyan(promptName)}`)\n );\n console.log(\n chalk.gray(\n `Local version: ${conflictInfo.localVersion}, Remote version: ${conflictInfo.remoteVersion}`\n )\n );\n\n if (conflictInfo.differences.length > 0) {\n console.log(chalk.yellow(\"\\nDifferences:\"));\n conflictInfo.differences.forEach((diff) => {\n console.log(chalk.gray(` • ${diff}`));\n });\n }\n\n console.log(chalk.yellow(\"\\nOptions:\"));\n console.log(\" [l] Use local version (overwrite remote)\");\n console.log(\" [r] Use remote version (overwrite local)\");\n console.log(\" [a] Abort sync for this prompt\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(\"Choose resolution (l/r/a): \", (answer: string) => {\n rl.close();\n const choice = answer.toLowerCase();\n if (choice === \"l\" || choice === \"local\") {\n resolve(\"local\");\n } else if (choice === \"r\" || choice === \"remote\") {\n resolve(\"remote\");\n } else {\n resolve(\"abort\");\n }\n });\n });\n};\n\nexport const syncCommand = async (): Promise<void> => {\n console.log(\"🔄 Starting sync...\");\n\n const startTime = Date.now();\n\n try {\n // Check API key before doing anything else\n checkApiKey();\n\n // Get prompts API service\n const promptsApiService = new PromptsApiService();\n\n // Ensure project is initialized (prompts.json, lock file, directories)\n await ensureProjectInitialized(false); // Don't prompt for .gitignore in sync\n\n // Load prompts config and lock\n const config = FileManager.loadPromptsConfig();\n const lock = FileManager.loadPromptsLock();\n\n const result: SyncResult = {\n fetched: [],\n pushed: [],\n unchanged: [],\n cleaned: [],\n errors: [],\n };\n\n // Process remote prompts (fetch and materialize)\n const remoteDeps = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n // Skip local file dependencies (both object format and string format)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n }\n );\n\n if (remoteDeps.length > 0) {\n const fetchSpinner = ora(\n `Checking ${remoteDeps.length} remote prompts...`\n ).start();\n\n for (const [name, dependency] of remoteDeps) {\n try {\n const versionSpec =\n typeof dependency === \"string\"\n ? dependency\n : dependency.version ?? \"latest\";\n\n // Check if we already have this prompt with the same version\n const lockEntry = lock.prompts[name];\n\n // Fetch the prompt from the API to check current version\n const prompt = await promptsApiService.get(name);\n\n if (prompt) {\n // Check if we need to update (new version or not materialized)\n const needsUpdate =\n !lockEntry ||\n lockEntry.version !== prompt.version ||\n !lockEntry.materialized ||\n !fs.existsSync(path.resolve(lockEntry.materialized));\n\n if (needsUpdate) {\n // Convert to MaterializedPrompt format using the converter\n const materializedPrompt =\n PromptConverter.fromApiToMaterialized(prompt);\n\n const savedPath = FileManager.saveMaterializedPrompt(\n name,\n materializedPrompt\n );\n const relativePath = path.relative(process.cwd(), savedPath);\n result.fetched.push({\n name,\n version: prompt.version,\n versionSpec,\n });\n\n // Update lock file entry\n FileManager.updateLockEntry(\n lock,\n name,\n materializedPrompt,\n savedPath\n );\n\n fetchSpinner.text = `Fetched ${chalk.cyan(\n `${name}@${versionSpec}`\n )} ${chalk.gray(`(version ${prompt.version})`)} → ${chalk.gray(\n relativePath\n )}`;\n } else {\n // No change needed, track as unchanged\n result.unchanged.push(name);\n }\n } else {\n result.errors.push({ name, error: \"Prompt not found\" });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name, error: errorMessage });\n }\n }\n\n fetchSpinner.stop();\n }\n\n // Process local prompts (push to API) - only those explicitly declared in prompts.json\n const localFileRefs = Object.entries(config.prompts).filter(\n ([, dependency]) => {\n return typeof dependency === \"string\" && dependency.startsWith(\"file:\");\n }\n );\n\n if (localFileRefs.length > 0) {\n const pushSpinner = ora(\n `Pushing ${localFileRefs.length} local prompts...`\n ).start();\n\n // Use the existing lock file instead of reloading it\n // const lock = FileManager.loadPromptsLock(); // Don't reload - use existing lock\n\n for (const [promptName, dependency] of localFileRefs) {\n try {\n const filePath = (dependency as string).slice(5); // Remove \"file:\" prefix\n\n // Load local prompt config\n const localConfig = FileManager.loadLocalPrompt(filePath);\n\n // Get current version from lock file\n const currentVersion = lock.prompts[promptName]?.version;\n\n // Convert local config to API configData format\n const configData: ConfigData = {\n model: localConfig.model,\n prompt: PromptConverter.extractSystemPrompt(localConfig.messages),\n messages: PromptConverter.filterNonSystemMessages(\n localConfig.messages\n ) as Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>,\n temperature: localConfig.modelParameters?.temperature,\n max_tokens: localConfig.modelParameters?.max_tokens,\n inputs: [{ identifier: \"input\", type: \"str\" }],\n outputs: [{ identifier: \"output\", type: \"str\" }],\n };\n\n // Use new sync API with conflict detection\n const syncResult = await promptsApiService.sync({\n name: promptName,\n configData,\n localVersion: currentVersion,\n commitMessage: `Synced from local file: ${path.basename(filePath)}`,\n });\n\n const relativePath = path.relative(process.cwd(), filePath);\n\n let conflictResolution: \"local\" | \"remote\" | \"abort\" | null = null;\n if (syncResult.action === \"conflict\") {\n // Handle conflict - prompt user for resolution\n pushSpinner.stop();\n conflictResolution = await handleConflict(\n promptName,\n syncResult.conflictInfo!\n );\n if (conflictResolution === \"abort\") {\n result.errors.push({\n name: promptName,\n error: \"Sync aborted due to conflict\",\n });\n continue;\n }\n\n // If user chose remote, we should pull the remote version to local file\n if (conflictResolution === \"remote\" && syncResult.conflictInfo) {\n // Update local file with remote content\n const remoteConfig = {\n model: syncResult.conflictInfo.remoteConfigData.model,\n modelParameters: {\n temperature:\n syncResult.conflictInfo.remoteConfigData.temperature,\n max_tokens:\n syncResult.conflictInfo.remoteConfigData.max_tokens,\n },\n messages: [\n {\n role: \"system\" as const,\n content: syncResult.conflictInfo.remoteConfigData.prompt,\n },\n ...(syncResult.conflictInfo.remoteConfigData.messages ?? []),\n ],\n };\n\n const yamlContent = yaml.dump(remoteConfig, {\n lineWidth: -1,\n noRefs: true,\n sortKeys: false,\n });\n\n fs.writeFileSync(filePath, yamlContent);\n }\n\n // If user chose to proceed, we continue with the sync\n pushSpinner.start();\n }\n\n // Update lock file with new version info\n if (syncResult.prompt) {\n lock.prompts[promptName] = {\n version: syncResult.prompt.version,\n versionId: syncResult.prompt.versionId,\n materialized: filePath,\n };\n } else if (syncResult.action === \"conflict\") {\n const remoteVersion = syncResult.conflictInfo?.remoteVersion ?? 0;\n if (conflictResolution === \"remote\") {\n // User chose remote - use remote version\n lock.prompts[promptName] = {\n version: remoteVersion,\n versionId: \"remote_version\", // We don't have the actual versionId from conflict info\n materialized: filePath,\n };\n } else {\n // User chose local - force push\n const syncResult = await promptsApiService.update(promptName, {\n ...localConfig,\n commitMessage: `Synced from local file: ${path.basename(\n filePath\n )}`,\n });\n lock.prompts[promptName] = {\n version: syncResult.version,\n versionId: syncResult.versionId,\n materialized: filePath,\n };\n }\n }\n\n // Determine the action text based on sync result and conflict resolution\n let actionText: string;\n if (syncResult.action === \"conflict\") {\n if (conflictResolution === \"remote\") {\n actionText = \"Pulled\"; // User chose to use remote version\n result.fetched.push({\n name: promptName,\n version: syncResult.conflictInfo?.remoteVersion ?? 0,\n versionSpec: \"latest\", // Default for conflict resolution\n });\n } else {\n actionText = \"Pushed\"; // User chose to use local version (or forced push)\n result.pushed.push({\n name: promptName,\n version: (syncResult.conflictInfo?.remoteVersion ?? 0) + 1, // New version after push\n });\n }\n } else if (syncResult.action === \"up_to_date\") {\n // For up-to-date prompts, add to unchanged instead of pushed\n actionText = \"Up-to-date\";\n result.unchanged.push(promptName);\n } else {\n const actionMap: Record<SyncAction, string> = {\n created: \"Created\",\n updated: \"Updated\",\n conflict: \"Conflict resolved\",\n up_to_date: \"Up to date\",\n };\n actionText = actionMap[syncResult.action as SyncAction] || \"Pushed\";\n result.pushed.push({\n name: promptName,\n version: syncResult.prompt?.version ?? 0,\n });\n }\n\n pushSpinner.text = `${actionText} ${chalk.cyan(\n promptName\n )} ${chalk.gray(\n `(version ${\n syncResult.prompt?.version ??\n syncResult.conflictInfo?.remoteVersion ??\n \"unknown\"\n })`\n )} ${conflictResolution === \"remote\" ? \"to\" : \"from\"} ${chalk.gray(\n relativePath\n )}`;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n result.errors.push({ name: promptName, error: errorMessage });\n }\n }\n\n // Save lock file with all updates\n FileManager.savePromptsLock(lock);\n\n pushSpinner.stop();\n }\n\n // Check for orphan local prompt files and show helpful warnings\n const discoveredLocalFiles = FileManager.getLocalPromptFiles();\n const orphanFiles = discoveredLocalFiles.filter((filePath) => {\n const promptName = FileManager.promptNameFromPath(filePath);\n return !config.prompts[promptName]; // Not declared in prompts.json\n });\n\n if (orphanFiles.length > 0) {\n console.log(\n chalk.yellow(\n `\\n⚠ Found ${orphanFiles.length} orphan prompt file${\n orphanFiles.length > 1 ? \"s\" : \"\"\n }:`\n )\n );\n\n for (const filePath of orphanFiles) {\n const promptName = FileManager.promptNameFromPath(filePath);\n const relativePath = path.relative(process.cwd(), filePath);\n\n console.log(chalk.yellow(` ${relativePath}`));\n console.log(\n chalk.gray(\n ` Add to prompts.json: \"${promptName}\": \"file:${relativePath}\"`\n )\n );\n }\n\n console.log(\n chalk.gray(\n `\\nTip: Add these to prompts.json to include them in sync operations.`\n )\n );\n }\n\n // Cleanup orphaned materialized files\n const currentDependencies = new Set(\n Object.keys(config.prompts).filter((name) => {\n const dependency = config.prompts[name];\n // Only include remote dependencies (not local file: dependencies)\n if (typeof dependency === \"object\" && dependency.file) {\n return false;\n }\n if (typeof dependency === \"string\" && dependency.startsWith(\"file:\")) {\n return false;\n }\n return true;\n })\n );\n\n const cleanedFiles =\n FileManager.cleanupOrphanedMaterializedFiles(currentDependencies);\n if (cleanedFiles.length > 0) {\n result.cleaned = cleanedFiles;\n FileManager.removeFromLock(lock, cleanedFiles);\n }\n\n // Save the updated lock file\n FileManager.savePromptsLock(lock);\n\n // Print individual results if there were actions\n if (result.fetched.length > 0) {\n for (const { name, version, versionSpec } of result.fetched) {\n // Get the actual saved path from lock file for display consistency\n const lockEntry = lock.prompts[name];\n const displayPath = lockEntry?.materialized\n ? `./${lockEntry.materialized}`\n : `./prompts/.materialized/${name}.prompt.yaml`;\n\n console.log(\n chalk.green(\n `✓ Pulled ${chalk.cyan(`${name}@${versionSpec}`)} ${chalk.gray(\n `(version ${version})`\n )} → ${chalk.gray(displayPath)}`\n )\n );\n }\n }\n\n if (result.pushed.length > 0) {\n for (const { name, version } of result.pushed) {\n const localPath = `./prompts/${name}.prompt.yaml`;\n console.log(\n chalk.green(\n `✓ Pushed ${chalk.cyan(name)} ${chalk.gray(\n `(version ${version})`\n )} from ${chalk.gray(localPath)}`\n )\n );\n }\n }\n\n // Print cleaned up files\n if (result.cleaned.length > 0) {\n for (const name of result.cleaned) {\n console.log(\n chalk.yellow(\n `✓ Cleaned ${chalk.cyan(name)} (no longer in dependencies)`\n )\n );\n }\n }\n\n // Print errors\n if (result.errors.length > 0) {\n for (const { name, error } of result.errors) {\n console.log(chalk.red(`✗ Failed ${chalk.cyan(name)}: ${error}`));\n }\n }\n\n // Print summary\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n const totalActions =\n result.fetched.length + result.pushed.length + result.cleaned.length;\n\n if (totalActions === 0 && result.errors.length === 0) {\n console.log(chalk.gray(`Synced in ${duration}s, no changes`));\n } else {\n const summary = [];\n if (result.fetched.length > 0)\n summary.push(`${result.fetched.length} fetched`);\n if (result.pushed.length > 0)\n summary.push(`${result.pushed.length} pushed`);\n if (result.cleaned.length > 0)\n summary.push(`${result.cleaned.length} cleaned`);\n if (result.errors.length > 0)\n summary.push(`${result.errors.length} errors`);\n\n console.log(chalk.gray(`Synced ${summary.join(\", \")} in ${duration}s`));\n }\n\n if (result.errors.length > 0) {\n process.exit(1);\n }\n } catch (error) {\n if (error instanceof PromptsError) {\n console.error(chalk.red(`Error: ${error.message}`));\n } else {\n console.error(\n chalk.red(\n `Unexpected error: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n )\n );\n }\n process.exit(1);\n }\n};\n"]}
|