@claude-flow/cli 3.5.2 → 3.5.4
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/.claude/helpers/auto-memory-hook.mjs +20 -7
- package/.claude/helpers/hook-handler.cjs +45 -18
- package/README.md +156 -26
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/gguf-engine.js.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-builder.js.map +1 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-distribution.js.map +1 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-format.js.map +1 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-runner.js.map +1 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/appliance/rvfa-signing.js.map +1 -0
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
- package/dist/src/commands/appliance-advanced.js +215 -0
- package/dist/src/commands/appliance-advanced.js.map +1 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.d.ts.map +1 -0
- package/dist/src/commands/appliance.js +406 -0
- package/dist/src/commands/appliance.js.map +1 -0
- package/dist/src/commands/benchmark.js +2 -2
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/claims.js +1 -1
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/config.js +1 -1
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/deployment.js +1 -1
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +7 -2
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/embeddings.js +1 -1
- package/dist/src/commands/embeddings.js.map +1 -1
- package/dist/src/commands/hooks.js +1 -1
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts +2 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +6 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init.js +11 -11
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +18 -3
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +24 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/neural.js +1 -1
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.js +1 -1
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/plugins.js +1 -1
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/providers.js +1 -1
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/security.js +1 -1
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/start.js +11 -11
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +12 -5
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/transfer-store.js +1 -1
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/claudemd-generator.js +1 -1
- package/dist/src/init/claudemd-generator.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +9 -8
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +28 -5
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +66 -16
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts +1 -1
- package/dist/src/init/statusline-generator.js +4 -4
- package/dist/src/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp-server.js +16 -0
- package/dist/src/mcp-server.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +1 -1
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +5 -5
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +2 -2
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +21 -1
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +1 -1
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +109 -6
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +36 -0
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +91 -0
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +1 -0
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +6 -0
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +54 -2
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/output.d.ts.map +1 -1
- package/dist/src/output.js +1 -0
- package/dist/src/output.js.map +1 -1
- package/dist/src/runtime/headless.js +3 -3
- package/dist/src/runtime/headless.js.map +1 -1
- package/dist/src/services/claim-service.js +1 -1
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts.map +1 -1
- package/dist/src/services/container-worker-pool.js +2 -0
- package/dist/src/services/container-worker-pool.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts.map +1 -1
- package/dist/src/services/worker-queue.js +2 -0
- package/dist/src/services/worker-queue.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RVFA Runner -- Boot and run self-contained Ruflo appliances.
|
|
3
|
+
*
|
|
4
|
+
* Supports three run modes (cli, mcp, verify) and two isolation
|
|
5
|
+
* strategies (native Node.js, container via Docker).
|
|
6
|
+
*
|
|
7
|
+
* @module @claude-flow/cli/appliance/rvfa-runner
|
|
8
|
+
*/
|
|
9
|
+
import { writeFile, mkdir, rm } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { RvfaReader } from './rvfa-format.js';
|
|
14
|
+
// ── Internal helpers ────────────────────────────────────────
|
|
15
|
+
/** Spawn a child process and capture stdout/stderr. */
|
|
16
|
+
function spawnAsync(cmd, args, opts) {
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const start = performance.now();
|
|
19
|
+
const out = [];
|
|
20
|
+
const err = [];
|
|
21
|
+
const child = spawn(cmd, args, {
|
|
22
|
+
cwd: opts.cwd, env: { ...process.env, ...opts.env }, stdio: ['pipe', 'pipe', 'pipe'],
|
|
23
|
+
});
|
|
24
|
+
child.stdout.on('data', (c) => { out.push(c); if (opts.verbose)
|
|
25
|
+
process.stdout.write(c); });
|
|
26
|
+
child.stderr.on('data', (c) => { err.push(c); if (opts.verbose)
|
|
27
|
+
process.stderr.write(c); });
|
|
28
|
+
child.on('close', (code) => resolve({
|
|
29
|
+
exitCode: code ?? 1, stdout: Buffer.concat(out).toString(), stderr: Buffer.concat(err).toString(),
|
|
30
|
+
duration: performance.now() - start,
|
|
31
|
+
}));
|
|
32
|
+
child.on('error', (e) => resolve({
|
|
33
|
+
exitCode: 1, stdout: '', stderr: e.message, duration: performance.now() - start,
|
|
34
|
+
}));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const fail = (stderr) => ({ exitCode: 1, stdout: '', stderr, duration: 0 });
|
|
38
|
+
const cleanup = (dir) => rm(dir, { recursive: true, force: true }).catch(() => { });
|
|
39
|
+
/** Check whether the reader has a section with the given id. */
|
|
40
|
+
function hasSection(reader, id) {
|
|
41
|
+
return reader.getSections().some((s) => s.id === id);
|
|
42
|
+
}
|
|
43
|
+
/** Safely extract a section, returning null if absent. */
|
|
44
|
+
function tryExtract(reader, id) {
|
|
45
|
+
try {
|
|
46
|
+
return reader.extractSection(id);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// ── Runner ──────────────────────────────────────────────────
|
|
53
|
+
export class RvfaRunner {
|
|
54
|
+
reader;
|
|
55
|
+
header;
|
|
56
|
+
constructor(reader) {
|
|
57
|
+
this.reader = reader;
|
|
58
|
+
this.header = reader.getHeader();
|
|
59
|
+
}
|
|
60
|
+
/** Read and parse an RVFA file from disk. Throws on invalid input. */
|
|
61
|
+
static async fromFile(rvfaPath) {
|
|
62
|
+
const reader = await RvfaReader.fromFile(rvfaPath);
|
|
63
|
+
return new RvfaRunner(reader);
|
|
64
|
+
}
|
|
65
|
+
/** Create a runner from an already-loaded buffer. */
|
|
66
|
+
static fromBuffer(buf) {
|
|
67
|
+
return new RvfaRunner(RvfaReader.fromBuffer(buf));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Boot the appliance: verify integrity, then dispatch to the
|
|
71
|
+
* requested isolation strategy and run mode.
|
|
72
|
+
*/
|
|
73
|
+
async boot(options) {
|
|
74
|
+
const { valid, errors } = this.reader.verify();
|
|
75
|
+
if (!valid) {
|
|
76
|
+
return fail(`Integrity check failed:\n${errors.join('\n')}`);
|
|
77
|
+
}
|
|
78
|
+
if (options.mode === 'verify')
|
|
79
|
+
return this.runVerify(options);
|
|
80
|
+
if (options.isolation === 'container')
|
|
81
|
+
return this.runContainer(options);
|
|
82
|
+
return this.runNative(options);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Run natively via Node.js: extract RUFLO section to a temp dir,
|
|
86
|
+
* configure env vars, optionally decrypt API-key vault, and spawn.
|
|
87
|
+
*/
|
|
88
|
+
async runNative(options) {
|
|
89
|
+
const workDir = join(tmpdir(), `rvfa-${this.header.name}-${Date.now()}`);
|
|
90
|
+
try {
|
|
91
|
+
await mkdir(workDir, { recursive: true });
|
|
92
|
+
const ruflo = tryExtract(this.reader, 'ruflo');
|
|
93
|
+
if (!ruflo)
|
|
94
|
+
return fail('RVFA appliance does not contain a "ruflo" section');
|
|
95
|
+
const entryFile = join(workDir, 'ruflo-bundle.js');
|
|
96
|
+
await writeFile(entryFile, ruflo);
|
|
97
|
+
const env = {
|
|
98
|
+
...this.header.boot.env,
|
|
99
|
+
RVFA_APPLIANCE_NAME: this.header.name,
|
|
100
|
+
RVFA_APPLIANCE_VERSION: this.header.appVersion,
|
|
101
|
+
RVFA_RUN_MODE: options.mode,
|
|
102
|
+
RVFA_PROFILE: this.header.profile,
|
|
103
|
+
};
|
|
104
|
+
if (options.passphrase && this.header.models.provider !== 'ruvllm') {
|
|
105
|
+
const vault = tryExtract(this.reader, 'models');
|
|
106
|
+
if (vault) {
|
|
107
|
+
const keys = await this.decryptVault(vault, options.passphrase);
|
|
108
|
+
if (keys)
|
|
109
|
+
Object.assign(env, keys);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const args = [...this.header.boot.args];
|
|
113
|
+
if (options.mode === 'mcp')
|
|
114
|
+
args.push('--mcp', '--transport', 'stdio');
|
|
115
|
+
return spawnAsync(this.header.boot.entrypoint || 'node', [entryFile, ...args], {
|
|
116
|
+
cwd: workDir, env, verbose: options.verbose,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await cleanup(workDir);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Run in a Docker container: generate a Dockerfile from the
|
|
125
|
+
* extracted sections, build the image, and run it.
|
|
126
|
+
*/
|
|
127
|
+
async runContainer(options) {
|
|
128
|
+
const dockerCheck = await spawnAsync('docker', ['info'], { verbose: false });
|
|
129
|
+
if (dockerCheck.exitCode !== 0) {
|
|
130
|
+
return fail('Docker is not available. Install Docker or use isolation: "native".');
|
|
131
|
+
}
|
|
132
|
+
const workDir = join(tmpdir(), `rvfa-container-${Date.now()}`);
|
|
133
|
+
try {
|
|
134
|
+
await mkdir(workDir, { recursive: true });
|
|
135
|
+
const ruflo = tryExtract(this.reader, 'ruflo');
|
|
136
|
+
if (!ruflo)
|
|
137
|
+
return fail('RVFA appliance does not contain a "ruflo" section');
|
|
138
|
+
await writeFile(join(workDir, 'ruflo-bundle.js'), ruflo);
|
|
139
|
+
const data = tryExtract(this.reader, 'data');
|
|
140
|
+
if (data)
|
|
141
|
+
await writeFile(join(workDir, 'data.bin'), data);
|
|
142
|
+
const envFlags = [];
|
|
143
|
+
for (const [k, v] of Object.entries(this.header.boot.env))
|
|
144
|
+
envFlags.push('-e', `${k}=${v}`);
|
|
145
|
+
envFlags.push('-e', `RVFA_RUN_MODE=${options.mode}`, '-e', `RVFA_PROFILE=${this.header.profile}`);
|
|
146
|
+
const baseImage = this.header.platform === 'alpine' ? 'node:20-alpine' : 'node:20-slim';
|
|
147
|
+
const cmdArgs = this.header.boot.args.map((a) => `, "${a}"`).join('');
|
|
148
|
+
const dockerfile = [
|
|
149
|
+
`FROM ${baseImage}`, 'WORKDIR /app', 'COPY ruflo-bundle.js .',
|
|
150
|
+
data ? 'COPY data.bin .' : '', `CMD ["node", "ruflo-bundle.js"${cmdArgs}]`,
|
|
151
|
+
].filter(Boolean).join('\n');
|
|
152
|
+
await writeFile(join(workDir, 'Dockerfile'), dockerfile);
|
|
153
|
+
const imageName = `rvfa-${this.header.name}:${this.header.appVersion}`.toLowerCase();
|
|
154
|
+
const build = await spawnAsync('docker', ['build', '-t', imageName, '.'], {
|
|
155
|
+
cwd: workDir, verbose: options.verbose,
|
|
156
|
+
});
|
|
157
|
+
if (build.exitCode !== 0) {
|
|
158
|
+
return { ...build, stderr: `Docker build failed:\n${build.stderr}` };
|
|
159
|
+
}
|
|
160
|
+
return spawnAsync('docker', ['run', '--rm', ...envFlags, imageName], { verbose: options.verbose });
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
await cleanup(workDir);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Run the verification suite. Extracts the VERIFY section and
|
|
168
|
+
* executes it; falls back to a basic integrity report.
|
|
169
|
+
*/
|
|
170
|
+
async runVerify(options) {
|
|
171
|
+
const start = performance.now();
|
|
172
|
+
const verifyPayload = tryExtract(this.reader, 'verify');
|
|
173
|
+
if (!verifyPayload) {
|
|
174
|
+
const { valid, errors } = this.reader.verify();
|
|
175
|
+
const lines = [
|
|
176
|
+
`Appliance: ${this.header.name} v${this.header.appVersion}`,
|
|
177
|
+
`Profile: ${this.header.profile}`,
|
|
178
|
+
`Sections: ${this.header.sections.length}`,
|
|
179
|
+
`Integrity: ${valid ? 'PASS' : 'FAIL'}`,
|
|
180
|
+
...errors.map((e) => ` FAIL: ${e}`),
|
|
181
|
+
errors.length === 0 ? ' All checks PASS' : '',
|
|
182
|
+
];
|
|
183
|
+
return {
|
|
184
|
+
exitCode: valid ? 0 : 1,
|
|
185
|
+
stdout: lines.filter(Boolean).join('\n'), stderr: '',
|
|
186
|
+
duration: performance.now() - start,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const workDir = join(tmpdir(), `rvfa-verify-${Date.now()}`);
|
|
190
|
+
try {
|
|
191
|
+
await mkdir(workDir, { recursive: true });
|
|
192
|
+
await writeFile(join(workDir, 'verify.js'), verifyPayload);
|
|
193
|
+
return spawnAsync('node', [join(workDir, 'verify.js')], {
|
|
194
|
+
cwd: workDir, verbose: options.verbose,
|
|
195
|
+
env: { RVFA_APPLIANCE_NAME: this.header.name, RVFA_APPLIANCE_VERSION: this.header.appVersion },
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
await cleanup(workDir);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Return appliance metadata without booting. */
|
|
203
|
+
getInfo() {
|
|
204
|
+
const sections = this.reader.getSections();
|
|
205
|
+
const totalSize = sections.reduce((sum, s) => sum + s.size, 0);
|
|
206
|
+
return {
|
|
207
|
+
header: { ...this.header },
|
|
208
|
+
sections: sections.map((s) => ({ id: s.id, size: s.size, originalSize: s.originalSize })),
|
|
209
|
+
totalSize,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// ── Private ───────────────────────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Decrypt an API-key vault (AES-256-GCM).
|
|
215
|
+
* Layout: [16-byte IV][ciphertext][16-byte auth-tag]
|
|
216
|
+
* Key derived via PBKDF2 with salt = "rvfa-vault-{name}".
|
|
217
|
+
*/
|
|
218
|
+
async decryptVault(payload, passphrase) {
|
|
219
|
+
try {
|
|
220
|
+
const { createDecipheriv, pbkdf2Sync } = await import('node:crypto');
|
|
221
|
+
if (payload.length < 33)
|
|
222
|
+
return null;
|
|
223
|
+
const iv = payload.subarray(0, 16);
|
|
224
|
+
const tag = payload.subarray(payload.length - 16);
|
|
225
|
+
const ciphertext = payload.subarray(16, payload.length - 16);
|
|
226
|
+
const key = pbkdf2Sync(passphrase, Buffer.from(`rvfa-vault-${this.header.name}`), 100_000, 32, 'sha256');
|
|
227
|
+
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
228
|
+
decipher.setAuthTag(tag);
|
|
229
|
+
const dec = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
230
|
+
return JSON.parse(dec.toString('utf-8'));
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=rvfa-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rvfa-runner.js","sourceRoot":"","sources":["../../../src/appliance/rvfa-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RVFA Ed25519 Code Signing -- Digital signatures for RVFA appliance files.
|
|
3
|
+
*
|
|
4
|
+
* Provides tamper detection and publisher identity verification using
|
|
5
|
+
* Ed25519 (RFC 8032) via Node.js native crypto. Zero external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @module @claude-flow/cli/appliance/rvfa-signing
|
|
8
|
+
*/
|
|
9
|
+
export interface RvfaKeyPair {
|
|
10
|
+
publicKey: Buffer;
|
|
11
|
+
privateKey: Buffer;
|
|
12
|
+
fingerprint: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SignatureMetadata {
|
|
15
|
+
algorithm: 'ed25519';
|
|
16
|
+
publicKeyFingerprint: string;
|
|
17
|
+
signature: string;
|
|
18
|
+
signedAt: string;
|
|
19
|
+
signedBy?: string;
|
|
20
|
+
scope: 'full' | 'sections';
|
|
21
|
+
}
|
|
22
|
+
export interface VerifyResult {
|
|
23
|
+
valid: boolean;
|
|
24
|
+
signerFingerprint?: string;
|
|
25
|
+
signedAt?: string;
|
|
26
|
+
signedBy?: string;
|
|
27
|
+
errors: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate a new Ed25519 key pair for RVFA signing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateKeyPair(): Promise<RvfaKeyPair>;
|
|
33
|
+
/**
|
|
34
|
+
* Save a key pair to disk as PEM files.
|
|
35
|
+
*
|
|
36
|
+
* @param keyPair The key pair to persist.
|
|
37
|
+
* @param dir Directory to write files into.
|
|
38
|
+
* @param name Base name for the key files (default: 'rvfa-signing').
|
|
39
|
+
* @returns Paths to the written public and private key files.
|
|
40
|
+
*/
|
|
41
|
+
export declare function saveKeyPair(keyPair: RvfaKeyPair, dir: string, name?: string): Promise<{
|
|
42
|
+
publicKeyPath: string;
|
|
43
|
+
privateKeyPath: string;
|
|
44
|
+
}>;
|
|
45
|
+
/**
|
|
46
|
+
* Load a key pair from PEM files on disk.
|
|
47
|
+
*
|
|
48
|
+
* @param dir Directory containing the key files.
|
|
49
|
+
* @param name Base name for the key files (default: 'rvfa-signing').
|
|
50
|
+
*/
|
|
51
|
+
export declare function loadKeyPair(dir: string, name?: string): Promise<RvfaKeyPair>;
|
|
52
|
+
/**
|
|
53
|
+
* Load a public key from a single PEM file.
|
|
54
|
+
*/
|
|
55
|
+
export declare function loadPublicKey(path: string): Promise<Buffer>;
|
|
56
|
+
/**
|
|
57
|
+
* Signs RVFA appliance files and data with Ed25519.
|
|
58
|
+
*/
|
|
59
|
+
export declare class RvfaSigner {
|
|
60
|
+
private readonly keyObj;
|
|
61
|
+
private readonly fingerprint;
|
|
62
|
+
constructor(privateKey: Buffer | string);
|
|
63
|
+
/**
|
|
64
|
+
* Sign an RVFA appliance file in-place.
|
|
65
|
+
*
|
|
66
|
+
* Algorithm:
|
|
67
|
+
* 1. Read and parse the RVFA binary
|
|
68
|
+
* 2. Strip any existing signature from the header
|
|
69
|
+
* 3. Compute SHA256 of [canonical_header + section_data + footer]
|
|
70
|
+
* 4. Sign the digest with Ed25519
|
|
71
|
+
* 5. Embed signature metadata into the header
|
|
72
|
+
* 6. Write the updated binary back to the file
|
|
73
|
+
*
|
|
74
|
+
* @param rvfaPath Path to the .rvf appliance file.
|
|
75
|
+
* @param signedBy Optional publisher name.
|
|
76
|
+
* @returns The signature metadata that was embedded.
|
|
77
|
+
*/
|
|
78
|
+
signAppliance(rvfaPath: string, signedBy?: string): Promise<SignatureMetadata>;
|
|
79
|
+
/**
|
|
80
|
+
* Sign a section footer hash (detached signature).
|
|
81
|
+
*
|
|
82
|
+
* @param footerHash The 32-byte SHA256 footer hash from an RVFA file.
|
|
83
|
+
* @returns Hex-encoded Ed25519 signature.
|
|
84
|
+
*/
|
|
85
|
+
signSections(footerHash: Buffer): Promise<string>;
|
|
86
|
+
/**
|
|
87
|
+
* Sign an RVFP patch file (detached signature).
|
|
88
|
+
*
|
|
89
|
+
* @param patchData The raw patch binary data.
|
|
90
|
+
* @returns Hex-encoded Ed25519 signature.
|
|
91
|
+
*/
|
|
92
|
+
signPatch(patchData: Buffer): Promise<string>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Verifies Ed25519 signatures on RVFA appliance files and data.
|
|
96
|
+
*/
|
|
97
|
+
export declare class RvfaVerifier {
|
|
98
|
+
private readonly keyObj;
|
|
99
|
+
private readonly fingerprint;
|
|
100
|
+
constructor(publicKey: Buffer | string);
|
|
101
|
+
/**
|
|
102
|
+
* Verify the Ed25519 signature embedded in an RVFA appliance file.
|
|
103
|
+
*
|
|
104
|
+
* @param rvfaPath Path to the .rvf appliance file.
|
|
105
|
+
* @returns Verification result with details and any errors.
|
|
106
|
+
*/
|
|
107
|
+
verifyAppliance(rvfaPath: string): Promise<VerifyResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Verify a detached Ed25519 signature over arbitrary data.
|
|
110
|
+
*
|
|
111
|
+
* @param data The data that was signed.
|
|
112
|
+
* @param signature Hex-encoded Ed25519 signature.
|
|
113
|
+
*/
|
|
114
|
+
verifyDetached(data: Buffer, signature: string): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Verify an RVFP patch file signature.
|
|
117
|
+
*
|
|
118
|
+
* @param patchData The raw patch binary data.
|
|
119
|
+
* @param signature Hex-encoded Ed25519 signature.
|
|
120
|
+
*/
|
|
121
|
+
verifyPatch(patchData: Buffer, signature: string): Promise<boolean>;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=rvfa-signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rvfa-signing.d.ts","sourceRoot":"","sources":["../../../src/appliance/rvfa-signing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAYD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,CAW5D;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,SAAiB,GACpB,OAAO,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAa5D;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,SAAiB,GACpB,OAAO,CAAC,WAAW,CAAC,CAmBtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AA4HD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,UAAU,EAAE,MAAM,GAAG,MAAM;IASvC;;;;;;;;;;;;;;OAcG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2BpF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvD;;;;;OAKG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAKpD;AAID;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,SAAS,EAAE,MAAM,GAAG,MAAM;IAMtC;;;;;OAKG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqE9D;;;;;OAKG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMvE;;;;;OAKG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAK1E"}
|