@letsping/sdk 0.2.0 → 0.3.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/dist/index.mjs DELETED
@@ -1,493 +0,0 @@
1
- var __getOwnPropNames = Object.getOwnPropertyNames;
2
- var __commonJS = (cb, mod) => function __require() {
3
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
4
- };
5
-
6
- // package.json
7
- var require_package = __commonJS({
8
- "package.json"(exports, module) {
9
- module.exports = {
10
- name: "@letsping/sdk",
11
- version: "0.2.0",
12
- description: "Behavioral Firewall and Cryo-Sleep State Parking for Autonomous Agents",
13
- main: "./dist/index.js",
14
- module: "./dist/index.mjs",
15
- types: "./dist/index.d.ts",
16
- exports: {
17
- ".": {
18
- types: "./dist/index.d.ts",
19
- require: "./dist/index.js",
20
- import: "./dist/index.mjs"
21
- },
22
- "./integrations/langgraph": {
23
- types: "./dist/integrations/langgraph.d.ts",
24
- require: "./dist/integrations/langgraph.js",
25
- import: "./dist/integrations/langgraph.mjs"
26
- }
27
- },
28
- scripts: {
29
- build: "tsup && tsc --emitDeclarationOnly --outDir dist",
30
- dev: "tsup --watch",
31
- clean: "rm -rf dist .turbo"
32
- },
33
- peerDependencies: {
34
- "@langchain/core": ">=0.1.52",
35
- "@langchain/langgraph": ">=0.0.1",
36
- "@opentelemetry/api": "^1.0.0"
37
- },
38
- peerDependenciesMeta: {
39
- "@opentelemetry/api": {
40
- optional: true
41
- },
42
- "@langchain/langgraph": {
43
- optional: true
44
- },
45
- "@langchain/core": {
46
- optional: true
47
- }
48
- },
49
- devDependencies: {
50
- "@langchain/core": "^1.1.28",
51
- "@langchain/langgraph": "^1.1.5",
52
- "@opentelemetry/api": "^1.9.0",
53
- "@types/node": "^22.0.0",
54
- tsup: "^8.0.0",
55
- typescript: "^5.7.2"
56
- },
57
- publishConfig: {
58
- access: "public"
59
- }
60
- };
61
- }
62
- });
63
-
64
- // src/index.ts
65
- import { createCipheriv, createDecipheriv, randomBytes, createHmac } from "crypto";
66
- var SDK_VERSION = "0.2.0";
67
- try {
68
- SDK_VERSION = require_package().version;
69
- } catch {
70
- }
71
- var otelApi = null;
72
- var otelTried = false;
73
- async function getOtel() {
74
- if (otelTried) return otelApi;
75
- otelTried = true;
76
- try {
77
- otelApi = await import("@opentelemetry/api");
78
- } catch {
79
- }
80
- return otelApi;
81
- }
82
- var LetsPingError = class extends Error {
83
- constructor(message, status) {
84
- super(message);
85
- this.status = status;
86
- this.name = "LetsPingError";
87
- }
88
- };
89
- function isEncEnvelope(v) {
90
- return typeof v === "object" && v !== null && v._lp_enc === true && typeof v.iv === "string" && typeof v.ct === "string";
91
- }
92
- function encryptPayload(keyBase64, payload) {
93
- const keyBuf = Buffer.from(keyBase64, "base64");
94
- const iv = randomBytes(12);
95
- const cipher = createCipheriv("aes-256-gcm", keyBuf, iv);
96
- const plain = Buffer.from(JSON.stringify(payload), "utf8");
97
- const ct = Buffer.concat([cipher.update(plain), cipher.final(), cipher.getAuthTag()]);
98
- return {
99
- _lp_enc: true,
100
- iv: iv.toString("base64"),
101
- ct: ct.toString("base64")
102
- };
103
- }
104
- function decryptPayload(keyBase64, envelope) {
105
- const keyBuf = Buffer.from(keyBase64, "base64");
106
- const iv = Buffer.from(envelope.iv, "base64");
107
- const ctFull = Buffer.from(envelope.ct, "base64");
108
- const authTag = ctFull.subarray(ctFull.length - 16);
109
- const ct = ctFull.subarray(0, ctFull.length - 16);
110
- const decipher = createDecipheriv("aes-256-gcm", keyBuf, iv);
111
- decipher.setAuthTag(authTag);
112
- const plain = Buffer.concat([decipher.update(ct), decipher.final()]);
113
- return JSON.parse(plain.toString("utf8"));
114
- }
115
- function computeDiff(original, patched) {
116
- if (original === patched) return null;
117
- if (typeof original !== "object" || typeof patched !== "object" || original === null || patched === null || Array.isArray(original) || Array.isArray(patched)) {
118
- if (JSON.stringify(original) !== JSON.stringify(patched)) {
119
- return { from: original, to: patched };
120
- }
121
- return null;
122
- }
123
- const changes = {};
124
- let hasChanges = false;
125
- const allKeys = /* @__PURE__ */ new Set([...Object.keys(original), ...Object.keys(patched)]);
126
- for (const key of allKeys) {
127
- const oV = original[key];
128
- const pV = patched[key];
129
- if (!(key in original)) {
130
- changes[key] = { from: void 0, to: pV };
131
- hasChanges = true;
132
- } else if (!(key in patched)) {
133
- changes[key] = { from: oV, to: void 0 };
134
- hasChanges = true;
135
- } else {
136
- const nestedDiff = computeDiff(oV, pV);
137
- if (nestedDiff) {
138
- changes[key] = nestedDiff;
139
- hasChanges = true;
140
- }
141
- }
142
- }
143
- return hasChanges ? changes : null;
144
- }
145
- var LetsPing = class {
146
- constructor(apiKey, options) {
147
- const key = apiKey || process.env.LETSPING_API_KEY;
148
- if (!key) throw new Error("LetsPing: API Key is required. Pass it to the constructor or set LETSPING_API_KEY env var.");
149
- this.apiKey = key;
150
- this.baseUrl = options?.baseUrl || "https://letsping.co/api";
151
- this.encryptionKey = options?.encryptionKey ?? process.env.LETSPING_ENCRYPTION_KEY ?? null;
152
- }
153
- _encrypt(payload) {
154
- if (!this.encryptionKey) return payload;
155
- return encryptPayload(this.encryptionKey, payload);
156
- }
157
- _decrypt(val) {
158
- if (!this.encryptionKey || !isEncEnvelope(val)) return val;
159
- try {
160
- return decryptPayload(this.encryptionKey, val);
161
- } catch {
162
- return val;
163
- }
164
- }
165
- _prepareStateUpload(stateSnapshot, fallbackDek) {
166
- if (this.encryptionKey) {
167
- return {
168
- data: this._encrypt(stateSnapshot),
169
- contentType: "application/json"
170
- };
171
- } else if (fallbackDek) {
172
- const keyBuf = Buffer.from(fallbackDek, "base64");
173
- const iv = randomBytes(12);
174
- const cipher = createCipheriv("aes-256-gcm", keyBuf, iv);
175
- const plain = Buffer.from(JSON.stringify(stateSnapshot), "utf8");
176
- const ct = Buffer.concat([cipher.update(plain), cipher.final(), cipher.getAuthTag()]);
177
- const finalPayload = Buffer.concat([iv, ct]);
178
- return {
179
- data: finalPayload,
180
- contentType: "application/octet-stream"
181
- };
182
- }
183
- return {
184
- data: stateSnapshot,
185
- contentType: "application/json"
186
- };
187
- }
188
- async ask(options) {
189
- if (options.schema && options.schema._def) {
190
- throw new LetsPingError("LetsPing Error: Raw Zod schema detected. You must convert it to JSON Schema (e.g. using 'zod-to-json-schema') before passing it to the SDK.");
191
- }
192
- const otel = await getOtel();
193
- let span = null;
194
- if (otel && otel.trace) {
195
- const tracer = otel.trace.getTracer("letsping-sdk");
196
- span = tracer.startSpan(`letsping.ask`, {
197
- attributes: {
198
- "letsping.service": options.service,
199
- "letsping.action": options.action,
200
- "letsping.priority": options.priority || "medium"
201
- }
202
- });
203
- }
204
- const traceId = options.trace_id;
205
- const parentId = options.parent_request_id;
206
- const basePayload = options.payload || {};
207
- const metaKey = "_lp_meta";
208
- const existingMeta = basePayload[metaKey] || {};
209
- const enrichedPayload = {
210
- ...basePayload,
211
- [metaKey]: {
212
- ...existingMeta,
213
- ...traceId ? { trace_id: traceId } : {},
214
- ...parentId ? { parent_request_id: parentId } : {}
215
- }
216
- };
217
- try {
218
- const res = await this.request("POST", "/ingest", {
219
- service: options.service,
220
- action: options.action,
221
- payload: this._encrypt(enrichedPayload),
222
- priority: options.priority || "medium",
223
- schema: options.schema,
224
- metadata: { role: options.role, sdk: "node", trace_id: traceId, parent_request_id: parentId }
225
- });
226
- const { id, uploadUrl, dek } = res;
227
- if (uploadUrl && options.state_snapshot) {
228
- try {
229
- const { data, contentType } = this._prepareStateUpload(options.state_snapshot, dek);
230
- const putRes = await fetch(uploadUrl, {
231
- method: "PUT",
232
- headers: { "Content-Type": contentType },
233
- body: Buffer.isBuffer(data) ? data : JSON.stringify(data)
234
- });
235
- if (!putRes.ok) {
236
- console.warn("LetsPing: Failed to upload state_snapshot to storage", await putRes.text());
237
- }
238
- } catch (e) {
239
- console.warn("LetsPing: Exception uploading state_snapshot", e.message);
240
- }
241
- }
242
- if (span) span.setAttribute("letsping.request_id", id);
243
- const timeout = options.timeoutMs || 24 * 60 * 60 * 1e3;
244
- const start = Date.now();
245
- let delay = 1e3;
246
- const maxDelay = 1e4;
247
- while (Date.now() - start < timeout) {
248
- try {
249
- const check = await this.request("GET", `/status/${id}`);
250
- if (check.status === "APPROVED" || check.status === "REJECTED") {
251
- const decryptedPayload = this._decrypt(check.payload) ?? options.payload;
252
- const decryptedPatched = check.patched_payload ? this._decrypt(check.patched_payload) : void 0;
253
- let diff_summary;
254
- let finalStatus = check.status;
255
- if (check.status === "APPROVED" && decryptedPatched !== void 0) {
256
- finalStatus = "APPROVED_WITH_MODIFICATIONS";
257
- const diff = computeDiff(decryptedPayload, decryptedPatched);
258
- diff_summary = diff ? { changes: diff } : { changes: "Unknown structure changes" };
259
- }
260
- if (span) {
261
- span.setAttribute("letsping.status", finalStatus);
262
- if (check.actor_id) span.setAttribute("letsping.actor_id", check.actor_id);
263
- span.end();
264
- }
265
- return {
266
- status: finalStatus,
267
- payload: decryptedPayload,
268
- patched_payload: decryptedPatched,
269
- diff_summary,
270
- metadata: {
271
- resolved_at: check.resolved_at,
272
- actor_id: check.actor_id
273
- }
274
- };
275
- }
276
- } catch (e) {
277
- const s = e.status;
278
- if (s && s >= 400 && s < 500 && s !== 404 && s !== 429) throw e;
279
- }
280
- const jitter = Math.random() * 200;
281
- await new Promise((r) => setTimeout(r, delay + jitter));
282
- delay = Math.min(delay * 1.5, maxDelay);
283
- }
284
- throw new LetsPingError(`Request ${id} timed out waiting for approval.`);
285
- } catch (error) {
286
- if (span) {
287
- span.recordException(error);
288
- span.setStatus({ code: otel.SpanStatusCode.ERROR });
289
- span.end();
290
- }
291
- throw error;
292
- }
293
- }
294
- async defer(options) {
295
- const otel = await getOtel();
296
- let span = null;
297
- if (otel && otel.trace) {
298
- const tracer = otel.trace.getTracer("letsping-sdk");
299
- span = tracer.startSpan(`letsping.defer`, {
300
- attributes: {
301
- "letsping.service": options.service,
302
- "letsping.action": options.action,
303
- "letsping.priority": options.priority || "medium"
304
- }
305
- });
306
- }
307
- const traceId = options.trace_id;
308
- const parentId = options.parent_request_id;
309
- const basePayload = options.payload || {};
310
- const metaKey = "_lp_meta";
311
- const existingMeta = basePayload[metaKey] || {};
312
- const enrichedPayload = {
313
- ...basePayload,
314
- [metaKey]: {
315
- ...existingMeta,
316
- ...traceId ? { trace_id: traceId } : {},
317
- ...parentId ? { parent_request_id: parentId } : {}
318
- }
319
- };
320
- try {
321
- const res = await this.request("POST", "/ingest", {
322
- service: options.service,
323
- action: options.action,
324
- payload: this._encrypt(enrichedPayload),
325
- priority: options.priority || "medium",
326
- schema: options.schema,
327
- metadata: { role: options.role, sdk: "node", trace_id: traceId, parent_request_id: parentId }
328
- });
329
- if (res.uploadUrl && options.state_snapshot) {
330
- try {
331
- const { data, contentType } = this._prepareStateUpload(options.state_snapshot, res.dek);
332
- const putRes = await fetch(res.uploadUrl, {
333
- method: "PUT",
334
- headers: { "Content-Type": contentType },
335
- body: Buffer.isBuffer(data) ? data : JSON.stringify(data)
336
- });
337
- if (!putRes.ok) {
338
- console.warn("LetsPing: Failed to upload state_snapshot to storage", await putRes.text());
339
- }
340
- } catch (e) {
341
- console.warn("LetsPing: Exception uploading state_snapshot", e.message);
342
- }
343
- }
344
- if (span) {
345
- span.setAttribute("letsping.request_id", res.id);
346
- span.end();
347
- }
348
- return { id: res.id };
349
- } catch (error) {
350
- if (span) {
351
- span.recordException(error);
352
- span.setStatus({ code: otel.SpanStatusCode.ERROR });
353
- span.end();
354
- }
355
- throw error;
356
- }
357
- }
358
- async request(method, path, body) {
359
- const headers = {
360
- "Authorization": `Bearer ${this.apiKey}`,
361
- "Content-Type": "application/json",
362
- "User-Agent": `letsping-node/${SDK_VERSION}`
363
- };
364
- try {
365
- const response = await fetch(`${this.baseUrl}${path}`, {
366
- method,
367
- headers,
368
- body: body ? JSON.stringify(body) : void 0
369
- });
370
- if (!response.ok) {
371
- const errorText = await response.text();
372
- let message = errorText;
373
- try {
374
- const json = JSON.parse(errorText);
375
- if (json.message) message = json.message;
376
- } catch {
377
- }
378
- throw new LetsPingError(`API Error [${response.status}]: ${message}`, response.status);
379
- }
380
- return response.json();
381
- } catch (e) {
382
- if (e instanceof LetsPingError) throw e;
383
- throw new LetsPingError(`Network Error: ${e.message}`);
384
- }
385
- }
386
- tool(service, action, priority = "medium") {
387
- return async (context) => {
388
- let payload;
389
- try {
390
- if (typeof context === "string") {
391
- try {
392
- payload = JSON.parse(context);
393
- } catch {
394
- payload = { raw_context: context };
395
- }
396
- } else if (typeof context === "object" && context !== null) {
397
- payload = context;
398
- } else {
399
- payload = { raw_context: String(context) };
400
- }
401
- const result = await this.ask({ service, action, payload, priority });
402
- if (result.status === "REJECTED") {
403
- return "STOP: Action Rejected by Human.";
404
- }
405
- if (result.status === "APPROVED_WITH_MODIFICATIONS") {
406
- return JSON.stringify({
407
- status: "APPROVED_WITH_MODIFICATIONS",
408
- message: "The human reviewer authorized this action but modified your original payload. Please review the diff_summary to learn from this correction.",
409
- diff_summary: result.diff_summary,
410
- original_payload: result.payload,
411
- executed_payload: result.patched_payload
412
- });
413
- }
414
- return JSON.stringify({
415
- status: "APPROVED",
416
- executed_payload: result.payload
417
- });
418
- } catch (e) {
419
- return `ERROR: System Failure: ${e.message}`;
420
- }
421
- };
422
- }
423
- async webhookHandler(payloadStr, signatureHeader, webhookSecret) {
424
- const sigParts = signatureHeader.split(",").map((p) => p.split("="));
425
- const sigMap = Object.fromEntries(sigParts);
426
- const rawTs = sigMap["t"];
427
- const rawSig = sigMap["v1"];
428
- if (!rawTs || !rawSig) {
429
- throw new LetsPingError("LetsPing Error: Missing webhook signature fields", 401);
430
- }
431
- const ts = Number(rawTs);
432
- if (!Number.isFinite(ts)) {
433
- throw new LetsPingError("LetsPing Error: Invalid webhook timestamp", 401);
434
- }
435
- const now = Date.now();
436
- const skewMs = Math.abs(now - ts);
437
- const maxSkewMs = 5 * 60 * 1e3;
438
- if (skewMs > maxSkewMs) {
439
- throw new LetsPingError("LetsPing Error: Webhook replay window exceeded", 401);
440
- }
441
- const expected = createHmac("sha256", webhookSecret).update(payloadStr).digest("hex");
442
- if (rawSig !== expected) {
443
- throw new LetsPingError("LetsPing Error: Invalid webhook signature", 401);
444
- }
445
- const payload = JSON.parse(payloadStr);
446
- const data = payload.data;
447
- let state_snapshot = void 0;
448
- if (data && data.state_download_url) {
449
- try {
450
- const res = await fetch(data.state_download_url);
451
- if (res.ok) {
452
- const contentType = res.headers.get("content-type") || "";
453
- if (contentType.includes("application/octet-stream")) {
454
- const fallbackDek = data.dek;
455
- if (fallbackDek) {
456
- const buffer = Buffer.from(await res.arrayBuffer());
457
- const keyBuf = Buffer.from(fallbackDek, "base64");
458
- const iv = buffer.subarray(0, 12);
459
- const ctFull = buffer.subarray(12);
460
- const authTag = ctFull.subarray(ctFull.length - 16);
461
- const ct = ctFull.subarray(0, ctFull.length - 16);
462
- const decipher = createDecipheriv("aes-256-gcm", keyBuf, iv);
463
- decipher.setAuthTag(authTag);
464
- const plain = Buffer.concat([decipher.update(ct), decipher.final()]);
465
- state_snapshot = JSON.parse(plain.toString("utf8"));
466
- } else {
467
- console.warn("LetsPing: Missing fallback DEK to decrypt octet-stream storage file");
468
- }
469
- } else {
470
- const encState = await res.json();
471
- state_snapshot = this._decrypt(encState);
472
- }
473
- } else {
474
- console.warn("LetsPing: Could not fetch state_snapshot from storage", await res.text());
475
- }
476
- } catch (e) {
477
- console.warn("LetsPing: Exception downloading state_snapshot from webhook url", e.message);
478
- }
479
- }
480
- return {
481
- id: payload.id,
482
- event: payload.event,
483
- data,
484
- state_snapshot
485
- };
486
- }
487
- };
488
- export {
489
- LetsPing,
490
- LetsPingError,
491
- computeDiff
492
- };
493
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@letsping/sdk\",\n \"version\": \"0.2.0\",\n \"description\": \"Behavioral Firewall and Cryo-Sleep State Parking for Autonomous Agents\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./integrations/langgraph\": {\n \"types\": \"./dist/integrations/langgraph.d.ts\",\n \"require\": \"./dist/integrations/langgraph.js\",\n \"import\": \"./dist/integrations/langgraph.mjs\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup && tsc --emitDeclarationOnly --outDir dist\",\n \"dev\": \"tsup --watch\",\n \"clean\": \"rm -rf dist .turbo\"\n },\n \"peerDependencies\": {\n \"@langchain/core\": \">=0.1.52\",\n \"@langchain/langgraph\": \">=0.0.1\",\n \"@opentelemetry/api\": \"^1.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@opentelemetry/api\": {\n \"optional\": true\n },\n \"@langchain/langgraph\": {\n \"optional\": true\n },\n \"@langchain/core\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@langchain/core\": \"^1.1.28\",\n \"@langchain/langgraph\": \"^1.1.5\",\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.2\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import { createCipheriv, createDecipheriv, randomBytes, createHmac } from \"node:crypto\";\r\n\r\nlet SDK_VERSION = \"0.2.0\";\r\ntry {\r\n\r\n SDK_VERSION = require(\"../package.json\").version;\r\n} catch { }\r\n\r\nlet otelApi: any = null;\r\nlet otelTried = false;\r\n\r\nasync function getOtel() {\r\n if (otelTried) return otelApi;\r\n otelTried = true;\r\n try {\r\n otelApi = await import(\"@opentelemetry/api\");\r\n } catch { }\r\n return otelApi;\r\n}\r\n\r\nexport type Priority = \"low\" | \"medium\" | \"high\" | \"critical\";\r\n\r\nexport interface RequestOptions {\r\n\r\n service: string;\r\n\r\n action: string;\r\n\r\n payload: Record<string, any>;\r\n\r\n priority?: Priority;\r\n\r\n schema?: Record<string, any>;\r\n\r\n state_snapshot?: Record<string, any>;\r\n\r\n timeoutMs?: number;\r\n\r\n role?: string;\r\n\r\n /**\r\n * Optional distributed tracing identifiers. If provided, these will be\r\n * attached to the request envelope so downstream frameworks can stitch\r\n * together multi-agent flows.\r\n */\r\n trace_id?: string;\r\n parent_request_id?: string;\r\n}\r\n\r\nexport interface Decision {\r\n status: \"APPROVED\" | \"REJECTED\" | \"APPROVED_WITH_MODIFICATIONS\";\r\n\r\n payload: any;\r\n\r\n patched_payload?: any;\r\n\r\n diff_summary?: any;\r\n metadata?: {\r\n resolved_at: string;\r\n actor_id: string;\r\n method?: string;\r\n };\r\n}\r\n\r\nexport class LetsPingError extends Error {\r\n constructor(message: string, public status?: number) {\r\n super(message);\r\n this.name = \"LetsPingError\";\r\n }\r\n}\r\n\r\ninterface EncEnvelope {\r\n _lp_enc: true;\r\n iv: string;\r\n ct: string;\r\n}\r\n\r\nfunction isEncEnvelope(v: unknown): v is EncEnvelope {\r\n return (\r\n typeof v === \"object\" && v !== null &&\r\n (v as any)._lp_enc === true &&\r\n typeof (v as any).iv === \"string\" &&\r\n typeof (v as any).ct === \"string\"\r\n );\r\n}\r\n\r\nfunction encryptPayload(keyBase64: string, payload: Record<string, any>): EncEnvelope {\r\n const keyBuf = Buffer.from(keyBase64, \"base64\");\r\n const iv = randomBytes(12);\r\n const cipher = createCipheriv(\"aes-256-gcm\", keyBuf, iv);\r\n const plain = Buffer.from(JSON.stringify(payload), \"utf8\");\r\n const ct = Buffer.concat([cipher.update(plain), cipher.final(), cipher.getAuthTag()]);\r\n return {\r\n _lp_enc: true,\r\n iv: iv.toString(\"base64\"),\r\n ct: ct.toString(\"base64\"),\r\n };\r\n}\r\n\r\nfunction decryptPayload(keyBase64: string, envelope: EncEnvelope): Record<string, any> {\r\n const keyBuf = Buffer.from(keyBase64, \"base64\");\r\n const iv = Buffer.from(envelope.iv, \"base64\");\r\n const ctFull = Buffer.from(envelope.ct, \"base64\");\r\n\r\n const authTag = ctFull.subarray(ctFull.length - 16);\r\n const ct = ctFull.subarray(0, ctFull.length - 16);\r\n const decipher = createDecipheriv(\"aes-256-gcm\", keyBuf, iv);\r\n decipher.setAuthTag(authTag);\r\n const plain = Buffer.concat([decipher.update(ct), decipher.final()]);\r\n return JSON.parse(plain.toString(\"utf8\"));\r\n}\r\n\r\nfunction computeDiff(original: any, patched: any): any {\r\n if (original === patched) return null;\r\n\r\n if (\r\n typeof original !== \"object\" ||\r\n typeof patched !== \"object\" ||\r\n original === null ||\r\n patched === null ||\r\n Array.isArray(original) ||\r\n Array.isArray(patched)\r\n ) {\r\n if (JSON.stringify(original) !== JSON.stringify(patched)) {\r\n return { from: original, to: patched };\r\n }\r\n return null;\r\n }\r\n\r\n const changes: Record<string, any> = {};\r\n let hasChanges = false;\r\n const allKeys = new Set([...Object.keys(original), ...Object.keys(patched)]);\r\n\r\n for (const key of allKeys) {\r\n const oV = original[key];\r\n const pV = patched[key];\r\n\r\n if (!(key in original)) {\r\n changes[key] = { from: undefined, to: pV };\r\n hasChanges = true;\r\n } else if (!(key in patched)) {\r\n changes[key] = { from: oV, to: undefined };\r\n hasChanges = true;\r\n } else {\r\n const nestedDiff = computeDiff(oV, pV);\r\n if (nestedDiff) {\r\n changes[key] = nestedDiff;\r\n hasChanges = true;\r\n }\r\n }\r\n }\r\n\r\n return hasChanges ? changes : null;\r\n}\r\n\r\nexport class LetsPing {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly encryptionKey: string | null;\r\n\r\n constructor(apiKey?: string, options?: { baseUrl?: string; encryptionKey?: string }) {\r\n const key = apiKey || process.env.LETSPING_API_KEY;\r\n if (!key) throw new Error(\"LetsPing: API Key is required. Pass it to the constructor or set LETSPING_API_KEY env var.\");\r\n\r\n this.apiKey = key;\r\n this.baseUrl = options?.baseUrl || \"https://letsping.co/api\";\r\n this.encryptionKey = options?.encryptionKey\r\n ?? process.env.LETSPING_ENCRYPTION_KEY\r\n ?? null;\r\n }\r\n\r\n private _encrypt(payload: Record<string, any>): Record<string, any> {\r\n if (!this.encryptionKey) return payload;\r\n return encryptPayload(this.encryptionKey, payload) as any;\r\n }\r\n\r\n private _decrypt(val: any): any {\r\n if (!this.encryptionKey || !isEncEnvelope(val)) return val;\r\n try {\r\n return decryptPayload(this.encryptionKey, val);\r\n } catch {\r\n\r\n return val;\r\n }\r\n }\r\n\r\n private _prepareStateUpload(\r\n stateSnapshot: Record<string, any>,\r\n fallbackDek?: string\r\n ): { data: any; contentType: string } {\r\n if (this.encryptionKey) {\r\n return {\r\n data: this._encrypt(stateSnapshot),\r\n contentType: \"application/json\"\r\n };\r\n } else if (fallbackDek) {\r\n const keyBuf = Buffer.from(fallbackDek, \"base64\");\r\n const iv = randomBytes(12);\r\n const cipher = createCipheriv(\"aes-256-gcm\", keyBuf, iv);\r\n const plain = Buffer.from(JSON.stringify(stateSnapshot), \"utf8\");\r\n const ct = Buffer.concat([cipher.update(plain), cipher.final(), cipher.getAuthTag()]);\r\n const finalPayload = Buffer.concat([iv, ct]);\r\n\r\n return {\r\n data: finalPayload,\r\n contentType: \"application/octet-stream\"\r\n };\r\n }\r\n return {\r\n data: stateSnapshot,\r\n contentType: \"application/json\"\r\n };\r\n }\r\n\r\n async ask(options: RequestOptions): Promise<Decision> {\r\n if (options.schema && (options.schema as any)._def) {\r\n throw new LetsPingError(\"LetsPing Error: Raw Zod schema detected. You must convert it to JSON Schema (e.g. using 'zod-to-json-schema') before passing it to the SDK.\");\r\n }\r\n\r\n const otel = await getOtel();\r\n let span: any = null;\r\n if (otel && otel.trace) {\r\n const tracer = otel.trace.getTracer(\"letsping-sdk\");\r\n span = tracer.startSpan(`letsping.ask`, {\r\n attributes: {\r\n \"letsping.service\": options.service,\r\n \"letsping.action\": options.action,\r\n \"letsping.priority\": options.priority || \"medium\",\r\n }\r\n });\r\n }\r\n\r\n const traceId = options.trace_id;\r\n const parentId = options.parent_request_id;\r\n\r\n // Do not mutate caller payload; attach tracing metadata under a reserved key.\r\n const basePayload = options.payload || {};\r\n const metaKey = \"_lp_meta\";\r\n const existingMeta = (basePayload as any)[metaKey] || {};\r\n const enrichedPayload = {\r\n ...basePayload,\r\n [metaKey]: {\r\n ...existingMeta,\r\n ...(traceId ? { trace_id: traceId } : {}),\r\n ...(parentId ? { parent_request_id: parentId } : {}),\r\n },\r\n };\r\n\r\n try {\r\n const res = await this.request<{ id: string, uploadUrl?: string, dek?: string }>(\"POST\", \"/ingest\", {\r\n service: options.service,\r\n action: options.action,\r\n payload: this._encrypt(enrichedPayload),\r\n priority: options.priority || \"medium\",\r\n schema: options.schema,\r\n metadata: { role: options.role, sdk: \"node\", trace_id: traceId, parent_request_id: parentId }\r\n });\r\n\r\n const { id, uploadUrl, dek } = res;\r\n\r\n if (uploadUrl && options.state_snapshot) {\r\n try {\r\n const { data, contentType } = this._prepareStateUpload(options.state_snapshot, dek);\r\n const putRes = await fetch(uploadUrl, {\r\n method: \"PUT\",\r\n headers: { \"Content-Type\": contentType },\r\n body: Buffer.isBuffer(data) ? (data as any) : JSON.stringify(data)\r\n });\r\n if (!putRes.ok) {\r\n console.warn(\"LetsPing: Failed to upload state_snapshot to storage\", await putRes.text());\r\n }\r\n } catch (e: any) {\r\n console.warn(\"LetsPing: Exception uploading state_snapshot\", e.message);\r\n }\r\n }\r\n\r\n if (span) span.setAttribute(\"letsping.request_id\", id);\r\n\r\n const timeout = options.timeoutMs || 24 * 60 * 60 * 1000;\r\n const start = Date.now();\r\n let delay = 1000;\r\n const maxDelay = 10000;\r\n\r\n while (Date.now() - start < timeout) {\r\n try {\r\n const check = await this.request<any>(\"GET\", `/status/${id}`);\r\n\r\n if (check.status === \"APPROVED\" || check.status === \"REJECTED\") {\r\n const decryptedPayload = this._decrypt(check.payload) ?? options.payload;\r\n const decryptedPatched = check.patched_payload ? this._decrypt(check.patched_payload) : undefined;\r\n\r\n let diff_summary;\r\n let finalStatus = check.status;\r\n if (check.status === \"APPROVED\" && decryptedPatched !== undefined) {\r\n finalStatus = \"APPROVED_WITH_MODIFICATIONS\";\r\n const diff = computeDiff(decryptedPayload, decryptedPatched);\r\n diff_summary = diff ? { changes: diff } : { changes: \"Unknown structure changes\" };\r\n }\r\n\r\n if (span) {\r\n span.setAttribute(\"letsping.status\", finalStatus);\r\n if (check.actor_id) span.setAttribute(\"letsping.actor_id\", check.actor_id);\r\n span.end();\r\n }\r\n\r\n return {\r\n status: finalStatus,\r\n payload: decryptedPayload,\r\n patched_payload: decryptedPatched,\r\n diff_summary,\r\n metadata: {\r\n resolved_at: check.resolved_at,\r\n actor_id: check.actor_id,\r\n }\r\n };\r\n }\r\n } catch (e: any) {\r\n const s = e.status;\r\n if (s && s >= 400 && s < 500 && s !== 404 && s !== 429) throw e;\r\n }\r\n\r\n const jitter = Math.random() * 200;\r\n await new Promise(r => setTimeout(r, delay + jitter));\r\n delay = Math.min(delay * 1.5, maxDelay);\r\n }\r\n\r\n throw new LetsPingError(`Request ${id} timed out waiting for approval.`);\r\n } catch (error: any) {\r\n if (span) {\r\n span.recordException(error);\r\n span.setStatus({ code: otel.SpanStatusCode.ERROR });\r\n span.end();\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async defer(options: RequestOptions): Promise<{ id: string }> {\r\n const otel = await getOtel();\r\n let span: any = null;\r\n if (otel && otel.trace) {\r\n const tracer = otel.trace.getTracer(\"letsping-sdk\");\r\n span = tracer.startSpan(`letsping.defer`, {\r\n attributes: {\r\n \"letsping.service\": options.service,\r\n \"letsping.action\": options.action,\r\n \"letsping.priority\": options.priority || \"medium\",\r\n }\r\n });\r\n }\r\n\r\n const traceId = options.trace_id;\r\n const parentId = options.parent_request_id;\r\n const basePayload = options.payload || {};\r\n const metaKey = \"_lp_meta\";\r\n const existingMeta = (basePayload as any)[metaKey] || {};\r\n const enrichedPayload = {\r\n ...basePayload,\r\n [metaKey]: {\r\n ...existingMeta,\r\n ...(traceId ? { trace_id: traceId } : {}),\r\n ...(parentId ? { parent_request_id: parentId } : {}),\r\n },\r\n };\r\n\r\n try {\r\n const res = await this.request<{ id: string, uploadUrl?: string, dek?: string }>(\"POST\", \"/ingest\", {\r\n service: options.service,\r\n action: options.action,\r\n payload: this._encrypt(enrichedPayload),\r\n priority: options.priority || \"medium\",\r\n schema: options.schema,\r\n metadata: { role: options.role, sdk: \"node\", trace_id: traceId, parent_request_id: parentId },\r\n });\r\n if (res.uploadUrl && options.state_snapshot) {\r\n try {\r\n const { data, contentType } = this._prepareStateUpload(options.state_snapshot, res.dek);\r\n const putRes = await fetch(res.uploadUrl, {\r\n method: \"PUT\",\r\n headers: { \"Content-Type\": contentType },\r\n body: Buffer.isBuffer(data) ? (data as any) : JSON.stringify(data)\r\n });\r\n if (!putRes.ok) {\r\n console.warn(\"LetsPing: Failed to upload state_snapshot to storage\", await putRes.text());\r\n }\r\n } catch (e: any) {\r\n console.warn(\"LetsPing: Exception uploading state_snapshot\", e.message);\r\n }\r\n }\r\n\r\n if (span) {\r\n span.setAttribute(\"letsping.request_id\", res.id);\r\n span.end();\r\n }\r\n return { id: res.id };\r\n } catch (error: any) {\r\n if (span) {\r\n span.recordException(error);\r\n span.setStatus({ code: otel.SpanStatusCode.ERROR });\r\n span.end();\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async request<T>(method: string, path: string, body?: any): Promise<T> {\r\n const headers: Record<string, string> = {\r\n \"Authorization\": `Bearer ${this.apiKey}`,\r\n \"Content-Type\": \"application/json\",\r\n \"User-Agent\": `letsping-node/${SDK_VERSION}`,\r\n };\r\n\r\n try {\r\n const response = await fetch(`${this.baseUrl}${path}`, {\r\n method,\r\n headers,\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n let message = errorText;\r\n try {\r\n const json = JSON.parse(errorText);\r\n if (json.message) message = json.message;\r\n } catch { }\r\n throw new LetsPingError(`API Error [${response.status}]: ${message}`, response.status);\r\n }\r\n\r\n return response.json() as Promise<T>;\r\n } catch (e: any) {\r\n if (e instanceof LetsPingError) throw e;\r\n throw new LetsPingError(`Network Error: ${e.message}`);\r\n }\r\n }\r\n\r\n tool(service: string, action: string, priority: Priority = \"medium\"): (context: string | Record<string, any>) => Promise<string> {\r\n return async (context: string | Record<string, any>): Promise<string> => {\r\n let payload: Record<string, any>;\r\n try {\r\n if (typeof context === \"string\") {\r\n try { payload = JSON.parse(context); }\r\n catch { payload = { raw_context: context }; }\r\n } else if (typeof context === \"object\" && context !== null) {\r\n payload = context;\r\n } else {\r\n payload = { raw_context: String(context) };\r\n }\r\n\r\n const result = await this.ask({ service, action, payload, priority });\r\n\r\n if (result.status === \"REJECTED\") {\r\n return \"STOP: Action Rejected by Human.\";\r\n }\r\n\r\n if (result.status === \"APPROVED_WITH_MODIFICATIONS\") {\r\n return JSON.stringify({\r\n status: \"APPROVED_WITH_MODIFICATIONS\",\r\n message: \"The human reviewer authorized this action but modified your original payload. Please review the diff_summary to learn from this correction.\",\r\n diff_summary: result.diff_summary,\r\n original_payload: result.payload,\r\n executed_payload: result.patched_payload\r\n });\r\n }\r\n\r\n return JSON.stringify({\r\n status: \"APPROVED\",\r\n executed_payload: result.payload\r\n });\r\n } catch (e: any) {\r\n return `ERROR: System Failure: ${e.message}`;\r\n }\r\n };\r\n }\r\n\r\n async webhookHandler(\r\n payloadStr: string,\r\n signatureHeader: string,\r\n webhookSecret: string\r\n ): Promise<{ id: string; event: string; data: Decision; state_snapshot?: Record<string, any> }> {\r\n const sigParts = signatureHeader.split(\",\").map(p => p.split(\"=\"));\r\n const sigMap = Object.fromEntries(sigParts);\r\n\r\n const rawTs = sigMap[\"t\"];\r\n const rawSig = sigMap[\"v1\"];\r\n if (!rawTs || !rawSig) {\r\n throw new LetsPingError(\"LetsPing Error: Missing webhook signature fields\", 401);\r\n }\r\n\r\n const ts = Number(rawTs);\r\n if (!Number.isFinite(ts)) {\r\n throw new LetsPingError(\"LetsPing Error: Invalid webhook timestamp\", 401);\r\n }\r\n\r\n const now = Date.now();\r\n const skewMs = Math.abs(now - ts);\r\n const maxSkewMs = 5 * 60 * 1000; // 5 minutes\r\n if (skewMs > maxSkewMs) {\r\n throw new LetsPingError(\"LetsPing Error: Webhook replay window exceeded\", 401);\r\n }\r\n\r\n const expected = createHmac(\"sha256\", webhookSecret).update(payloadStr).digest(\"hex\");\r\n if (rawSig !== expected) {\r\n throw new LetsPingError(\"LetsPing Error: Invalid webhook signature\", 401);\r\n }\r\n\r\n const payload = JSON.parse(payloadStr);\r\n const data = payload.data;\r\n let state_snapshot = undefined;\r\n\r\n if (data && data.state_download_url) {\r\n try {\r\n const res = await fetch(data.state_download_url);\r\n if (res.ok) {\r\n const contentType = res.headers.get(\"content-type\") || \"\";\r\n if (contentType.includes(\"application/octet-stream\")) {\r\n const fallbackDek = data.dek;\r\n if (fallbackDek) {\r\n const buffer = Buffer.from(await res.arrayBuffer());\r\n const keyBuf = Buffer.from(fallbackDek, \"base64\");\r\n const iv = buffer.subarray(0, 12);\r\n const ctFull = buffer.subarray(12);\r\n\r\n const authTag = ctFull.subarray(ctFull.length - 16);\r\n const ct = ctFull.subarray(0, ctFull.length - 16);\r\n\r\n const decipher = createDecipheriv(\"aes-256-gcm\", keyBuf, iv);\r\n decipher.setAuthTag(authTag);\r\n const plain = Buffer.concat([decipher.update(ct), decipher.final()]);\r\n state_snapshot = JSON.parse(plain.toString(\"utf8\"));\r\n } else {\r\n console.warn(\"LetsPing: Missing fallback DEK to decrypt octet-stream storage file\");\r\n }\r\n } else {\r\n const encState = await res.json();\r\n state_snapshot = this._decrypt(encState);\r\n }\r\n } else {\r\n console.warn(\"LetsPing: Could not fetch state_snapshot from storage\", await res.text());\r\n }\r\n } catch (e: any) {\r\n console.warn(\"LetsPing: Exception downloading state_snapshot from webhook url\", e.message);\r\n }\r\n }\r\n\r\n return {\r\n id: payload.id,\r\n event: payload.event,\r\n data,\r\n state_snapshot\r\n };\r\n }\r\n}\r\n\r\nexport { computeDiff };"],"mappings":"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","names":[]}
@@ -1,20 +0,0 @@
1
- import { BaseCheckpointSaver, Checkpoint, CheckpointMetadata, CheckpointTuple } from '@langchain/langgraph';
2
- import { RunnableConfig } from '@langchain/core/runnables';
3
- import { LetsPing } from '../index.mjs';
4
-
5
- declare class LetsPingCheckpointer extends BaseCheckpointSaver {
6
- client: LetsPing;
7
- private checkpoints;
8
- constructor(client: LetsPing);
9
- private getTransport;
10
- private saveRemote;
11
- private loadRemote;
12
- private deleteRemote;
13
- put(config: RunnableConfig, checkpoint: Checkpoint, metadata: CheckpointMetadata, newVersions?: Record<string, string | number>): Promise<RunnableConfig>;
14
- putWrites(config: RunnableConfig, writes: any, taskId: string): Promise<void>;
15
- deleteThread(threadId: string): Promise<void>;
16
- getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined>;
17
- list(config: RunnableConfig, options?: any): AsyncGenerator<CheckpointTuple>;
18
- }
19
-
20
- export { LetsPingCheckpointer };
@@ -1,17 +0,0 @@
1
- import { BaseCheckpointSaver, Checkpoint, CheckpointMetadata, CheckpointTuple } from "@langchain/langgraph";
2
- import { RunnableConfig } from "@langchain/core/runnables";
3
- import { LetsPing } from "../index";
4
- export declare class LetsPingCheckpointer extends BaseCheckpointSaver {
5
- client: LetsPing;
6
- private checkpoints;
7
- constructor(client: LetsPing);
8
- private getTransport;
9
- private saveRemote;
10
- private loadRemote;
11
- private deleteRemote;
12
- put(config: RunnableConfig, checkpoint: Checkpoint, metadata: CheckpointMetadata, newVersions?: Record<string, string | number>): Promise<RunnableConfig>;
13
- putWrites(config: RunnableConfig, writes: any, taskId: string): Promise<void>;
14
- deleteThread(threadId: string): Promise<void>;
15
- getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined>;
16
- list(config: RunnableConfig, options?: any): AsyncGenerator<CheckpointTuple>;
17
- }