@t4h/agent-runtime 0.1.1 → 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.
Files changed (57) hide show
  1. package/README.md +94 -5
  2. package/catalog/agents.catalog.yaml +123 -0
  3. package/dist/brain.d.ts +8 -0
  4. package/dist/brain.js +11 -0
  5. package/dist/brain.js.map +1 -1
  6. package/dist/catalog.d.ts +13 -0
  7. package/dist/catalog.js +39 -0
  8. package/dist/catalog.js.map +1 -0
  9. package/dist/cli.js +33 -8
  10. package/dist/cli.js.map +1 -1
  11. package/dist/connector.d.ts +13 -0
  12. package/dist/connector.js +208 -0
  13. package/dist/connector.js.map +1 -0
  14. package/dist/env.d.ts +59 -0
  15. package/dist/env.js +138 -0
  16. package/dist/env.js.map +1 -0
  17. package/dist/evals.js +1 -1
  18. package/dist/gateway.d.ts +5 -1
  19. package/dist/gateway.js +4 -2
  20. package/dist/gateway.js.map +1 -1
  21. package/dist/host.d.ts +111 -13
  22. package/dist/host.js +251 -43
  23. package/dist/host.js.map +1 -1
  24. package/dist/index.d.ts +18 -4
  25. package/dist/index.js +11 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/model-auth.d.ts +83 -0
  28. package/dist/model-auth.js +231 -0
  29. package/dist/model-auth.js.map +1 -0
  30. package/dist/notifier.d.ts +1 -1
  31. package/dist/policy.js +12 -1
  32. package/dist/policy.js.map +1 -1
  33. package/dist/prompt.d.ts +8 -0
  34. package/dist/prompt.js +10 -3
  35. package/dist/prompt.js.map +1 -1
  36. package/dist/round.js +2 -1
  37. package/dist/round.js.map +1 -1
  38. package/dist/runtime-tools.d.ts +1 -1
  39. package/dist/runtime-tools.js +3 -3
  40. package/dist/runtime-tools.js.map +1 -1
  41. package/dist/signature.d.ts +34 -0
  42. package/dist/signature.js +87 -0
  43. package/dist/signature.js.map +1 -0
  44. package/dist/start.d.ts +31 -0
  45. package/dist/start.js +110 -0
  46. package/dist/start.js.map +1 -0
  47. package/dist/store/long-term.d.ts +63 -3
  48. package/dist/store/long-term.js +71 -11
  49. package/dist/store/long-term.js.map +1 -1
  50. package/dist/store/migrations.d.ts +1 -1
  51. package/dist/store/migrations.js +24 -0
  52. package/dist/store/migrations.js.map +1 -1
  53. package/dist/wiring.d.ts +11 -0
  54. package/dist/wiring.js +32 -0
  55. package/dist/wiring.js.map +1 -0
  56. package/package.json +13 -6
  57. package/proto/t4h/agents/v1/agents.proto +176 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Handlers do conector de agentes do círculo (`proto/t4h/agents/v1/agents.proto`).
