@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 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
- if (!forkId && !account && !hasLabKeys(context)) return base;
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 = [LAB_FORK_CONTEXT_KEY, LAB_ACCOUNT_CONTEXT_KEY];
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.2.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.2",
46
+ "eve": "0.83.3",
47
47
  "tsup": "8.5.1",
48
48
  "typescript": "6.0.3",
49
49
  "vitest": "5.0.5",