@blink-authority-com/claude-code-plugin 1.0.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/LICENSE +21 -0
- package/README.md +146 -0
- package/dist/bsec-client.d.ts +35 -0
- package/dist/bsec-client.d.ts.map +1 -0
- package/dist/bsec-client.js +122 -0
- package/dist/bsec-client.js.map +1 -0
- package/dist/docs/cache.d.ts +19 -0
- package/dist/docs/cache.d.ts.map +1 -0
- package/dist/docs/cache.js +92 -0
- package/dist/docs/cache.js.map +1 -0
- package/dist/docs/fetcher.d.ts +19 -0
- package/dist/docs/fetcher.d.ts.map +1 -0
- package/dist/docs/fetcher.js +81 -0
- package/dist/docs/fetcher.js.map +1 -0
- package/dist/docs/parser.d.ts +33 -0
- package/dist/docs/parser.d.ts.map +1 -0
- package/dist/docs/parser.js +145 -0
- package/dist/docs/parser.js.map +1 -0
- package/dist/docs/search.d.ts +38 -0
- package/dist/docs/search.d.ts.map +1 -0
- package/dist/docs/search.js +180 -0
- package/dist/docs/search.js.map +1 -0
- package/dist/docs/tools/api.d.ts +12 -0
- package/dist/docs/tools/api.d.ts.map +1 -0
- package/dist/docs/tools/api.js +58 -0
- package/dist/docs/tools/api.js.map +1 -0
- package/dist/docs/tools/cli.d.ts +12 -0
- package/dist/docs/tools/cli.d.ts.map +1 -0
- package/dist/docs/tools/cli.js +56 -0
- package/dist/docs/tools/cli.js.map +1 -0
- package/dist/docs/tools/concepts.d.ts +18 -0
- package/dist/docs/tools/concepts.d.ts.map +1 -0
- package/dist/docs/tools/concepts.js +136 -0
- package/dist/docs/tools/concepts.js.map +1 -0
- package/dist/docs/tools/sdk.d.ts +12 -0
- package/dist/docs/tools/sdk.d.ts.map +1 -0
- package/dist/docs/tools/sdk.js +72 -0
- package/dist/docs/tools/sdk.js.map +1 -0
- package/dist/docs/tools/search.d.ts +11 -0
- package/dist/docs/tools/search.d.ts.map +1 -0
- package/dist/docs/tools/search.js +36 -0
- package/dist/docs/tools/search.js.map +1 -0
- package/dist/docs/types.d.ts +70 -0
- package/dist/docs/types.d.ts.map +1 -0
- package/dist/docs/types.js +8 -0
- package/dist/docs/types.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +622 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/debug.d.ts +16 -0
- package/dist/prompts/debug.d.ts.map +1 -0
- package/dist/prompts/debug.js +34 -0
- package/dist/prompts/debug.js.map +1 -0
- package/dist/prompts/integrate.d.ts +16 -0
- package/dist/prompts/integrate.d.ts.map +1 -0
- package/dist/prompts/integrate.js +30 -0
- package/dist/prompts/integrate.js.map +1 -0
- package/dist/prompts/review.d.ts +16 -0
- package/dist/prompts/review.d.ts.map +1 -0
- package/dist/prompts/review.js +28 -0
- package/dist/prompts/review.js.map +1 -0
- package/dist/resources/changelog.d.ts +22 -0
- package/dist/resources/changelog.d.ts.map +1 -0
- package/dist/resources/changelog.js +55 -0
- package/dist/resources/changelog.js.map +1 -0
- package/dist/resources/errors.d.ts +16 -0
- package/dist/resources/errors.d.ts.map +1 -0
- package/dist/resources/errors.js +103 -0
- package/dist/resources/errors.js.map +1 -0
- package/dist/resources/patterns.d.ts +16 -0
- package/dist/resources/patterns.d.ts.map +1 -0
- package/dist/resources/patterns.js +151 -0
- package/dist/resources/patterns.js.map +1 -0
- package/dist/templates/approval-workflow.d.ts +6 -0
- package/dist/templates/approval-workflow.d.ts.map +1 -0
- package/dist/templates/approval-workflow.js +467 -0
- package/dist/templates/approval-workflow.js.map +1 -0
- package/dist/templates/audit-trail.d.ts +6 -0
- package/dist/templates/audit-trail.d.ts.map +1 -0
- package/dist/templates/audit-trail.js +396 -0
- package/dist/templates/audit-trail.js.map +1 -0
- package/dist/templates/cli-tool.d.ts +6 -0
- package/dist/templates/cli-tool.d.ts.map +1 -0
- package/dist/templates/cli-tool.js +346 -0
- package/dist/templates/cli-tool.js.map +1 -0
- package/dist/templates/express-api.d.ts +6 -0
- package/dist/templates/express-api.d.ts.map +1 -0
- package/dist/templates/express-api.js +314 -0
- package/dist/templates/express-api.js.map +1 -0
- package/dist/templates/notary.d.ts +6 -0
- package/dist/templates/notary.d.ts.map +1 -0
- package/dist/templates/notary.js +360 -0
- package/dist/templates/notary.js.map +1 -0
- package/dist/test.d.ts +8 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +140 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/add-signing.d.ts +19 -0
- package/dist/tools/add-signing.d.ts.map +1 -0
- package/dist/tools/add-signing.js +317 -0
- package/dist/tools/add-signing.js.map +1 -0
- package/dist/tools/decode.d.ts +13 -0
- package/dist/tools/decode.d.ts.map +1 -0
- package/dist/tools/decode.js +262 -0
- package/dist/tools/decode.js.map +1 -0
- package/dist/tools/hierarchy.d.ts +13 -0
- package/dist/tools/hierarchy.d.ts.map +1 -0
- package/dist/tools/hierarchy.js +319 -0
- package/dist/tools/hierarchy.js.map +1 -0
- package/dist/tools/lint.d.ts +13 -0
- package/dist/tools/lint.d.ts.map +1 -0
- package/dist/tools/lint.js +323 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/scaffold.d.ts +11 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +84 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/sign-test.d.ts +17 -0
- package/dist/tools/sign-test.d.ts.map +1 -0
- package/dist/tools/sign-test.js +126 -0
- package/dist/tools/sign-test.js.map +1 -0
- package/dist/tools/test-vectors.d.ts +13 -0
- package/dist/tools/test-vectors.d.ts.map +1 -0
- package/dist/tools/test-vectors.js +169 -0
- package/dist/tools/test-vectors.js.map +1 -0
- package/dist/tools/verify-local.d.ts +17 -0
- package/dist/tools/verify-local.d.ts.map +1 -0
- package/dist/tools/verify-local.js +233 -0
- package/dist/tools/verify-local.js.map +1 -0
- package/dist/tools/verify-test.d.ts +17 -0
- package/dist/tools/verify-test.d.ts.map +1 -0
- package/dist/tools/verify-test.js +107 -0
- package/dist/tools/verify-test.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document notary scaffold template.
|
|
3
|
+
* Generates a notarization service: upload, hash, sign, verify.
|
|
4
|
+
*/
|
|
5
|
+
export function generateNotary(name, features) {
|
|
6
|
+
const hasMultiAlgo = features.includes('multi-algorithm') || features.includes('post-quantum');
|
|
7
|
+
const files = {};
|
|
8
|
+
// --- package.json ---
|
|
9
|
+
files['package.json'] = JSON.stringify({
|
|
10
|
+
name,
|
|
11
|
+
version: '0.1.0',
|
|
12
|
+
description: `${name} — Document notarization service with BLINK Authority`,
|
|
13
|
+
type: 'module',
|
|
14
|
+
scripts: {
|
|
15
|
+
build: 'tsc',
|
|
16
|
+
start: 'node dist/server.js',
|
|
17
|
+
dev: 'tsx src/server.ts',
|
|
18
|
+
},
|
|
19
|
+
dependencies: {
|
|
20
|
+
'@blink-technology/sdk': '^0.14.0',
|
|
21
|
+
express: '^4.21.0',
|
|
22
|
+
multer: '^1.4.5-lts.1',
|
|
23
|
+
dotenv: '^16.4.0',
|
|
24
|
+
},
|
|
25
|
+
devDependencies: {
|
|
26
|
+
'@types/express': '^4.17.21',
|
|
27
|
+
'@types/multer': '^1.4.12',
|
|
28
|
+
'@types/node': '^22.15.2',
|
|
29
|
+
typescript: '^5.8.3',
|
|
30
|
+
tsx: '^4.19.0',
|
|
31
|
+
},
|
|
32
|
+
}, null, 2);
|
|
33
|
+
// --- tsconfig.json ---
|
|
34
|
+
files['tsconfig.json'] = JSON.stringify({
|
|
35
|
+
compilerOptions: {
|
|
36
|
+
target: 'ES2022',
|
|
37
|
+
module: 'Node16',
|
|
38
|
+
moduleResolution: 'Node16',
|
|
39
|
+
outDir: 'dist',
|
|
40
|
+
rootDir: 'src',
|
|
41
|
+
strict: true,
|
|
42
|
+
esModuleInterop: true,
|
|
43
|
+
skipLibCheck: true,
|
|
44
|
+
forceConsistentCasingInFileNames: true,
|
|
45
|
+
declaration: true,
|
|
46
|
+
sourceMap: true,
|
|
47
|
+
},
|
|
48
|
+
include: ['src/**/*'],
|
|
49
|
+
exclude: ['node_modules', 'dist'],
|
|
50
|
+
}, null, 2);
|
|
51
|
+
// --- .env.example ---
|
|
52
|
+
files['.env.example'] = `# BLINK Secure Engine connection
|
|
53
|
+
BSEC_URL=http://localhost:9100
|
|
54
|
+
BSEC_TOKEN=your-bsec-token-here
|
|
55
|
+
SLOT_NAME=default
|
|
56
|
+
|
|
57
|
+
# Server
|
|
58
|
+
PORT=3000
|
|
59
|
+
`;
|
|
60
|
+
// --- src/blink.ts ---
|
|
61
|
+
files['src/blink.ts'] = `/**
|
|
62
|
+
* BLINK Secure Engine connection management.
|
|
63
|
+
*
|
|
64
|
+
* BLINK Authority — https://blink-authority.com
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
import { BlinkSigner, BlinkVerifier, AlgoSuiteId } from '@blink-technology/sdk';
|
|
68
|
+
|
|
69
|
+
let signer: BlinkSigner;
|
|
70
|
+
let vrfPublicKey: Uint8Array;
|
|
71
|
+
|
|
72
|
+
export async function initBlink(bsecUrl: string, slotName: string): Promise<void> {
|
|
73
|
+
signer = await BlinkSigner.connect(bsecUrl, slotName, AlgoSuiteId.Ed25519);
|
|
74
|
+
vrfPublicKey = await signer.vrfPublicKey();
|
|
75
|
+
console.log(
|
|
76
|
+
\`[blink] Connected to BSEC at \${bsecUrl} \` +
|
|
77
|
+
\`(slot=\${slotName}, pk=\${Buffer.from(vrfPublicKey).toString('hex').slice(0, 16)}...)\`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function getSigner(): BlinkSigner { return signer; }
|
|
82
|
+
export function getVrfPublicKey(): Uint8Array { return vrfPublicKey; }
|
|
83
|
+
export function getVrfPublicKeyHex(): string { return Buffer.from(vrfPublicKey).toString('hex'); }
|
|
84
|
+
|
|
85
|
+
export function createVerifier(): BlinkVerifier {
|
|
86
|
+
return new BlinkVerifier(vrfPublicKey, {
|
|
87
|
+
freshnessWindowMs: 365 * 24 * 60 * 60 * 1000, // 1 year for notarization
|
|
88
|
+
clockSkewToleranceMs: 60_000,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export async function shutdownBlink(): Promise<void> {
|
|
93
|
+
if (signer) {
|
|
94
|
+
await signer.close();
|
|
95
|
+
console.log('[blink] Disconnected from BLINK Secure Engine');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
`;
|
|
99
|
+
// --- src/notarize.ts ---
|
|
100
|
+
files['src/notarize.ts'] = `/**
|
|
101
|
+
* Document notarization logic.
|
|
102
|
+
*
|
|
103
|
+
* 1. Compute SHA-256 hash of the uploaded document
|
|
104
|
+
* 2. Sign the hash via BLINK Secure Engine (single-use credential)
|
|
105
|
+
* 3. Return the notarization certificate (envelope + metadata)
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
109
|
+
import { getSigner, getVrfPublicKeyHex } from './blink.js';
|
|
110
|
+
|
|
111
|
+
export interface NotarizationCertificate {
|
|
112
|
+
id: string;
|
|
113
|
+
document: {
|
|
114
|
+
filename: string;
|
|
115
|
+
size: number;
|
|
116
|
+
hash: string;
|
|
117
|
+
};
|
|
118
|
+
envelope: string;
|
|
119
|
+
signerPublicKey: string;
|
|
120
|
+
assuranceLevel: string;
|
|
121
|
+
notarizedAt: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Notarize a document: hash it, then sign the hash with BLINK.
|
|
126
|
+
*/
|
|
127
|
+
export async function notarizeDocument(
|
|
128
|
+
file: Buffer,
|
|
129
|
+
filename: string,
|
|
130
|
+
): Promise<NotarizationCertificate> {
|
|
131
|
+
// Step 1: Compute SHA-256 hash of the file
|
|
132
|
+
const hash = createHash('sha256').update(new Uint8Array(file)).digest();
|
|
133
|
+
const hashBytes = new Uint8Array(hash.buffer, hash.byteOffset, hash.byteLength);
|
|
134
|
+
|
|
135
|
+
// Step 2: Sign the hash via BLINK Secure Engine
|
|
136
|
+
// Uses signDetached — the hash is the payload, not included in the envelope
|
|
137
|
+
const envelope = await getSigner().signDetached(hashBytes);
|
|
138
|
+
|
|
139
|
+
// Step 3: Build the notarization certificate
|
|
140
|
+
return {
|
|
141
|
+
id: \`NOTARY-\${randomUUID()}\`,
|
|
142
|
+
document: {
|
|
143
|
+
filename,
|
|
144
|
+
size: file.length,
|
|
145
|
+
hash: hash.toString('hex'),
|
|
146
|
+
},
|
|
147
|
+
envelope: Buffer.from(envelope).toString('base64'),
|
|
148
|
+
signerPublicKey: getVrfPublicKeyHex(),
|
|
149
|
+
assuranceLevel: 'Standard Assurance',
|
|
150
|
+
notarizedAt: new Date().toISOString(),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Verify a previously notarized document.
|
|
156
|
+
* Re-hashes the file and checks the envelope signature.
|
|
157
|
+
*/
|
|
158
|
+
export async function verifyNotarization(
|
|
159
|
+
file: Buffer,
|
|
160
|
+
certificate: NotarizationCertificate,
|
|
161
|
+
): Promise<{ valid: boolean; reason?: string }> {
|
|
162
|
+
// Re-hash the file
|
|
163
|
+
const currentHash = createHash('sha256').update(new Uint8Array(file)).digest('hex');
|
|
164
|
+
|
|
165
|
+
// Check hash matches
|
|
166
|
+
if (currentHash !== certificate.document.hash) {
|
|
167
|
+
return {
|
|
168
|
+
valid: false,
|
|
169
|
+
reason: \`Document hash mismatch: expected \${certificate.document.hash}, got \${currentHash}\`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Verify the BLINK envelope
|
|
174
|
+
const { createVerifier } = await import('./blink.js');
|
|
175
|
+
const verifier = createVerifier();
|
|
176
|
+
const envelopeBytes = new Uint8Array(Buffer.from(certificate.envelope, 'base64'));
|
|
177
|
+
const result = verifier.verify(envelopeBytes);
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
valid: result.valid,
|
|
181
|
+
reason: result.valid ? undefined : (result.reason ?? 'Signature verification failed'),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
`;
|
|
185
|
+
// --- src/routes.ts ---
|
|
186
|
+
files['src/routes.ts'] = `/**
|
|
187
|
+
* Notary API routes.
|
|
188
|
+
*
|
|
189
|
+
* POST /notarize — Upload a document, receive a notarization certificate
|
|
190
|
+
* POST /verify — Upload a document + certificate, verify authenticity
|
|
191
|
+
* GET /health — Health check
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
import { Router } from 'express';
|
|
195
|
+
import multer from 'multer';
|
|
196
|
+
import { notarizeDocument, verifyNotarization } from './notarize.js';
|
|
197
|
+
import { getVrfPublicKeyHex } from './blink.js';
|
|
198
|
+
|
|
199
|
+
const upload = multer({
|
|
200
|
+
storage: multer.memoryStorage(),
|
|
201
|
+
limits: { fileSize: 50 * 1024 * 1024 }, // 50 MB max
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
const router = Router();
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* POST /notarize — Upload a file to notarize.
|
|
208
|
+
* Returns a notarization certificate containing the BLINK envelope.
|
|
209
|
+
*/
|
|
210
|
+
router.post('/notarize', upload.single('file'), async (req, res, next) => {
|
|
211
|
+
try {
|
|
212
|
+
if (!req.file) {
|
|
213
|
+
res.status(400).json({ error: 'No file uploaded. Send as multipart/form-data with field "file".' });
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const certificate = await notarizeDocument(req.file.buffer, req.file.originalname);
|
|
218
|
+
res.status(201).json(certificate);
|
|
219
|
+
} catch (err) {
|
|
220
|
+
next(err);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* POST /verify — Upload a file and its certificate to verify.
|
|
226
|
+
* Re-hashes the file and checks the BLINK signature.
|
|
227
|
+
*/
|
|
228
|
+
router.post('/verify', upload.single('file'), async (req, res, next) => {
|
|
229
|
+
try {
|
|
230
|
+
if (!req.file) {
|
|
231
|
+
res.status(400).json({ error: 'No file uploaded.' });
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const certJson = req.body?.certificate;
|
|
236
|
+
if (!certJson) {
|
|
237
|
+
res.status(400).json({ error: 'Missing "certificate" field in request body.' });
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const certificate = typeof certJson === 'string' ? JSON.parse(certJson) : certJson;
|
|
242
|
+
const result = await verifyNotarization(req.file.buffer, certificate);
|
|
243
|
+
|
|
244
|
+
res.json({
|
|
245
|
+
verified: result.valid,
|
|
246
|
+
reason: result.reason,
|
|
247
|
+
document: {
|
|
248
|
+
filename: req.file.originalname,
|
|
249
|
+
size: req.file.size,
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
} catch (err) {
|
|
253
|
+
next(err);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
/** GET /health */
|
|
258
|
+
router.get('/health', (_req, res) => {
|
|
259
|
+
res.json({
|
|
260
|
+
status: 'ok',
|
|
261
|
+
service: '${name}',
|
|
262
|
+
signerPublicKey: getVrfPublicKeyHex(),
|
|
263
|
+
timestamp: new Date().toISOString(),
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
export default router;
|
|
268
|
+
`;
|
|
269
|
+
// --- src/server.ts ---
|
|
270
|
+
files['src/server.ts'] = `/**
|
|
271
|
+
* ${name} — Document notarization service with BLINK Authority.
|
|
272
|
+
*
|
|
273
|
+
* Upload documents to get a cryptographic notarization certificate.
|
|
274
|
+
* Verify documents by re-uploading with the certificate.
|
|
275
|
+
*/
|
|
276
|
+
|
|
277
|
+
import 'dotenv/config';
|
|
278
|
+
import express from 'express';
|
|
279
|
+
import { initBlink, shutdownBlink } from './blink.js';
|
|
280
|
+
import routes from './routes.js';
|
|
281
|
+
|
|
282
|
+
async function main(): Promise<void> {
|
|
283
|
+
const bsecUrl = process.env['BSEC_URL'] ?? 'http://localhost:9100';
|
|
284
|
+
const slotName = process.env['SLOT_NAME'] ?? 'default';
|
|
285
|
+
const port = parseInt(process.env['PORT'] ?? '3000', 10);
|
|
286
|
+
|
|
287
|
+
// Connect to BLINK Secure Engine
|
|
288
|
+
await initBlink(bsecUrl, slotName);
|
|
289
|
+
|
|
290
|
+
const app = express();
|
|
291
|
+
app.use(express.json());
|
|
292
|
+
app.use(routes);
|
|
293
|
+
|
|
294
|
+
const server = app.listen(port, () => {
|
|
295
|
+
console.log(\`[server] ${name} listening on port \${port}\`);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
// Graceful shutdown
|
|
299
|
+
const shutdown = async (signal: string) => {
|
|
300
|
+
console.log(\`[server] Received \${signal}, shutting down...\`);
|
|
301
|
+
server.close();
|
|
302
|
+
await shutdownBlink();
|
|
303
|
+
process.exit(0);
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
307
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
main().catch((err) => {
|
|
311
|
+
console.error('[server] Fatal error:', err);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
});
|
|
314
|
+
`;
|
|
315
|
+
// --- README.md ---
|
|
316
|
+
files['README.md'] = `# ${name}
|
|
317
|
+
|
|
318
|
+
Document notarization service built on **BLINK Authority**. Upload documents to receive
|
|
319
|
+
a cryptographic notarization certificate, then verify documents later.
|
|
320
|
+
|
|
321
|
+
## Quick Start
|
|
322
|
+
|
|
323
|
+
\`\`\`bash
|
|
324
|
+
npm install
|
|
325
|
+
cp .env.example .env
|
|
326
|
+
npm run dev
|
|
327
|
+
\`\`\`
|
|
328
|
+
|
|
329
|
+
## API
|
|
330
|
+
|
|
331
|
+
### POST /notarize
|
|
332
|
+
Upload a file to notarize. Returns a certificate with the BLINK signature envelope.
|
|
333
|
+
|
|
334
|
+
\`\`\`bash
|
|
335
|
+
curl -F "file=@document.pdf" http://localhost:3000/notarize
|
|
336
|
+
\`\`\`
|
|
337
|
+
|
|
338
|
+
### POST /verify
|
|
339
|
+
Upload a file and its certificate to verify authenticity.
|
|
340
|
+
|
|
341
|
+
\`\`\`bash
|
|
342
|
+
curl -F "file=@document.pdf" -F "certificate=@certificate.json" http://localhost:3000/verify
|
|
343
|
+
\`\`\`
|
|
344
|
+
|
|
345
|
+
### GET /health
|
|
346
|
+
Health check with signer public key.
|
|
347
|
+
|
|
348
|
+
## How It Works
|
|
349
|
+
|
|
350
|
+
1. **Upload** — The document is uploaded to the server
|
|
351
|
+
2. **Hash** — SHA-256 hash is computed
|
|
352
|
+
3. **Sign** — The hash is signed with a single-use BLINK credential
|
|
353
|
+
4. **Certificate** — The BLINK envelope + metadata is returned as the notarization certificate
|
|
354
|
+
5. **Verify** — Re-upload the document; the server re-hashes and verifies the envelope
|
|
355
|
+
|
|
356
|
+
Built with [BLINK Authority](https://blink-authority.com).
|
|
357
|
+
`;
|
|
358
|
+
return files;
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=notary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notary.js","sourceRoot":"","sources":["../../src/templates/notary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,QAAkB;IAElB,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE/F,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,CACpC;QACE,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,GAAG,IAAI,uDAAuD;QAC3E,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,qBAAqB;YAC5B,GAAG,EAAE,mBAAmB;SACzB;QACD,YAAY,EAAE;YACZ,uBAAuB,EAAE,SAAS;YAClC,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,SAAS;SAClB;QACD,eAAe,EAAE;YACf,gBAAgB,EAAE,UAAU;YAC5B,eAAe,EAAE,SAAS;YAC1B,aAAa,EAAE,UAAU;YACzB,UAAU,EAAE,QAAQ;YACpB,GAAG,EAAE,SAAS;SACf;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CACrC;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,QAAQ;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,gCAAgC,EAAE,IAAI;YACtC,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;SAChB;QACD,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;KAClC,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IAEF,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG;;;;;;;CAOzB,CAAC;IAEA,uBAAuB;IACvB,KAAK,CAAC,cAAc,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCzB,CAAC;IAEA,0BAA0B;IAC1B,KAAK,CAAC,iBAAiB,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoF5B,CAAC;IAEA,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2EX,IAAI;;;;;;;CAOnB,CAAC;IAEA,wBAAwB;IACxB,KAAK,CAAC,eAAe,CAAC,GAAG;KACtB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;6BAwBoB,IAAI;;;;;;;;;;;;;;;;;;;CAmBhC,CAAC;IAEA,oBAAoB;IACpB,KAAK,CAAC,WAAW,CAAC,GAAG,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC/B,CAAC;IAEA,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple smoke test for BLINK Claude Plugin tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* Run: npm test
|
|
5
|
+
* (Requires: npm run build first)
|
|
6
|
+
*/
|
|
7
|
+
import { handleScaffold } from './tools/scaffold.js';
|
|
8
|
+
import { handleAddSigning } from './tools/add-signing.js';
|
|
9
|
+
import { handleDecodeEnvelope } from './tools/decode.js';
|
|
10
|
+
import { handleGenerateTestVectors } from './tools/test-vectors.js';
|
|
11
|
+
import { handleVerifyLocal } from './tools/verify-local.js';
|
|
12
|
+
import { handleLint } from './tools/lint.js';
|
|
13
|
+
import { handleHierarchyDesign } from './tools/hierarchy.js';
|
|
14
|
+
import { handleSignTest } from './tools/sign-test.js';
|
|
15
|
+
import { handleVerifyTest } from './tools/verify-test.js';
|
|
16
|
+
import { PluginBsecClient, createPluginBsecClient } from './bsec-client.js';
|
|
17
|
+
let passed = 0;
|
|
18
|
+
let failed = 0;
|
|
19
|
+
function test(name, fn) {
|
|
20
|
+
try {
|
|
21
|
+
fn();
|
|
22
|
+
passed++;
|
|
23
|
+
console.log(` PASS: ${name}`);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
failed++;
|
|
27
|
+
console.log(` FAIL: ${name}`);
|
|
28
|
+
console.log(` ${err}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function assert(condition, message) {
|
|
32
|
+
if (!condition)
|
|
33
|
+
throw new Error(message);
|
|
34
|
+
}
|
|
35
|
+
console.log('\nBLINK Claude Plugin — Smoke Tests\n');
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// S45-01: BSEC Client
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
console.log('S45-01: BSEC Client');
|
|
40
|
+
test('createPluginBsecClient returns a PluginBsecClient', () => {
|
|
41
|
+
const client = createPluginBsecClient('https://localhost:8443', 'test-token');
|
|
42
|
+
assert(client instanceof PluginBsecClient, 'Expected PluginBsecClient instance');
|
|
43
|
+
});
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// S45-02: blink_sign_test
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
console.log('\nS45-02: blink_sign_test');
|
|
48
|
+
test('returns error when BSEC not configured', () => {
|
|
49
|
+
const result = handleSignTest({ payload: 'test' }, null);
|
|
50
|
+
// Synchronous return when no client
|
|
51
|
+
assert(!('then' in result), 'Expected synchronous result');
|
|
52
|
+
const toolResult = result;
|
|
53
|
+
assert(toolResult.isError === true, 'Expected isError');
|
|
54
|
+
const body = JSON.parse(toolResult.content[0].text);
|
|
55
|
+
assert(body.error === 'Connected mode not configured', 'Expected connected mode error');
|
|
56
|
+
});
|
|
57
|
+
test('returns error when payload is empty', () => {
|
|
58
|
+
const result = handleSignTest({ payload: '' }, null);
|
|
59
|
+
const toolResult = result;
|
|
60
|
+
assert(toolResult.isError === true, 'Expected isError for empty payload');
|
|
61
|
+
});
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// S45-03: blink_verify_test
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
console.log('\nS45-03: blink_verify_test');
|
|
66
|
+
test('returns error when envelope is missing', () => {
|
|
67
|
+
const result = handleVerifyTest({}, null);
|
|
68
|
+
const toolResult = result;
|
|
69
|
+
assert(toolResult.isError === true, 'Expected isError for missing envelope');
|
|
70
|
+
});
|
|
71
|
+
test('returns offline mode result for valid-format envelope', () => {
|
|
72
|
+
// Create a minimal valid envelope
|
|
73
|
+
const envelope = {
|
|
74
|
+
signature: Buffer.alloc(64).toString('base64'),
|
|
75
|
+
ephemeral_public_key: Buffer.alloc(32).toString('base64'),
|
|
76
|
+
vrf_proof: Buffer.alloc(80).toString('base64'),
|
|
77
|
+
p_derive: Buffer.alloc(32).toString('base64'),
|
|
78
|
+
domain_input: 'test:identity:2026-03-31T00:00:00Z',
|
|
79
|
+
timestamp: new Date().toISOString(),
|
|
80
|
+
algorithm: 'ed25519',
|
|
81
|
+
payload_hash: 'a'.repeat(64),
|
|
82
|
+
};
|
|
83
|
+
const envelopeB64 = Buffer.from(JSON.stringify(envelope)).toString('base64');
|
|
84
|
+
const pDerive = Buffer.alloc(32).toString('base64');
|
|
85
|
+
const result = handleVerifyTest({ envelope: envelopeB64, p_derive: pDerive }, null);
|
|
86
|
+
const toolResult = result;
|
|
87
|
+
const body = JSON.parse(toolResult.content[0].text);
|
|
88
|
+
assert(body.mode === 'offline', 'Expected offline mode');
|
|
89
|
+
assert(body.format_verification !== undefined, 'Expected format_verification');
|
|
90
|
+
});
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Existing tools (quick smoke)
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
console.log('\nExisting tools (smoke)');
|
|
95
|
+
test('blink_scaffold returns files', () => {
|
|
96
|
+
const result = handleScaffold({ template: 'express-api', name: 'test-app' });
|
|
97
|
+
assert(result.content.length > 0, 'Expected content');
|
|
98
|
+
const body = JSON.parse(result.content[0].text);
|
|
99
|
+
assert(body.files || body.project_name, 'Expected scaffold output');
|
|
100
|
+
});
|
|
101
|
+
test('blink_add_signing returns enhanced code', () => {
|
|
102
|
+
const result = handleAddSigning({ code: 'app.get("/", (req, res) => res.send("ok"));', pattern: 'sign-response' });
|
|
103
|
+
assert(result.content.length > 0, 'Expected content');
|
|
104
|
+
});
|
|
105
|
+
test('blink_decode_envelope handles invalid input', () => {
|
|
106
|
+
const result = handleDecodeEnvelope({ envelope: 'not-valid-base64!!' });
|
|
107
|
+
assert(result.content.length > 0, 'Expected content');
|
|
108
|
+
});
|
|
109
|
+
test('blink_generate_test_vectors returns vectors', () => {
|
|
110
|
+
const result = handleGenerateTestVectors({ count: 2 });
|
|
111
|
+
assert(result.content.length > 0, 'Expected content');
|
|
112
|
+
const body = JSON.parse(result.content[0].text);
|
|
113
|
+
assert(body.test_vectors || body.vectors || Array.isArray(body), 'Expected test vectors');
|
|
114
|
+
});
|
|
115
|
+
test('blink_verify_local handles missing envelope', () => {
|
|
116
|
+
const result = handleVerifyLocal({});
|
|
117
|
+
assert(result.content.length > 0, 'Expected content');
|
|
118
|
+
const body = JSON.parse(result.content[0].text);
|
|
119
|
+
assert(body.format_valid === false, 'Expected format_valid false');
|
|
120
|
+
});
|
|
121
|
+
test('blink_lint returns results', () => {
|
|
122
|
+
const result = handleLint({ code: 'const x = 1;' });
|
|
123
|
+
assert(result.content.length > 0, 'Expected content');
|
|
124
|
+
});
|
|
125
|
+
test('blink_hierarchy_design returns hierarchy', () => {
|
|
126
|
+
const result = handleHierarchyDesign({ description: 'A small startup with 3 services' });
|
|
127
|
+
assert(result.content.length > 0, 'Expected content');
|
|
128
|
+
});
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// Summary
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
console.log(`\n${'='.repeat(40)}`);
|
|
133
|
+
console.log(`Results: ${passed} passed, ${failed} failed, ${passed + failed} total`);
|
|
134
|
+
if (failed > 0) {
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log('All tests passed.\n');
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,MAAM,GAAG,CAAC,CAAC;AAEf,SAAS,IAAI,CAAC,IAAY,EAAE,EAAc;IACxC,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;QACL,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,SAAkB,EAAE,OAAe;IACjD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AAErD,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAEnC,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,MAAM,GAAG,sBAAsB,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,CAAC,MAAM,YAAY,gBAAgB,EAAE,oCAAoC,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAC9E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEzC,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IACzD,oCAAoC;IACpC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAA+E,CAAC;IACnG,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,+BAA+B,EAAE,+BAA+B,CAAC,CAAC;AAC1F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAA+E,CAAC;IACnG,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,oCAAoC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAC9E,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE3C,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAA+E,CAAC;IACnG,MAAM,CAAC,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,uCAAuC,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,kCAAkC;IAClC,MAAM,QAAQ,GAAG;QACf,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9C,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzD,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7C,YAAY,EAAE,oCAAoC;QAClD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;KAC7B,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,MAA4D,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE,8BAA8B,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAC9E,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAExC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;IACxC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,6CAA6C,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IACnH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAC5F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,YAAY,KAAK,KAAK,EAAE,6BAA6B,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACnC,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,GAAG,MAAM,QAAQ,CAAC,CAAC;AAErF,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* blink_add_signing tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Takes existing code and a signing pattern, returns enhanced code
|
|
5
|
+
* with BLINK signing added. Uses string manipulation (not AST) for v1.
|
|
6
|
+
*
|
|
7
|
+
* Patterns:
|
|
8
|
+
* sign-response — Add BLINK signing middleware to Express responses
|
|
9
|
+
* sign-document — Add document hashing + BLINK signing
|
|
10
|
+
* sign-audit-entry — Add hash-chained audit entry signing
|
|
11
|
+
* verify-incoming — Add incoming signature verification
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleAddSigning(args: Record<string, unknown>): {
|
|
14
|
+
content: Array<{
|
|
15
|
+
type: string;
|
|
16
|
+
text: string;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=add-signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-signing.d.ts","sourceRoot":"","sources":["../../src/tools/add-signing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkTH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAiCpD"}
|