@t4h/agent-runtime 0.0.0-stage → 0.1.1
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 +47 -3
- package/schema/agent.schema.json +236 -0
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifesto do agente: lê `agents/<id>/agent.yaml`, valida contra o schema v1 e aplica
|
|
3
|
+
* as regras que o JSON Schema sozinho não expressa (as que dependem de mais de um campo).
|
|
4
|
+
*
|
|
5
|
+
* Um agente é uma pasta: agent.yaml, persona.md, skills/ (opcional) e evals/. Tudo que
|
|
6
|
+
* faz dele quem ele é passa por PR; o código é comum a todos.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
9
|
+
import { basename, join, resolve } from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { Ajv } from 'ajv';
|
|
12
|
+
import { parse as parseYaml } from 'yaml';
|
|
13
|
+
import { LEVELS } from './levels.js';
|
|
14
|
+
import { inferEventKind } from './inbox.js';
|
|
15
|
+
export class ManifestError extends Error {
|
|
16
|
+
agentDir;
|
|
17
|
+
problems;
|
|
18
|
+
constructor(agentDir, problems) {
|
|
19
|
+
super(`agent.yaml inválido em ${agentDir}:\n - ${problems.join('\n - ')}`);
|
|
20
|
+
this.agentDir = agentDir;
|
|
21
|
+
this.problems = problems;
|
|
22
|
+
this.name = 'ManifestError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export const SCHEMA_PATH = fileURLToPath(new URL('../schema/agent.schema.json', import.meta.url));
|
|
26
|
+
const ajv = new Ajv({ allErrors: true, useDefaults: true, strict: false });
|
|
27
|
+
const validateSchema = ajv.compile(JSON.parse(readFileSync(SCHEMA_PATH, 'utf8')));
|
|
28
|
+
function formatAjvError(e) {
|
|
29
|
+
const where = e.instancePath || '(raiz)';
|
|
30
|
+
if (e.keyword === 'additionalProperties') {
|
|
31
|
+
return `${where}: campo desconhecido "${e.params.additionalProperty}"`;
|
|
32
|
+
}
|
|
33
|
+
return `${where}: ${e.message ?? e.keyword}`;
|
|
34
|
+
}
|
|
35
|
+
/** Regras entre campos. Devolve a lista de problemas (vazia = ok). */
|
|
36
|
+
export function semanticProblems(m, folderName) {
|
|
37
|
+
const problems = [];
|
|
38
|
+
const subservices = new Set(m.gateway.subservices);
|
|
39
|
+
const subOf = (tool) => tool.split('.')[0];
|
|
40
|
+
if (folderName !== undefined && folderName !== m.id) {
|
|
41
|
+
problems.push(`id "${m.id}" precisa ser igual ao nome da pasta "${folderName}"`);
|
|
42
|
+
}
|
|
43
|
+
const declaredEvents = new Set(m.triggers.events.map((e) => (typeof e === 'string' ? e : e.type)));
|
|
44
|
+
const owner = new Map();
|
|
45
|
+
const reads = new Set(m.reads);
|
|
46
|
+
const forbidden = new Set(m.guardrails.forbiddenTools);
|
|
47
|
+
for (const tool of m.reads) {
|
|
48
|
+
if (!subservices.has(subOf(tool)))
|
|
49
|
+
problems.push(`reads: "${tool}" usa um conector fora de gateway.subservices`);
|
|
50
|
+
if (forbidden.has(tool))
|
|
51
|
+
problems.push(`reads: "${tool}" também está em guardrails.forbiddenTools`);
|
|
52
|
+
}
|
|
53
|
+
const reachesAutonomous = Object.values(m.routines).some((r) => r.level === 'autonomous' || r.target === 'autonomous');
|
|
54
|
+
if (reachesAutonomous && !m.owner.securityCoOwner) {
|
|
55
|
+
problems.push('owner.securityCoOwner precisa ser true: há rotina que chega a autonomous');
|
|
56
|
+
}
|
|
57
|
+
for (const [name, r] of Object.entries(m.routines)) {
|
|
58
|
+
if (r.target && LEVELS.indexOf(r.target) < LEVELS.indexOf(r.level)) {
|
|
59
|
+
problems.push(`routines.${name}: target (${r.target}) abaixo do level (${r.level})`);
|
|
60
|
+
}
|
|
61
|
+
if (r.on.length === 0 && !r.schedule) {
|
|
62
|
+
problems.push(`routines.${name}: sem gatilho (declare "on" ou "schedule")`);
|
|
63
|
+
}
|
|
64
|
+
for (const ev of r.on) {
|
|
65
|
+
if (!declaredEvents.has(ev))
|
|
66
|
+
problems.push(`routines.${name}.on: evento "${ev}" não está em triggers.events`);
|
|
67
|
+
}
|
|
68
|
+
for (const tool of r.actions) {
|
|
69
|
+
if (!subservices.has(subOf(tool)))
|
|
70
|
+
problems.push(`routines.${name}.actions: "${tool}" usa um conector fora de gateway.subservices`);
|
|
71
|
+
if (reads.has(tool))
|
|
72
|
+
problems.push(`routines.${name}.actions: "${tool}" está também em reads (ou lê, ou age)`);
|
|
73
|
+
if (forbidden.has(tool))
|
|
74
|
+
problems.push(`routines.${name}.actions: "${tool}" está em guardrails.forbiddenTools`);
|
|
75
|
+
const prev = owner.get(tool);
|
|
76
|
+
if (prev)
|
|
77
|
+
problems.push(`"${tool}" aparece nas rotinas ${prev} e ${name}: cada ferramenta pertence a uma rotina só`);
|
|
78
|
+
owner.set(tool, name);
|
|
79
|
+
}
|
|
80
|
+
// Os quatro requisitos do Autônomo que dá para conferir no manifesto. Os outros dois
|
|
81
|
+
// (tudo auditado e Segurança junto) são do runtime e do securityCoOwner acima.
|
|
82
|
+
if (r.level === 'autonomous') {
|
|
83
|
+
if (!r.scope)
|
|
84
|
+
problems.push(`routines.${name}: autonomous exige scope (onde pode agir)`);
|
|
85
|
+
if (!r.limits?.perHour)
|
|
86
|
+
problems.push(`routines.${name}: autonomous exige limits.perHour`);
|
|
87
|
+
if (!r.undo)
|
|
88
|
+
problems.push(`routines.${name}: autonomous exige undo (como desfazer)`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const peer of m.handoffTo) {
|
|
92
|
+
if (peer === m.id)
|
|
93
|
+
problems.push('handoffTo: o agente não conversa consigo mesmo');
|
|
94
|
+
}
|
|
95
|
+
return problems;
|
|
96
|
+
}
|
|
97
|
+
/** Valida um objeto já lido do YAML. Aplica os defaults do schema no próprio objeto. */
|
|
98
|
+
export function validateManifest(raw, folderName) {
|
|
99
|
+
const data = structuredClone(raw);
|
|
100
|
+
// O ajv só preenche defaults dentro de objetos que existem: cria os blocos opcionais
|
|
101
|
+
// vazios para os defaults de dentro deles valerem.
|
|
102
|
+
if (data && typeof data === 'object' && !Array.isArray(data)) {
|
|
103
|
+
const obj = data;
|
|
104
|
+
for (const k of ['triggers', 'limits', 'breaker', 'guardrails', 'conversation', 'memory'])
|
|
105
|
+
obj[k] ??= {};
|
|
106
|
+
}
|
|
107
|
+
if (!validateSchema(data)) {
|
|
108
|
+
return { problems: (validateSchema.errors ?? []).map(formatAjvError) };
|
|
109
|
+
}
|
|
110
|
+
const manifest = data;
|
|
111
|
+
const problems = semanticProblems(manifest, folderName);
|
|
112
|
+
return problems.length ? { problems } : { manifest, problems };
|
|
113
|
+
}
|
|
114
|
+
export function loadAgent(agentDir) {
|
|
115
|
+
const dir = resolve(agentDir);
|
|
116
|
+
const yamlPath = join(dir, 'agent.yaml');
|
|
117
|
+
if (!existsSync(yamlPath))
|
|
118
|
+
throw new ManifestError(dir, ['agent.yaml não encontrado']);
|
|
119
|
+
const { manifest, problems } = validateManifest(parseYaml(readFileSync(yamlPath, 'utf8')), basename(dir));
|
|
120
|
+
if (!manifest)
|
|
121
|
+
throw new ManifestError(dir, problems);
|
|
122
|
+
const personaPath = join(dir, 'persona.md');
|
|
123
|
+
if (!existsSync(personaPath))
|
|
124
|
+
throw new ManifestError(dir, ['persona.md não encontrado']);
|
|
125
|
+
const skillsDir = join(dir, 'skills');
|
|
126
|
+
const actionOwner = new Map();
|
|
127
|
+
for (const [name, r] of Object.entries(manifest.routines))
|
|
128
|
+
for (const t of r.actions)
|
|
129
|
+
actionOwner.set(t, name);
|
|
130
|
+
const eventKinds = new Map();
|
|
131
|
+
for (const e of manifest.triggers.events) {
|
|
132
|
+
if (typeof e === 'string')
|
|
133
|
+
eventKinds.set(e, inferEventKind(e));
|
|
134
|
+
else
|
|
135
|
+
eventKinds.set(e.type, e.kind);
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
manifest,
|
|
139
|
+
dir,
|
|
140
|
+
persona: readFileSync(personaPath, 'utf8'),
|
|
141
|
+
...(existsSync(skillsDir) && statSync(skillsDir).isDirectory() ? { localSkillsDir: skillsDir } : {}),
|
|
142
|
+
actionOwner,
|
|
143
|
+
eventKinds,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Carrega todas as pastas de agents/. Junta os erros de todos antes de falhar. */
|
|
147
|
+
export function loadAgents(agentsRoot) {
|
|
148
|
+
const root = resolve(agentsRoot);
|
|
149
|
+
const agents = [];
|
|
150
|
+
const errors = [];
|
|
151
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
152
|
+
if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name.startsWith('_'))
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
agents.push(loadAgent(join(root, entry.name)));
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
if (e instanceof ManifestError)
|
|
159
|
+
errors.push(e);
|
|
160
|
+
else
|
|
161
|
+
throw e;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (errors.length)
|
|
165
|
+
throw new AggregateError(errors, errors.map((e) => e.message).join('\n\n'));
|
|
166
|
+
const ids = new Set(agents.map((a) => a.manifest.id));
|
|
167
|
+
const dangling = agents.flatMap((a) => a.manifest.handoffTo.filter((p) => !ids.has(p)).map((p) => `${a.manifest.id}.handoffTo: agente "${p}" não existe neste repositório`));
|
|
168
|
+
if (dangling.length)
|
|
169
|
+
throw new Error(dangling.join('\n'));
|
|
170
|
+
return agents;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Para onde vão exceções, propostas, quedas de nível e escalações. Em produção, uma
|
|
3
|
+
* implementação que posta no canal do time pelo gateway (conector de chat) e avisa o
|
|
4
|
+
* DRI; aqui só a interface e a versão de console.
|
|
5
|
+
*/
|
|
6
|
+
export type NoticeKind = 'proposal' | 'escalation' | 'exception' | 'demotion' | 'kill-switch';
|
|
7
|
+
export interface Notice {
|
|
8
|
+
agentId: string;
|
|
9
|
+
kind: NoticeKind;
|
|
10
|
+
/** Quem precisa ler: o DRI, o líder do time, Segurança. */
|
|
11
|
+
to: string[];
|
|
12
|
+
text: string;
|
|
13
|
+
ref?: {
|
|
14
|
+
itemId?: number | null;
|
|
15
|
+
actionId?: number | null;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface Notifier {
|
|
19
|
+
notify(n: Notice): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare const consoleNotifier: Notifier;
|
|
22
|
+
/** Guarda os avisos em memória. Útil em teste e no demo. */
|
|
23
|
+
export declare class MemoryNotifier implements Notifier {
|
|
24
|
+
readonly notices: Notice[];
|
|
25
|
+
notify(n: Notice): Promise<void>;
|
|
26
|
+
}
|
package/dist/notifier.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const consoleNotifier = {
|
|
2
|
+
async notify(n) {
|
|
3
|
+
console.info(JSON.stringify({ notice: n }));
|
|
4
|
+
},
|
|
5
|
+
};
|
|
6
|
+
/** Guarda os avisos em memória. Útil em teste e no demo. */
|
|
7
|
+
export class MemoryNotifier {
|
|
8
|
+
notices = [];
|
|
9
|
+
async notify(n) {
|
|
10
|
+
this.notices.push(n);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifier.js","sourceRoot":"","sources":["../src/notifier.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,KAAK,CAAC,MAAM,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC;AAEF,4DAA4D;AAC5D,MAAM,OAAO,cAAc;IAChB,OAAO,GAAa,EAAE,CAAC;IAChC,KAAK,CAAC,MAAM,CAAC,CAAS;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LoadedAgent } from './manifest.js';
|
|
2
|
+
export interface ResolvedSkills {
|
|
3
|
+
/** Pastas de plugin para `options.plugins`. */
|
|
4
|
+
pluginPaths: string[];
|
|
5
|
+
/** Nomes qualificados (`plugin:skill`) para `options.skills`. */
|
|
6
|
+
skills: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function resolveSkills(agent: LoadedAgent, pluginsDir: string | undefined): ResolvedSkills;
|
package/dist/plugins.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills do agente.
|
|
3
|
+
*
|
|
4
|
+
* - Plugins do marketplace de skills da organização, na versão do manifesto. O Agent SDK só
|
|
5
|
+
* carrega plugin local, então o build baixa cada um para PLUGINS_DIR/<nome> (ver
|
|
6
|
+
* scripts/fetch-plugins.mjs) e aqui só conferimos que a versão bate.
|
|
7
|
+
* - A pasta skills/ do agente vira um plugin local só dele (`agent-<id>`), sempre ligado.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join, resolve } from 'node:path';
|
|
12
|
+
function skillNames(pluginDir) {
|
|
13
|
+
const dir = join(pluginDir, 'skills');
|
|
14
|
+
if (!existsSync(dir))
|
|
15
|
+
return [];
|
|
16
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
17
|
+
.filter((e) => e.isDirectory() && existsSync(join(dir, e.name, 'SKILL.md')))
|
|
18
|
+
.map((e) => e.name);
|
|
19
|
+
}
|
|
20
|
+
/** Cria (uma vez por processo) o plugin local com as skills exclusivas do agente. */
|
|
21
|
+
function materializeAgentPlugin(agent) {
|
|
22
|
+
const name = `agent-${agent.manifest.id}`;
|
|
23
|
+
const dir = mkdtempSync(join(tmpdir(), `${name}-`));
|
|
24
|
+
mkdirSync(join(dir, '.claude-plugin'));
|
|
25
|
+
writeFileSync(join(dir, '.claude-plugin', 'plugin.json'), JSON.stringify({ name, version: '0.0.0', description: `Skills exclusivas de ${agent.manifest.name}` }, null, 2));
|
|
26
|
+
symlinkSync(resolve(agent.localSkillsDir), join(dir, 'skills'), 'dir');
|
|
27
|
+
return dir;
|
|
28
|
+
}
|
|
29
|
+
export function resolveSkills(agent, pluginsDir) {
|
|
30
|
+
const m = agent.manifest;
|
|
31
|
+
const pluginPaths = [];
|
|
32
|
+
const skills = [];
|
|
33
|
+
const problems = [];
|
|
34
|
+
const available = new Map();
|
|
35
|
+
for (const p of m.plugins) {
|
|
36
|
+
if (!pluginsDir) {
|
|
37
|
+
problems.push(`plugin ${p.name}@${p.version}: PLUGINS_DIR não definido (rode pnpm fetch-plugins)`);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const dir = join(pluginsDir, p.name);
|
|
41
|
+
const manifestPath = join(dir, '.claude-plugin', 'plugin.json');
|
|
42
|
+
if (!existsSync(manifestPath)) {
|
|
43
|
+
problems.push(`plugin ${p.name}: não encontrado em ${dir}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const version = JSON.parse(readFileSync(manifestPath, 'utf8')).version;
|
|
47
|
+
if (version !== p.version) {
|
|
48
|
+
problems.push(`plugin ${p.name}: manifesto pede ${p.version}, baixado é ${version ?? 'sem versão'}`);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
pluginPaths.push(dir);
|
|
52
|
+
available.set(p.name, skillNames(dir));
|
|
53
|
+
}
|
|
54
|
+
for (const s of m.skills) {
|
|
55
|
+
const owners = [...available].filter(([, names]) => names.includes(s)).map(([plugin]) => plugin);
|
|
56
|
+
if (owners.length === 1)
|
|
57
|
+
skills.push(`${owners[0]}:${s}`);
|
|
58
|
+
else if (owners.length > 1)
|
|
59
|
+
problems.push(`skill ${s} existe em mais de um plugin (${owners.join(', ')})`);
|
|
60
|
+
else if (available.size)
|
|
61
|
+
problems.push(`skill ${s} não existe nos plugins declarados`);
|
|
62
|
+
}
|
|
63
|
+
if (agent.localSkillsDir) {
|
|
64
|
+
const dir = materializeAgentPlugin(agent);
|
|
65
|
+
pluginPaths.push(dir);
|
|
66
|
+
for (const s of skillNames(dir))
|
|
67
|
+
skills.push(`agent-${m.id}:${s}`);
|
|
68
|
+
}
|
|
69
|
+
if (problems.length)
|
|
70
|
+
throw new Error(`skills de ${m.id}:\n - ${problems.join('\n - ')}`);
|
|
71
|
+
return { pluginPaths, skills };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/policy.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { LoadedAgent } from './manifest.js';
|
|
2
|
+
import { type EffectiveLevel } from './levels.js';
|
|
3
|
+
import type { Notifier } from './notifier.js';
|
|
4
|
+
import type { LongTermStore } from './store/long-term.js';
|
|
5
|
+
export declare const RUNTIME_SERVER = "runtime";
|
|
6
|
+
export type GateDecision = {
|
|
7
|
+
allow: true;
|
|
8
|
+
} | {
|
|
9
|
+
allow: false;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
export interface GateOptions {
|
|
13
|
+
agent: LoadedAgent;
|
|
14
|
+
store: LongTermStore;
|
|
15
|
+
notifier: Notifier;
|
|
16
|
+
mode: 'round' | 'conversation';
|
|
17
|
+
/** Na rodada: o item em trabalho e as rotinas que os eventos dele acionaram. */
|
|
18
|
+
item?: {
|
|
19
|
+
id: number;
|
|
20
|
+
subject: string;
|
|
21
|
+
routines: string[];
|
|
22
|
+
};
|
|
23
|
+
caps: Map<string, {
|
|
24
|
+
cap: EffectiveLevel;
|
|
25
|
+
reason: string;
|
|
26
|
+
}>;
|
|
27
|
+
now?: () => Date;
|
|
28
|
+
}
|
|
29
|
+
/** `mcp__<subservice>__<tool>` → `<subservice>.<tool>`, o nome usado no manifesto. */
|
|
30
|
+
export declare function qualifiedToolName(sdkName: string): {
|
|
31
|
+
server: string;
|
|
32
|
+
tool: string;
|
|
33
|
+
qualified: string;
|
|
34
|
+
} | undefined;
|
|
35
|
+
export declare function sdkToolName(qualified: string): string;
|
|
36
|
+
export declare function idempotencyKey(parts: {
|
|
37
|
+
agentId: string;
|
|
38
|
+
itemId: number | null;
|
|
39
|
+
routine: string;
|
|
40
|
+
tool: string;
|
|
41
|
+
input: unknown;
|
|
42
|
+
}): string;
|
|
43
|
+
export declare class PolicyGate {
|
|
44
|
+
private readonly o;
|
|
45
|
+
/** Motivo declarado pelo modelo para a próxima chamada de cada ferramenta. */
|
|
46
|
+
private readonly reasons;
|
|
47
|
+
/** tool_use_id → id da ação registrada como "executando". */
|
|
48
|
+
private readonly running;
|
|
49
|
+
/** Decisões já tomadas por tool_use_id (o hook e o canUseTool consultam a mesma). */
|
|
50
|
+
private readonly decisions;
|
|
51
|
+
constructor(o: GateOptions);
|
|
52
|
+
/** Chamado pela ferramenta `runtime.justify` antes de uma ação com efeito. */
|
|
53
|
+
justify(tool: string, reason: string): string;
|
|
54
|
+
levelOf(routine: string): EffectiveLevel;
|
|
55
|
+
/** Decisão já tomada para este tool_use_id (usada pelo canUseTool como segunda trava). */
|
|
56
|
+
decided(toolUseId: string): GateDecision | undefined;
|
|
57
|
+
check(sdkName: string, input: Record<string, unknown>, toolUseId: string): Promise<GateDecision>;
|
|
58
|
+
private deny;
|
|
59
|
+
private decide;
|
|
60
|
+
/** Depois que a ferramenta rodou: grava o desfecho e confere o disjuntor. */
|
|
61
|
+
after(toolUseId: string, ok: boolean, result: unknown): Promise<void>;
|
|
62
|
+
private audit;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Disjuntor: se os erros e correções passam do limite, a rotina desce um nível na hora e
|
|
66
|
+
* avisa o DRI e Segurança. O nível alto é seguro porque a descida é automática.
|
|
67
|
+
*/
|
|
68
|
+
export declare function evaluateBreaker(agent: LoadedAgent, routine: string, store: LongTermStore, notifier: Notifier, caps?: Map<string, {
|
|
69
|
+
cap: EffectiveLevel;
|
|
70
|
+
reason: string;
|
|
71
|
+
}>): Promise<EffectiveLevel | undefined>;
|
package/dist/policy.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portão de política: toda chamada de ferramenta do modelo passa por aqui antes de rodar.
|
|
3
|
+
*
|
|
4
|
+
* É o que transforma o manifesto em regra de verdade. Decide, chamada a chamada:
|
|
5
|
+
* - se a ferramenta está no escopo do agente (reads, actions de uma rotina acionada);
|
|
6
|
+
* - se é proibida (segregação de funções), em qualquer nível;
|
|
7
|
+
* - se o motivo foi dado antes (tudo auditado, com o motivo);
|
|
8
|
+
* - se já foi feita (nada se repete);
|
|
9
|
+
* - o que o nível da rotina permite: registrar (shadow), propor (copilot) ou executar
|
|
10
|
+
* (agent, autonomous), com janela e teto por hora;
|
|
11
|
+
* - na conversa, só leitura (com o acesso do próprio agente).
|
|
12
|
+
*
|
|
13
|
+
* O modelo nunca recebe "permissão" para nada fora disso: o runtime liga as ferramentas
|
|
14
|
+
* built-in do Claude Code desligadas e nega o resto aqui.
|
|
15
|
+
*/
|
|
16
|
+
import { createHash } from 'node:crypto';
|
|
17
|
+
import { breakerTrips, effectiveLevel, insideWindow, oneBelow, rank } from './levels.js';
|
|
18
|
+
import { stableStringify } from './short-term.js';
|
|
19
|
+
export const RUNTIME_SERVER = 'runtime';
|
|
20
|
+
/** `mcp__<subservice>__<tool>` → `<subservice>.<tool>`, o nome usado no manifesto. */
|
|
21
|
+
export function qualifiedToolName(sdkName) {
|
|
22
|
+
const m = /^mcp__([a-z][a-z0-9_]*?)__([a-zA-Z0-9_]+)$/.exec(sdkName);
|
|
23
|
+
if (!m)
|
|
24
|
+
return undefined;
|
|
25
|
+
return { server: m[1], tool: m[2], qualified: `${m[1]}.${m[2]}` };
|
|
26
|
+
}
|
|
27
|
+
export function sdkToolName(qualified) {
|
|
28
|
+
const [sub, tool] = qualified.split('.');
|
|
29
|
+
return `mcp__${sub}__${tool}`;
|
|
30
|
+
}
|
|
31
|
+
export function idempotencyKey(parts) {
|
|
32
|
+
return createHash('sha256')
|
|
33
|
+
.update(`${parts.agentId}|${parts.itemId ?? '-'}|${parts.routine}|${parts.tool}|${stableStringify(parts.input)}`)
|
|
34
|
+
.digest('hex');
|
|
35
|
+
}
|
|
36
|
+
export class PolicyGate {
|
|
37
|
+
o;
|
|
38
|
+
/** Motivo declarado pelo modelo para a próxima chamada de cada ferramenta. */
|
|
39
|
+
reasons = new Map();
|
|
40
|
+
/** tool_use_id → id da ação registrada como "executando". */
|
|
41
|
+
running = new Map();
|
|
42
|
+
/** Decisões já tomadas por tool_use_id (o hook e o canUseTool consultam a mesma). */
|
|
43
|
+
decisions = new Map();
|
|
44
|
+
constructor(o) {
|
|
45
|
+
this.o = o;
|
|
46
|
+
}
|
|
47
|
+
/** Chamado pela ferramenta `runtime.justify` antes de uma ação com efeito. */
|
|
48
|
+
justify(tool, reason) {
|
|
49
|
+
const routine = this.o.agent.actionOwner.get(tool);
|
|
50
|
+
if (!routine)
|
|
51
|
+
return `"${tool}" não é uma ação de nenhuma rotina deste agente.`;
|
|
52
|
+
this.reasons.set(tool, reason);
|
|
53
|
+
const level = this.levelOf(routine);
|
|
54
|
+
return `Motivo registrado para ${tool} (rotina ${routine}, nível ${level}). Pode chamar a ferramenta.`;
|
|
55
|
+
}
|
|
56
|
+
levelOf(routine) {
|
|
57
|
+
const spec = this.o.agent.manifest.routines[routine];
|
|
58
|
+
return effectiveLevel({ stage: this.o.agent.manifest.stage, manifestLevel: spec.level, cap: this.o.caps.get(routine)?.cap ?? null });
|
|
59
|
+
}
|
|
60
|
+
/** Decisão já tomada para este tool_use_id (usada pelo canUseTool como segunda trava). */
|
|
61
|
+
decided(toolUseId) {
|
|
62
|
+
return this.decisions.get(toolUseId);
|
|
63
|
+
}
|
|
64
|
+
async check(sdkName, input, toolUseId) {
|
|
65
|
+
const d = await this.decide(sdkName, input, toolUseId);
|
|
66
|
+
this.decisions.set(toolUseId, d);
|
|
67
|
+
return d;
|
|
68
|
+
}
|
|
69
|
+
deny(message) {
|
|
70
|
+
return { allow: false, message };
|
|
71
|
+
}
|
|
72
|
+
async decide(sdkName, input, toolUseId) {
|
|
73
|
+
const { agent, store, mode, item } = this.o;
|
|
74
|
+
const m = agent.manifest;
|
|
75
|
+
// Ferramentas do próprio runtime (justify, finish_item, note...) e o carregamento de skill.
|
|
76
|
+
if (sdkName === 'Skill')
|
|
77
|
+
return { allow: true };
|
|
78
|
+
const parsed = qualifiedToolName(sdkName);
|
|
79
|
+
if (!parsed)
|
|
80
|
+
return this.deny(`Ferramenta "${sdkName}" não está disponível para agentes.`);
|
|
81
|
+
if (parsed.server === RUNTIME_SERVER)
|
|
82
|
+
return { allow: true };
|
|
83
|
+
const tool = parsed.qualified;
|
|
84
|
+
if (m.guardrails.forbiddenTools.includes(tool)) {
|
|
85
|
+
await this.audit(tool, input, 'denied', 'proibida (segregação de funções)', toolUseId);
|
|
86
|
+
return this.deny(`"${tool}" é proibida para agentes em qualquer nível. Se for preciso, escale para uma pessoa.`);
|
|
87
|
+
}
|
|
88
|
+
if (!m.gateway.subservices.includes(parsed.server)) {
|
|
89
|
+
return this.deny(`O conector "${parsed.server}" não está no escopo deste agente.`);
|
|
90
|
+
}
|
|
91
|
+
// Leitura: liberada em qualquer nível, inclusive na conversa (o acesso é o do agente).
|
|
92
|
+
if (m.reads.includes(tool))
|
|
93
|
+
return { allow: true };
|
|
94
|
+
const routine = agent.actionOwner.get(tool);
|
|
95
|
+
if (!routine)
|
|
96
|
+
return this.deny(`"${tool}" não está em reads nem nas actions de nenhuma rotina.`);
|
|
97
|
+
if (mode === 'conversation') {
|
|
98
|
+
return this.deny('Na conversa você só lê. Para agir, a demanda precisa entrar como item de uma rotina.');
|
|
99
|
+
}
|
|
100
|
+
if (!item || !item.routines.includes(routine)) {
|
|
101
|
+
return this.deny(`A rotina "${routine}" não foi acionada por este item; "${tool}" não vale aqui.`);
|
|
102
|
+
}
|
|
103
|
+
const reason = this.reasons.get(tool);
|
|
104
|
+
if (!reason) {
|
|
105
|
+
return this.deny(`Antes de "${tool}", chame ${RUNTIME_SERVER}.justify com o motivo. Toda ação fica registrada com o motivo.`);
|
|
106
|
+
}
|
|
107
|
+
this.reasons.delete(tool);
|
|
108
|
+
let level = this.levelOf(routine);
|
|
109
|
+
let note;
|
|
110
|
+
const spec = m.routines[routine];
|
|
111
|
+
const now = this.o.now?.() ?? new Date();
|
|
112
|
+
// Escopo fechado no tempo e na quantidade: fora da janela ou acima do teto, vira proposta.
|
|
113
|
+
if (rank(level) >= rank('agent')) {
|
|
114
|
+
if (spec.limits?.window && !insideWindow(spec.limits.window, now, m.triggers.timezone)) {
|
|
115
|
+
level = 'copilot';
|
|
116
|
+
note = `fora da janela ${spec.limits.window}: virou proposta`;
|
|
117
|
+
}
|
|
118
|
+
else if (spec.limits?.perHour) {
|
|
119
|
+
const done = await store.executedSince(m.id, routine, new Date(now.getTime() - 3600_000));
|
|
120
|
+
if (done >= spec.limits.perHour) {
|
|
121
|
+
level = 'copilot';
|
|
122
|
+
note = `teto de ${spec.limits.perHour}/hora atingido: virou proposta`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const key = idempotencyKey({ agentId: m.id, itemId: item.id, routine, tool, input });
|
|
127
|
+
const base = { agentId: m.id, itemId: item.id, routine, tool, input, reason, level, idempotencyKey: key, toolUseId, ...(note ? { note } : {}) };
|
|
128
|
+
if (level === 'shadow') {
|
|
129
|
+
const r = await store.recordAction({ ...base, mode: 'shadow', status: 'pending' });
|
|
130
|
+
return this.deny(`Estágio shadow: "${tool}" NÃO foi executada. Registrei como o que você faria (#${r.id}). Não tente de novo; siga.`);
|
|
131
|
+
}
|
|
132
|
+
if (level === 'copilot') {
|
|
133
|
+
const r = await store.recordAction({ ...base, mode: 'proposed', status: 'pending' });
|
|
134
|
+
if (r.duplicate)
|
|
135
|
+
return this.deny(`Já existe uma proposta igual para este item. Nada se repete; siga.`);
|
|
136
|
+
await this.o.notifier.notify({
|
|
137
|
+
agentId: m.id,
|
|
138
|
+
kind: 'proposal',
|
|
139
|
+
to: [m.team.leader ?? m.owner.dri],
|
|
140
|
+
text: `${m.name} propõe ${tool} em ${item.subject}. Motivo: ${reason}${note ? ` (${note})` : ''}`,
|
|
141
|
+
ref: { itemId: item.id, actionId: r.id },
|
|
142
|
+
});
|
|
143
|
+
return this.deny(`Proposta #${r.id} registrada; uma pessoa aprova antes de "${tool}" rodar${note ? ` (${note})` : ''}. Não tente executar de outro jeito.`);
|
|
144
|
+
}
|
|
145
|
+
const r = await store.recordAction({ ...base, mode: 'executed', status: 'pending' });
|
|
146
|
+
if (r.duplicate)
|
|
147
|
+
return this.deny(`"${tool}" com esses mesmos dados já foi feita neste item. Nada se repete; siga.`);
|
|
148
|
+
this.running.set(toolUseId, r.id);
|
|
149
|
+
return { allow: true };
|
|
150
|
+
}
|
|
151
|
+
/** Depois que a ferramenta rodou: grava o desfecho e confere o disjuntor. */
|
|
152
|
+
async after(toolUseId, ok, result) {
|
|
153
|
+
const actionId = this.running.get(toolUseId);
|
|
154
|
+
if (actionId === undefined)
|
|
155
|
+
return;
|
|
156
|
+
this.running.delete(toolUseId);
|
|
157
|
+
await this.o.store.completeAction(actionId, ok ? 'ok' : 'error', result);
|
|
158
|
+
if (!ok) {
|
|
159
|
+
const action = await this.o.store.getAction(actionId);
|
|
160
|
+
if (action)
|
|
161
|
+
await evaluateBreaker(this.o.agent, action.routine, this.o.store, this.o.notifier, this.o.caps);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async audit(tool, input, mode, note, toolUseId) {
|
|
165
|
+
const { agent, store, item } = this.o;
|
|
166
|
+
await store.recordAction({
|
|
167
|
+
agentId: agent.manifest.id,
|
|
168
|
+
itemId: item?.id ?? null,
|
|
169
|
+
routine: agent.actionOwner.get(tool) ?? '-',
|
|
170
|
+
tool,
|
|
171
|
+
input,
|
|
172
|
+
reason: null,
|
|
173
|
+
mode,
|
|
174
|
+
status: 'rejected',
|
|
175
|
+
level: 'shadow',
|
|
176
|
+
idempotencyKey: `denied:${toolUseId}`,
|
|
177
|
+
toolUseId,
|
|
178
|
+
note,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Disjuntor: se os erros e correções passam do limite, a rotina desce um nível na hora e
|
|
184
|
+
* avisa o DRI e Segurança. O nível alto é seguro porque a descida é automática.
|
|
185
|
+
*/
|
|
186
|
+
export async function evaluateBreaker(agent, routine, store, notifier, caps) {
|
|
187
|
+
const m = agent.manifest;
|
|
188
|
+
const spec = m.routines[routine];
|
|
189
|
+
if (!spec)
|
|
190
|
+
return undefined;
|
|
191
|
+
const outcomes = await store.recentOutcomes(m.id, routine, m.breaker.window);
|
|
192
|
+
const { trip, rate, sample } = breakerTrips(outcomes, m.breaker);
|
|
193
|
+
if (!trip)
|
|
194
|
+
return undefined;
|
|
195
|
+
const current = effectiveLevel({ stage: m.stage, manifestLevel: spec.level, cap: (await store.levelCaps(m.id)).get(routine)?.cap ?? null });
|
|
196
|
+
const next = oneBelow(current);
|
|
197
|
+
if (next === current)
|
|
198
|
+
return undefined;
|
|
199
|
+
const reason = `disjuntor: ${(rate * 100).toFixed(0)}% de erro ou correção nas últimas ${sample} execuções (limite ${(m.breaker.maxErrorRate * 100).toFixed(0)}%)`;
|
|
200
|
+
await store.setLevelCap(m.id, routine, next, reason);
|
|
201
|
+
caps?.set(routine, { cap: next, reason });
|
|
202
|
+
await notifier.notify({
|
|
203
|
+
agentId: m.id,
|
|
204
|
+
kind: 'demotion',
|
|
205
|
+
to: [m.owner.dri, ...(m.owner.securityCoOwner ? ['seguranca'] : [])],
|
|
206
|
+
text: `${m.name}: rotina ${routine} desceu de ${current} para ${next}. ${reason}.`,
|
|
207
|
+
});
|
|
208
|
+
return next;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAuB,MAAM,aAAa,CAAC;AAE9G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AAexC,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IAC7D,OAAO,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAgG;IAC7H,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;SAChH,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,UAAU;IAQQ;IAP7B,8EAA8E;IAC7D,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,6DAA6D;IAC5C,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,qFAAqF;IACpE,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE7D,YAA6B,CAAc;QAAd,MAAC,GAAD,CAAC,CAAa;IAAG,CAAC;IAE/C,8EAA8E;IAC9E,OAAO,CAAC,IAAY,EAAE,MAAc;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,IAAI,kDAAkD,CAAC;QAChF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,0BAA0B,IAAI,YAAY,OAAO,WAAW,KAAK,8BAA8B,CAAC;IACzG,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;QACtD,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACvI,CAAC;IAED,0FAA0F;IAC1F,OAAO,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,KAA8B,EAAE,SAAiB;QAC5E,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,IAAI,CAAC,OAAe;QAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,KAA8B,EAAE,SAAiB;QACrF,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEzB,4FAA4F;QAC5F,IAAI,OAAO,KAAK,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,OAAO,qCAAqC,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAE7D,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,kCAAkC,EAAE,SAAS,CAAC,CAAC;YACvF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,sFAAsF,CAAC,CAAC;QACnH,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,oCAAoC,CAAC,CAAC;QACrF,CAAC;QAED,uFAAuF;QACvF,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAEnD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,wDAAwD,CAAC,CAAC;QACjG,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,OAAO,sCAAsC,IAAI,kBAAkB,CAAC,CAAC;QACrG,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,YAAY,cAAc,gEAAgE,CAAC,CAAC;QAChI,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAwB,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;QAEzC,2FAA2F;QAC3F,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvF,KAAK,GAAG,SAAS,CAAC;gBAClB,IAAI,GAAG,kBAAkB,IAAI,CAAC,MAAM,CAAC,MAAM,kBAAkB,CAAC;YAChE,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;gBAC1F,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAChC,KAAK,GAAG,SAAS,CAAC;oBAClB,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,OAAO,gCAAgC,CAAC;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAEhJ,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC,IAAI,CACd,oBAAoB,IAAI,0DAA0D,CAAC,CAAC,EAAE,6BAA6B,CACpH,CAAC;QACJ,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YACxG,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3B,OAAO,EAAE,CAAC,CAAC,EAAE;gBACb,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,WAAW,IAAI,OAAO,IAAI,CAAC,OAAO,aAAa,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjG,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;aACzC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CACd,aAAa,CAAC,CAAC,EAAE,4CAA4C,IAAI,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAC1I,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,yEAAyE,CAAC,CAAC;QACrH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAG,CAAC,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,EAAW,EAAE,MAAe;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,MAAM;gBAAE,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,KAA8B,EAAE,IAAc,EAAE,IAAY,EAAE,SAAiB;QAC/G,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,YAAY,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;YAC1B,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;YACxB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG;YAC3C,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,IAAI;YACZ,IAAI;YACJ,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,QAAQ;YACf,cAAc,EAAE,UAAU,SAAS,EAAE;YACrC,SAAS;YACT,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAkB,EAClB,OAAe,EACf,KAAoB,EACpB,QAAkB,EAClB,IAA2D;IAE3D,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5I,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC,MAAM,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACnK,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,EAAE;QACb,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,YAAY,OAAO,cAAc,OAAO,SAAS,IAAI,KAAK,MAAM,GAAG;KACnF,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Montagem do prompt. O system prompt é estável por agente (persona + regras do runtime),
|
|
3
|
+
* para aproveitar o cache; o que muda a cada item vai na mensagem.
|
|
4
|
+
*/
|
|
5
|
+
import type { LoadedAgent } from './manifest.js';
|
|
6
|
+
import type { EffectiveLevel } from './levels.js';
|
|
7
|
+
import type { ActionRow, EventRow, ItemRow } from './store/long-term.js';
|
|
8
|
+
/** Dado vindo de fora (chamado, mensagem) nunca vira instrução. */
|
|
9
|
+
export declare function untrusted(origin: string, data: unknown): string;
|
|
10
|
+
export declare function systemPrompt(agent: LoadedAgent, levelOf: (routine: string) => EffectiveLevel): string;
|
|
11
|
+
export declare function itemPrompt(opts: {
|
|
12
|
+
item: ItemRow & {
|
|
13
|
+
events: EventRow[];
|
|
14
|
+
};
|
|
15
|
+
routines: string[];
|
|
16
|
+
history: ActionRow[];
|
|
17
|
+
corrections: ActionRow[];
|
|
18
|
+
}): string;
|
|
19
|
+
export declare function conversationPrompt(opts: {
|
|
20
|
+
asker: string;
|
|
21
|
+
askerKind: 'person' | 'agent';
|
|
22
|
+
message: string;
|
|
23
|
+
conversationId: string;
|
|
24
|
+
}): string;
|