@t4h/agent-runtime 0.0.0-stage → 0.1.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/README.md +23 -2
- package/bin/t4h-agent.mjs +2 -0
- package/dist/brain.d.ts +48 -0
- package/dist/brain.js +99 -0
- package/dist/brain.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +27 -0
- package/dist/cli.js.map +1 -0
- package/dist/evals.d.ts +38 -0
- package/dist/evals.js +95 -0
- package/dist/evals.js.map +1 -0
- package/dist/gateway.d.ts +61 -0
- package/dist/gateway.js +93 -0
- package/dist/gateway.js.map +1 -0
- package/dist/host.d.ts +76 -0
- package/dist/host.js +267 -0
- package/dist/host.js.map +1 -0
- package/dist/inbox.d.ts +23 -0
- package/dist/inbox.js +29 -0
- package/dist/inbox.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/levels.d.ts +48 -0
- package/dist/levels.js +73 -0
- package/dist/levels.js.map +1 -0
- package/dist/manifest.d.ts +111 -0
- package/dist/manifest.js +172 -0
- package/dist/manifest.js.map +1 -0
- package/dist/notifier.d.ts +26 -0
- package/dist/notifier.js +13 -0
- package/dist/notifier.js.map +1 -0
- package/dist/plugins.d.ts +8 -0
- package/dist/plugins.js +73 -0
- package/dist/plugins.js.map +1 -0
- package/dist/policy.d.ts +71 -0
- package/dist/policy.js +210 -0
- package/dist/policy.js.map +1 -0
- package/dist/prompt.d.ts +24 -0
- package/dist/prompt.js +84 -0
- package/dist/prompt.js.map +1 -0
- package/dist/round.d.ts +34 -0
- package/dist/round.js +108 -0
- package/dist/round.js.map +1 -0
- package/dist/runtime-tools.d.ts +75 -0
- package/dist/runtime-tools.js +114 -0
- package/dist/runtime-tools.js.map +1 -0
- package/dist/short-term.d.ts +16 -0
- package/dist/short-term.js +60 -0
- package/dist/short-term.js.map +1 -0
- package/dist/store/long-term.d.ts +136 -0
- package/dist/store/long-term.js +206 -0
- package/dist/store/long-term.js.map +1 -0
- package/dist/store/migrations.d.ts +5 -0
- package/dist/store/migrations.js +104 -0
- package/dist/store/migrations.js.map +1 -0
- package/dist/store/sql.d.ts +18 -0
- package/dist/store/sql.js +67 -0
- package/dist/store/sql.js.map +1 -0
- package/package.json +48 -4
- package/schema/agent.schema.json +236 -0
package/dist/host.js
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host dos agentes de um repositório de círculo: um processo, vários agentes.
|
|
3
|
+
*
|
|
4
|
+
* Junta as peças: caixa de entrada, rodadas (no despertar do cron ou sob demanda),
|
|
5
|
+
* agenda das rotinas com o time, conversa direta, propostas esperando uma pessoa,
|
|
6
|
+
* correções, disjuntor e bloqueio de emergência.
|
|
7
|
+
*/
|
|
8
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
9
|
+
import { createServer } from 'node:http';
|
|
10
|
+
import { Cron } from 'croner';
|
|
11
|
+
import { resolveKind } from './inbox.js';
|
|
12
|
+
import { consoleNotifier } from './notifier.js';
|
|
13
|
+
import { resolveSkills } from './plugins.js';
|
|
14
|
+
import { evaluateBreaker, PolicyGate } from './policy.js';
|
|
15
|
+
import { conversationPrompt, systemPrompt } from './prompt.js';
|
|
16
|
+
import { runRound } from './round.js';
|
|
17
|
+
import { RuntimeTools } from './runtime-tools.js';
|
|
18
|
+
import { ShortTermMemory } from './short-term.js';
|
|
19
|
+
export function gatewayExecutor(gateway) {
|
|
20
|
+
return {
|
|
21
|
+
call: (_agent, tool, input) => {
|
|
22
|
+
const [sub, name] = tool.split('.');
|
|
23
|
+
return gateway.callTool(sub, name, input);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export class AgentHost {
|
|
28
|
+
o;
|
|
29
|
+
agents = new Map();
|
|
30
|
+
skills = new Map();
|
|
31
|
+
crons = [];
|
|
32
|
+
notifier;
|
|
33
|
+
http;
|
|
34
|
+
constructor(o) {
|
|
35
|
+
this.o = o;
|
|
36
|
+
for (const a of o.agents)
|
|
37
|
+
this.agents.set(a.manifest.id, a);
|
|
38
|
+
this.notifier = o.notifier ?? consoleNotifier;
|
|
39
|
+
}
|
|
40
|
+
get store() {
|
|
41
|
+
return this.o.store;
|
|
42
|
+
}
|
|
43
|
+
agent(id) {
|
|
44
|
+
const a = this.agents.get(id);
|
|
45
|
+
if (!a)
|
|
46
|
+
throw new Error(`agente "${id}" não existe neste repositório`);
|
|
47
|
+
return a;
|
|
48
|
+
}
|
|
49
|
+
skillsOf(a) {
|
|
50
|
+
let s = this.skills.get(a.manifest.id);
|
|
51
|
+
if (!s) {
|
|
52
|
+
s = resolveSkills(a, this.o.pluginsDir);
|
|
53
|
+
this.skills.set(a.manifest.id, s);
|
|
54
|
+
}
|
|
55
|
+
return s;
|
|
56
|
+
}
|
|
57
|
+
// ── entrada ─────────────────────────────────────────────────────────────────────
|
|
58
|
+
async enqueue(agentId, ev) {
|
|
59
|
+
const a = this.agent(agentId);
|
|
60
|
+
if (!a.eventKinds.has(ev.type) && !ev.type.startsWith('schedule.')) {
|
|
61
|
+
throw new Error(`${agentId} não assina o evento "${ev.type}" (triggers.events)`);
|
|
62
|
+
}
|
|
63
|
+
return this.o.store.enqueue(agentId, ev, resolveKind(ev, a.eventKinds));
|
|
64
|
+
}
|
|
65
|
+
// ── rodada ──────────────────────────────────────────────────────────────────────
|
|
66
|
+
runRound(agentId, hops = 0) {
|
|
67
|
+
const a = this.agent(agentId);
|
|
68
|
+
return runRound({
|
|
69
|
+
agent: a,
|
|
70
|
+
store: this.o.store,
|
|
71
|
+
brain: this.o.brain,
|
|
72
|
+
notifier: this.notifier,
|
|
73
|
+
skills: this.skillsOf(a),
|
|
74
|
+
servers: () => this.o.servers(a),
|
|
75
|
+
askPeer: (peer, q) => this.converse(peer, { email: a.manifest.identity.email, kind: 'agent' }, q, `handoff:${agentId}`, hops + 1).then((r) => r.answer),
|
|
76
|
+
...(this.o.now ? { now: this.o.now } : {}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// ── conversa ────────────────────────────────────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Conversa direta (pelo Claude, via conector do círculo, ou de outro agente). Corre à
|
|
82
|
+
* parte da fila. Só lê, com o acesso do próprio agente: ele é um colaborador virtual, e
|
|
83
|
+
* quem pode conversar com ele é decidido pelo grant do conector `agents_<círculo>`.
|
|
84
|
+
*/
|
|
85
|
+
async converse(agentId, asker, message, conversationId, hops = 0) {
|
|
86
|
+
const a = this.agent(agentId);
|
|
87
|
+
const m = a.manifest;
|
|
88
|
+
if (!m.conversation.enabled)
|
|
89
|
+
throw new Error(`${agentId} não aceita conversa direta`);
|
|
90
|
+
if (await this.o.store.killSwitch(agentId))
|
|
91
|
+
throw new Error(`${agentId} está bloqueado`);
|
|
92
|
+
if (hops > m.conversation.maxHops)
|
|
93
|
+
throw new Error(`limite de ${m.conversation.maxHops} idas e voltas entre agentes atingido`);
|
|
94
|
+
const memory = new ShortTermMemory(`${agentId}-conv`);
|
|
95
|
+
const caps = await this.o.store.levelCaps(agentId);
|
|
96
|
+
const gate = new PolicyGate({ agent: a, store: this.o.store, notifier: this.notifier, mode: 'conversation', caps });
|
|
97
|
+
const tools = new RuntimeTools({
|
|
98
|
+
agent: a,
|
|
99
|
+
gate,
|
|
100
|
+
memory,
|
|
101
|
+
store: this.o.store,
|
|
102
|
+
notifier: this.notifier,
|
|
103
|
+
askPeer: (p, q) => this.converse(p, { email: m.identity.email, kind: 'agent' }, q, conversationId, hops + 1).then((r) => r.answer),
|
|
104
|
+
});
|
|
105
|
+
try {
|
|
106
|
+
const res = await this.o.brain.run({
|
|
107
|
+
agent: a,
|
|
108
|
+
systemPrompt: systemPrompt(a, (r) => gate.levelOf(r)),
|
|
109
|
+
prompt: conversationPrompt({ asker: asker.email, askerKind: asker.kind, message, conversationId }),
|
|
110
|
+
gate,
|
|
111
|
+
tools,
|
|
112
|
+
mcpServers: await this.o.servers(a),
|
|
113
|
+
skills: this.skillsOf(a),
|
|
114
|
+
maxTurns: m.conversation.maxTurns,
|
|
115
|
+
signal: AbortSignal.timeout(m.limits.roundTimeoutSec * 1000),
|
|
116
|
+
});
|
|
117
|
+
if (res.error)
|
|
118
|
+
throw new Error(res.error);
|
|
119
|
+
// A conversa fica registrada, como qualquer ação dele.
|
|
120
|
+
await this.o.store.recordAction({
|
|
121
|
+
agentId,
|
|
122
|
+
itemId: null,
|
|
123
|
+
routine: '_conversation',
|
|
124
|
+
tool: 'runtime.answer',
|
|
125
|
+
input: { asker: asker.email, askerKind: asker.kind, conversationId, hops, message },
|
|
126
|
+
reason: null,
|
|
127
|
+
mode: 'executed',
|
|
128
|
+
status: 'ok',
|
|
129
|
+
level: 'agent',
|
|
130
|
+
idempotencyKey: `conv:${conversationId}:${Date.now()}:${Math.random()}`,
|
|
131
|
+
});
|
|
132
|
+
return { answer: res.text, costUsd: res.costUsd };
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
memory.dispose();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ── propostas, correções, nível ─────────────────────────────────────────────────
|
|
139
|
+
pendingProposals(agentId) {
|
|
140
|
+
return this.o.store.history(agentId, { mode: 'proposed', status: 'pending', limit: 100 });
|
|
141
|
+
}
|
|
142
|
+
/** Uma pessoa aprova ou recusa a proposta. Aprovada, roda pelo gateway com a identidade do agente. */
|
|
143
|
+
async decideProposal(actionId, decision, by, note) {
|
|
144
|
+
const row = await this.o.store.decideProposal(actionId, decision, by, note);
|
|
145
|
+
if (!row)
|
|
146
|
+
throw new Error(`proposta #${actionId} não existe ou já foi decidida`);
|
|
147
|
+
if (decision === 'rejected')
|
|
148
|
+
return row;
|
|
149
|
+
const a = this.agent(row.agent_id);
|
|
150
|
+
try {
|
|
151
|
+
const r = await this.o.executor.call(a, row.tool, row.input);
|
|
152
|
+
await this.o.store.setProposalResult(actionId, r.ok ? 'ok' : 'error', r.content);
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
await this.o.store.setProposalResult(actionId, 'error', { error: e.message });
|
|
156
|
+
}
|
|
157
|
+
await evaluateBreaker(a, row.routine, this.o.store, this.notifier);
|
|
158
|
+
return (await this.o.store.getAction(actionId));
|
|
159
|
+
}
|
|
160
|
+
/** Uma pessoa corrige o que ele fez. Vira aprendizado no próximo prompt e conta no disjuntor. */
|
|
161
|
+
async correctAction(actionId, by, note) {
|
|
162
|
+
const row = await this.o.store.correctAction(actionId, by, note);
|
|
163
|
+
if (!row)
|
|
164
|
+
throw new Error(`ação #${actionId} não existe ou não foi executada`);
|
|
165
|
+
await evaluateBreaker(this.agent(row.agent_id), row.routine, this.o.store, this.notifier);
|
|
166
|
+
return row;
|
|
167
|
+
}
|
|
168
|
+
/** Incidente: a rotina desce na hora, por decisão de pessoa. */
|
|
169
|
+
async demote(agentId, routine, to, by, reason) {
|
|
170
|
+
await this.o.store.setLevelCap(agentId, routine, to, `${by}: ${reason}`);
|
|
171
|
+
const m = this.agent(agentId).manifest;
|
|
172
|
+
await this.notifier.notify({ agentId, kind: 'demotion', to: [m.owner.dri, 'seguranca'], text: `${m.name}: ${routine} desceu para ${to} por ${by}. ${reason}` });
|
|
173
|
+
}
|
|
174
|
+
/** Bloqueio de emergência: para tudo na hora, sem deploy. */
|
|
175
|
+
async kill(agentId, by, reason) {
|
|
176
|
+
await this.o.store.setKillSwitch(agentId, reason, by);
|
|
177
|
+
const m = this.agent(agentId).manifest;
|
|
178
|
+
await this.notifier.notify({ agentId, kind: 'kill-switch', to: [m.owner.dri, 'seguranca'], text: `${m.name} bloqueado por ${by}: ${reason}` });
|
|
179
|
+
}
|
|
180
|
+
// ── agenda e entrada HTTP ───────────────────────────────────────────────────────
|
|
181
|
+
/** Liga o despertar de cada agente e a agenda das rotinas. */
|
|
182
|
+
startSchedules(onRound = () => { }) {
|
|
183
|
+
for (const a of this.agents.values()) {
|
|
184
|
+
const m = a.manifest;
|
|
185
|
+
const tz = m.triggers.timezone;
|
|
186
|
+
if (m.triggers.schedule) {
|
|
187
|
+
this.crons.push(new Cron(m.triggers.schedule, { timezone: tz, protect: true }, async () => {
|
|
188
|
+
onRound(m.id, await this.runRound(m.id).catch((e) => ({ items: [], costUsd: 0, error: String(e) })));
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
for (const [name, r] of Object.entries(m.routines)) {
|
|
192
|
+
if (!r.schedule)
|
|
193
|
+
continue;
|
|
194
|
+
this.crons.push(new Cron(r.schedule, { timezone: tz }, async (self) => {
|
|
195
|
+
const at = (self.currentRun() ?? new Date()).toISOString().slice(0, 16);
|
|
196
|
+
await this.enqueue(m.id, { id: `schedule:${name}:${at}`, type: `schedule.${name}`, subject: `schedule:${name}:${at}`, kind: 'hygiene' });
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Entrada de eventos por webhook: POST /agents/:id/events, assinado com HMAC-SHA256
|
|
203
|
+
* (`x-t4h-signature: sha256=<hex>`). GET /healthz para o Container App.
|
|
204
|
+
*/
|
|
205
|
+
listen(port, hmacSecret) {
|
|
206
|
+
this.http = createServer(async (req, res) => {
|
|
207
|
+
const reply = (status, body) => {
|
|
208
|
+
res.writeHead(status, { 'content-type': 'application/json' });
|
|
209
|
+
res.end(JSON.stringify(body));
|
|
210
|
+
};
|
|
211
|
+
try {
|
|
212
|
+
if (req.method === 'GET' && req.url === '/healthz')
|
|
213
|
+
return reply(200, { ok: true, agents: [...this.agents.keys()] });
|
|
214
|
+
const m = /^\/agents\/([a-z0-9-]+)\/(events|rounds)$/.exec(req.url ?? '');
|
|
215
|
+
if (req.method !== 'POST' || !m)
|
|
216
|
+
return reply(404, { error: 'not found' });
|
|
217
|
+
const raw = await readBody(req);
|
|
218
|
+
if (!verifySignature(raw, req.headers['x-t4h-signature'], hmacSecret))
|
|
219
|
+
return reply(401, { error: 'assinatura inválida' });
|
|
220
|
+
// Acordar agora, sem esperar o cron (operação e testes). Responde com o relatório.
|
|
221
|
+
if (m[2] === 'rounds')
|
|
222
|
+
return reply(200, await this.runRound(m[1]));
|
|
223
|
+
const ev = JSON.parse(raw);
|
|
224
|
+
if (!ev?.type || !ev?.subject)
|
|
225
|
+
return reply(400, { error: 'type e subject são obrigatórios' });
|
|
226
|
+
return reply(202, await this.enqueue(m[1], ev));
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
return reply(400, { error: e.message });
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
return new Promise((ok) => this.http.listen(port, () => ok(this.http.address().port)));
|
|
233
|
+
}
|
|
234
|
+
async stop() {
|
|
235
|
+
for (const c of this.crons)
|
|
236
|
+
c.stop();
|
|
237
|
+
await new Promise((ok) => (this.http ? this.http.close(() => ok()) : ok()));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function readBody(req) {
|
|
241
|
+
return new Promise((ok, fail) => {
|
|
242
|
+
const chunks = [];
|
|
243
|
+
let size = 0;
|
|
244
|
+
req.on('data', (c) => {
|
|
245
|
+
size += c.length;
|
|
246
|
+
if (size > 256 * 1024) {
|
|
247
|
+
fail(new Error('evento grande demais'));
|
|
248
|
+
req.destroy();
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
chunks.push(c);
|
|
252
|
+
});
|
|
253
|
+
req.on('end', () => ok(Buffer.concat(chunks).toString('utf8')));
|
|
254
|
+
req.on('error', fail);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/** Sem segredo configurado, só aceita fora de produção. */
|
|
258
|
+
export function verifySignature(raw, header, secret) {
|
|
259
|
+
if (!secret)
|
|
260
|
+
return process.env.NODE_ENV !== 'production';
|
|
261
|
+
if (typeof header !== 'string' || !header.startsWith('sha256='))
|
|
262
|
+
return false;
|
|
263
|
+
const expected = Buffer.from(createHmac('sha256', secret).update(raw).digest('hex'));
|
|
264
|
+
const got = Buffer.from(header.slice('sha256='.length));
|
|
265
|
+
return got.length === expected.length && timingSafeEqual(got, expected);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|
package/dist/inbox.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caixa de entrada: muitos eventos, uma fila só.
|
|
3
|
+
*
|
|
4
|
+
* Todo evento vira uma linha no Postgres (nada se perde se o agente estiver dormindo).
|
|
5
|
+
* Eventos do mesmo assunto (`subject`) viram um item só; repetidos (mesmo `id` na origem)
|
|
6
|
+
* são descartados. O item herda a maior prioridade entre os seus eventos.
|
|
7
|
+
*/
|
|
8
|
+
export type EventKind = 'conversation' | 'critical' | 'new' | 'update' | 'hygiene';
|
|
9
|
+
/** Ordem da fila: alguém falando com ele, crítico, novo, mudou, higiene. */
|
|
10
|
+
export declare const PRIORITY: Record<EventKind, number>;
|
|
11
|
+
export interface IncomingEvent {
|
|
12
|
+
/** Id na origem. Serve para descartar repetido. */
|
|
13
|
+
id?: string;
|
|
14
|
+
type: string;
|
|
15
|
+
/** Assunto que junta eventos num item: `ticket:STR-512`, `chat:<conversa>`. */
|
|
16
|
+
subject: string;
|
|
17
|
+
/** Se ausente, vem do manifesto (triggers.events) ou do nome do evento. */
|
|
18
|
+
kind?: EventKind;
|
|
19
|
+
payload?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Palpite pelo nome, para quem declara o evento só como string no manifesto. */
|
|
22
|
+
export declare function inferEventKind(type: string): EventKind;
|
|
23
|
+
export declare function resolveKind(ev: IncomingEvent, declared: Map<string, EventKind>): EventKind;
|
package/dist/inbox.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Ordem da fila: alguém falando com ele, crítico, novo, mudou, higiene. */
|
|
2
|
+
export const PRIORITY = {
|
|
3
|
+
conversation: 1,
|
|
4
|
+
critical: 2,
|
|
5
|
+
new: 3,
|
|
6
|
+
update: 4,
|
|
7
|
+
hygiene: 5,
|
|
8
|
+
};
|
|
9
|
+
/** Palpite pelo nome, para quem declara o evento só como string no manifesto. */
|
|
10
|
+
export function inferEventKind(type) {
|
|
11
|
+
if (type.startsWith('schedule.'))
|
|
12
|
+
return 'hygiene';
|
|
13
|
+
if (/\.(mention|message|reply|asked)$/.test(type))
|
|
14
|
+
return 'conversation';
|
|
15
|
+
if (/\.(critical|incident)$/.test(type))
|
|
16
|
+
return 'critical';
|
|
17
|
+
if (/\.(opened|created|new)$/.test(type))
|
|
18
|
+
return 'new';
|
|
19
|
+
return 'update';
|
|
20
|
+
}
|
|
21
|
+
export function resolveKind(ev, declared) {
|
|
22
|
+
// Um evento comum pode chegar marcado como crítico pela origem; isso só sobe a
|
|
23
|
+
// prioridade, nunca desce.
|
|
24
|
+
const base = declared.get(ev.type) ?? inferEventKind(ev.type);
|
|
25
|
+
if (ev.kind && PRIORITY[ev.kind] < PRIORITY[base])
|
|
26
|
+
return ev.kind;
|
|
27
|
+
return base;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AASA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,QAAQ,GAA8B;IACjD,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;CACX,CAAC;AAaF,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,cAAc,CAAC;IACzE,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC3D,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAiB,EAAE,QAAgC;IAC7E,+EAA+E;IAC/E,2BAA2B;IAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { loadAgent, loadAgents, validateManifest, semanticProblems, ManifestError, SCHEMA_PATH } from './manifest.js';
|
|
2
|
+
export type { AgentManifest, LoadedAgent, RoutineSpec } from './manifest.js';
|
|
3
|
+
export { LEVELS, effectiveLevel, breakerTrips, insideWindow, oneBelow, lower } from './levels.js';
|
|
4
|
+
export type { Level, EffectiveLevel, BreakerConfig, OutcomeStatus } from './levels.js';
|
|
5
|
+
export { PRIORITY, inferEventKind, resolveKind } from './inbox.js';
|
|
6
|
+
export type { EventKind, IncomingEvent } from './inbox.js';
|
|
7
|
+
export { PolicyGate, evaluateBreaker, qualifiedToolName, sdkToolName, idempotencyKey, RUNTIME_SERVER } from './policy.js';
|
|
8
|
+
export type { GateDecision, GateOptions } from './policy.js';
|
|
9
|
+
export { LongTermStore } from './store/long-term.js';
|
|
10
|
+
export type { ActionRow, ActionMode, ActionStatus, ItemRow, EventRow } from './store/long-term.js';
|
|
11
|
+
export { pgSql, pgliteSql, sqlFromUrl } from './store/sql.js';
|
|
12
|
+
export type { Sql, Queryable } from './store/sql.js';
|
|
13
|
+
export { ShortTermMemory, stableStringify } from './short-term.js';
|
|
14
|
+
export { GatewayClient, GatewayError, ClientCredentialsTokenSource, StaticTokenSource, } from './gateway.js';
|
|
15
|
+
export type { TokenSource, GatewayTool } from './gateway.js';
|
|
16
|
+
export { ClaudeBrain } from './brain.js';
|
|
17
|
+
export type { Brain, BrainTask, BrainResult } from './brain.js';
|
|
18
|
+
export { RuntimeTools } from './runtime-tools.js';
|
|
19
|
+
export type { ItemOutcome, AskPeer } from './runtime-tools.js';
|
|
20
|
+
export { resolveSkills } from './plugins.js';
|
|
21
|
+
export type { ResolvedSkills } from './plugins.js';
|
|
22
|
+
export { systemPrompt, itemPrompt, conversationPrompt, untrusted } from './prompt.js';
|
|
23
|
+
export { runRound, routinesFor } from './round.js';
|
|
24
|
+
export type { RoundReport, RoundDeps } from './round.js';
|
|
25
|
+
export { AgentHost, gatewayExecutor, verifySignature } from './host.js';
|
|
26
|
+
export type { AgentHostOptions, Asker, ToolExecutor } from './host.js';
|
|
27
|
+
export { consoleNotifier, MemoryNotifier } from './notifier.js';
|
|
28
|
+
export type { Notifier, Notice, NoticeKind } from './notifier.js';
|
|
29
|
+
export { loadEvalCases, runEvalCase, runEvals, subsetMatch } from './evals.js';
|
|
30
|
+
export type { EvalCase, EvalResult } from './evals.js';
|
|
31
|
+
export { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
|
|
32
|
+
export type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { loadAgent, loadAgents, validateManifest, semanticProblems, ManifestError, SCHEMA_PATH } from './manifest.js';
|
|
2
|
+
export { LEVELS, effectiveLevel, breakerTrips, insideWindow, oneBelow, lower } from './levels.js';
|
|
3
|
+
export { PRIORITY, inferEventKind, resolveKind } from './inbox.js';
|
|
4
|
+
export { PolicyGate, evaluateBreaker, qualifiedToolName, sdkToolName, idempotencyKey, RUNTIME_SERVER } from './policy.js';
|
|
5
|
+
export { LongTermStore } from './store/long-term.js';
|
|
6
|
+
export { pgSql, pgliteSql, sqlFromUrl } from './store/sql.js';
|
|
7
|
+
export { ShortTermMemory, stableStringify } from './short-term.js';
|
|
8
|
+
export { GatewayClient, GatewayError, ClientCredentialsTokenSource, StaticTokenSource, } from './gateway.js';
|
|
9
|
+
export { ClaudeBrain } from './brain.js';
|
|
10
|
+
export { RuntimeTools } from './runtime-tools.js';
|
|
11
|
+
export { resolveSkills } from './plugins.js';
|
|
12
|
+
export { systemPrompt, itemPrompt, conversationPrompt, untrusted } from './prompt.js';
|
|
13
|
+
export { runRound, routinesFor } from './round.js';
|
|
14
|
+
export { AgentHost, gatewayExecutor, verifySignature } from './host.js';
|
|
15
|
+
export { consoleNotifier, MemoryNotifier } from './notifier.js';
|
|
16
|
+
export { loadEvalCases, runEvalCase, runEvals, subsetMatch } from './evals.js';
|
|
17
|
+
// Para servir conectores em processo (stubs locais, evals) sem depender do SDK direto.
|
|
18
|
+
export { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGlG,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG1H,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGxE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/E,uFAAuF;AACvF,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/levels.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Níveis de autonomia do Modelo de Gestão AI First, por rotina.
|
|
3
|
+
*
|
|
4
|
+
* copilot ele sugere; a pessoa aprova antes → a ação vira proposta
|
|
5
|
+
* agent ele executa; a pessoa trata exceções → executa e registra
|
|
6
|
+
* autonomous ele age; a pessoa audita depois → executa e registra
|
|
7
|
+
*
|
|
8
|
+
* `shadow` não é nível de rotina no manifesto: é o estágio do agente inteiro (só lê e
|
|
9
|
+
* registra o que faria) e também o piso para onde o disjuntor derruba um copilot.
|
|
10
|
+
*
|
|
11
|
+
* Subir é sempre um PR no agent.yaml. Descer é automático (disjuntor) ou manual (incidente).
|
|
12
|
+
*/
|
|
13
|
+
export declare const LEVELS: readonly ["copilot", "agent", "autonomous"];
|
|
14
|
+
export type Level = (typeof LEVELS)[number];
|
|
15
|
+
export type EffectiveLevel = 'shadow' | Level;
|
|
16
|
+
export declare function rank(level: EffectiveLevel): number;
|
|
17
|
+
export declare function lower(a: EffectiveLevel, b: EffectiveLevel): EffectiveLevel;
|
|
18
|
+
export declare function oneBelow(level: EffectiveLevel): EffectiveLevel;
|
|
19
|
+
/**
|
|
20
|
+
* Nível que vale agora: o menor entre o do manifesto e o teto gravado pelo disjuntor.
|
|
21
|
+
* No estágio shadow, tudo é shadow.
|
|
22
|
+
*/
|
|
23
|
+
export declare function effectiveLevel(opts: {
|
|
24
|
+
stage: 'shadow' | 'live';
|
|
25
|
+
manifestLevel: Level;
|
|
26
|
+
cap?: EffectiveLevel | null;
|
|
27
|
+
}): EffectiveLevel;
|
|
28
|
+
export interface BreakerConfig {
|
|
29
|
+
window: number;
|
|
30
|
+
minSample: number;
|
|
31
|
+
maxErrorRate: number;
|
|
32
|
+
}
|
|
33
|
+
export type OutcomeStatus = 'ok' | 'error' | 'corrected';
|
|
34
|
+
/**
|
|
35
|
+
* Disjuntor. Recebe os desfechos mais recentes da rotina (mais novo primeiro) e diz se
|
|
36
|
+
* ela precisa descer. Erro de execução e correção de uma pessoa contam igual: os dois
|
|
37
|
+
* dizem que o agente não devia ter feito aquilo sozinho.
|
|
38
|
+
*/
|
|
39
|
+
export declare function breakerTrips(recent: OutcomeStatus[], cfg: BreakerConfig): {
|
|
40
|
+
trip: boolean;
|
|
41
|
+
rate: number;
|
|
42
|
+
sample: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Janela de horário ("Mon-Fri 08:00-19:00") no fuso do agente. Fora dela, a ação com
|
|
46
|
+
* efeito vira proposta em vez de ser executada.
|
|
47
|
+
*/
|
|
48
|
+
export declare function insideWindow(window: string, now: Date, timeZone: string): boolean;
|
package/dist/levels.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Níveis de autonomia do Modelo de Gestão AI First, por rotina.
|
|
3
|
+
*
|
|
4
|
+
* copilot ele sugere; a pessoa aprova antes → a ação vira proposta
|
|
5
|
+
* agent ele executa; a pessoa trata exceções → executa e registra
|
|
6
|
+
* autonomous ele age; a pessoa audita depois → executa e registra
|
|
7
|
+
*
|
|
8
|
+
* `shadow` não é nível de rotina no manifesto: é o estágio do agente inteiro (só lê e
|
|
9
|
+
* registra o que faria) e também o piso para onde o disjuntor derruba um copilot.
|
|
10
|
+
*
|
|
11
|
+
* Subir é sempre um PR no agent.yaml. Descer é automático (disjuntor) ou manual (incidente).
|
|
12
|
+
*/
|
|
13
|
+
export const LEVELS = ['copilot', 'agent', 'autonomous'];
|
|
14
|
+
const ORDER = ['shadow', 'copilot', 'agent', 'autonomous'];
|
|
15
|
+
export function rank(level) {
|
|
16
|
+
return ORDER.indexOf(level);
|
|
17
|
+
}
|
|
18
|
+
export function lower(a, b) {
|
|
19
|
+
return rank(a) <= rank(b) ? a : b;
|
|
20
|
+
}
|
|
21
|
+
export function oneBelow(level) {
|
|
22
|
+
return ORDER[Math.max(0, rank(level) - 1)];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Nível que vale agora: o menor entre o do manifesto e o teto gravado pelo disjuntor.
|
|
26
|
+
* No estágio shadow, tudo é shadow.
|
|
27
|
+
*/
|
|
28
|
+
export function effectiveLevel(opts) {
|
|
29
|
+
if (opts.stage === 'shadow')
|
|
30
|
+
return 'shadow';
|
|
31
|
+
return opts.cap ? lower(opts.manifestLevel, opts.cap) : opts.manifestLevel;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Disjuntor. Recebe os desfechos mais recentes da rotina (mais novo primeiro) e diz se
|
|
35
|
+
* ela precisa descer. Erro de execução e correção de uma pessoa contam igual: os dois
|
|
36
|
+
* dizem que o agente não devia ter feito aquilo sozinho.
|
|
37
|
+
*/
|
|
38
|
+
export function breakerTrips(recent, cfg) {
|
|
39
|
+
const sample = recent.slice(0, cfg.window);
|
|
40
|
+
if (sample.length < cfg.minSample)
|
|
41
|
+
return { trip: false, rate: 0, sample: sample.length };
|
|
42
|
+
const bad = sample.filter((s) => s !== 'ok').length;
|
|
43
|
+
const rate = bad / sample.length;
|
|
44
|
+
return { trip: rate > cfg.maxErrorRate, rate, sample: sample.length };
|
|
45
|
+
}
|
|
46
|
+
const DAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
|
47
|
+
/**
|
|
48
|
+
* Janela de horário ("Mon-Fri 08:00-19:00") no fuso do agente. Fora dela, a ação com
|
|
49
|
+
* efeito vira proposta em vez de ser executada.
|
|
50
|
+
*/
|
|
51
|
+
export function insideWindow(window, now, timeZone) {
|
|
52
|
+
const m = /^(\w{3})-(\w{3}) (\d{2}):(\d{2})-(\d{2}):(\d{2})$/.exec(window);
|
|
53
|
+
if (!m)
|
|
54
|
+
return false;
|
|
55
|
+
const [, d1, d2, h1, m1, h2, m2] = m;
|
|
56
|
+
const parts = new Intl.DateTimeFormat('en-US', {
|
|
57
|
+
timeZone,
|
|
58
|
+
weekday: 'short',
|
|
59
|
+
hour: '2-digit',
|
|
60
|
+
minute: '2-digit',
|
|
61
|
+
hourCycle: 'h23',
|
|
62
|
+
}).formatToParts(now);
|
|
63
|
+
const get = (t) => parts.find((p) => p.type === t)?.value ?? '';
|
|
64
|
+
const day = DAYS.indexOf(get('weekday'));
|
|
65
|
+
const minutes = Number(get('hour')) * 60 + Number(get('minute'));
|
|
66
|
+
const from = DAYS.indexOf(d1);
|
|
67
|
+
const to = DAYS.indexOf(d2);
|
|
68
|
+
const dayOk = from <= to ? day >= from && day <= to : day >= from || day <= to;
|
|
69
|
+
const start = Number(h1) * 60 + Number(m1);
|
|
70
|
+
const end = Number(h2) * 60 + Number(m2);
|
|
71
|
+
return dayOk && minutes >= start && minutes < end;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=levels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levels.js","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { type Level } from './levels.js';
|
|
2
|
+
import { type EventKind } from './inbox.js';
|
|
3
|
+
export interface RoutineSpec {
|
|
4
|
+
level: Level;
|
|
5
|
+
target?: Level;
|
|
6
|
+
does: string;
|
|
7
|
+
on: string[];
|
|
8
|
+
schedule?: string;
|
|
9
|
+
actions: string[];
|
|
10
|
+
scope?: Record<string, unknown>;
|
|
11
|
+
limits?: {
|
|
12
|
+
perHour?: number;
|
|
13
|
+
window?: string;
|
|
14
|
+
};
|
|
15
|
+
undo?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentManifest {
|
|
18
|
+
schemaVersion: 1;
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description: string;
|
|
22
|
+
stage: 'shadow' | 'live';
|
|
23
|
+
owner: {
|
|
24
|
+
dri: string;
|
|
25
|
+
securityCoOwner: boolean;
|
|
26
|
+
};
|
|
27
|
+
team: {
|
|
28
|
+
area: string;
|
|
29
|
+
team: string;
|
|
30
|
+
leader?: string;
|
|
31
|
+
channel?: string;
|
|
32
|
+
};
|
|
33
|
+
identity: {
|
|
34
|
+
email: string;
|
|
35
|
+
clientId?: string;
|
|
36
|
+
};
|
|
37
|
+
model: string;
|
|
38
|
+
effort: 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
39
|
+
gateway: {
|
|
40
|
+
subservices: string[];
|
|
41
|
+
};
|
|
42
|
+
reads: string[];
|
|
43
|
+
triggers: {
|
|
44
|
+
schedule?: string;
|
|
45
|
+
timezone: string;
|
|
46
|
+
events: Array<string | {
|
|
47
|
+
type: string;
|
|
48
|
+
kind: EventKind;
|
|
49
|
+
}>;
|
|
50
|
+
};
|
|
51
|
+
limits: {
|
|
52
|
+
itemsPerRound: number;
|
|
53
|
+
roundTimeoutSec: number;
|
|
54
|
+
maxTurnsPerItem: number;
|
|
55
|
+
budgetUsdPerItem?: number;
|
|
56
|
+
maxAttempts: number;
|
|
57
|
+
};
|
|
58
|
+
breaker: {
|
|
59
|
+
window: number;
|
|
60
|
+
minSample: number;
|
|
61
|
+
maxErrorRate: number;
|
|
62
|
+
};
|
|
63
|
+
routines: Record<string, RoutineSpec>;
|
|
64
|
+
guardrails: {
|
|
65
|
+
forbiddenTools: string[];
|
|
66
|
+
untrustedInputs: string[];
|
|
67
|
+
};
|
|
68
|
+
conversation: {
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
maxTurns: number;
|
|
71
|
+
maxHops: number;
|
|
72
|
+
};
|
|
73
|
+
plugins: Array<{
|
|
74
|
+
name: string;
|
|
75
|
+
version: string;
|
|
76
|
+
}>;
|
|
77
|
+
skills: string[];
|
|
78
|
+
handoffTo: string[];
|
|
79
|
+
memory: {
|
|
80
|
+
shortTerm: 'sqlite';
|
|
81
|
+
longTerm: 'postgres';
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Um agente carregado: o manifesto mais o que o runtime deriva dele. */
|
|
85
|
+
export interface LoadedAgent {
|
|
86
|
+
manifest: AgentManifest;
|
|
87
|
+
dir: string;
|
|
88
|
+
persona: string;
|
|
89
|
+
/** Pasta skills/ do agente, se existir: vira um plugin local só dele. */
|
|
90
|
+
localSkillsDir?: string;
|
|
91
|
+
/** Ferramenta com efeito → rotina dona dela. */
|
|
92
|
+
actionOwner: Map<string, string>;
|
|
93
|
+
/** Tipo de evento → tipo de prioridade. */
|
|
94
|
+
eventKinds: Map<string, EventKind>;
|
|
95
|
+
}
|
|
96
|
+
export declare class ManifestError extends Error {
|
|
97
|
+
readonly agentDir: string;
|
|
98
|
+
readonly problems: string[];
|
|
99
|
+
constructor(agentDir: string, problems: string[]);
|
|
100
|
+
}
|
|
101
|
+
export declare const SCHEMA_PATH: string;
|
|
102
|
+
/** Regras entre campos. Devolve a lista de problemas (vazia = ok). */
|
|
103
|
+
export declare function semanticProblems(m: AgentManifest, folderName?: string): string[];
|
|
104
|
+
/** Valida um objeto já lido do YAML. Aplica os defaults do schema no próprio objeto. */
|
|
105
|
+
export declare function validateManifest(raw: unknown, folderName?: string): {
|
|
106
|
+
manifest?: AgentManifest;
|
|
107
|
+
problems: string[];
|
|
108
|
+
};
|
|
109
|
+
export declare function loadAgent(agentDir: string): LoadedAgent;
|
|
110
|
+
/** Carrega todas as pastas de agents/. Junta os erros de todos antes de falhar. */
|
|
111
|
+
export declare function loadAgents(agentsRoot: string): LoadedAgent[];
|