@execlave/sdk 1.1.5 → 1.2.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/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +5 -1
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/mcp.d.ts +36 -0
- package/dist/integrations/mcp.d.ts.map +1 -0
- package/dist/integrations/mcp.js +167 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/openai-chat.d.ts +41 -0
- package/dist/integrations/openai-chat.d.ts.map +1 -0
- package/dist/integrations/openai-chat.js +164 -0
- package/dist/integrations/openai-chat.js.map +1 -0
- package/package.json +30 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rishit Mavani
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Official JavaScript/TypeScript SDK for the [Execlave](https://www.execlave.com)
|
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://www.execlave.com/docs)
|
|
9
9
|
|
|
10
|
-
> **Framework integrations** —
|
|
10
|
+
> **Framework integrations** — drop-in handlers for [LangChain](https://www.execlave.com/docs/integrations/langchain), the [OpenAI Agents SDK](https://www.execlave.com/docs/integrations/openai-agents), [CrewAI](https://www.execlave.com/docs/integrations/crewai), the [OpenAI Chat Completions API](https://www.execlave.com/docs/integrations/openai-chat), and the [Model Context Protocol](https://www.execlave.com/docs/integrations/mcp), or see [all integrations](https://www.execlave.com/docs/integrations). [Get an API key](https://www.execlave.com/signup?utm_source=github&utm_medium=sdk&utm_campaign=js).
|
|
11
11
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
@@ -13,4 +13,8 @@ export { ExeclaveTracingProcessor } from './openai-agents';
|
|
|
13
13
|
export type { ExeclaveTracingProcessorOptions } from './openai-agents';
|
|
14
14
|
export { instrumentCrew } from './crewai';
|
|
15
15
|
export type { InstrumentCrewOptions } from './crewai';
|
|
16
|
+
export { instrumentOpenAI } from './openai-chat';
|
|
17
|
+
export type { InstrumentOpenAIOptions } from './openai-chat';
|
|
18
|
+
export { instrumentMcpClient } from './mcp';
|
|
19
|
+
export type { InstrumentMcpClientOptions } from './mcp';
|
|
16
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,YAAY,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAC5C,YAAY,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -9,11 +9,15 @@
|
|
|
9
9
|
* import { ExeclaveCallbackHandler } from '@execlave/sdk/integrations/langchain';
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.instrumentCrew = exports.ExeclaveTracingProcessor = exports.ExeclaveCallbackHandler = void 0;
|
|
12
|
+
exports.instrumentMcpClient = exports.instrumentOpenAI = exports.instrumentCrew = exports.ExeclaveTracingProcessor = exports.ExeclaveCallbackHandler = void 0;
|
|
13
13
|
var langchain_1 = require("./langchain");
|
|
14
14
|
Object.defineProperty(exports, "ExeclaveCallbackHandler", { enumerable: true, get: function () { return langchain_1.ExeclaveCallbackHandler; } });
|
|
15
15
|
var openai_agents_1 = require("./openai-agents");
|
|
16
16
|
Object.defineProperty(exports, "ExeclaveTracingProcessor", { enumerable: true, get: function () { return openai_agents_1.ExeclaveTracingProcessor; } });
|
|
17
17
|
var crewai_1 = require("./crewai");
|
|
18
18
|
Object.defineProperty(exports, "instrumentCrew", { enumerable: true, get: function () { return crewai_1.instrumentCrew; } });
|
|
19
|
+
var openai_chat_1 = require("./openai-chat");
|
|
20
|
+
Object.defineProperty(exports, "instrumentOpenAI", { enumerable: true, get: function () { return openai_chat_1.instrumentOpenAI; } });
|
|
21
|
+
var mcp_1 = require("./mcp");
|
|
22
|
+
Object.defineProperty(exports, "instrumentMcpClient", { enumerable: true, get: function () { return mcp_1.instrumentMcpClient; } });
|
|
19
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA;AAGhC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AAGjC,mCAA0C;AAAjC,wGAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA;AAGhC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AAGjC,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AAGvB,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA;AAGzB,6BAA4C;AAAnC,0GAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Context Protocol (MCP) client auto-instrumentation.
|
|
3
|
+
*
|
|
4
|
+
* Wrap an `@modelcontextprotocol/sdk` `Client` so every `callTool` is
|
|
5
|
+
* policy-enforced (tool allowlist) and recorded as a `tool` span.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
+
* import { Execlave } from '@execlave/sdk';
|
|
10
|
+
* import { instrumentMcpClient } from '@execlave/sdk/integrations/mcp';
|
|
11
|
+
*
|
|
12
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
13
|
+
* const mcp = new Client({ name: 'app', version: '1.0' });
|
|
14
|
+
* instrumentMcpClient(mcp, exe, { agentId: 'my-bot' });
|
|
15
|
+
*
|
|
16
|
+
* const result = await mcp.callTool({ name: 'search', arguments: { q: 'x' } });
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Idempotent. No compile-time dependency on the MCP SDK — the call
|
|
20
|
+
* surface is duck-typed.
|
|
21
|
+
*/
|
|
22
|
+
import type { Execlave } from '../client';
|
|
23
|
+
export interface InstrumentMcpClientOptions {
|
|
24
|
+
/** Agent id registered with Execlave. Required for enforcement. */
|
|
25
|
+
agentId: string;
|
|
26
|
+
/** Run `enforcePolicy` on tool calls. Default true. */
|
|
27
|
+
enforce?: boolean;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
userId?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Wrap `client.callTool` to enforce policies and record a tool span.
|
|
33
|
+
* Returns the same client for fluent chaining.
|
|
34
|
+
*/
|
|
35
|
+
export declare function instrumentMcpClient<T>(client: T, exe: Execlave, opts: InstrumentMcpClientOptions): T;
|
|
36
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/integrations/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAsB1C,MAAM,WAAW,0BAA0B;IACzC,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,MAAM,EAAE,CAAC,EACT,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,0BAA0B,GAC/B,CAAC,CA4EH"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model Context Protocol (MCP) client auto-instrumentation.
|
|
4
|
+
*
|
|
5
|
+
* Wrap an `@modelcontextprotocol/sdk` `Client` so every `callTool` is
|
|
6
|
+
* policy-enforced (tool allowlist) and recorded as a `tool` span.
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
10
|
+
* import { Execlave } from '@execlave/sdk';
|
|
11
|
+
* import { instrumentMcpClient } from '@execlave/sdk/integrations/mcp';
|
|
12
|
+
*
|
|
13
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
14
|
+
* const mcp = new Client({ name: 'app', version: '1.0' });
|
|
15
|
+
* instrumentMcpClient(mcp, exe, { agentId: 'my-bot' });
|
|
16
|
+
*
|
|
17
|
+
* const result = await mcp.callTool({ name: 'search', arguments: { q: 'x' } });
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Idempotent. No compile-time dependency on the MCP SDK — the call
|
|
21
|
+
* surface is duck-typed.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.instrumentMcpClient = instrumentMcpClient;
|
|
25
|
+
const errors_1 = require("../errors");
|
|
26
|
+
const spans_1 = require("../instrumentation/spans");
|
|
27
|
+
const MARKER = '_execlaveInstrumented';
|
|
28
|
+
function isEnforcementError(err) {
|
|
29
|
+
return (err instanceof errors_1.PolicyBlockedError ||
|
|
30
|
+
err instanceof errors_1.PolicyDeniedError ||
|
|
31
|
+
err instanceof errors_1.ApprovalTimeoutError ||
|
|
32
|
+
err instanceof errors_1.EnforcementUnavailableError ||
|
|
33
|
+
err instanceof errors_1.AgentPausedError);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wrap `client.callTool` to enforce policies and record a tool span.
|
|
37
|
+
* Returns the same client for fluent chaining.
|
|
38
|
+
*/
|
|
39
|
+
function instrumentMcpClient(client, exe, opts) {
|
|
40
|
+
if (client === null || client === undefined) {
|
|
41
|
+
throw new Error('instrumentMcpClient: client must not be null/undefined');
|
|
42
|
+
}
|
|
43
|
+
if (!exe)
|
|
44
|
+
throw new Error('instrumentMcpClient: exe must not be null/undefined');
|
|
45
|
+
if (!opts?.agentId)
|
|
46
|
+
throw new Error('instrumentMcpClient: agentId is required');
|
|
47
|
+
const c = client;
|
|
48
|
+
if (c[MARKER])
|
|
49
|
+
return client;
|
|
50
|
+
const original = c.callTool;
|
|
51
|
+
if (typeof original !== 'function') {
|
|
52
|
+
throw new TypeError('instrumentMcpClient: client.callTool is missing or not a function');
|
|
53
|
+
}
|
|
54
|
+
const enforce = opts.enforce !== false;
|
|
55
|
+
const tree = (0, spans_1.getSpanTree)(exe);
|
|
56
|
+
const boundOriginal = original.bind(c);
|
|
57
|
+
const wrapped = async (request, ...rest) => {
|
|
58
|
+
// Both `(name, args)` and `({ name, arguments })` shapes are
|
|
59
|
+
// supported by various MCP SDK versions.
|
|
60
|
+
const { name, args } = normaliseCallToolArgs(request, rest);
|
|
61
|
+
if (enforce && name) {
|
|
62
|
+
try {
|
|
63
|
+
await exe.enforcePolicy({
|
|
64
|
+
agentId: opts.agentId,
|
|
65
|
+
input: safeStr(args) ?? `tool:${name}`,
|
|
66
|
+
tools: [name],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
if (isEnforcementError(err))
|
|
71
|
+
throw err;
|
|
72
|
+
// eslint-disable-next-line no-console
|
|
73
|
+
console.warn('[execlave] MCP enforcePolicy failed (non-fatal):', err);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const span = tree.start({
|
|
77
|
+
kind: spans_1.SPAN_KIND_TOOL,
|
|
78
|
+
name: String(name ?? 'mcp.tool'),
|
|
79
|
+
agentId: opts.agentId,
|
|
80
|
+
sessionId: opts.sessionId,
|
|
81
|
+
userId: opts.userId,
|
|
82
|
+
metadata: { mcpTool: true },
|
|
83
|
+
});
|
|
84
|
+
if (args !== undefined && args !== null) {
|
|
85
|
+
try {
|
|
86
|
+
span.setInput(args);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* noop */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
let result;
|
|
93
|
+
try {
|
|
94
|
+
result = await boundOriginal(request, ...rest);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
span.finish('error', err?.message ?? String(err), err?.name ?? 'Error');
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const text = extractContent(result?.content);
|
|
102
|
+
if (text !== null)
|
|
103
|
+
span.setOutput(text);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* noop */
|
|
107
|
+
}
|
|
108
|
+
span.finish(result?.isError ? 'error' : 'success');
|
|
109
|
+
return result;
|
|
110
|
+
};
|
|
111
|
+
try {
|
|
112
|
+
c.callTool = wrapped;
|
|
113
|
+
c[MARKER] = true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
/* frozen object */
|
|
117
|
+
}
|
|
118
|
+
return client;
|
|
119
|
+
}
|
|
120
|
+
// ----------------------------------------------------------------------
|
|
121
|
+
// Helpers
|
|
122
|
+
// ----------------------------------------------------------------------
|
|
123
|
+
function normaliseCallToolArgs(request, rest) {
|
|
124
|
+
if (typeof request === 'string') {
|
|
125
|
+
return { name: request, args: rest[0] };
|
|
126
|
+
}
|
|
127
|
+
if (request && typeof request === 'object') {
|
|
128
|
+
const name = typeof request.name === 'string'
|
|
129
|
+
? request.name
|
|
130
|
+
: typeof request?.params?.name === 'string'
|
|
131
|
+
? request.params.name
|
|
132
|
+
: null;
|
|
133
|
+
const args = request.arguments !== undefined
|
|
134
|
+
? request.arguments
|
|
135
|
+
: request?.params?.arguments;
|
|
136
|
+
return { name, args };
|
|
137
|
+
}
|
|
138
|
+
return { name: null, args: undefined };
|
|
139
|
+
}
|
|
140
|
+
function extractContent(content) {
|
|
141
|
+
if (!Array.isArray(content))
|
|
142
|
+
return safeStr(content);
|
|
143
|
+
const parts = [];
|
|
144
|
+
for (const item of content) {
|
|
145
|
+
const text = item?.text;
|
|
146
|
+
if (typeof text === 'string')
|
|
147
|
+
parts.push(text);
|
|
148
|
+
else {
|
|
149
|
+
const s = safeStr(item);
|
|
150
|
+
if (s)
|
|
151
|
+
parts.push(s);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return parts.length ? parts.join('\n').slice(0, 4000) : null;
|
|
155
|
+
}
|
|
156
|
+
function safeStr(value, limit = 4000) {
|
|
157
|
+
if (value === null || value === undefined)
|
|
158
|
+
return null;
|
|
159
|
+
try {
|
|
160
|
+
const s = typeof value === 'string' ? value : JSON.stringify(value);
|
|
161
|
+
return s.slice(0, limit);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/integrations/mcp.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;AAqCH,kDAgFC;AAlHD,sCAMmB;AACnB,oDAAuE;AAEvE,MAAM,MAAM,GAAG,uBAAuB,CAAC;AAEvC,SAAS,kBAAkB,CAAC,GAAY;IACtC,OAAO,CACL,GAAG,YAAY,2BAAkB;QACjC,GAAG,YAAY,0BAAiB;QAChC,GAAG,YAAY,6BAAoB;QACnC,GAAG,YAAY,oCAA2B;QAC1C,GAAG,YAAY,yBAAgB,CAChC,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,MAAS,EACT,GAAa,EACb,IAAgC;IAEhC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACjF,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAEhF,MAAM,CAAC,GAAG,MAAa,CAAC;IACxB,IAAI,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5B,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAY,EAAE,GAAG,IAAW,EAAgB,EAAE;QACnE,6DAA6D;QAC7D,yCAAyC;QACzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAE5D,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,aAAa,CAAC;oBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE;oBACtC,KAAK,EAAE,CAAC,IAAI,CAAC;iBACd,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,kBAAkB,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBACvC,sCAAsC;gBACtC,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YACtB,IAAI,EAAE,sBAAc;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC;YAChC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;QACD,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC,CAAC;YACxE,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,UAAU;QACZ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yEAAyE;AACzE,UAAU;AACV,yEAAyE;AACzE,SAAS,qBAAqB,CAC5B,OAAY,EACZ,IAAW;IAEX,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,IAAI,GACR,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAC9B,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,OAAO,OAAO,EAAE,MAAM,EAAE,IAAI,KAAK,QAAQ;gBACzC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;gBACrB,CAAC,CAAC,IAAI,CAAC;QACb,MAAM,IAAI,GACR,OAAO,CAAC,SAAS,KAAK,SAAS;YAC7B,CAAC,CAAC,OAAO,CAAC,SAAS;YACnB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAI,IAAY,EAAE,IAAI,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC1C,CAAC;YACJ,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,KAAK,GAAG,IAAI;IAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Chat Completions auto-instrumentation.
|
|
3
|
+
*
|
|
4
|
+
* Wrap an `openai` client so every `chat.completions.create(...)` call is
|
|
5
|
+
* governed by Execlave: the user prompt is enforced before the request
|
|
6
|
+
* leaves, and the call is recorded as an `llm` span with model + token
|
|
7
|
+
* usage metadata.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import OpenAI from 'openai';
|
|
11
|
+
* import { Execlave } from '@execlave/sdk';
|
|
12
|
+
* import { instrumentOpenAI } from '@execlave/sdk/integrations/openai-chat';
|
|
13
|
+
*
|
|
14
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
15
|
+
* const openai = instrumentOpenAI(new OpenAI(), exe, { agentId: 'my-bot' });
|
|
16
|
+
*
|
|
17
|
+
* const resp = await openai.chat.completions.create({
|
|
18
|
+
* model: 'gpt-4o-mini',
|
|
19
|
+
* messages: [{ role: 'user', content: 'hi' }],
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Idempotent — marker prevents double-wrapping. No compile-time
|
|
24
|
+
* dependency on the openai SDK — the call surface is duck-typed.
|
|
25
|
+
*/
|
|
26
|
+
import type { Execlave } from '../client';
|
|
27
|
+
export interface InstrumentOpenAIOptions {
|
|
28
|
+
/** Agent id registered with Execlave. Required for enforcement. */
|
|
29
|
+
agentId: string;
|
|
30
|
+
/** Run `enforcePolicy` on the user message. Default true. */
|
|
31
|
+
enforce?: boolean;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
userId?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Patch `client.chat.completions.create` to enforce policies and record
|
|
37
|
+
* an LLM span around every call. Returns the same client for fluent
|
|
38
|
+
* chaining.
|
|
39
|
+
*/
|
|
40
|
+
export declare function instrumentOpenAI<T>(client: T, exe: Execlave, opts: InstrumentOpenAIOptions): T;
|
|
41
|
+
//# sourceMappingURL=openai-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chat.d.ts","sourceRoot":"","sources":["../../src/integrations/openai-chat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAsB1C,MAAM,WAAW,uBAAuB;IACtC,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,GAAG,CAAC,CAiF9F"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI Chat Completions auto-instrumentation.
|
|
4
|
+
*
|
|
5
|
+
* Wrap an `openai` client so every `chat.completions.create(...)` call is
|
|
6
|
+
* governed by Execlave: the user prompt is enforced before the request
|
|
7
|
+
* leaves, and the call is recorded as an `llm` span with model + token
|
|
8
|
+
* usage metadata.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import OpenAI from 'openai';
|
|
12
|
+
* import { Execlave } from '@execlave/sdk';
|
|
13
|
+
* import { instrumentOpenAI } from '@execlave/sdk/integrations/openai-chat';
|
|
14
|
+
*
|
|
15
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
16
|
+
* const openai = instrumentOpenAI(new OpenAI(), exe, { agentId: 'my-bot' });
|
|
17
|
+
*
|
|
18
|
+
* const resp = await openai.chat.completions.create({
|
|
19
|
+
* model: 'gpt-4o-mini',
|
|
20
|
+
* messages: [{ role: 'user', content: 'hi' }],
|
|
21
|
+
* });
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Idempotent — marker prevents double-wrapping. No compile-time
|
|
25
|
+
* dependency on the openai SDK — the call surface is duck-typed.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.instrumentOpenAI = instrumentOpenAI;
|
|
29
|
+
const errors_1 = require("../errors");
|
|
30
|
+
const spans_1 = require("../instrumentation/spans");
|
|
31
|
+
const MARKER = '_execlaveInstrumented';
|
|
32
|
+
function isEnforcementError(err) {
|
|
33
|
+
return (err instanceof errors_1.PolicyBlockedError ||
|
|
34
|
+
err instanceof errors_1.PolicyDeniedError ||
|
|
35
|
+
err instanceof errors_1.ApprovalTimeoutError ||
|
|
36
|
+
err instanceof errors_1.EnforcementUnavailableError ||
|
|
37
|
+
err instanceof errors_1.AgentPausedError);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Patch `client.chat.completions.create` to enforce policies and record
|
|
41
|
+
* an LLM span around every call. Returns the same client for fluent
|
|
42
|
+
* chaining.
|
|
43
|
+
*/
|
|
44
|
+
function instrumentOpenAI(client, exe, opts) {
|
|
45
|
+
if (client === null || client === undefined) {
|
|
46
|
+
throw new Error('instrumentOpenAI: client must not be null/undefined');
|
|
47
|
+
}
|
|
48
|
+
if (!exe)
|
|
49
|
+
throw new Error('instrumentOpenAI: exe must not be null/undefined');
|
|
50
|
+
if (!opts?.agentId)
|
|
51
|
+
throw new Error('instrumentOpenAI: agentId is required');
|
|
52
|
+
const c = client;
|
|
53
|
+
const completions = c?.chat?.completions;
|
|
54
|
+
if (!completions || typeof completions.create !== 'function') {
|
|
55
|
+
throw new TypeError('instrumentOpenAI: client.chat.completions.create is missing');
|
|
56
|
+
}
|
|
57
|
+
if (completions[MARKER])
|
|
58
|
+
return client;
|
|
59
|
+
const enforce = opts.enforce !== false;
|
|
60
|
+
const tree = (0, spans_1.getSpanTree)(exe);
|
|
61
|
+
const originalCreate = completions.create.bind(completions);
|
|
62
|
+
const wrappedCreate = async (params, ...rest) => {
|
|
63
|
+
const model = params?.model;
|
|
64
|
+
const messages = params?.messages;
|
|
65
|
+
if (enforce) {
|
|
66
|
+
const userText = extractUserInput(messages) ?? 'chat.completions';
|
|
67
|
+
try {
|
|
68
|
+
await exe.enforcePolicy({ agentId: opts.agentId, input: userText });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (isEnforcementError(err))
|
|
72
|
+
throw err;
|
|
73
|
+
// eslint-disable-next-line no-console
|
|
74
|
+
console.warn('[execlave] enforcePolicy failed (non-fatal):', err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const span = tree.start({
|
|
78
|
+
kind: spans_1.SPAN_KIND_LLM,
|
|
79
|
+
name: String(model ?? 'chat.completions'),
|
|
80
|
+
agentId: opts.agentId,
|
|
81
|
+
sessionId: opts.sessionId,
|
|
82
|
+
userId: opts.userId,
|
|
83
|
+
metadata: { provider: 'openai', endpoint: 'chat.completions' },
|
|
84
|
+
});
|
|
85
|
+
if (model)
|
|
86
|
+
span.setModel(String(model));
|
|
87
|
+
try {
|
|
88
|
+
span.setInput(messages);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
/* noop */
|
|
92
|
+
}
|
|
93
|
+
let response;
|
|
94
|
+
try {
|
|
95
|
+
response = await originalCreate(params, ...rest);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
span.finish('error', err?.message ?? String(err), err?.name ?? 'Error');
|
|
99
|
+
throw err;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const choices = response?.choices ?? [];
|
|
103
|
+
const message = choices[0]?.message;
|
|
104
|
+
const content = message?.content;
|
|
105
|
+
if (content !== undefined && content !== null)
|
|
106
|
+
span.setOutput(content);
|
|
107
|
+
const usage = response?.usage;
|
|
108
|
+
const p = (usage?.prompt_tokens ?? usage?.promptTokens);
|
|
109
|
+
const compl = (usage?.completion_tokens ?? usage?.completionTokens);
|
|
110
|
+
if (typeof p === 'number' && typeof compl === 'number')
|
|
111
|
+
span.setTokens(p, compl);
|
|
112
|
+
const respModel = response?.model;
|
|
113
|
+
if (typeof respModel === 'string' && respModel)
|
|
114
|
+
span.setModel(respModel);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
/* swallow — instrumentation must not break the call */
|
|
118
|
+
}
|
|
119
|
+
span.finish('success');
|
|
120
|
+
return response;
|
|
121
|
+
};
|
|
122
|
+
try {
|
|
123
|
+
completions.create = wrappedCreate;
|
|
124
|
+
completions[MARKER] = true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Frozen object — double-wrap guard inactive but we've done what we can.
|
|
128
|
+
}
|
|
129
|
+
return client;
|
|
130
|
+
}
|
|
131
|
+
// ----------------------------------------------------------------------
|
|
132
|
+
// Helpers
|
|
133
|
+
// ----------------------------------------------------------------------
|
|
134
|
+
function extractUserInput(messages) {
|
|
135
|
+
if (!Array.isArray(messages))
|
|
136
|
+
return safeStr(messages);
|
|
137
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
138
|
+
const msg = messages[i];
|
|
139
|
+
if (msg?.role !== 'user')
|
|
140
|
+
continue;
|
|
141
|
+
const content = msg?.content;
|
|
142
|
+
if (Array.isArray(content)) {
|
|
143
|
+
const parts = content
|
|
144
|
+
.map((p) => (typeof p?.text === 'string' ? p.text : null))
|
|
145
|
+
.filter((x) => !!x);
|
|
146
|
+
if (parts.length)
|
|
147
|
+
return safeStr(parts.join('\n'));
|
|
148
|
+
}
|
|
149
|
+
return safeStr(content);
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
function safeStr(value, limit = 4000) {
|
|
154
|
+
if (value === null || value === undefined)
|
|
155
|
+
return null;
|
|
156
|
+
try {
|
|
157
|
+
const s = typeof value === 'string' ? value : JSON.stringify(value);
|
|
158
|
+
return s.slice(0, limit);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=openai-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chat.js","sourceRoot":"","sources":["../../src/integrations/openai-chat.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@execlave/sdk",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Official JavaScript/TypeScript SDK for the Execlave AI agent governance platform — tracing, policy enforcement, and framework auto-instrumentation for LangChain",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Official JavaScript/TypeScript SDK for the Execlave AI agent governance platform — tracing, policy enforcement, and framework auto-instrumentation for LangChain, OpenAI Agents SDK, CrewAI, Model Context Protocol, and OpenAI Chat Completions",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -13,10 +13,30 @@
|
|
|
13
13
|
"types": "./dist/instrumentation/index.d.ts",
|
|
14
14
|
"default": "./dist/instrumentation/index.js"
|
|
15
15
|
},
|
|
16
|
+
"./integrations": {
|
|
17
|
+
"types": "./dist/integrations/index.d.ts",
|
|
18
|
+
"default": "./dist/integrations/index.js"
|
|
19
|
+
},
|
|
16
20
|
"./integrations/langchain": {
|
|
17
21
|
"types": "./dist/integrations/langchain.d.ts",
|
|
18
22
|
"default": "./dist/integrations/langchain.js"
|
|
19
23
|
},
|
|
24
|
+
"./integrations/openai-agents": {
|
|
25
|
+
"types": "./dist/integrations/openai-agents.d.ts",
|
|
26
|
+
"default": "./dist/integrations/openai-agents.js"
|
|
27
|
+
},
|
|
28
|
+
"./integrations/crewai": {
|
|
29
|
+
"types": "./dist/integrations/crewai.d.ts",
|
|
30
|
+
"default": "./dist/integrations/crewai.js"
|
|
31
|
+
},
|
|
32
|
+
"./integrations/openai-chat": {
|
|
33
|
+
"types": "./dist/integrations/openai-chat.d.ts",
|
|
34
|
+
"default": "./dist/integrations/openai-chat.js"
|
|
35
|
+
},
|
|
36
|
+
"./integrations/mcp": {
|
|
37
|
+
"types": "./dist/integrations/mcp.d.ts",
|
|
38
|
+
"default": "./dist/integrations/mcp.js"
|
|
39
|
+
},
|
|
20
40
|
"./package.json": "./package.json"
|
|
21
41
|
},
|
|
22
42
|
"files": [
|
|
@@ -60,10 +80,14 @@
|
|
|
60
80
|
"ai-compliance",
|
|
61
81
|
"audit",
|
|
62
82
|
"langchain",
|
|
63
|
-
"openai-agents"
|
|
83
|
+
"openai-agents",
|
|
84
|
+
"crewai",
|
|
85
|
+
"mcp",
|
|
86
|
+
"model-context-protocol",
|
|
87
|
+
"openai"
|
|
64
88
|
],
|
|
65
89
|
"license": "MIT",
|
|
66
|
-
"author": "
|
|
90
|
+
"author": "Rishit Mavani <support@execlave.com>",
|
|
67
91
|
"repository": {
|
|
68
92
|
"type": "git",
|
|
69
93
|
"url": "git+https://github.com/execlave-ai/execlave-js-sdk.git",
|
|
@@ -105,12 +129,14 @@
|
|
|
105
129
|
}
|
|
106
130
|
},
|
|
107
131
|
"devDependencies": {
|
|
132
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
108
133
|
"@opentelemetry/api": "^1.9.0",
|
|
109
134
|
"@opentelemetry/exporter-trace-otlp-http": "^0.213.0",
|
|
110
135
|
"@opentelemetry/resources": "^2.6.0",
|
|
111
136
|
"@opentelemetry/sdk-trace-base": "^2.6.0",
|
|
112
137
|
"@types/jest": "^29.5.0",
|
|
113
138
|
"jest": "^29.7.0",
|
|
139
|
+
"openai": "^4.103.0",
|
|
114
140
|
"rimraf": "^5.0.0",
|
|
115
141
|
"ts-jest": "^29.1.0",
|
|
116
142
|
"typescript": "^5.3.0"
|