3
+ *
4
+ * Mesmo modelo de qualquer provider do gateway: o gateway autentica e autoriza (grants URN
5
+ * por papel, concedidos pela plataforma), manda a FieldMask e o passaporte; aqui só
6
+ * executamos e projetamos. `ctx.user` é auditoria e "quem pergunta": nunca autorização.
7
+ * Quem pode bloquear ou limitar um agente é decidido pelo grant da tabela `controle`.
8
+ */
9
+ import { status as grpcStatus } from '@grpc/grpc-js';
10
+ import { applyFieldMask, ProviderError } from '@t4h/mcp-provider-sdk';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { HostError } from './host.js';
13
+ import { effectiveLevel } from './levels.js';
14
+ import { CONVERSATION_ROUTINE } from './store/long-term.js';
15
+ export const AGENTS_SERVICE_FQN = 't4h.agents.v1.AgentsService';
16
+ /** O proto do conector, publicado com o pacote (o gateway o puxa por reflection). */
17
+ export function agentsProtoPath() {
18
+ return fileURLToPath(new URL('../proto/t4h/agents/v1/agents.proto', import.meta.url));
19
+ }
20
+ /** Tetos que uma pessoa pode pôr numa rotina pelo conector. */
21
+ const CAP_LEVELS = ['shadow', 'copilot', 'agent'];
22
+ function toAction(a) {
23
+ return {
24
+ id: String(a.id),
25
+ subject: a.subject ?? '',
26
+ routine: a.routine,
27
+ tool: a.tool,
28
+ mode: a.mode,
29
+ status: a.status,
30
+ level: a.level,
31
+ reason: a.reason ?? '',
32
+ input_json: JSON.stringify(a.input),
33
+ note: a.note ?? '',
34
+ created_at: new Date(a.created_at).toISOString(),
35
+ };
36
+ }
37
+ function agentOr404(host, id) {
38
+ if (!id || !host.agents.has(id))
39
+ throw new ProviderError(grpcStatus.NOT_FOUND, `agente "${id}" não existe neste conector`);
40
+ return host.agent(id);
41
+ }
42
+ function routineOr404(a, routine) {
43
+ const spec = a.manifest.routines[routine];
44
+ if (!routine || !spec)
45
+ throw new ProviderError(grpcStatus.NOT_FOUND, `${a.manifest.id} não tem a rotina "${routine}"`);
46
+ return spec;
47
+ }
48
+ /** O id de ação chega como texto (uint64 com `longs: String`). */
49
+ function actionId(raw) {
50
+ const id = Number(raw);
51
+ if (!Number.isSafeInteger(id) || id <= 0)
52
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'action_id inválido');
53
+ return id;
54
+ }
55
+ const HOST_STATUS = {
56
+ unavailable: grpcStatus.UNAVAILABLE,
57
+ resource_exhausted: grpcStatus.RESOURCE_EXHAUSTED,
58
+ invalid_argument: grpcStatus.INVALID_ARGUMENT,
59
+ };
60
+ /**
61
+ * Erro de regra do host (não existe, já decidida, bloqueado) vira FAILED_PRECONDITION;
62
+ * desligando, teto de conversas e pedido malformado têm status próprio.
63
+ */
64
+ function precondition(e) {
65
+ if (e instanceof ProviderError)
66
+ throw e;
67
+ if (e instanceof HostError)
68
+ throw new ProviderError(HOST_STATUS[e.code], e.message);
69
+ throw new ProviderError(grpcStatus.FAILED_PRECONDITION, e.message);
70
+ }
71
+ async function levelNow(host, a, routine) {
72
+ const spec = a.manifest.routines[routine];
73
+ if (!spec)
74
+ return '';
75
+ const caps = await host.store.levelCaps(a.manifest.id);
76
+ return effectiveLevel({ stage: a.manifest.stage, manifestLevel: spec.level, cap: caps.get(routine)?.cap ?? null });
77
+ }
78
+ export function agentsConnectorHandlers(host, opts = {}) {
79
+ const limits = opts.historyLimit ?? { default: 20, max: 100 };
80
+ // ── agente ──────────────────────────────────────────────────────────────────────
81
+ const listAgents = async (ctx) => {
82
+ const agents = await Promise.all([...host.agents.values()].map(async (a) => {
83
+ const m = a.manifest;
84
+ const caps = await host.store.levelCaps(m.id);
85
+ return {
86
+ id: m.id,
87
+ name: m.name,
88
+ description: m.description,
89
+ stage: m.stage,
90
+ dri: m.owner.dri,
91
+ team: `${m.team.area}/${m.team.team}`,
92
+ blocked: Boolean(await host.store.killSwitch(m.id)),
93
+ routines: Object.entries(m.routines).map(([name, r]) => ({
94
+ name,
95
+ does: r.does,
96
+ level: effectiveLevel({ stage: m.stage, manifestLevel: r.level, cap: caps.get(name)?.cap ?? null }),
97
+ target: r.target ?? r.level,
98
+ capped_reason: caps.get(name)?.reason ?? '',
99
+ })),
100
+ };
101
+ }));
102
+ return applyFieldMask({ agents }, ctx.fieldMaskPaths);
103
+ };
104
+ const askAgent = async (ctx) => {
105
+ const { agent_id, message, thread_id } = ctx.request;
106
+ agentOr404(host, agent_id);
107
+ if (!message?.trim())
108
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'message é obrigatório');
109
+ const r = await host.ask(agent_id, { email: ctx.user.email, kind: 'person' }, message, thread_id || undefined).catch(precondition);
110
+ // Sem o ask_id, quem perguntou não tem como buscar a resposta: vai sempre.
111
+ return applyFieldMask({ agent_id, ask_id: r.ask_id, status: r.status, answer: r.answer ?? '' }, ctx.fieldMaskPaths, {
112
+ alwaysInclude: ['agent_id', 'ask_id', 'status'],
113
+ });
114
+ };
115
+ const getAnswer = async (ctx) => {
116
+ const askId = ctx.request.ask_id?.trim();
117
+ if (!askId)
118
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'ask_id é obrigatório');
119
+ // Pergunta de outra pessoa responde igual a uma que não existe.
120
+ const row = await host.answer(askId, ctx.user.email);
121
+ if (!row)
122
+ throw new ProviderError(grpcStatus.NOT_FOUND, `pergunta "${askId}" não existe`);
123
+ return applyFieldMask({ ask_id: row.id, agent_id: row.agent_id, status: row.status, answer: row.answer ?? '', error: row.error ?? '' }, ctx.fieldMaskPaths, { alwaysInclude: ['ask_id', 'status'] });
124
+ };
125
+ // ── acao ────────────────────────────────────────────────────────────────────────
126
+ const explainActions = async (ctx) => {
127
+ agentOr404(host, ctx.request.agent_id);
128
+ // As conversas ficam de fora: guardam quem perguntou o quê, e só quem perguntou lê
129
+ // (pelo agent_answer).
130
+ const rows = await host.store.history(ctx.request.agent_id, {
131
+ excludeRoutine: CONVERSATION_ROUTINE,
132
+ ...(ctx.request.subject ? { subject: ctx.request.subject } : {}),
133
+ limit: Math.min(ctx.request.limit || limits.default, limits.max),
134
+ });
135
+ return applyFieldMask({ actions: rows.map(toAction) }, ctx.fieldMaskPaths);
136
+ };
137
+ const correctAction = async (ctx) => {
138
+ const id = actionId(ctx.request.action_id);
139
+ if (!ctx.request.note?.trim())
140
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'note é obrigatório: diga o que estava errado e o certo');
141
+ const row = await host.correctAction(id, ctx.user.email, ctx.request.note).catch(precondition);
142
+ const level = await levelNow(host, host.agent(row.agent_id), row.routine);
143
+ return applyFieldMask({ action_id: String(row.id), status: row.status, routine_level: level }, ctx.fieldMaskPaths, { alwaysInclude: ['action_id'] });
144
+ };
145
+ // ── proposta ────────────────────────────────────────────────────────────────────
146
+ const listProposals = async (ctx) => {
147
+ agentOr404(host, ctx.request.agent_id);
148
+ return applyFieldMask({ proposals: (await host.pendingProposals(ctx.request.agent_id)).map(toAction) }, ctx.fieldMaskPaths);
149
+ };
150
+ const decideProposal = async (ctx) => {
151
+ const id = actionId(ctx.request.action_id);
152
+ const row = await host
153
+ .decideProposal(id, ctx.request.approve ? 'approved' : 'rejected', ctx.user.email, ctx.request.note || undefined)
154
+ .catch(precondition);
155
+ return applyFieldMask({ action_id: String(row.id), status: row.status, result_json: JSON.stringify(row.result ?? null) }, ctx.fieldMaskPaths, {
156
+ alwaysInclude: ['action_id'],
157
+ });
158
+ };
159
+ // ── controle ────────────────────────────────────────────────────────────────────
160
+ const setBlocked = async (ctx) => {
161
+ const { agent_id, blocked } = ctx.request;
162
+ agentOr404(host, agent_id);
163
+ const reason = ctx.request.reason?.trim() ?? '';
164
+ if (blocked) {
165
+ if (!reason)
166
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'reason é obrigatório ao bloquear');
167
+ await host.kill(agent_id, ctx.user.email, reason);
168
+ }
169
+ else {
170
+ await host.unblock(agent_id, ctx.user.email, reason || undefined);
171
+ }
172
+ const now = Boolean(await host.store.killSwitch(agent_id));
173
+ return applyFieldMask({ agent_id, blocked: now }, ctx.fieldMaskPaths, { alwaysInclude: ['agent_id'] });
174
+ };
175
+ const capRoutine = async (ctx) => {
176
+ const { agent_id, routine } = ctx.request;
177
+ const a = agentOr404(host, agent_id);
178
+ routineOr404(a, routine);
179
+ const level = ctx.request.level?.trim() ?? '';
180
+ const reason = ctx.request.reason?.trim() ?? '';
181
+ if (!level) {
182
+ await host.restore(agent_id, routine, ctx.user.email, reason || undefined);
183
+ }
184
+ else {
185
+ if (!CAP_LEVELS.includes(level)) {
186
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, `level "${level}" inválido: use ${CAP_LEVELS.join(', ')} ou vazio para restaurar`);
187
+ }
188
+ if (!reason)
189
+ throw new ProviderError(grpcStatus.INVALID_ARGUMENT, 'reason é obrigatório ao limitar o nível');
190
+ await host.demote(agent_id, routine, level, ctx.user.email, reason);
191
+ }
192
+ return applyFieldMask({ agent_id, routine, level: await levelNow(host, a, routine) }, ctx.fieldMaskPaths, {
193
+ alwaysInclude: ['agent_id', 'routine'],
194
+ });
195
+ };
196
+ return {
197
+ ListAgents: listAgents,
198
+ AskAgent: askAgent,
199
+ GetAnswer: getAnswer,
200
+ ExplainActions: explainActions,
201
+ ListProposals: listProposals,
202
+ DecideProposal: decideProposal,
203
+ CorrectAction: correctAction,
204
+ SetBlocked: setBlocked,
205
+ CapRoutine: capRoutine,
206
+ };
207
+ }
208
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,aAAa,EAA0C,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,cAAc,EAAuB,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,oBAAoB,EAAkB,MAAM,sBAAsB,CAAC;AAE5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,6BAA6B,CAAC;AAEhE,qFAAqF;AACrF,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,qCAAqC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxF,CAAC;AAOD,+DAA+D;AAC/D,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAK3D,SAAS,QAAQ,CAAC,CAAY;IAC5B,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;QACtB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QACnC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAe,EAAE,EAAU;IAC7C,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,WAAW,EAAE,6BAA6B,CAAC,CAAC;IAC3H,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,CAAc,EAAE,OAAe;IACnD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,sBAAsB,OAAO,GAAG,CAAC,CAAC;IACvH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CAAC,GAAY;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACrH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,WAAW,EAAE,UAAU,CAAC,WAAW;IACnC,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;IACjD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;CACrC,CAAC;AAEX;;;GAGG;AACH,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,YAAY,aAAa;QAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,YAAY,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACpF,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,mBAAmB,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAe,EAAE,CAAc,EAAE,OAAe;IACtE,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAe,EAAE,OAA+B,EAAE;IACxF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAE9D,mFAAmF;IAEnF,MAAM,UAAU,GAAgC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO;gBACL,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;gBACrC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnD,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvD,IAAI;oBACJ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;oBACnG,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK;oBAC3B,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,EAAE;iBAC5C,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QACF,OAAO,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAA4F,KAAK,EAAE,GAAG,EAAE,EAAE;QACtH,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACrD,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;QACpG,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnI,2EAA2E;QAC3E,OAAO,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE;YAClH,aAAa,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC;SAChD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAqD,KAAK,EAAE,GAAG,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;QACzF,gEAAgE;QAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,aAAa,KAAK,cAAc,CAAC,CAAC;QAC1F,OAAO,cAAc,CACnB,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,EAChH,GAAG,CAAC,cAAc,EAClB,EAAE,aAAa,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CACxC,CAAC;IACJ,CAAC,CAAC;IAEF,mFAAmF;IAEnF,MAAM,cAAc,GAAyF,KAAK,EAAE,GAAG,EAAE,EAAE;QACzH,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,mFAAmF;QACnF,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1D,cAAc,EAAE,oBAAoB;YACpC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;SACjE,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,MAAM,aAAa,GAAsE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrG,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,wDAAwD,CAAC,CAAC;QAC9I,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1E,OAAO,cAAc,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvJ,CAAC,CAAC;IAEF,mFAAmF;IAEnF,MAAM,aAAa,GAAuD,KAAK,EAAE,GAAG,EAAE,EAAE;QACtF,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9H,CAAC,CAAC;IAEF,MAAM,cAAc,GAAyF,KAAK,EAAE,GAAG,EAAE,EAAE;QACzH,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI;aACnB,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;aAChH,KAAK,CAAC,YAAY,CAAC,CAAC;QACvB,OAAO,cAAc,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE;YAC5I,aAAa,EAAE,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,mFAAmF;IAEnF,MAAM,UAAU,GAA0F,KAAK,EAAE,GAAG,EAAE,EAAE;QACtH,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QAC1C,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAChD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;YACtG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,OAAO,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC,CAAC;IAEF,MAAM,UAAU,GAAyG,KAAK,EAAE,GAAG,EAAE,EAAE;QACrI,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QAC1C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACrC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,IAAI,CAAE,UAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,UAAU,KAAK,mBAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC1I,CAAC;YACD,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;YAC7G,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE;YACxG,aAAa,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;SACvC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,cAAc;QAC9B,aAAa,EAAE,aAAa;QAC5B,cAAc,EAAE,cAAc;QAC9B,aAAa,EAAE,aAAa;QAC5B,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,UAAU;KACvB,CAAC;AACJ,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Ambiente do processo dos agentes, num lugar só e fail-fast: espelha o `loadProviderEnv()`
3
+ * do SDK de providers (e o reusa para o conector). Combinação inválida falha no boot, não
4
+ * na primeira rodada.
5
+ *
6
+ * Em produção (`NODE_ENV=production`) não há atalho: Postgres de verdade, eventos
7
+ * assinados, identidade própria de cada agente no Keycloak, credencial do modelo e o conector
8
+ * com mTLS. Fora de produção, o que faltar cai no modo local (PGlite, eventos sem
9
+ * assinatura, sem conector, `wiring` de stub no lugar do gateway).
10
+ */
11
+ import { type ProviderEnv } from '@t4h/mcp-provider-sdk';
12
+ import type { LoadedAgent } from './manifest.js';
13
+ import { type ModelAuthConfig } from './model-auth.js';
14
+ export interface AgentEnv {
15
+ nodeEnv: string;
16
+ isProduction: boolean;
17
+ /** `postgres://…` em produção; fora dela também `pglite:<pasta>` ou ausente (em memória). */
18
+ databaseUrl?: string;
19
+ events: {
20
+ port: number;
21
+ /** Segredo HMAC por fonte. Vazio só fora de produção. */
22
+ secrets: Map<string, string>;
23
+ /** `POST /agents/:id/rounds`: fora de produção sim; em produção, nunca. */
24
+ allowManualRounds: boolean;
25
+ /** Espera entre o evento novo e a rodada que ele dispara (junta a rajada). */
26
+ wakeDebounceMs: number;
27
+ };
28
+ /** Ausente fora de produção sem `GATEWAY_URL`: quem sobe passa um `wiring` de stub. */
29
+ gateway?: {
30
+ url: string;
31
+ /** Só fora de produção: token fixo no lugar do client_credentials. */
32
+ devToken?: string;
33
+ keycloakIssuer?: string;
34
+ /** `AGENT_<ID>_CLIENT_SECRET` de cada agente, pelo id do agente. */
35
+ clientSecrets: Map<string, string>;
36
+ };
37
+ /** Ambiente do conector gRPC (`loadProviderEnv`). Ausente fora de produção sem passaporte configurado. */
38
+ connector?: ProviderEnv;
39
+ /**
40
+ * `PROVIDER_REQUIRE_CALL_BINDING=1`: o conector recusa passaporte sem o vínculo com a
41
+ * chamada (`requireCallBinding` do SDK de providers). Desligado por padrão, como no SDK.
42
+ */
43
+ requireCallBinding: boolean;
44
+ /** Credencial do modelo: nativa do Claude Code ou federação feita pelo runtime. */
45
+ model: ModelAuthConfig;
46
+ /** Quanto `agent_ask` espera a resposta antes de devolver `running`. */
47
+ askWaitMs: number;
48
+ debug: boolean;
49
+ }
50
+ /** Padrão do gateway para cortar a chamada ao provider (`PROVIDER_CALL_TIMEOUT_MS`). */
51
+ export declare const GATEWAY_CALL_TIMEOUT_MS = 30000;
52
+ export declare const DEFAULT_WAKE_DEBOUNCE_MS = 10000;
53
+ /** `AGENT_<ID>_CLIENT_SECRET`: hífen vira `_`, tudo em maiúsculas. */
54
+ export declare function agentSecretVar(agentId: string): string;
55
+ /**
56
+ * Lê e valida o ambiente para estes agentes. Junta todos os problemas numa mensagem só
57
+ * (quem sobe o processo corrige tudo de uma vez) e lança.
58
+ */
59
+ export declare function loadAgentEnv(agents: LoadedAgent[], env?: NodeJS.ProcessEnv): AgentEnv;
package/dist/env.js ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Ambiente do processo dos agentes, num lugar só e fail-fast: espelha o `loadProviderEnv()`
3
+ * do SDK de providers (e o reusa para o conector). Combinação inválida falha no boot, não
4
+ * na primeira rodada.
5
+ *
6
+ * Em produção (`NODE_ENV=production`) não há atalho: Postgres de verdade, eventos
7
+ * assinados, identidade própria de cada agente no Keycloak, credencial do modelo e o conector
8
+ * com mTLS. Fora de produção, o que faltar cai no modo local (PGlite, eventos sem
9
+ * assinatura, sem conector, `wiring` de stub no lugar do gateway).
10
+ */
11
+ import { loadProviderEnv, optionalEnv } from '@t4h/mcp-provider-sdk';
12
+ import { readModelAuth } from './model-auth.js';
13
+ import { parseEventSecrets } from './signature.js';
14
+ /** Padrão do gateway para cortar a chamada ao provider (`PROVIDER_CALL_TIMEOUT_MS`). */
15
+ export const GATEWAY_CALL_TIMEOUT_MS = 30_000;
16
+ export const DEFAULT_WAKE_DEBOUNCE_MS = 10_000;
17
+ /** `AGENT_<ID>_CLIENT_SECRET`: hífen vira `_`, tudo em maiúsculas. */
18
+ export function agentSecretVar(agentId) {
19
+ return `AGENT_${agentId.toUpperCase().replace(/-/g, '_')}_CLIENT_SECRET`;
20
+ }
21
+ function intEnv(name, fallback, env, problems, min = 0) {
22
+ const raw = optionalEnv(name, env);
23
+ if (raw === undefined)
24
+ return fallback;
25
+ const n = Number(raw);
26
+ if (!Number.isInteger(n) || n < min) {
27
+ problems.push(`${name}="${raw}" inválido: use um inteiro >= ${min}`);
28
+ return fallback;
29
+ }
30
+ return n;
31
+ }
32
+ /**
33
+ * Lê e valida o ambiente para estes agentes. Junta todos os problemas numa mensagem só
34
+ * (quem sobe o processo corrige tudo de uma vez) e lança.
35
+ */
36
+ export function loadAgentEnv(agents, env = process.env) {
37
+ const nodeEnv = env.NODE_ENV ?? 'development';
38
+ const isProduction = nodeEnv === 'production';
39
+ const problems = [];
40
+ // ── banco ───────────────────────────────────────────────────────────────────────
41
+ const databaseUrl = optionalEnv('DATABASE_URL', env);
42
+ const isPostgres = Boolean(databaseUrl && /^postgres(ql)?:\/\//.test(databaseUrl));
43
+ if (isProduction && !isPostgres)
44
+ problems.push('DATABASE_URL postgres://… é obrigatório em produção (PGlite só fora dela)');
45
+ else if (databaseUrl && !isPostgres && !databaseUrl.startsWith('pglite:'))
46
+ problems.push('DATABASE_URL: use postgres://… ou pglite:<pasta>');
47
+ // ── eventos ─────────────────────────────────────────────────────────────────────
48
+ let secrets = new Map();
49
+ try {
50
+ secrets = parseEventSecrets(optionalEnv('EVENTS_HMAC_SECRETS', env));
51
+ }
52
+ catch (e) {
53
+ problems.push(e.message);
54
+ }
55
+ // O nome antigo (um segredo só) seria ignorado em silêncio: melhor parar.
56
+ if (optionalEnv('EVENTS_HMAC_SECRET', env))
57
+ problems.push('EVENTS_HMAC_SECRET não existe mais: use EVENTS_HMAC_SECRETS="fonte=segredo,…"');
58
+ if (isProduction && !secrets.size)
59
+ problems.push('EVENTS_HMAC_SECRETS com ao menos uma fonte é obrigatório em produção');
60
+ const eventsPort = intEnv('EVENTS_PORT', 8080, env, problems);
61
+ const wakeDebounceMs = intEnv('EVENTS_WAKE_DEBOUNCE_MS', DEFAULT_WAKE_DEBOUNCE_MS, env, problems);
62
+ // ── conversa ────────────────────────────────────────────────────────────────────
63
+ const gatewayTimeout = intEnv('PROVIDER_CALL_TIMEOUT_MS', GATEWAY_CALL_TIMEOUT_MS, env, problems, 1);
64
+ const askWaitMs = intEnv('AGENTS_ASK_WAIT_MS', 20_000, env, problems, 1);
65
+ if (askWaitMs >= gatewayTimeout) {
66
+ problems.push(`AGENTS_ASK_WAIT_MS (${askWaitMs}) tem de ficar abaixo do timeout do gateway para o provider (${gatewayTimeout} ms)`);
67
+ }
68
+ // ── gateway (identidade de cada agente) ─────────────────────────────────────────
69
+ const gatewayUrl = optionalEnv('GATEWAY_URL', env);
70
+ const devToken = optionalEnv('GATEWAY_DEV_TOKEN', env);
71
+ const keycloakIssuer = optionalEnv('KEYCLOAK_ISSUER', env);
72
+ const clientSecrets = new Map();
73
+ const missingSecrets = [];
74
+ for (const a of agents) {
75
+ const name = agentSecretVar(a.manifest.id);
76
+ const value = optionalEnv(name, env);
77
+ if (value)
78
+ clientSecrets.set(a.manifest.id, value);
79
+ else
80
+ missingSecrets.push(name);
81
+ }
82
+ let gateway;
83
+ if (isProduction) {
84
+ if (!gatewayUrl)
85
+ problems.push('GATEWAY_URL é obrigatório em produção');
86
+ if (devToken)
87
+ problems.push('GATEWAY_DEV_TOKEN é proibido em produção: cada agente usa a própria identidade');
88
+ if (!keycloakIssuer)
89
+ problems.push('KEYCLOAK_ISSUER é obrigatório em produção');
90
+ if (missingSecrets.length)
91
+ problems.push(`falta o segredo do client de cada agente: ${missingSecrets.join(', ')}`);
92
+ }
93
+ else if (gatewayUrl && !devToken && (!keycloakIssuer || missingSecrets.length)) {
94
+ problems.push(`com GATEWAY_URL, defina GATEWAY_DEV_TOKEN ou KEYCLOAK_ISSUER e ${missingSecrets.join(', ') || 'os segredos dos agentes'}`);
95
+ }
96
+ if (gatewayUrl) {
97
+ gateway = {
98
+ url: gatewayUrl,
99
+ ...(devToken && !isProduction ? { devToken } : {}),
100
+ ...(keycloakIssuer ? { keycloakIssuer } : {}),
101
+ clientSecrets,
102
+ };
103
+ }
104
+ // ── modelo ──────────────────────────────────────────────────────────────────────
105
+ const model = readModelAuth(env);
106
+ problems.push(...model.problems);
107
+ if (isProduction && model.config.mode === 'none' && !model.problems.length) {
108
+ problems.push('credencial do modelo é obrigatória em produção: federação (ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_SERVICE_ACCOUNT_ID) ou ANTHROPIC_API_KEY');
109
+ }
110
+ // ── conector gRPC ───────────────────────────────────────────────────────────────
111
+ // Em produção, sempre (e o SDK já exige mTLS). Fora dela, só se o passaporte estiver
112
+ // configurado; configurado pela metade, falha como em produção.
113
+ let connector;
114
+ if (isProduction || optionalEnv('GATEWAY_JWKS_URL', env) || optionalEnv('SERVICE_JWT_PUBLIC_KEY', env)) {
115
+ try {
116
+ connector = loadProviderEnv(env);
117
+ }
118
+ catch (e) {
119
+ problems.push(`conector: ${e.message}`);
120
+ }
121
+ }
122
+ if (problems.length) {
123
+ throw new Error(`ambiente inválido${isProduction ? ' (produção)' : ''}:\n - ${problems.join('\n - ')}`);
124
+ }
125
+ return {
126
+ nodeEnv,
127
+ isProduction,
128
+ ...(databaseUrl ? { databaseUrl } : {}),
129
+ events: { port: eventsPort, secrets, allowManualRounds: !isProduction, wakeDebounceMs },
130
+ ...(gateway ? { gateway } : {}),
131
+ ...(connector ? { connector } : {}),
132
+ requireCallBinding: optionalEnv('PROVIDER_REQUIRE_CALL_BINDING', env) === '1',
133
+ model: model.config,
134
+ askWaitMs,
135
+ debug: optionalEnv('AGENT_DEBUG', env) === '1',
136
+ };
137
+ }
138
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
package/dist/evals.js CHANGED
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * Formato (agents/<id>/evals/*.yaml):
9
9
  *
10
- * - name: chamado de custo vai para FinOps
10
+ * - name: chamado de custo vai para o time financeiro
11
11
  * events:
12
12
  * - { type: exemplo.item.opened, subject: "item:42", payload: { titulo: "..." } }
13
13
  * expect:
package/dist/gateway.d.ts CHANGED
@@ -19,14 +19,18 @@ export declare class StaticTokenSource implements TokenSource {
19
19
  }
20
20
  /** Token curto do Keycloak, renovado um minuto antes de vencer. */
21
21
  export declare class ClientCredentialsTokenSource implements TokenSource {
22
+ /** `cache: false`: um token novo a cada chamada (para quem precisa de `jti` novo). */
22
23
  private readonly cfg;
23
24
  private readonly fetchImpl;
24
25
  private cached?;
25
- constructor(cfg: {
26
+ constructor(
27
+ /** `cache: false`: um token novo a cada chamada (para quem precisa de `jti` novo). */
28
+ cfg: {
26
29
  issuer: string;
27
30
  clientId: string;
28
31
  clientSecret: string;
29
32
  scope?: string;
33
+ cache?: boolean;
30
34
  }, fetchImpl?: typeof fetch);
31
35
  token(): Promise<string>;
32
36
  }
package/dist/gateway.js CHANGED
@@ -13,13 +13,15 @@ export class ClientCredentialsTokenSource {
13
13
  cfg;
14
14
  fetchImpl;
15
15
  cached;
16
- constructor(cfg, fetchImpl = fetch) {
16
+ constructor(
17
+ /** `cache: false`: um token novo a cada chamada (para quem precisa de `jti` novo). */
18
+ cfg, fetchImpl = fetch) {
17
19
  this.cfg = cfg;
18
20
  this.fetchImpl = fetchImpl;
19
21
  }
20
22
  async token() {
21
23
  const now = Date.now();
22
- if (this.cached && this.cached.exp - 60_000 > now)
24
+ if (this.cfg.cache !== false && this.cached && this.cached.exp - 60_000 > now)
23
25
  return this.cached.value;
24
26
  const body = new URLSearchParams({
25
27
  grant_type: 'client_credentials',
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}