@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.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/dist/bsec-client.d.ts +35 -0
  4. package/dist/bsec-client.d.ts.map +1 -0
  5. package/dist/bsec-client.js +122 -0
  6. package/dist/bsec-client.js.map +1 -0
  7. package/dist/docs/cache.d.ts +19 -0
  8. package/dist/docs/cache.d.ts.map +1 -0
  9. package/dist/docs/cache.js +92 -0
  10. package/dist/docs/cache.js.map +1 -0
  11. package/dist/docs/fetcher.d.ts +19 -0
  12. package/dist/docs/fetcher.d.ts.map +1 -0
  13. package/dist/docs/fetcher.js +81 -0
  14. package/dist/docs/fetcher.js.map +1 -0
  15. package/dist/docs/parser.d.ts +33 -0
  16. package/dist/docs/parser.d.ts.map +1 -0
  17. package/dist/docs/parser.js +145 -0
  18. package/dist/docs/parser.js.map +1 -0
  19. package/dist/docs/search.d.ts +38 -0
  20. package/dist/docs/search.d.ts.map +1 -0
  21. package/dist/docs/search.js +180 -0
  22. package/dist/docs/search.js.map +1 -0
  23. package/dist/docs/tools/api.d.ts +12 -0
  24. package/dist/docs/tools/api.d.ts.map +1 -0
  25. package/dist/docs/tools/api.js +58 -0
  26. package/dist/docs/tools/api.js.map +1 -0
  27. package/dist/docs/tools/cli.d.ts +12 -0
  28. package/dist/docs/tools/cli.d.ts.map +1 -0
  29. package/dist/docs/tools/cli.js +56 -0
  30. package/dist/docs/tools/cli.js.map +1 -0
  31. package/dist/docs/tools/concepts.d.ts +18 -0
  32. package/dist/docs/tools/concepts.d.ts.map +1 -0
  33. package/dist/docs/tools/concepts.js +136 -0
  34. package/dist/docs/tools/concepts.js.map +1 -0
  35. package/dist/docs/tools/sdk.d.ts +12 -0
  36. package/dist/docs/tools/sdk.d.ts.map +1 -0
  37. package/dist/docs/tools/sdk.js +72 -0
  38. package/dist/docs/tools/sdk.js.map +1 -0
  39. package/dist/docs/tools/search.d.ts +11 -0
  40. package/dist/docs/tools/search.d.ts.map +1 -0
  41. package/dist/docs/tools/search.js +36 -0
  42. package/dist/docs/tools/search.js.map +1 -0
  43. package/dist/docs/types.d.ts +70 -0
  44. package/dist/docs/types.d.ts.map +1 -0
  45. package/dist/docs/types.js +8 -0
  46. package/dist/docs/types.js.map +1 -0
  47. package/dist/index.d.ts +9 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +622 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/prompts/debug.d.ts +16 -0
  52. package/dist/prompts/debug.d.ts.map +1 -0
  53. package/dist/prompts/debug.js +34 -0
  54. package/dist/prompts/debug.js.map +1 -0
  55. package/dist/prompts/integrate.d.ts +16 -0
  56. package/dist/prompts/integrate.d.ts.map +1 -0
  57. package/dist/prompts/integrate.js +30 -0
  58. package/dist/prompts/integrate.js.map +1 -0
  59. package/dist/prompts/review.d.ts +16 -0
  60. package/dist/prompts/review.d.ts.map +1 -0
  61. package/dist/prompts/review.js +28 -0
  62. package/dist/prompts/review.js.map +1 -0
  63. package/dist/resources/changelog.d.ts +22 -0
  64. package/dist/resources/changelog.d.ts.map +1 -0
  65. package/dist/resources/changelog.js +55 -0
  66. package/dist/resources/changelog.js.map +1 -0
  67. package/dist/resources/errors.d.ts +16 -0
  68. package/dist/resources/errors.d.ts.map +1 -0
  69. package/dist/resources/errors.js +103 -0
  70. package/dist/resources/errors.js.map +1 -0
  71. package/dist/resources/patterns.d.ts +16 -0
  72. package/dist/resources/patterns.d.ts.map +1 -0
  73. package/dist/resources/patterns.js +151 -0
  74. package/dist/resources/patterns.js.map +1 -0
  75. package/dist/templates/approval-workflow.d.ts +6 -0
  76. package/dist/templates/approval-workflow.d.ts.map +1 -0
  77. package/dist/templates/approval-workflow.js +467 -0
  78. package/dist/templates/approval-workflow.js.map +1 -0
  79. package/dist/templates/audit-trail.d.ts +6 -0
  80. package/dist/templates/audit-trail.d.ts.map +1 -0
  81. package/dist/templates/audit-trail.js +396 -0
  82. package/dist/templates/audit-trail.js.map +1 -0
  83. package/dist/templates/cli-tool.d.ts +6 -0
  84. package/dist/templates/cli-tool.d.ts.map +1 -0
  85. package/dist/templates/cli-tool.js +346 -0
  86. package/dist/templates/cli-tool.js.map +1 -0
  87. package/dist/templates/express-api.d.ts +6 -0
  88. package/dist/templates/express-api.d.ts.map +1 -0
  89. package/dist/templates/express-api.js +314 -0
  90. package/dist/templates/express-api.js.map +1 -0
  91. package/dist/templates/notary.d.ts +6 -0
  92. package/dist/templates/notary.d.ts.map +1 -0
  93. package/dist/templates/notary.js +360 -0
  94. package/dist/templates/notary.js.map +1 -0
  95. package/dist/test.d.ts +8 -0
  96. package/dist/test.d.ts.map +1 -0
  97. package/dist/test.js +140 -0
  98. package/dist/test.js.map +1 -0
  99. package/dist/tools/add-signing.d.ts +19 -0
  100. package/dist/tools/add-signing.d.ts.map +1 -0
  101. package/dist/tools/add-signing.js +317 -0
  102. package/dist/tools/add-signing.js.map +1 -0
  103. package/dist/tools/decode.d.ts +13 -0
  104. package/dist/tools/decode.d.ts.map +1 -0
  105. package/dist/tools/decode.js +262 -0
  106. package/dist/tools/decode.js.map +1 -0
  107. package/dist/tools/hierarchy.d.ts +13 -0
  108. package/dist/tools/hierarchy.d.ts.map +1 -0
  109. package/dist/tools/hierarchy.js +319 -0
  110. package/dist/tools/hierarchy.js.map +1 -0
  111. package/dist/tools/lint.d.ts +13 -0
  112. package/dist/tools/lint.d.ts.map +1 -0
  113. package/dist/tools/lint.js +323 -0
  114. package/dist/tools/lint.js.map +1 -0
  115. package/dist/tools/scaffold.d.ts +11 -0
  116. package/dist/tools/scaffold.d.ts.map +1 -0
  117. package/dist/tools/scaffold.js +84 -0
  118. package/dist/tools/scaffold.js.map +1 -0
  119. package/dist/tools/sign-test.d.ts +17 -0
  120. package/dist/tools/sign-test.d.ts.map +1 -0
  121. package/dist/tools/sign-test.js +126 -0
  122. package/dist/tools/sign-test.js.map +1 -0
  123. package/dist/tools/test-vectors.d.ts +13 -0
  124. package/dist/tools/test-vectors.d.ts.map +1 -0
  125. package/dist/tools/test-vectors.js +169 -0
  126. package/dist/tools/test-vectors.js.map +1 -0
  127. package/dist/tools/verify-local.d.ts +17 -0
  128. package/dist/tools/verify-local.d.ts.map +1 -0
  129. package/dist/tools/verify-local.js +233 -0
  130. package/dist/tools/verify-local.js.map +1 -0
  131. package/dist/tools/verify-test.d.ts +17 -0
  132. package/dist/tools/verify-test.d.ts.map +1 -0
  133. package/dist/tools/verify-test.js +107 -0
  134. package/dist/tools/verify-test.js.map +1 -0
  135. package/package.json +54 -0
