@npm-safe/core-dsh 1.0.5
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 +204 -0
- package/dist/index.d.ts +513 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +711 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +47 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +161 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/gemini.d.ts +47 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +165 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/llm-config.d.ts +97 -0
- package/dist/llm/llm-config.d.ts.map +1 -0
- package/dist/llm/llm-config.js +188 -0
- package/dist/llm/llm-config.js.map +1 -0
- package/dist/llm/parse.d.ts +95 -0
- package/dist/llm/parse.d.ts.map +1 -0
- package/dist/llm/parse.js +158 -0
- package/dist/llm/parse.js.map +1 -0
- package/dist/llm/provider.d.ts +122 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +206 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/registry/client.d.ts +164 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +378 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/types.d.ts +226 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +32 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/validator.d.ts +87 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +214 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/scanner/ci-scan.d.ts +82 -0
- package/dist/scanner/ci-scan.d.ts.map +1 -0
- package/dist/scanner/ci-scan.js +130 -0
- package/dist/scanner/ci-scan.js.map +1 -0
- package/dist/scanner/rule-config.d.ts +61 -0
- package/dist/scanner/rule-config.d.ts.map +1 -0
- package/dist/scanner/rule-config.js +103 -0
- package/dist/scanner/rule-config.js.map +1 -0
- package/dist/scanner/rule-loader.d.ts +28 -0
- package/dist/scanner/rule-loader.d.ts.map +1 -0
- package/dist/scanner/rule-loader.js +67 -0
- package/dist/scanner/rule-loader.js.map +1 -0
- package/dist/scanner/static-rules.d.ts +88 -0
- package/dist/scanner/static-rules.d.ts.map +1 -0
- package/dist/scanner/static-rules.js +723 -0
- package/dist/scanner/static-rules.js.map +1 -0
- package/dist/scanner/types.d.ts +177 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +53 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/scheduler/rate-limiter.d.ts +74 -0
- package/dist/scheduler/rate-limiter.d.ts.map +1 -0
- package/dist/scheduler/rate-limiter.js +182 -0
- package/dist/scheduler/rate-limiter.js.map +1 -0
- package/dist/scheduler/refresh-scheduler.d.ts +201 -0
- package/dist/scheduler/refresh-scheduler.d.ts.map +1 -0
- package/dist/scheduler/refresh-scheduler.js +295 -0
- package/dist/scheduler/refresh-scheduler.js.map +1 -0
- package/dist/store/cache-manager.d.ts +166 -0
- package/dist/store/cache-manager.d.ts.map +1 -0
- package/dist/store/cache-manager.js +356 -0
- package/dist/store/cache-manager.js.map +1 -0
- package/dist/store/database.d.ts +81 -0
- package/dist/store/database.d.ts.map +1 -0
- package/dist/store/database.js +182 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/schema.d.ts +42 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +126 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/translator/provider.d.ts +152 -0
- package/dist/translator/provider.d.ts.map +1 -0
- package/dist/translator/provider.js +159 -0
- package/dist/translator/provider.js.map +1 -0
- package/dist/translator/types.d.ts +83 -0
- package/dist/translator/types.d.ts.map +1 -0
- package/dist/translator/types.js +58 -0
- package/dist/translator/types.js.map +1 -0
- package/package.json +42 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified composition layer for @npm-safe/core.
|
|
3
|
+
*
|
|
4
|
+
* {@link NpmSafeEngine} combines the database, cache, registry client, rate
|
|
5
|
+
* limiter, static analyzer, and refresh scheduler into a single facade that
|
|
6
|
+
* exposes the full public API of the engine.
|
|
7
|
+
*
|
|
8
|
+
* @module index
|
|
9
|
+
*/
|
|
10
|
+
import type { SearchResult } from './registry/types.js';
|
|
11
|
+
import { type RuleDescriptor } from './scanner/static-rules.js';
|
|
12
|
+
import type { ScanRule } from './scanner/types.js';
|
|
13
|
+
import { SecurityLevel, Severity } from './scanner/types.js';
|
|
14
|
+
import type { StaticScanReport } from './scanner/types.js';
|
|
15
|
+
import type { LlmScanReport } from './scanner/types.js';
|
|
16
|
+
import { RuleConfigManager } from './scanner/rule-config.js';
|
|
17
|
+
import type { CiReport, CiScanOptions } from './scanner/ci-scan.js';
|
|
18
|
+
import type { LlmProviderOptions } from './llm/provider.js';
|
|
19
|
+
import type { LlmConfig, LlmStatus } from './llm/llm-config.js';
|
|
20
|
+
/**
|
|
21
|
+
* Options accepted by the {@link NpmSafeEngine} constructor.
|
|
22
|
+
*/
|
|
23
|
+
export interface NpmSafeEngineOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Filesystem path to the SQLite database file.
|
|
26
|
+
* @default './npm-safe.db'
|
|
27
|
+
*/
|
|
28
|
+
readonly dbPath?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Base URL of the npm registry.
|
|
31
|
+
* @default 'https://registry.npmjs.org'
|
|
32
|
+
*/
|
|
33
|
+
readonly registryUrl?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Token bucket refill rate (tokens per second).
|
|
36
|
+
* @default 5
|
|
37
|
+
*/
|
|
38
|
+
readonly rateLimit?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Maximum burst size for the token bucket.
|
|
41
|
+
* @default 10
|
|
42
|
+
*/
|
|
43
|
+
readonly rateLimitBurst?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Cache TTL for package metadata in milliseconds.
|
|
46
|
+
* @default 3600000 (1 hour)
|
|
47
|
+
*/
|
|
48
|
+
readonly cacheTtlMs?: number;
|
|
49
|
+
/**
|
|
50
|
+
* HTTP proxy URL used for registry requests (e.g.
|
|
51
|
+
* `http://127.0.0.1:7897`). When omitted, the conventional environment
|
|
52
|
+
* variables (`HTTPS_PROXY`, `HTTP_PROXY`, `ALL_PROXY`) are consulted.
|
|
53
|
+
*/
|
|
54
|
+
readonly proxy?: string;
|
|
55
|
+
/** Optional LLM security scanner configuration (OpenAI / Gemini / Anthropic). */
|
|
56
|
+
readonly llm?: LlmProviderOptions;
|
|
57
|
+
/**
|
|
58
|
+
* Path to the LLM provider configuration JSON file.
|
|
59
|
+
* @default '~/.npm-safe/llm.json'
|
|
60
|
+
*/
|
|
61
|
+
readonly llmConfigPath?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Path to the per-rule configuration JSON file.
|
|
64
|
+
* @default '~/.npm-safe/rules.json'
|
|
65
|
+
*/
|
|
66
|
+
readonly rulesConfigPath?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Directory scanned for third-party rule plugin files (`*.mjs` / `*.js`).
|
|
69
|
+
* @default '~/.npm-safe/rules/'
|
|
70
|
+
*/
|
|
71
|
+
readonly rulesDir?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Result of a {@link NpmSafeEngine.checkPackage} call.
|
|
75
|
+
*/
|
|
76
|
+
export interface CheckResult {
|
|
77
|
+
/** Name of the checked package. */
|
|
78
|
+
readonly packageName: string;
|
|
79
|
+
/** Whether the package exists on the registry. */
|
|
80
|
+
readonly exists: boolean;
|
|
81
|
+
/** The latest available version, or an empty string when `exists` is `false`. */
|
|
82
|
+
readonly latestVersion: string;
|
|
83
|
+
/** Security assessment of the package. */
|
|
84
|
+
readonly security: {
|
|
85
|
+
/** Overall security level derived from the combined scan. */
|
|
86
|
+
readonly overallLevel: SecurityLevel;
|
|
87
|
+
/** Numeric security score (0–100, higher is safer). */
|
|
88
|
+
readonly overallScore: number;
|
|
89
|
+
/** Full static scan report, or `null` if one is not available. */
|
|
90
|
+
readonly staticScan: StaticScanReport | null;
|
|
91
|
+
/** Optional semantic analysis from the configured LLM provider. */
|
|
92
|
+
readonly llmScan?: LlmScanReport;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Basic registry metadata, or `null` when the package does not exist.
|
|
96
|
+
*/
|
|
97
|
+
readonly registryInfo: {
|
|
98
|
+
/** Human-readable description of the package. */
|
|
99
|
+
readonly description: string;
|
|
100
|
+
/** URL to the package's homepage. */
|
|
101
|
+
readonly homepage: string;
|
|
102
|
+
/** Repository descriptor as a string (e.g. `"github:user/repo"`). */
|
|
103
|
+
readonly repository: string;
|
|
104
|
+
} | null;
|
|
105
|
+
/**
|
|
106
|
+
* ISO-8601 timestamp of when this result was last cached, or `null` when
|
|
107
|
+
* the exact cached-at time is not known (e.g. served from an earlier cache
|
|
108
|
+
* hit whose timestamp was not recorded).
|
|
109
|
+
*/
|
|
110
|
+
readonly cachedAt: string | null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Options accepted by {@link NpmSafeEngine.checkPackage}.
|
|
114
|
+
*/
|
|
115
|
+
export interface CheckPackageOptions {
|
|
116
|
+
/**
|
|
117
|
+
* When `true`, skip the ENTIRE cache-hit fast path (including
|
|
118
|
+
* `cache.getPackage`, `cache.getSecurityReport`, and
|
|
119
|
+
* `cache.getLlmScanReport`) and always execute the cache-miss path: fetch
|
|
120
|
+
* fresh metadata from the registry, persist it, re-run the static analyzer,
|
|
121
|
+
* persist the security report, and run the LLM scan. In other words,
|
|
122
|
+
* `forceRefresh` mirrors the stale-fetch path exactly. Useful when the
|
|
123
|
+
* caller knows the cached data is stale or wants to re-validate against the
|
|
124
|
+
* live registry regardless of TTL.
|
|
125
|
+
* @default false
|
|
126
|
+
*/
|
|
127
|
+
readonly forceRefresh?: boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Optional external abort signal. When supplied, the signal is forwarded
|
|
130
|
+
* to the registry fetch (`client.getPackageMetadata`) and the LLM scan so
|
|
131
|
+
* an abort during in-flight work settles the promise promptly with
|
|
132
|
+
* `DOMException('The operation was aborted.', 'AbortError')` (cooperative
|
|
133
|
+
* cancellation).
|
|
134
|
+
*/
|
|
135
|
+
readonly signal?: AbortSignal;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Options accepted by {@link NpmSafeEngine.checkPackages}.
|
|
139
|
+
*/
|
|
140
|
+
export interface BatchCheckOptions {
|
|
141
|
+
/**
|
|
142
|
+
* Maximum number of concurrent checks. Every check still consumes one
|
|
143
|
+
* token from the rate limiter.
|
|
144
|
+
* @default 5
|
|
145
|
+
*/
|
|
146
|
+
readonly concurrency?: number;
|
|
147
|
+
/**
|
|
148
|
+
* Optional external abort signal forwarded to each worker's
|
|
149
|
+
* {@link NpmSafeEngine.checkPackage} call. The worker loop short-circuits
|
|
150
|
+
* at the top of each iteration when this signal is aborted, so a long
|
|
151
|
+
* batch settles promptly instead of continuing to iterate.
|
|
152
|
+
*/
|
|
153
|
+
readonly signal?: AbortSignal;
|
|
154
|
+
/**
|
|
155
|
+
* Progress callback invoked after each package completes. `done` counts
|
|
156
|
+
* completed packages (both successes and failures); `total` is the input
|
|
157
|
+
* length.
|
|
158
|
+
*/
|
|
159
|
+
readonly onProgress?: (done: number, total: number, entry: BatchPackageResult) => void;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* One entry of the result array returned by
|
|
163
|
+
* {@link NpmSafeEngine.checkPackages}, in input order.
|
|
164
|
+
*/
|
|
165
|
+
export interface BatchPackageResult {
|
|
166
|
+
/** Input package name. */
|
|
167
|
+
readonly name: string;
|
|
168
|
+
/** Whether the check succeeded. */
|
|
169
|
+
readonly ok: boolean;
|
|
170
|
+
/** The check result when `ok` is `true`. */
|
|
171
|
+
readonly result?: CheckResult;
|
|
172
|
+
/** Error message when `ok` is `false`. */
|
|
173
|
+
readonly error?: string;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Unified facade that composes every @npm-safe/core module into a single
|
|
177
|
+
* public API surface.
|
|
178
|
+
*
|
|
179
|
+
* Construct an instance with optional {@link NpmSafeEngineOptions}, then use
|
|
180
|
+
* its methods to check, search, watch, refresh, and configure npm packages.
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```ts
|
|
184
|
+
* const engine = new NpmSafeEngine({ dbPath: './my-cache.db' });
|
|
185
|
+
* const result = await engine.checkPackage('lodash');
|
|
186
|
+
* console.log(result.security.overallLevel);
|
|
187
|
+
* await engine.close();
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
export declare class NpmSafeEngine {
|
|
191
|
+
/** Database connection manager. */
|
|
192
|
+
private readonly database;
|
|
193
|
+
/** Cache read/write layer. */
|
|
194
|
+
private readonly cache;
|
|
195
|
+
/** HTTP client for the npm registry. */
|
|
196
|
+
private readonly client;
|
|
197
|
+
/** Token bucket rate limiter. */
|
|
198
|
+
private readonly limiter;
|
|
199
|
+
/** Static analysis engine. */
|
|
200
|
+
private readonly analyzer;
|
|
201
|
+
/** Per-rule configuration (enabled / severity / options). */
|
|
202
|
+
private readonly ruleConfig;
|
|
203
|
+
/** Auto-refresh scheduler. */
|
|
204
|
+
private readonly scheduler;
|
|
205
|
+
/** LLM provider configuration manager. */
|
|
206
|
+
private readonly llmConfig;
|
|
207
|
+
/** Optional semantic security scanner. */
|
|
208
|
+
private llmProvider?;
|
|
209
|
+
/**
|
|
210
|
+
* @param options - Optional configuration overrides; see
|
|
211
|
+
* {@link NpmSafeEngineOptions} for available options.
|
|
212
|
+
*/
|
|
213
|
+
constructor(options?: NpmSafeEngineOptions);
|
|
214
|
+
/**
|
|
215
|
+
* Check a package by name, returning cached data if still fresh, or fetching
|
|
216
|
+
* from the registry, running static analysis, and caching the result.
|
|
217
|
+
*
|
|
218
|
+
* When the package does not exist on the registry (HTTP 404) the returned
|
|
219
|
+
* {@link CheckResult.exists} is `false` and the security / registry info
|
|
220
|
+
* fields are empty. All other errors (network failure, timeout, …) are
|
|
221
|
+
* rethrown so the caller can handle them appropriately.
|
|
222
|
+
*
|
|
223
|
+
* Pass `{ forceRefresh: true }` to skip the cache-hit fast path entirely
|
|
224
|
+
* and always re-fetch from the registry. Pass `{ signal }` to make the
|
|
225
|
+
* check cooperatively cancellable — an abort settles the promise promptly
|
|
226
|
+
* with `DOMException('The operation was aborted.', 'AbortError')`.
|
|
227
|
+
*
|
|
228
|
+
* @param name - Fully-qualified package name (scope included when scoped).
|
|
229
|
+
* @param options - Optional check options (forceRefresh, signal).
|
|
230
|
+
* @returns A promise that resolves to the check result.
|
|
231
|
+
*/
|
|
232
|
+
checkPackage(name: string, options?: CheckPackageOptions): Promise<CheckResult>;
|
|
233
|
+
/**
|
|
234
|
+
* Search the npm registry for packages matching a text query.
|
|
235
|
+
*
|
|
236
|
+
* @param query - Free-text search query.
|
|
237
|
+
* @param options - Optional search options. `options.size` caps the number
|
|
238
|
+
* of results (defaults to 20); `options.signal` is forwarded to the
|
|
239
|
+
* registry client for cooperative cancellation. Search is not cached, so
|
|
240
|
+
* there is no `forceRefresh` option here.
|
|
241
|
+
* @returns An array of search-result hits, ordered by relevance.
|
|
242
|
+
*/
|
|
243
|
+
searchPackages(query: string, options?: {
|
|
244
|
+
readonly size?: number;
|
|
245
|
+
readonly signal?: AbortSignal;
|
|
246
|
+
}): Promise<SearchResult[]>;
|
|
247
|
+
/**
|
|
248
|
+
* Check many packages in parallel with a shared concurrency cap.
|
|
249
|
+
*
|
|
250
|
+
* Every check consumes one token from the rate limiter, so the batch
|
|
251
|
+
* respects the configured request budget even when running concurrently.
|
|
252
|
+
* Individual failures are isolated: a package that throws (network error,
|
|
253
|
+
* timeout, …) yields a `{ ok: false, error }` entry instead of rejecting
|
|
254
|
+
* the whole batch. Use `checkPackage` when the raw error must propagate.
|
|
255
|
+
*
|
|
256
|
+
* @param names - Package names to check.
|
|
257
|
+
* @param options - Batch options (concurrency, progress callback).
|
|
258
|
+
* @returns One entry per input name, in input order.
|
|
259
|
+
*/
|
|
260
|
+
checkPackages(names: readonly string[], options?: BatchCheckOptions): Promise<BatchPackageResult[]>;
|
|
261
|
+
/**
|
|
262
|
+
* Scan a project's dependencies and return a CI report with a failure gate.
|
|
263
|
+
*
|
|
264
|
+
* Reads dependencies from `package.json` (or `package-lock.json` when
|
|
265
|
+
* `options.lockfile` is set), checks each one via {@link checkPackage}, and
|
|
266
|
+
* aggregates the results into a {@link CiReport}. The report's `failed` flag
|
|
267
|
+
* is `true` when any dependency reaches `options.failLevel` (inclusive) or
|
|
268
|
+
* when any check throws.
|
|
269
|
+
*
|
|
270
|
+
* This method is a pure computation — it does NOT log, format, or set process
|
|
271
|
+
* exit codes. The caller (CLI or plugin) renders the report and maps `failed`
|
|
272
|
+
* to an exit code.
|
|
273
|
+
*
|
|
274
|
+
* When `options.signal` is supplied, the loop short-circuits at the top of
|
|
275
|
+
* each iteration on abort and rejects with
|
|
276
|
+
* `DOMException('The operation was aborted.', 'AbortError')` so an aborted
|
|
277
|
+
* scan does not keep iterating deps (cooperative cancellation).
|
|
278
|
+
*
|
|
279
|
+
* @param options - Optional scan configuration. Defaults:
|
|
280
|
+
* `dir = process.cwd()`, `failLevel = SecurityLevel.Dangerous`.
|
|
281
|
+
* @returns A {@link CiReport} describing every checked dependency.
|
|
282
|
+
*/
|
|
283
|
+
ciScan(options?: CiScanOptions): Promise<CiReport>;
|
|
284
|
+
/**
|
|
285
|
+
* Returns the list of package names currently on the watchlist.
|
|
286
|
+
*
|
|
287
|
+
* @returns All watched package names, in insertion order.
|
|
288
|
+
*/
|
|
289
|
+
getWatchlist(): Promise<string[]>;
|
|
290
|
+
/**
|
|
291
|
+
* Add a package to the watchlist. Idempotent — adding a name that is already
|
|
292
|
+
* watched is a no-op.
|
|
293
|
+
*
|
|
294
|
+
* @param name - Fully-qualified package name to watch.
|
|
295
|
+
*/
|
|
296
|
+
addToWatchlist(name: string): Promise<void>;
|
|
297
|
+
/**
|
|
298
|
+
* Remove a package from the watchlist. No-op if the name was not watched.
|
|
299
|
+
*
|
|
300
|
+
* @param name - Fully-qualified package name to stop watching.
|
|
301
|
+
*/
|
|
302
|
+
removeFromWatchlist(name: string): Promise<void>;
|
|
303
|
+
/**
|
|
304
|
+
* Refresh a single package: fetch its latest metadata from the registry,
|
|
305
|
+
* re-run static analysis, and persist the results.
|
|
306
|
+
*
|
|
307
|
+
* Per-package failures are surfaced via the scheduler's `refresh:error`
|
|
308
|
+
* event and represented by a `false` result rather than thrown, so a
|
|
309
|
+
* failing package does not abort a batch. An external abort
|
|
310
|
+
* (`options.signal` aborted) propagates as
|
|
311
|
+
* `DOMException('The operation was aborted.', 'AbortError')`.
|
|
312
|
+
*
|
|
313
|
+
* @param name - Fully-qualified package name to refresh.
|
|
314
|
+
* @param options - Optional refresh options. `options.signal` is forwarded
|
|
315
|
+
* to the registry fetch and LLM scan.
|
|
316
|
+
*/
|
|
317
|
+
refreshPackage(name: string, options?: {
|
|
318
|
+
readonly signal?: AbortSignal;
|
|
319
|
+
}): Promise<boolean>;
|
|
320
|
+
/**
|
|
321
|
+
* Refresh every package whose cached metadata has passed its TTL.
|
|
322
|
+
*
|
|
323
|
+
* Packages are processed sequentially so the rate limiter is respected.
|
|
324
|
+
* When `options.signal` is supplied, the loop short-circuits at the top of
|
|
325
|
+
* each iteration on abort and rejects with
|
|
326
|
+
* `DOMException('The operation was aborted.', 'AbortError')`.
|
|
327
|
+
*
|
|
328
|
+
* @param options - Optional refresh options. `options.signal` is forwarded
|
|
329
|
+
* to each per-package refresh.
|
|
330
|
+
*/
|
|
331
|
+
refreshAll(options?: {
|
|
332
|
+
readonly signal?: AbortSignal;
|
|
333
|
+
}): Promise<boolean>;
|
|
334
|
+
/**
|
|
335
|
+
* Retrieve a setting value by key.
|
|
336
|
+
*
|
|
337
|
+
* @param key - Settings key.
|
|
338
|
+
* @returns The stored value, or `null` if the key is unset.
|
|
339
|
+
*/
|
|
340
|
+
getSetting(key: string): Promise<string | null>;
|
|
341
|
+
/**
|
|
342
|
+
* Upsert a setting value by key.
|
|
343
|
+
*
|
|
344
|
+
* @param key - Settings key.
|
|
345
|
+
* @param value - Value to persist.
|
|
346
|
+
*/
|
|
347
|
+
setSetting(key: string, value: string): Promise<void>;
|
|
348
|
+
/**
|
|
349
|
+
* Record a check into the persistent history database. Used by the CLI and
|
|
350
|
+
* the desktop extension so history is shared across both frontends.
|
|
351
|
+
*
|
|
352
|
+
* @param result - A check result for an existing package.
|
|
353
|
+
*/
|
|
354
|
+
recordCheckHistory(result: CheckResult): Promise<void>;
|
|
355
|
+
/**
|
|
356
|
+
* Append a raw history entry (newest-first, capped at 1000).
|
|
357
|
+
*/
|
|
358
|
+
recordHistoryEntry(entry: {
|
|
359
|
+
readonly packageName: string;
|
|
360
|
+
readonly level: string;
|
|
361
|
+
readonly score: number;
|
|
362
|
+
readonly timestamp: string;
|
|
363
|
+
}): Promise<void>;
|
|
364
|
+
/**
|
|
365
|
+
* Return the persistent check history, newest first (capped at 1000).
|
|
366
|
+
*/
|
|
367
|
+
getCheckHistory(limit?: number): Promise<ReadonlyArray<{
|
|
368
|
+
readonly packageName: string;
|
|
369
|
+
readonly level: string;
|
|
370
|
+
readonly score: number;
|
|
371
|
+
readonly timestamp: string;
|
|
372
|
+
}>>;
|
|
373
|
+
/**
|
|
374
|
+
* Clear the persistent check history.
|
|
375
|
+
*/
|
|
376
|
+
clearCheckHistory(): Promise<void>;
|
|
377
|
+
/**
|
|
378
|
+
* Register a scan rule at runtime. A rule with the same id replaces the
|
|
379
|
+
* existing one.
|
|
380
|
+
*
|
|
381
|
+
* @param rule - The rule to register.
|
|
382
|
+
*/
|
|
383
|
+
registerRule(rule: ScanRule): void;
|
|
384
|
+
/**
|
|
385
|
+
* Remove a scan rule by id.
|
|
386
|
+
*
|
|
387
|
+
* @param ruleId - Id of the rule to remove.
|
|
388
|
+
* @returns `true` if a rule was removed, `false` if no such rule exists.
|
|
389
|
+
*/
|
|
390
|
+
unregisterRule(ruleId: string): boolean;
|
|
391
|
+
/**
|
|
392
|
+
* Describe every registered rule with its effective status.
|
|
393
|
+
*
|
|
394
|
+
* @returns Rule descriptors in registration order.
|
|
395
|
+
*/
|
|
396
|
+
listRules(): RuleDescriptor[];
|
|
397
|
+
/**
|
|
398
|
+
* Enable or disable a rule (persisted in the rules config file).
|
|
399
|
+
*
|
|
400
|
+
* @param ruleId - Id of the rule.
|
|
401
|
+
* @param enabled - Whether the rule should run.
|
|
402
|
+
*/
|
|
403
|
+
setRuleEnabled(ruleId: string, enabled: boolean): void;
|
|
404
|
+
/**
|
|
405
|
+
* Override a rule's severity (persisted). Pass `undefined` to clear the
|
|
406
|
+
* override and return to the rule's default severity.
|
|
407
|
+
*
|
|
408
|
+
* @param ruleId - Id of the rule.
|
|
409
|
+
* @param severity - Severity override, or `undefined` to clear.
|
|
410
|
+
*/
|
|
411
|
+
setRuleSeverity(ruleId: string, severity: Severity | undefined): void;
|
|
412
|
+
/**
|
|
413
|
+
* Set free-form options for a rule (persisted). Rule implementations can
|
|
414
|
+
* read these via the rule config manager.
|
|
415
|
+
*
|
|
416
|
+
* @param ruleId - Id of the rule.
|
|
417
|
+
* @param options - Free-form options.
|
|
418
|
+
*/
|
|
419
|
+
setRuleOptions(ruleId: string, options: Readonly<Record<string, unknown>>): void;
|
|
420
|
+
/**
|
|
421
|
+
* Access the rule configuration manager for low-level inspection.
|
|
422
|
+
*
|
|
423
|
+
* @returns The rule configuration manager backing this engine.
|
|
424
|
+
*/
|
|
425
|
+
getRuleConfig(): RuleConfigManager;
|
|
426
|
+
/**
|
|
427
|
+
* Load third-party rules from a directory of ES module files.
|
|
428
|
+
*
|
|
429
|
+
* Each `*.mjs` / `*.js` file may export a `rule`, `rules`, or `default`
|
|
430
|
+
* binding holding one or more {@link ScanRule}s. Files that fail to load
|
|
431
|
+
* are skipped.
|
|
432
|
+
*
|
|
433
|
+
* @param dir - Directory to scan. Defaults to `~/.npm-safe/rules/`.
|
|
434
|
+
* @returns The number of rules loaded.
|
|
435
|
+
*/
|
|
436
|
+
loadRulePlugins(dir?: string): Promise<number>;
|
|
437
|
+
/**
|
|
438
|
+
* Get the raw LLM configuration, including the API key.
|
|
439
|
+
*
|
|
440
|
+
* @returns The current persisted LLM config.
|
|
441
|
+
*/
|
|
442
|
+
getLlmConfig(): LlmConfig;
|
|
443
|
+
/**
|
|
444
|
+
* Get a masked, display-safe view of the LLM status.
|
|
445
|
+
*
|
|
446
|
+
* @returns Status object safe to render in a UI.
|
|
447
|
+
*/
|
|
448
|
+
getLlmStatus(): LlmStatus;
|
|
449
|
+
/**
|
|
450
|
+
* Update the LLM configuration and recreate the provider.
|
|
451
|
+
*
|
|
452
|
+
* The change is persisted immediately. If LLM scanning is disabled or no
|
|
453
|
+
* API key is available, the provider is set to `undefined` so the rest of the
|
|
454
|
+
* engine continues unaffected.
|
|
455
|
+
*
|
|
456
|
+
* @param update - Partial config update. Pass `{ enabled: false }` to disable.
|
|
457
|
+
*/
|
|
458
|
+
setLlmConfig(update: Partial<LlmConfig>): void;
|
|
459
|
+
/**
|
|
460
|
+
* Test whether the current LLM configuration can connect to its provider.
|
|
461
|
+
*
|
|
462
|
+
* @returns `true` if the provider is enabled, configured, and the test call
|
|
463
|
+
* succeeds; `false` otherwise.
|
|
464
|
+
*/
|
|
465
|
+
testLlmConnection(): Promise<boolean>;
|
|
466
|
+
/**
|
|
467
|
+
* Start the periodic auto-refresh loop.
|
|
468
|
+
*
|
|
469
|
+
* The first refresh cycle kicks off immediately in the background; subsequent
|
|
470
|
+
* cycles repeat at `intervalMs`. Safe to call multiple times — calling while
|
|
471
|
+
* already running resets the interval.
|
|
472
|
+
*
|
|
473
|
+
* @param intervalMs - Milliseconds between refresh cycles.
|
|
474
|
+
* Defaults to 1 hour.
|
|
475
|
+
*/
|
|
476
|
+
startAutoRefresh(intervalMs?: number): void;
|
|
477
|
+
/**
|
|
478
|
+
* Stop the periodic auto-refresh loop.
|
|
479
|
+
*
|
|
480
|
+
* Safe to call when the scheduler is not running. Any in-flight refresh
|
|
481
|
+
* continues to completion.
|
|
482
|
+
*/
|
|
483
|
+
stopAutoRefresh(): void;
|
|
484
|
+
/**
|
|
485
|
+
* Release all resources held by the engine.
|
|
486
|
+
*
|
|
487
|
+
* Stops the auto-refresh scheduler, disposes the rate-limiter timer, and
|
|
488
|
+
* closes the database connection. After calling this method the engine
|
|
489
|
+
* instance must not be used for further operations.
|
|
490
|
+
*/
|
|
491
|
+
close(): void;
|
|
492
|
+
/**
|
|
493
|
+
* Assemble a {@link CheckResult} from its constituent parts.
|
|
494
|
+
*/
|
|
495
|
+
private buildCheckResult;
|
|
496
|
+
private scanWithLlm;
|
|
497
|
+
}
|
|
498
|
+
export { createLlmProvider, LlmProviderError } from './llm/provider.js';
|
|
499
|
+
export type { LlmProviderOptions, LlmScanInput, LlmScanProvider, } from './llm/provider.js';
|
|
500
|
+
export { LlmConfigManager, getDefaultLlmConfigPath } from './llm/llm-config.js';
|
|
501
|
+
export type { LlmConfig, LlmStatus } from './llm/llm-config.js';
|
|
502
|
+
export { RuleConfigManager } from './scanner/rule-config.js';
|
|
503
|
+
export type { RuleConfig, RuleConfigFile, RuleOptions } from './scanner/rule-config.js';
|
|
504
|
+
export { loadRulesFromDirectory } from './scanner/rule-loader.js';
|
|
505
|
+
export type { LoadedRuleFile, RuleModuleExport } from './scanner/rule-loader.js';
|
|
506
|
+
export type { RuleDescriptor } from './scanner/static-rules.js';
|
|
507
|
+
export { DatabaseManager } from './store/database.js';
|
|
508
|
+
export { CacheManager, DEFAULT_CACHE_TTL_MS, MAX_CHECK_HISTORY } from './store/cache-manager.js';
|
|
509
|
+
export type { CacheManagerOptions } from './store/cache-manager.js';
|
|
510
|
+
export { SecurityLevel, Severity } from './scanner/types.js';
|
|
511
|
+
export { LEVEL_RANK, readDependencies, readLockfileDependencies } from './scanner/ci-scan.js';
|
|
512
|
+
export type { CiReport, CiScanOptions, PackageResult, Dependency } from './scanner/ci-scan.js';
|
|
513
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|