@noclaf/cli 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/exec-delegate.js +164 -0
- package/dist/lib/exec-delegate.js.map +1 -0
- package/dist/tools/delegate-exec.js +54 -0
- package/dist/tools/delegate-exec.js.map +1 -0
- package/dist/tools/exec-status.js +42 -0
- package/dist/tools/exec-status.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
import { skillsDir } from './skills.js';
|
|
7
|
+
const jobs = new Map();
|
|
8
|
+
function jobsDir() {
|
|
9
|
+
return join(homedir(), '.noclaf', 'exec-jobs');
|
|
10
|
+
}
|
|
11
|
+
function jobPath(id) {
|
|
12
|
+
return join(jobsDir(), `${id}.json`);
|
|
13
|
+
}
|
|
14
|
+
/** Persiste o job — o servidor MCP pode reiniciar entre chamadas. */
|
|
15
|
+
function save(job) {
|
|
16
|
+
jobs.set(job.id, job);
|
|
17
|
+
try {
|
|
18
|
+
mkdirSync(jobsDir(), { recursive: true });
|
|
19
|
+
writeFileSync(jobPath(job.id), JSON.stringify(job, null, 2) + '\n', 'utf8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
/* best-effort */
|
|
23
|
+
}
|
|
24
|
+
return job;
|
|
25
|
+
}
|
|
26
|
+
export function getJob(id) {
|
|
27
|
+
const mem = jobs.get(id);
|
|
28
|
+
if (mem)
|
|
29
|
+
return mem;
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(readFileSync(jobPath(id), 'utf8'));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const CODEX_CANDIDATES = [
|
|
38
|
+
join(homedir(), '.local', 'bin', 'codex'),
|
|
39
|
+
'/opt/homebrew/bin/codex',
|
|
40
|
+
'/usr/local/bin/codex',
|
|
41
|
+
];
|
|
42
|
+
/** Acha o `codex` — o MCP é spawnado por app GUI, com PATH mínimo. */
|
|
43
|
+
export function resolveCodexBin() {
|
|
44
|
+
const override = process.env.NOCLAF_CODEX_BIN;
|
|
45
|
+
if (override && existsSync(override))
|
|
46
|
+
return override;
|
|
47
|
+
const onPath = spawnSync('codex', ['--version'], { stdio: 'ignore' });
|
|
48
|
+
if (!onPath.error)
|
|
49
|
+
return 'codex';
|
|
50
|
+
return CODEX_CANDIDATES.find((p) => existsSync(p)) ?? null;
|
|
51
|
+
}
|
|
52
|
+
/** Preâmbulo que ancora o agente de execução no harness do repo. */
|
|
53
|
+
function buildPrompt(instruction) {
|
|
54
|
+
return [
|
|
55
|
+
'Implemente a tarefa abaixo NESTE worktree.',
|
|
56
|
+
'Antes de codar: leia AGENTS.md, docs/_rules/noclaf.md e docs/_patterns.md e SIGA-OS.',
|
|
57
|
+
'Regras: mudança mínima; nada de libs/estilos fora do harness.',
|
|
58
|
+
'Limites: arquivo <300 linhas, função <30 linhas, comentário <=1 linha.',
|
|
59
|
+
'Rode lint/build/testes do repo. NÃO commite — deixe o trabalho staged.',
|
|
60
|
+
'',
|
|
61
|
+
instruction,
|
|
62
|
+
].join('\n');
|
|
63
|
+
}
|
|
64
|
+
/** Roda o hook de tamanho (mesma lógica do commit) sobre o que está staged. */
|
|
65
|
+
function checkSize(worktree) {
|
|
66
|
+
let script;
|
|
67
|
+
try {
|
|
68
|
+
script = join(skillsDir(), 'hooks', 'dev', 'check-code-size.py');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return { ok: true, output: 'skills indisponíveis — check pulado' };
|
|
72
|
+
}
|
|
73
|
+
if (!existsSync(script))
|
|
74
|
+
return { ok: true, output: 'check-code-size ausente — pulado' };
|
|
75
|
+
spawnSync('git', ['add', '-A'], { cwd: worktree, stdio: 'ignore' });
|
|
76
|
+
const r = spawnSync('python3', [script], {
|
|
77
|
+
cwd: worktree,
|
|
78
|
+
input: JSON.stringify({ tool_input: { command: 'git commit' } }),
|
|
79
|
+
encoding: 'utf8',
|
|
80
|
+
});
|
|
81
|
+
if (r.error)
|
|
82
|
+
return { ok: true, output: 'python3 ausente — pulado' };
|
|
83
|
+
return { ok: r.status === 0, output: (r.stderr || '').trim() || 'ok' };
|
|
84
|
+
}
|
|
85
|
+
/** Scripts de qualidade que existem no package.json. */
|
|
86
|
+
function npmScripts(worktree) {
|
|
87
|
+
try {
|
|
88
|
+
const pkg = JSON.parse(readFileSync(join(worktree, 'package.json'), 'utf8'));
|
|
89
|
+
return ['lint', 'build', 'test'].filter((s) => pkg.scripts?.[s]);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function runScript(worktree, script) {
|
|
96
|
+
const r = spawnSync('npm', ['run', script, '--silent'], { cwd: worktree, encoding: 'utf8' });
|
|
97
|
+
const out = `${r.stdout ?? ''}${r.stderr ?? ''}`.trim();
|
|
98
|
+
return { ok: !r.error && r.status === 0, output: out.slice(-1500) || 'ok' };
|
|
99
|
+
}
|
|
100
|
+
function changedFiles(worktree) {
|
|
101
|
+
const r = spawnSync('git', ['status', '--porcelain'], { cwd: worktree, encoding: 'utf8' });
|
|
102
|
+
return (r.stdout ?? '')
|
|
103
|
+
.split('\n')
|
|
104
|
+
.map((l) => l.slice(3).trim())
|
|
105
|
+
.filter(Boolean);
|
|
106
|
+
}
|
|
107
|
+
/** Checks determinísticos — sem LLM, pra o Opus não gastar ciclo com o mecânico. */
|
|
108
|
+
function runChecks(worktree) {
|
|
109
|
+
const checks = { size: checkSize(worktree) };
|
|
110
|
+
for (const s of npmScripts(worktree))
|
|
111
|
+
checks[s] = runScript(worktree, s);
|
|
112
|
+
return checks;
|
|
113
|
+
}
|
|
114
|
+
function finish(job) {
|
|
115
|
+
return save({ ...job, finishedAt: new Date().toISOString() });
|
|
116
|
+
}
|
|
117
|
+
function spawnCodex(job, bin, prompt) {
|
|
118
|
+
const args = (process.env.NOCLAF_CODEX_ARGS ?? 'exec --full-auto').split(/\s+/);
|
|
119
|
+
const child = spawn(bin, [...args, prompt], {
|
|
120
|
+
cwd: job.worktree,
|
|
121
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
122
|
+
});
|
|
123
|
+
let out = '';
|
|
124
|
+
child.stdout.on('data', (d) => {
|
|
125
|
+
out += d.toString();
|
|
126
|
+
});
|
|
127
|
+
child.stderr.on('data', (d) => {
|
|
128
|
+
out += d.toString();
|
|
129
|
+
});
|
|
130
|
+
child.on('error', (e) => finish({ ...job, state: 'failed', error: e.message }));
|
|
131
|
+
child.on('close', (code) => finish({
|
|
132
|
+
...job,
|
|
133
|
+
state: code === 0 ? 'done' : 'failed',
|
|
134
|
+
exitCode: code,
|
|
135
|
+
summary: out.trim().slice(-2000),
|
|
136
|
+
checks: runChecks(job.worktree),
|
|
137
|
+
changed: changedFiles(job.worktree),
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
/** Dispara o Codex em background e devolve o job (consulte com `noclaf_exec_status`). */
|
|
141
|
+
export function startExec(opts) {
|
|
142
|
+
const job = {
|
|
143
|
+
id: randomUUID().slice(0, 8),
|
|
144
|
+
state: 'running',
|
|
145
|
+
worktree: opts.worktree,
|
|
146
|
+
exitCode: null,
|
|
147
|
+
summary: '',
|
|
148
|
+
checks: {},
|
|
149
|
+
changed: [],
|
|
150
|
+
startedAt: new Date().toISOString(),
|
|
151
|
+
};
|
|
152
|
+
const bin = resolveCodexBin();
|
|
153
|
+
if (!bin) {
|
|
154
|
+
return finish({
|
|
155
|
+
...job,
|
|
156
|
+
state: 'failed',
|
|
157
|
+
error: 'codex não encontrado — instale/logue (`codex login`) ou defina NOCLAF_CODEX_BIN',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
save(job);
|
|
161
|
+
spawnCodex(job, bin, buildPrompt(opts.instruction));
|
|
162
|
+
return job;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=exec-delegate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-delegate.js","sourceRoot":"","sources":["../../src/lib/exec-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
4
|
+
import { startExec } from '../lib/exec-delegate.js';
|
|
5
|
+
const ArgsSchema = z
|
|
6
|
+
.object({
|
|
7
|
+
worktree: z.string().min(1),
|
|
8
|
+
instruction: z.string().min(1),
|
|
9
|
+
})
|
|
10
|
+
.strict();
|
|
11
|
+
export const definition = {
|
|
12
|
+
name: 'noclaf_delegate_exec',
|
|
13
|
+
description: 'Delega a IMPLEMENTAÇÃO a um agente de execução novo (Codex local, na assinatura — sem API) ' +
|
|
14
|
+
'num worktree já criado pelo /implement. Roda em background e, ao terminar, mede o resultado ' +
|
|
15
|
+
'(tamanho de arquivo/função, lint, build, testes). NÃO julga qualidade e NÃO commita — o ' +
|
|
16
|
+
'review fica com você (code-reviewer + harness). Consulte o resultado com `noclaf_exec_status`.',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
worktree: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Caminho absoluto do worktree onde implementar (criado pelo /implement).',
|
|
23
|
+
},
|
|
24
|
+
instruction: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'O que implementar: o ticket + critérios de aceitação. Numa re-tentativa, inclua as ' +
|
|
27
|
+
'violações apontadas pelo review — o agente de execução é novo e não herda a conversa.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
required: ['worktree', 'instruction'],
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
export async function handler(args, _ctx) {
|
|
35
|
+
const parsed = ArgsSchema.safeParse(args);
|
|
36
|
+
if (!parsed.success) {
|
|
37
|
+
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
38
|
+
}
|
|
39
|
+
const { worktree, instruction } = parsed.data;
|
|
40
|
+
if (!existsSync(worktree)) {
|
|
41
|
+
return errorResult(`Worktree não encontrado: ${worktree}`);
|
|
42
|
+
}
|
|
43
|
+
const job = startExec({ worktree, instruction });
|
|
44
|
+
if (job.state === 'failed') {
|
|
45
|
+
return errorResult(job.error ?? 'falha ao iniciar a execução');
|
|
46
|
+
}
|
|
47
|
+
return jsonResult({
|
|
48
|
+
job_id: job.id,
|
|
49
|
+
state: job.state,
|
|
50
|
+
worktree: job.worktree,
|
|
51
|
+
hint: 'Consulte com `noclaf_exec_status` até state=done|failed.',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=delegate-exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegate-exec.js","sourceRoot":"","sources":["../../src/tools/delegate-exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,6FAA6F;QAC7F,8FAA8F;QAC9F,0FAA0F;QAC1F,gGAAgG;IAClG,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yEAAyE;aACvF;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,qFAAqF;oBACrF,uFAAuF;aAC1F;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;QACrC,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,0DAA0D;KACjE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
|
+
import { getJob } from '../lib/exec-delegate.js';
|
|
4
|
+
const ArgsSchema = z.object({ job_id: z.string().min(1) }).strict();
|
|
5
|
+
export const definition = {
|
|
6
|
+
name: 'noclaf_exec_status',
|
|
7
|
+
description: 'Estado de uma execução delegada (`noclaf_delegate_exec`): running | done | failed, com o ' +
|
|
8
|
+
'resumo do agente, os arquivos alterados e os checks determinísticos (tamanho, lint, build, ' +
|
|
9
|
+
'testes). Use os checks como FATOS na sua revisão — não gaste ciclo revisando o mecânico.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
job_id: { type: 'string', description: 'Id devolvido por `noclaf_delegate_exec`.' },
|
|
14
|
+
},
|
|
15
|
+
required: ['job_id'],
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export async function handler(args, _ctx) {
|
|
20
|
+
const parsed = ArgsSchema.safeParse(args);
|
|
21
|
+
if (!parsed.success) {
|
|
22
|
+
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
23
|
+
}
|
|
24
|
+
const job = getJob(parsed.data.job_id);
|
|
25
|
+
if (!job)
|
|
26
|
+
return errorResult(`Job não encontrado: ${parsed.data.job_id}`);
|
|
27
|
+
const failing = Object.entries(job.checks)
|
|
28
|
+
.filter(([, c]) => !c.ok)
|
|
29
|
+
.map(([name]) => name);
|
|
30
|
+
return jsonResult({
|
|
31
|
+
id: job.id,
|
|
32
|
+
state: job.state,
|
|
33
|
+
worktree: job.worktree,
|
|
34
|
+
exit_code: job.exitCode,
|
|
35
|
+
changed: job.changed,
|
|
36
|
+
checks: job.checks,
|
|
37
|
+
failing_checks: failing,
|
|
38
|
+
summary: job.summary,
|
|
39
|
+
error: job.error,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=exec-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-status.js","sourceRoot":"","sources":["../../src/tools/exec-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EACT,2FAA2F;QAC3F,6FAA6F;QAC7F,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;SACpF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO,UAAU,CAAC;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,QAAQ;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -14,6 +14,8 @@ import * as endTaskAllocation from './end-task-allocation.js';
|
|
|
14
14
|
import * as getActiveAllocation from './get-active-allocation.js';
|
|
15
15
|
import * as listMyAllocations from './list-my-allocations.js';
|
|
16
16
|
import * as recordDelivery from './record-delivery.js';
|
|
17
|
+
import * as delegateExec from './delegate-exec.js';
|
|
18
|
+
import * as execStatus from './exec-status.js';
|
|
17
19
|
export const tools = {
|
|
18
20
|
[getContext.definition.name]: getContext,
|
|
19
21
|
[listProjects.definition.name]: listProjects,
|
|
@@ -31,6 +33,8 @@ export const tools = {
|
|
|
31
33
|
[getActiveAllocation.definition.name]: getActiveAllocation,
|
|
32
34
|
[listMyAllocations.definition.name]: listMyAllocations,
|
|
33
35
|
[recordDelivery.definition.name]: recordDelivery,
|
|
36
|
+
[delegateExec.definition.name]: delegateExec,
|
|
37
|
+
[execStatus.definition.name]: execStatus,
|
|
34
38
|
};
|
|
35
39
|
export const toolDefinitions = Object.values(tools).map((t) => t.definition);
|
|
36
40
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,mBAAmB,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAa/C,MAAM,CAAC,MAAM,KAAK,GAA+B;IAC/C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY;IAC5C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS;IACtC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO;IAClC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;IACxC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ;IACpC,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW;IAC1C,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,eAAe;IAClD,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,aAAa;IAC9C,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,mBAAmB;IAC1D,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB;IACtD,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,mBAAmB;IAC1D,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB;IACtD,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,cAAc;IAChD,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY;IAC5C,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAW,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC"}
|
package/package.json
CHANGED