@@ -0,0 +1,323 @@
1
+ /**
2
+ * blink_lint tool handler.
3
+ *
4
+ * Analyses code for BLINK integration best practices using
5
+ * regex/pattern matching (no AST). Supports 8 rules.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Helper: find line number for a match index
9
+ // ---------------------------------------------------------------------------
10
+ function lineOfIndex(code, index) {
11
+ let line = 1;
12
+ for (let i = 0; i < index && i < code.length; i++) {
13
+ if (code[i] === '\n')
14
+ line++;
15
+ }
16
+ return line;
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Helper: check if a position is inside a try block (approximate)
20
+ // ---------------------------------------------------------------------------
21
+ function isInsideTry(code, index) {
22
+ // Look backwards from index for 'try' followed by '{' before any '}'
23
+ const before = code.substring(0, index);
24
+ const lastTry = before.lastIndexOf('try');
25
+ if (lastTry === -1)
26
+ return false;
27
+ const afterTry = before.substring(lastTry);
28
+ const braceOpen = afterTry.indexOf('{');
29
+ if (braceOpen === -1)
30
+ return false;
31
+ // Count braces between try's { and our index
32
+ let depth = 0;
33
+ for (let i = lastTry + braceOpen; i < index; i++) {
34
+ if (code[i] === '{')
35
+ depth++;
36
+ if (code[i] === '}')
37
+ depth--;
38
+ }
39
+ return depth > 0;
40
+ }
41
+ // ---------------------------------------------------------------------------
42
+ // Rule definitions
43
+ // ---------------------------------------------------------------------------
44
+ const RULES = [
45
+ // Rule 1: no-shutdown-handler
46
+ {
47
+ id: 'no-shutdown-handler',
48
+ severity: 'error',
49
+ check(lines, code) {
50
+ const hasConnect = /BlinkSigner\.connect/i.test(code);
51
+ const hasSigint = /process\.on\s*\(\s*['"]SIGINT['"]/i.test(code);
52
+ const hasSigterm = /process\.on\s*\(\s*['"]SIGTERM['"]/i.test(code);
53
+ if (hasConnect && !hasSigint && !hasSigterm) {
54
+ const match = code.match(/BlinkSigner\.connect/i);
55
+ const line = match ? lineOfIndex(code, match.index) : 1;
56
+ return [{
57
+ rule: 'no-shutdown-handler',
58
+ severity: 'error',
59
+ line,
60
+ message: 'BlinkSigner.connect() is called but no SIGINT/SIGTERM handler calls signer.close(). ' +
61
+ 'The BSEC connection will leak on process exit.',
62
+ suggestion: 'Add process.on("SIGINT", async () => { await signer.close(); process.exit(0); }) ' +
63
+ 'and the same for SIGTERM.',
64
+ }];
65
+ }
66
+ return [];
67
+ },
68
+ },
69
+ // Rule 2: signer-after-close
70
+ {
71
+ id: 'signer-after-close',
72
+ severity: 'error',
73
+ check(lines, code) {
74
+ const findings = [];
75
+ // Look for .close() followed by .sign( in the same scope
76
+ const closePattern = /\.close\s*\(\s*\)/g;
77
+ let closeMatch;
78
+ while ((closeMatch = closePattern.exec(code)) !== null) {
79
+ const afterClose = code.substring(closeMatch.index + closeMatch[0].length);
80
+ const signMatch = afterClose.match(/\.sign\s*\(/);
81
+ if (signMatch) {
82
+ // Check they're not in different functions (rough heuristic: no function/=> between them)
83
+ const between = afterClose.substring(0, signMatch.index);
84
+ const hasFuncBoundary = /(?:function\s|=>\s*\{|async\s+function)/.test(between);
85
+ if (!hasFuncBoundary) {
86
+ findings.push({
87
+ rule: 'signer-after-close',
88
+ severity: 'error',
89
+ line: lineOfIndex(code, closeMatch.index),
90
+ message: 'signer.sign() is called after signer.close() in what appears to be the same scope. ' +
91
+ 'The signer connection is no longer active.',
92
+ suggestion: 'Move the sign() call before close(), or create a new connection.',
93
+ });
94
+ }
95
+ }
96
+ }
97
+ return findings;
98
+ },
99
+ },
100
+ // Rule 3: envelope-not-base64
101
+ {
102
+ id: 'envelope-not-base64',
103
+ severity: 'warning',
104
+ check(lines, code) {
105
+ const findings = [];
106
+ const pattern = /toString\s*\(\s*['"]hex['"]\s*\)/g;
107
+ let match;
108
+ while ((match = pattern.exec(code)) !== null) {
109
+ // Check if "envelope" is mentioned nearby (within 200 chars before)
110
+ const before = code.substring(Math.max(0, match.index - 200), match.index);
111
+ if (/envelope/i.test(before)) {
112
+ findings.push({
113
+ rule: 'envelope-not-base64',
114
+ severity: 'warning',
115
+ line: lineOfIndex(code, match.index),
116
+ message: 'Envelope appears to be converted to hex instead of base64. ' +
117
+ 'BLINK envelopes should be transmitted as base64.',
118
+ suggestion: 'Use .toString("base64") instead of .toString("hex") for envelope encoding.',
119
+ });
120
+ }
121
+ }
122
+ return findings;
123
+ },
124
+ },
125
+ // Rule 4: no-sign-error-handling
126
+ {
127
+ id: 'no-sign-error-handling',
128
+ severity: 'warning',
129
+ check(lines, code) {
130
+ const findings = [];
131
+ const pattern = /\.sign\s*\(/g;
132
+ let match;
133
+ while ((match = pattern.exec(code)) !== null) {
134
+ // Skip if it's part of 'assign' or 'design' etc.
135
+ const charBefore = match.index > 0 ? code[match.index - 1] : '';
136
+ if (/[a-zA-Z]/.test(charBefore))
137
+ continue;
138
+ if (!isInsideTry(code, match.index)) {
139
+ findings.push({
140
+ rule: 'no-sign-error-handling',
141
+ severity: 'warning',
142
+ line: lineOfIndex(code, match.index),
143
+ message: 'signer.sign() is called without a try/catch block. Signing can fail due to ' +
144
+ 'network issues, expired sessions, or invalid slots.',
145
+ suggestion: 'Wrap the sign() call in a try/catch block and handle BSEC errors gracefully.',
146
+ });
147
+ }
148
+ }
149
+ return findings;
150
+ },
151
+ },
152
+ // Rule 5: vrf-key-not-cached
153
+ {
154
+ id: 'vrf-key-not-cached',
155
+ severity: 'warning',
156
+ check(lines, code) {
157
+ const findings = [];
158
+ const pattern = /vrfPublicKey\s*\(\s*\)/g;
159
+ let match;
160
+ while ((match = pattern.exec(code)) !== null) {
161
+ // Check if inside a route/request handler (look for app.get, app.post, router., req, res nearby)
162
+ const before = code.substring(Math.max(0, match.index - 500), match.index);
163
+ const isInHandler = /(?:app\.\w+\s*\(|router\.\w+\s*\(|req\s*,\s*res|request\s*,\s*response)/i.test(before);
164
+ if (isInHandler) {
165
+ findings.push({
166
+ rule: 'vrf-key-not-cached',
167
+ severity: 'warning',
168
+ line: lineOfIndex(code, match.index),
169
+ message: 'vrfPublicKey() is called inside what appears to be a request handler. ' +
170
+ 'This makes a round-trip to BSEC on every request.',
171
+ suggestion: 'Cache the VRF public key at startup: const vrfKey = await signer.vrfPublicKey(); ' +
172
+ 'Then use the cached value in request handlers.',
173
+ });
174
+ }
175
+ }
176
+ return findings;
177
+ },
178
+ },
179
+ // Rule 6: algorithm-not-explicit
180
+ {
181
+ id: 'algorithm-not-explicit',
182
+ severity: 'info',
183
+ check(lines, code) {
184
+ const findings = [];
185
+ const pattern = /BlinkSigner\.connect\s*\([^)]*\)/g;
186
+ let match;
187
+ while ((match = pattern.exec(code)) !== null) {
188
+ const argsStr = match[0];
189
+ // Count commas to estimate number of arguments
190
+ const commas = (argsStr.match(/,/g) || []).length;
191
+ // Also check if AlgoSuiteId is mentioned
192
+ const hasAlgo = /AlgoSuiteId|algorithm|algo/i.test(argsStr);
193
+ if (commas < 2 && !hasAlgo) {
194
+ findings.push({
195
+ rule: 'algorithm-not-explicit',
196
+ severity: 'info',
197
+ line: lineOfIndex(code, match.index),
198
+ message: 'BlinkSigner.connect() is called without an explicit algorithm suite. ' +
199
+ 'The default (Ed25519) will be used.',
200
+ suggestion: 'Consider specifying the algorithm explicitly: ' +
201
+ 'BlinkSigner.connect(url, token, AlgoSuiteId.Ed25519) for clarity.',
202
+ });
203
+ }
204
+ }
205
+ return findings;
206
+ },
207
+ },
208
+ // Rule 7: tls-reject-unhandled
209
+ {
210
+ id: 'tls-reject-unhandled',
211
+ severity: 'warning',
212
+ check(lines, code) {
213
+ const findings = [];
214
+ const pattern = /BlinkSigner\.connect\s*\(\s*['"`]https:\/\//g;
215
+ let match;
216
+ while ((match = pattern.exec(code)) !== null) {
217
+ const hasTlsVar = /NODE_TLS_REJECT_UNAUTHORIZED/i.test(code);
218
+ const hasTlsOption = /rejectUnauthorized|tlsOptions|tls:/i.test(code);
219
+ if (!hasTlsVar && !hasTlsOption) {
220
+ findings.push({
221
+ rule: 'tls-reject-unhandled',
222
+ severity: 'warning',
223
+ line: lineOfIndex(code, match.index),
224
+ message: 'Connecting to BSEC over HTTPS but no TLS certificate handling is visible. ' +
225
+ 'Self-signed BSEC certificates will cause connection failures.',
226
+ suggestion: 'For self-signed BSEC certificates, set NODE_TLS_REJECT_UNAUTHORIZED="0" ' +
227
+ 'in development or provide a CA certificate bundle.',
228
+ });
229
+ }
230
+ }
231
+ return findings;
232
+ },
233
+ },
234
+ // Rule 8: sync-in-signing-path
235
+ {
236
+ id: 'sync-in-signing-path',
237
+ severity: 'warning',
238
+ check(lines, code) {
239
+ const findings = [];
240
+ const hasSign = /\.sign\s*\(/g.test(code);
241
+ if (!hasSign)
242
+ return [];
243
+ const syncPattern = /(?:readFileSync|writeFileSync|execSync|accessSync)\s*\(/g;
244
+ let match;
245
+ while ((match = syncPattern.exec(code)) !== null) {
246
+ findings.push({
247
+ rule: 'sync-in-signing-path',
248
+ severity: 'warning',
249
+ line: lineOfIndex(code, match.index),
250
+ message: `Synchronous operation "${match[0].replace('(', '')}" found in a file that also uses signer.sign(). ` +
251
+ 'Synchronous I/O blocks the event loop and can cause BSEC timeouts.',
252
+ suggestion: 'Use async alternatives (readFile, writeFile, exec) to avoid blocking the event loop.',
253
+ });
254
+ }
255
+ return findings;
256
+ },
257
+ },
258
+ ];
259
+ // ---------------------------------------------------------------------------
260
+ // Handler
261
+ // ---------------------------------------------------------------------------
262
+ export function handleLint(args) {
263
+ const code = args.code;
264
+ // language arg accepted but rules currently target JS/TS patterns
265
+ // const language = ((args.language as string) || 'typescript').toLowerCase();
266
+ if (!code || typeof code !== 'string' || code.trim() === '') {
267
+ return {
268
+ content: [{
269
+ type: 'text',
270
+ text: JSON.stringify({
271
+ error: 'Missing or empty "code" parameter. Provide source code to analyse.',
272
+ }),
273
+ }],
274
+ };
275
+ }
276
+ const lines = code.split('\n');
277
+ const allFindings = [];
278
+ for (const rule of RULES) {
279
+ try {
280
+ const findings = rule.check(lines, code);
281
+ allFindings.push(...findings);
282
+ }
283
+ catch {
284
+ // Rule failed — skip silently
285
+ }
286
+ }
287
+ // Sort by severity (error > warning > info), then by line
288
+ const severityOrder = { error: 0, warning: 1, info: 2 };
289
+ allFindings.sort((a, b) => {
290
+ const sevDiff = severityOrder[a.severity] - severityOrder[b.severity];
291
+ if (sevDiff !== 0)
292
+ return sevDiff;
293
+ return a.line - b.line;
294
+ });
295
+ // Summary
296
+ const errors = allFindings.filter((f) => f.severity === 'error').length;
297
+ const warnings = allFindings.filter((f) => f.severity === 'warning').length;
298
+ const infos = allFindings.filter((f) => f.severity === 'info').length;
299
+ let summary;
300
+ if (allFindings.length === 0) {
301
+ summary = 'No BLINK integration issues found. Code follows best practices.';
302
+ }
303
+ else {
304
+ const parts = [];
305
+ if (errors > 0)
306
+ parts.push(`${errors} error${errors > 1 ? 's' : ''}`);
307
+ if (warnings > 0)
308
+ parts.push(`${warnings} warning${warnings > 1 ? 's' : ''}`);
309
+ if (infos > 0)
310
+ parts.push(`${infos} info${infos > 1 ? 's' : ''}`);
311
+ summary = `Found ${allFindings.length} issue${allFindings.length > 1 ? 's' : ''}: ${parts.join(', ')}.`;
312
+ if (errors > 0) {
313
+ summary += ' Fix errors first — they indicate likely runtime failures.';
314
+ }
315
+ }
316
+ return {
317
+ content: [{
318
+ type: 'text',
319
+ text: JSON.stringify({ findings: allFindings, summary }, null, 2),
320
+ }],
321
+ };
322
+ }
323
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAC9E,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,qEAAqE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAEnC,6CAA6C;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAC9E,MAAM,KAAK,GAAe;IACxB,8BAA8B;IAC9B;QACE,EAAE,EAAE,qBAAqB;QACzB,QAAQ,EAAE,OAAO;QACjB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpE,IAAI,UAAU,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC;wBACN,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,OAAO;wBACjB,IAAI;wBACJ,OAAO,EACL,sFAAsF;4BACtF,gDAAgD;wBAClD,UAAU,EACR,mFAAmF;4BACnF,2BAA2B;qBAC9B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;KACF;IAED,6BAA6B;IAC7B;QACE,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EAAE,OAAO;QACjB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,yDAAyD;YACzD,MAAM,YAAY,GAAG,oBAAoB,CAAC;YAC1C,IAAI,UAAkC,CAAC;YAEvC,OAAO,CAAC,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAClD,IAAI,SAAS,EAAE,CAAC;oBACd,0FAA0F;oBAC1F,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;oBACzD,MAAM,eAAe,GAAG,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAChF,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,oBAAoB;4BAC1B,QAAQ,EAAE,OAAO;4BACjB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;4BACzC,OAAO,EACL,qFAAqF;gCACrF,4CAA4C;4BAC9C,UAAU,EACR,kEAAkE;yBACrE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,8BAA8B;IAC9B;QACE,EAAE,EAAE,qBAAqB;QACzB,QAAQ,EAAE,SAAS;QACnB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,mCAAmC,CAAC;YACpD,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7C,oEAAoE;gBACpE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3E,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;wBACpC,OAAO,EACL,6DAA6D;4BAC7D,kDAAkD;wBACpD,UAAU,EAAE,4EAA4E;qBACzF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,iCAAiC;IACjC;QACE,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,SAAS;QACnB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,cAAc,CAAC;YAC/B,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7C,iDAAiD;gBACjD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;oBAAE,SAAS;gBAE1C,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,wBAAwB;wBAC9B,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;wBACpC,OAAO,EACL,6EAA6E;4BAC7E,qDAAqD;wBACvD,UAAU,EACR,8EAA8E;qBACjF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,6BAA6B;IAC7B;QACE,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EAAE,SAAS;QACnB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,yBAAyB,CAAC;YAC1C,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7C,iGAAiG;gBACjG,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3E,MAAM,WAAW,GAAG,0EAA0E,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE5G,IAAI,WAAW,EAAE,CAAC;oBAChB,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,oBAAoB;wBAC1B,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;wBACpC,OAAO,EACL,wEAAwE;4BACxE,mDAAmD;wBACrD,UAAU,EACR,mFAAmF;4BACnF,gDAAgD;qBACnD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,iCAAiC;IACjC;QACE,EAAE,EAAE,wBAAwB;QAC5B,QAAQ,EAAE,MAAM;QAChB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,mCAAmC,CAAC;YACpD,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,+CAA+C;gBAC/C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAClD,yCAAyC;gBACzC,MAAM,OAAO,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAE5D,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,wBAAwB;wBAC9B,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;wBACpC,OAAO,EACL,uEAAuE;4BACvE,qCAAqC;wBACvC,UAAU,EACR,gDAAgD;4BAChD,mEAAmE;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,+BAA+B;IAC/B;QACE,EAAE,EAAE,sBAAsB;QAC1B,QAAQ,EAAE,SAAS;QACnB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,8CAA8C,CAAC;YAC/D,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAG,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7D,MAAM,YAAY,GAAG,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEtE,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,sBAAsB;wBAC5B,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;wBACpC,OAAO,EACL,4EAA4E;4BAC5E,+DAA+D;wBACjE,UAAU,EACR,0EAA0E;4BAC1E,oDAAoD;qBACvD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IAED,+BAA+B;IAC/B;QACE,EAAE,EAAE,sBAAsB;QAC1B,QAAQ,EAAE,SAAS;QACnB,KAAK,CAAC,KAAe,EAAE,IAAY;YACjC,MAAM,QAAQ,GAAkB,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YAExB,MAAM,WAAW,GAAG,0DAA0D,CAAC;YAC/E,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,sBAAsB;oBAC5B,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;oBACpC,OAAO,EACL,0BAA0B,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,kDAAkD;wBACrG,oEAAoE;oBACtE,UAAU,EACR,sFAAsF;iBACzF,CAAC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;CACF,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CACxB,IAA6B;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;IAC7C,kEAAkE;IAClE,8EAA8E;IAE9E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,oEAAoE;qBAC5E,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAkB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,aAAa,GAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAChF,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAClC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,UAAU;IACV,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAEtE,IAAI,OAAe,CAAC;IACpB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAG,iEAAiE,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,QAAQ,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,SAAS,WAAW,CAAC,MAAM,SAAS,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACxG,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,4DAA4D,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aAClE,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * blink_scaffold tool handler.
3
+ * Dispatches to the appropriate template generator based on the requested template.
4
+ */
5
+ export declare function handleScaffold(args: Record<string, unknown>): {
6
+ content: Array<{
7
+ type: string;
8
+ text: string;
9
+ }>;
10
+ };
11
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4CH,wBAAgB,cAAc,CAC5B,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,CAmDpD"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * blink_scaffold tool handler.
3
+ * Dispatches to the appropriate template generator based on the requested template.
4
+ */
5
+ import { generateExpressApi } from '../templates/express-api.js';
6
+ import { generateCliTool } from '../templates/cli-tool.js';
7
+ import { generateNotary } from '../templates/notary.js';
8
+ import { generateAuditTrail } from '../templates/audit-trail.js';
9
+ import { generateApprovalWorkflow } from '../templates/approval-workflow.js';
10
+ const TEMPLATE_GENERATORS = {
11
+ 'express-api': generateExpressApi,
12
+ 'cli-tool': generateCliTool,
13
+ 'notary': generateNotary,
14
+ 'audit-trail': generateAuditTrail,
15
+ 'approval-workflow': generateApprovalWorkflow,
16
+ };
17
+ const TEMPLATE_INSTRUCTIONS = {
18
+ 'express-api': '1. Run `npm install`\n' +
19
+ '2. Copy `.env.example` to `.env` and configure your BSEC connection\n' +
20
+ '3. Run `npm run dev` to start the development server\n' +
21
+ '4. Add your API routes in `src/server.ts` — all JSON responses will be auto-signed',
22
+ 'cli-tool': '1. Run `npm install`\n' +
23
+ '2. Run `npm run build && npm link` to install globally\n' +
24
+ '3. Use `<name> sign -f <file>` to sign a file\n' +
25
+ '4. Use `<name> verify -f <file> -e <envelope> -k <key>` to verify',
26
+ 'notary': '1. Run `npm install`\n' +
27
+ '2. Copy `.env.example` to `.env` and configure your BSEC connection\n' +
28
+ '3. Run `npm run dev`\n' +
29
+ '4. POST a file to `/notarize` to get a notarization certificate',
30
+ 'audit-trail': '1. Run `npm install`\n' +
31
+ '2. Copy `.env.example` to `.env` and configure your BSEC connection\n' +
32
+ '3. Run `npm run dev`\n' +
33
+ '4. POST to `/entries` to create hash-chained audit entries',
34
+ 'approval-workflow': '1. Run `npm install`\n' +
35
+ '2. Copy `.env.example` to `.env` and configure your BSEC connection\n' +
36
+ '3. Run `npm run dev`\n' +
37
+ '4. POST to `/requests` to create an approval request, then POST to `/requests/:id/approve`',
38
+ };
39
+ export function handleScaffold(args) {
40
+ const template = String(args.template ?? '');
41
+ const name = String(args.name ?? '');
42
+ const features = args.features ?? ['graceful-shutdown', 'health-check'];
43
+ if (!template || !TEMPLATE_GENERATORS[template]) {
44
+ return {
45
+ content: [{
46
+ type: 'text',
47
+ text: JSON.stringify({
48
+ error: `Unknown template: "${template}". Valid templates: ${Object.keys(TEMPLATE_GENERATORS).join(', ')}`,
49
+ }),
50
+ }],
51
+ };
52
+ }
53
+ if (!name) {
54
+ return {
55
+ content: [{
56
+ type: 'text',
57
+ text: JSON.stringify({ error: 'Missing required parameter: name' }),
58
+ }],
59
+ };
60
+ }
61
+ const generator = TEMPLATE_GENERATORS[template];
62
+ const filesMap = generator(name, features);
63
+ // Convert Record<string, string> to the expected file array format
64
+ const files = Object.entries(filesMap).map(([path, content]) => ({
65
+ path,
66
+ content,
67
+ }));
68
+ const instructions = (TEMPLATE_INSTRUCTIONS[template] ?? '')
69
+ .replace(/<name>/g, name);
70
+ const response = {
71
+ files,
72
+ instructions,
73
+ template,
74
+ name,
75
+ features,
76
+ };
77
+ return {
78
+ content: [{
79
+ type: 'text',
80
+ text: JSON.stringify(response, null, 2),
81
+ }],
82
+ };
83
+ }
84
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,MAAM,mBAAmB,GAAiF;IACxG,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,kBAAkB;IACjC,mBAAmB,EAAE,wBAAwB;CAC9C,CAAC;AAEF,MAAM,qBAAqB,GAA2B;IACpD,aAAa,EACX,wBAAwB;QACxB,uEAAuE;QACvE,wDAAwD;QACxD,oFAAoF;IACtF,UAAU,EACR,wBAAwB;QACxB,0DAA0D;QAC1D,iDAAiD;QACjD,mEAAmE;IACrE,QAAQ,EACN,wBAAwB;QACxB,uEAAuE;QACvE,wBAAwB;QACxB,iEAAiE;IACnE,aAAa,EACX,wBAAwB;QACxB,uEAAuE;QACvE,wBAAwB;QACxB,4DAA4D;IAC9D,mBAAmB,EACjB,wBAAwB;QACxB,uEAAuE;QACvE,wBAAwB;QACxB,4FAA4F;CAC/F,CAAC;AAEF,MAAM,UAAU,cAAc,CAC5B,IAA6B;IAE7B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAI,IAAI,CAAC,QAAiC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IAElG,IAAI,CAAC,QAAQ,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,sBAAsB,QAAQ,uBAAuB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBAC1G,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;iBACpE,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3C,mEAAmE;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI;QACJ,OAAO;KACR,CAAC,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;SACzD,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG;QACf,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,IAAI;QACJ,QAAQ;KACT,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * blink_sign_test tool handler.
3
+ *
4
+ * Live signing against a BSEC instance (connected mode).
5
+ * Requires --bsec-url and --bsec-token CLI arguments.
6
+ */
7
+ import { PluginBsecClient } from '../bsec-client.js';
8
+ type ToolResult = {
9
+ content: Array<{
10
+ type: string;
11
+ text: string;
12
+ }>;
13
+ isError?: boolean;
14
+ };
15
+ export declare function handleSignTest(args: Record<string, unknown>, bsecClient: PluginBsecClient | null): ToolResult | Promise<ToolResult>;
16
+ export {};
17
+ //# sourceMappingURL=sign-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-test.d.ts","sourceRoot":"","sources":["../../src/tools/sign-test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAOtE,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAKxF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAClC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgDlC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * blink_sign_test tool handler.
3
+ *
4
+ * Live signing against a BSEC instance (connected mode).
5
+ * Requires --bsec-url and --bsec-token CLI arguments.
6
+ */
7
+ import { BsecClientError } from '../bsec-client.js';
8
+ import { createHash } from 'crypto';
9
+ // ---------------------------------------------------------------------------
10
+ // Handler
11
+ // ---------------------------------------------------------------------------
12
+ export function handleSignTest(args, bsecClient) {
13
+ // Gate: connected mode required
14
+ if (!bsecClient) {
15
+ return {
16
+ content: [{
17
+ type: 'text',
18
+ text: JSON.stringify({
19
+ error: 'Connected mode not configured',
20
+ help: [
21
+ 'To enable live BSEC signing, start the plugin with:',
22
+ ' --bsec-url https://your-bsec-instance:8443',
23
+ ' --bsec-token YOUR_SESSION_TOKEN',
24
+ '',
25
+ 'Example Claude Code config (settings.json):',
26
+ '{',
27
+ ' "mcpServers": {',
28
+ ' "blink": {',
29
+ ' "command": "npx",',
30
+ ' "args": [',
31
+ ' "@blink-authority-com/claude-code-plugin",',
32
+ ' "--bsec-url", "https://localhost:8443",',
33
+ ' "--bsec-token", "your-session-token"',
34
+ ' ]',
35
+ ' }',
36
+ ' }',
37
+ '}',
38
+ ].join('\n'),
39
+ }, null, 2),
40
+ }],
41
+ isError: true,
42
+ };
43
+ }
44
+ const payload = args.payload;
45
+ if (!payload || typeof payload !== 'string' || payload.trim() === '') {
46
+ return {
47
+ content: [{
48
+ type: 'text',
49
+ text: JSON.stringify({ error: 'Missing or empty "payload" parameter.' }),
50
+ }],
51
+ isError: true,
52
+ };
53
+ }
54
+ const algorithm = args.algorithm || 'ed25519';
55
+ const algoSuiteId = algorithm.toLowerCase().includes('ml-dsa') ? 2 : 1;
56
+ return doSign(bsecClient, payload, algoSuiteId, algorithm);
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Async signing
60
+ // ---------------------------------------------------------------------------
61
+ async function doSign(client, payload, algoSuiteId, algorithm) {
62
+ const timestamp = new Date().toISOString();
63
+ const domainInput = `test:${timestamp}`;
64
+ // Hash the payload (SHA-256)
65
+ const payloadHash = createHash('sha256').update(payload, 'utf-8').digest('hex');
66
+ const payloadBuffer = Buffer.from(payloadHash, 'hex');
67
+ const startMs = Date.now();
68
+ let result;
69
+ try {
70
+ result = await client.vrfCompositeSign(payloadBuffer, domainInput, algoSuiteId);
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof BsecClientError
74
+ ? `BSEC returned status ${err.status}`
75
+ : 'Failed to connect to BSEC instance';
76
+ return {
77
+ content: [{
78
+ type: 'text',
79
+ text: JSON.stringify({
80
+ error: msg,
81
+ help: 'Ensure the BSEC instance is running and the session token is valid.',
82
+ }),
83
+ }],
84
+ isError: true,
85
+ };
86
+ }
87
+ const elapsedMs = Date.now() - startMs;
88
+ // Build the envelope
89
+ const envelope = {
90
+ signature: result.signature,
91
+ ephemeral_public_key: result.ephemeral_public_key,
92
+ vrf_proof: result.vrf_proof,
93
+ p_derive: result.p_derive,
94
+ domain_input: result.domain_input,
95
+ timestamp,
96
+ algorithm,
97
+ payload_hash: payloadHash,
98
+ algo_suite_id: result.algo_suite_id,
99
+ };
100
+ const envelopeB64 = Buffer.from(JSON.stringify(envelope)).toString('base64');
101
+ const response = {
102
+ warning: 'Data was sent to an external BSEC instance for signing.',
103
+ envelope_base64: envelopeB64,
104
+ envelope_decoded: envelope,
105
+ timing: {
106
+ elapsed_ms: elapsedMs,
107
+ timestamp,
108
+ },
109
+ field_explanations: {
110
+ signature: 'The Ed25519/ML-DSA digital signature over the payload hash, created by the ephemeral key.',
111
+ ephemeral_public_key: 'One-time public key derived from the VRF. Destroyed after signing.',
112
+ vrf_proof: 'Verifiable Random Function proof linking P_derive to the ephemeral key.',
113
+ p_derive: 'Persistent VRF public key (P_derive). Used to verify the proof chain.',
114
+ domain_input: 'Context string binding the signature to a specific purpose and time.',
115
+ payload_hash: 'SHA-256 hash of the original payload that was signed.',
116
+ algo_suite_id: '1 = Ed25519, 2 = ML-DSA-44 (post-quantum).',
117
+ },
118
+ };
119
+ return {
120
+ content: [{
121
+ type: 'text',
122
+ text: JSON.stringify(response, null, 2),
123
+ }],
124
+ };
125
+ }
126
+ //# sourceMappingURL=sign-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-test.js","sourceRoot":"","sources":["../../src/tools/sign-test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * blink_generate_test_vectors tool handler.
3
+ *
4
+ * Generates deterministic mock BLINK envelopes for unit testing.
5
+ * Uses seed-based pseudorandom generation for reproducibility.
6
+ */
7
+ export declare function handleGenerateTestVectors(args: Record<string, unknown>): {
8
+ content: Array<{
9
+ type: string;
10
+ text: string;
11
+ }>;
12
+ };
13
+ //# sourceMappingURL=test-vectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-vectors.d.ts","sourceRoot":"","sources":["../../src/tools/test-vectors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoDH,wBAAgB,yBAAyB,CACvC,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,CAwIpD"}