@agent-builder-lab/eve-kit 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/channel.d.ts +3 -0
- package/dist/channel.js +14 -3
- package/dist/chunk-Z56XW2U4.js +33 -0
- package/dist/mcp.d.ts +27 -1
- package/dist/mcp.js +13 -0
- package/package.json +2 -2
package/dist/channel.d.ts
CHANGED
|
@@ -28,6 +28,9 @@ interface LabChannelOptions extends Omit<EveChannelInput, "auth"> {
|
|
|
28
28
|
* para os atributos do auth do turno (`labAccount`), onde `labAuthorization()` confere cada
|
|
29
29
|
* tool call, e também sai do contexto que o modelo vê: a identidade vem do harness, nunca do
|
|
30
30
|
* texto.
|
|
31
|
+
* - Quando o pedido traz o modo do MCP da formação (`clientContext.labMcp`, o botão do lab), os
|
|
32
|
+
* ataques vão para os atributos do auth do turno (`labMcp`) e saem do contexto do modelo:
|
|
33
|
+
* `labMcpAtaquesOf(ctx)` (de `@agent-builder-lab/eve-kit/mcp`) lê na ferramenta.
|
|
31
34
|
*
|
|
32
35
|
* Em produção (`eve start`, Vercel) o acesso local não autentica nada e o canal se comporta como
|
|
33
36
|
* o padrão com os autenticadores que você passar.
|
package/dist/channel.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LAB_MCP_ATTRIBUTE,
|
|
3
|
+
LAB_MCP_CONTEXT_KEY,
|
|
4
|
+
labMcpAtaquesFromContext
|
|
5
|
+
} from "./chunk-Z56XW2U4.js";
|
|
1
6
|
import {
|
|
2
7
|
LAB_ACCOUNT_ATTRIBUTE,
|
|
3
8
|
LAB_ACCOUNT_CONTEXT_KEY,
|
|
@@ -31,11 +36,13 @@ function labOnMessage(options) {
|
|
|
31
36
|
const context = ctx.eve.clientContext;
|
|
32
37
|
const forkId = forkIdFromContext(context);
|
|
33
38
|
const account = labAccountFromContext(context);
|
|
34
|
-
|
|
39
|
+
const mcpAtaques = labMcpAtaquesFromContext(context);
|
|
40
|
+
if (!forkId && !account && mcpAtaques === void 0 && !hasLabKeys(context)) return base;
|
|
35
41
|
const plan = forkId ? await fetchForkPlan(forkId, options.connectorUrl) : void 0;
|
|
36
42
|
const attributes = {
|
|
37
43
|
...forkId ? { [LAB_FORK_ATTRIBUTE]: forkId } : {},
|
|
38
|
-
...account ? { [LAB_ACCOUNT_ATTRIBUTE]: JSON.stringify(account) } : {}
|
|
44
|
+
...account ? { [LAB_ACCOUNT_ATTRIBUTE]: JSON.stringify(account) } : {},
|
|
45
|
+
...mcpAtaques !== void 0 ? { [LAB_MCP_ATTRIBUTE]: JSON.stringify({ ataques: mcpAtaques }) } : {}
|
|
39
46
|
};
|
|
40
47
|
return {
|
|
41
48
|
...base,
|
|
@@ -68,7 +75,11 @@ function isLoopback(request) {
|
|
|
68
75
|
const host = new URL(request.url).hostname.replace(/^\[|\]$/g, "");
|
|
69
76
|
return host === "127.0.0.1" || host === "localhost" || host === "::1";
|
|
70
77
|
}
|
|
71
|
-
var LAB_KEYS = [
|
|
78
|
+
var LAB_KEYS = [
|
|
79
|
+
LAB_FORK_CONTEXT_KEY,
|
|
80
|
+
LAB_ACCOUNT_CONTEXT_KEY,
|
|
81
|
+
LAB_MCP_CONTEXT_KEY
|
|
82
|
+
];
|
|
72
83
|
function hasLabKeys(context) {
|
|
73
84
|
if (!context || typeof context !== "object" || Array.isArray(context)) return false;
|
|
74
85
|
return LAB_KEYS.some((key) => key in context);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/lab-mcp.ts
|
|
2
|
+
var LAB_MCP_CONTEXT_KEY = "labMcp";
|
|
3
|
+
var LAB_MCP_ATTRIBUTE = "labMcp";
|
|
4
|
+
var ATAQUES_VALIDOS = /^[a-z_@, ]{0,200}$/;
|
|
5
|
+
function labMcpAtaquesFromContext(context) {
|
|
6
|
+
if (!context || typeof context !== "object" || Array.isArray(context)) return void 0;
|
|
7
|
+
const value = context[LAB_MCP_CONTEXT_KEY];
|
|
8
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
9
|
+
const v = value;
|
|
10
|
+
if (v.v !== 1 || typeof v.ataques !== "string") return void 0;
|
|
11
|
+
return ATAQUES_VALIDOS.test(v.ataques) ? v.ataques : void 0;
|
|
12
|
+
}
|
|
13
|
+
function labMcpAtaquesFromAuth(auth) {
|
|
14
|
+
const raw = auth?.attributes?.[LAB_MCP_ATTRIBUTE];
|
|
15
|
+
if (typeof raw !== "string") return void 0;
|
|
16
|
+
try {
|
|
17
|
+
const ataques = JSON.parse(raw)?.ataques;
|
|
18
|
+
return typeof ataques === "string" && ATAQUES_VALIDOS.test(ataques) ? ataques : void 0;
|
|
19
|
+
} catch {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function labMcpAtaquesOf(ctx) {
|
|
24
|
+
return labMcpAtaquesFromAuth(ctx.session.auth.current);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export {
|
|
28
|
+
LAB_MCP_CONTEXT_KEY,
|
|
29
|
+
LAB_MCP_ATTRIBUTE,
|
|
30
|
+
labMcpAtaquesFromContext,
|
|
31
|
+
labMcpAtaquesFromAuth,
|
|
32
|
+
labMcpAtaquesOf
|
|
33
|
+
};
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { ApprovalPolicy } from 'eve/tools/approval';
|
|
2
2
|
|
|
3
|
+
/** Chave do `clientContext` com o modo do MCP do turno. */
|
|
4
|
+
declare const LAB_MCP_CONTEXT_KEY = "labMcp";
|
|
5
|
+
/** Atributo do auth do turno com os ataques, em JSON (`{"ataques":"injecao"}`), para as ferramentas lerem. */
|
|
6
|
+
declare const LAB_MCP_ATTRIBUTE = "labMcp";
|
|
7
|
+
/**
|
|
8
|
+
* Os ataques que o lab mandou no `clientContext` do pedido: "" para o modo limpo, "injecao",
|
|
9
|
+
* "todos"… Undefined quando o pedido não traz o modo ou ele vem fora do formato.
|
|
10
|
+
*/
|
|
11
|
+
declare function labMcpAtaquesFromContext(context: unknown): string | undefined;
|
|
12
|
+
type AuthLike = {
|
|
13
|
+
readonly attributes?: Readonly<Record<string, string | readonly string[]>>;
|
|
14
|
+
};
|
|
15
|
+
/** Os ataques guardados nos atributos de um auth (o `labChannel()` grava). */
|
|
16
|
+
declare function labMcpAtaquesFromAuth(auth: AuthLike | null | undefined): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Os ataques do MCP escolhidos no lab para este turno, para usar dentro de uma ferramenta:
|
|
19
|
+
* `labMcpAtaquesOf(ctx)`. "" é o modo limpo; undefined, sem escolha (vale a URL do agente).
|
|
20
|
+
*/
|
|
21
|
+
declare function labMcpAtaquesOf(ctx: {
|
|
22
|
+
readonly session: {
|
|
23
|
+
readonly auth: {
|
|
24
|
+
readonly current: AuthLike | null;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}): string | undefined;
|
|
28
|
+
|
|
3
29
|
interface ClienteMcp {
|
|
4
30
|
chamar(nome: string, argumentos: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;
|
|
5
31
|
listar(signal?: AbortSignal): Promise<Array<{
|
|
@@ -84,4 +110,4 @@ declare function aprovarEntradaExterna<TInput = Record<string, unknown>>(opcoes?
|
|
|
84
110
|
readonly next?: ApprovalPolicy<TInput>;
|
|
85
111
|
}): ApprovalPolicy<TInput>;
|
|
86
112
|
|
|
87
|
-
export { type AchadoNoResultado, type ClienteMcp, type OpcoesDaFerramentaMcp, type OpcoesDeVarredura, type OpcoesDoCliente, type ResultadoDaVarredura, type ResultadoExterno, type SinalDeAtaque, aprovarEntradaExterna, chamarMcpVarrido, clienteMcpHttp, varrerResultado };
|
|
113
|
+
export { type AchadoNoResultado, type ClienteMcp, LAB_MCP_ATTRIBUTE, LAB_MCP_CONTEXT_KEY, type OpcoesDaFerramentaMcp, type OpcoesDeVarredura, type OpcoesDoCliente, type ResultadoDaVarredura, type ResultadoExterno, type SinalDeAtaque, aprovarEntradaExterna, chamarMcpVarrido, clienteMcpHttp, labMcpAtaquesFromAuth, labMcpAtaquesFromContext, labMcpAtaquesOf, varrerResultado };
|
package/dist/mcp.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LAB_MCP_ATTRIBUTE,
|
|
3
|
+
LAB_MCP_CONTEXT_KEY,
|
|
4
|
+
labMcpAtaquesFromAuth,
|
|
5
|
+
labMcpAtaquesFromContext,
|
|
6
|
+
labMcpAtaquesOf
|
|
7
|
+
} from "./chunk-Z56XW2U4.js";
|
|
8
|
+
|
|
1
9
|
// src/mcp-client.ts
|
|
2
10
|
var PROTOCOLO = "2025-06-18";
|
|
3
11
|
var ErroMcp = class extends Error {
|
|
@@ -270,8 +278,13 @@ function aprovarEntradaExterna(opcoes = {}) {
|
|
|
270
278
|
};
|
|
271
279
|
}
|
|
272
280
|
export {
|
|
281
|
+
LAB_MCP_ATTRIBUTE,
|
|
282
|
+
LAB_MCP_CONTEXT_KEY,
|
|
273
283
|
aprovarEntradaExterna,
|
|
274
284
|
chamarMcpVarrido,
|
|
275
285
|
clienteMcpHttp,
|
|
286
|
+
labMcpAtaquesFromAuth,
|
|
287
|
+
labMcpAtaquesFromContext,
|
|
288
|
+
labMcpAtaquesOf,
|
|
276
289
|
varrerResultado
|
|
277
290
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-builder-lab/eve-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Liga um agente eve ao Agent Builder Lab: instrumentação da janela de contexto, canal com history e stubs, replay e autorização por conta de teste.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "24.19.2",
|
|
46
|
-
"eve": "0.83.
|
|
46
|
+
"eve": "0.83.3",
|
|
47
47
|
"tsup": "8.5.1",
|
|
48
48
|
"typescript": "6.0.3",
|
|
49
49
|
"vitest": "5.0.5",
|