@skillsmith/core 0.10.0 → 0.11.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/CHANGELOG.md +4 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +23 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +137 -0
- package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -1
- package/dist/src/analysis/tree-sitter/pythonIncremental.js +83 -10
- package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +6 -1
- package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -1
- package/dist/src/config/audit-notify-state.d.ts +46 -0
- package/dist/src/config/audit-notify-state.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.js +55 -0
- package/dist/src/config/audit-notify-state.js.map +1 -0
- package/dist/src/config/audit-notify-state.test.d.ts +9 -0
- package/dist/src/config/audit-notify-state.test.d.ts.map +1 -0
- package/dist/src/config/audit-notify-state.test.js +63 -0
- package/dist/src/config/audit-notify-state.test.js.map +1 -0
- package/dist/src/config/index.d.ts +10 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/exports/services.d.ts +1 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +3 -1
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/logging/context.d.ts +58 -0
- package/dist/src/logging/context.d.ts.map +1 -0
- package/dist/src/logging/context.js +62 -0
- package/dist/src/logging/context.js.map +1 -0
- package/dist/src/logging/context.test.d.ts +14 -0
- package/dist/src/logging/context.test.d.ts.map +1 -0
- package/dist/src/logging/context.test.js +88 -0
- package/dist/src/logging/context.test.js.map +1 -0
- package/dist/src/logging/index.d.ts +13 -0
- package/dist/src/logging/index.d.ts.map +1 -0
- package/dist/src/logging/index.js +12 -0
- package/dist/src/logging/index.js.map +1 -0
- package/dist/src/logging/logger.d.ts +71 -0
- package/dist/src/logging/logger.d.ts.map +1 -0
- package/dist/src/logging/logger.js +264 -0
- package/dist/src/logging/logger.js.map +1 -0
- package/dist/src/logging/logger.test.d.ts +9 -0
- package/dist/src/logging/logger.test.d.ts.map +1 -0
- package/dist/src/logging/logger.test.js +320 -0
- package/dist/src/logging/logger.test.js.map +1 -0
- package/dist/src/logging/redact.d.ts +35 -0
- package/dist/src/logging/redact.d.ts.map +1 -0
- package/dist/src/logging/redact.js +152 -0
- package/dist/src/logging/redact.js.map +1 -0
- package/dist/src/logging/redact.test.d.ts +8 -0
- package/dist/src/logging/redact.test.d.ts.map +1 -0
- package/dist/src/logging/redact.test.js +330 -0
- package/dist/src/logging/redact.test.js.map +1 -0
- package/dist/src/logging/rotation.d.ts +75 -0
- package/dist/src/logging/rotation.d.ts.map +1 -0
- package/dist/src/logging/rotation.js +284 -0
- package/dist/src/logging/rotation.js.map +1 -0
- package/dist/src/logging/rotation.test.d.ts +11 -0
- package/dist/src/logging/rotation.test.d.ts.map +1 -0
- package/dist/src/logging/rotation.test.js +132 -0
- package/dist/src/logging/rotation.test.js.map +1 -0
- package/dist/src/logging/types.d.ts +69 -0
- package/dist/src/logging/types.d.ts.map +1 -0
- package/dist/src/logging/types.js +9 -0
- package/dist/src/logging/types.js.map +1 -0
- package/dist/src/security/index.d.ts +2 -0
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +4 -0
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts +46 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js +209 -0
- package/dist/src/security/scanner/SecurityScanner.hostile-update.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +2 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +2 -0
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +21 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +19 -2
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/sync/access-token.d.ts +27 -0
- package/dist/src/sync/access-token.d.ts.map +1 -0
- package/dist/src/sync/access-token.js +40 -0
- package/dist/src/sync/access-token.js.map +1 -0
- package/dist/src/sync/audit-notify-client.d.ts +83 -0
- package/dist/src/sync/audit-notify-client.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.js +126 -0
- package/dist/src/sync/audit-notify-client.js.map +1 -0
- package/dist/src/sync/audit-notify-client.test.d.ts +14 -0
- package/dist/src/sync/audit-notify-client.test.d.ts.map +1 -0
- package/dist/src/sync/audit-notify-client.test.js +133 -0
- package/dist/src/sync/audit-notify-client.test.js.map +1 -0
- package/dist/src/sync/index.d.ts +1 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/index.js +2 -0
- package/dist/src/sync/index.js.map +1 -1
- package/dist/src/sync/inventory-client.d.ts.map +1 -1
- package/dist/src/sync/inventory-client.js +5 -16
- package/dist/src/sync/inventory-client.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +15 -0
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +6 -1
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.js +5 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -1
- package/dist/src/telemetry/wrap.correlation.test.d.ts +20 -0
- package/dist/src/telemetry/wrap.correlation.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.correlation.test.js +174 -0
- package/dist/src/telemetry/wrap.correlation.test.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.gate.test.js +5 -0
- package/dist/src/telemetry/wrap.gate.test.js.map +1 -1
- package/dist/src/telemetry/wrap.js +111 -52
- package/dist/src/telemetry/wrap.js.map +1 -1
- package/dist/src/telemetry/wrap.marker.test.js +5 -0
- package/dist/src/telemetry/wrap.marker.test.js.map +1 -1
- package/dist/src/telemetry/wrap.test.js +10 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -1
- package/dist/src/types.d.ts +6 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +179 -1
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/package.json +7 -2
|
@@ -19,6 +19,14 @@
|
|
|
19
19
|
import type { ParseResult } from '../types.js';
|
|
20
20
|
import type { TreeSitterLanguage, TreeSitterParser } from './manager.js';
|
|
21
21
|
import { type QueryCtor } from './pythonExtractor.js';
|
|
22
|
+
/**
|
|
23
|
+
* Full-jitter backoff: a random point in `[0, base * 2^(attempt-1))` ms for the
|
|
24
|
+
* 1-based `attempt` that just failed. Jitter (not a fixed delay) is deliberate —
|
|
25
|
+
* the failure mode is many workers colliding during WASM instantiation, so a
|
|
26
|
+
* fixed delay would make them retry in lockstep and collide again (SMI-5567,
|
|
27
|
+
* plan-review finding #11). Exported for unit testing of the jitter bounds.
|
|
28
|
+
*/
|
|
29
|
+
export declare function jitteredInitBackoffMs(attempt: number): number;
|
|
22
30
|
/** Resolve the path to the Python WASM grammar distributed via tree-sitter-wasms. */
|
|
23
31
|
export declare function resolvePythonWasmPath(): string;
|
|
24
32
|
/** Options for PythonIncrementalParser. */
|
|
@@ -27,6 +35,17 @@ export interface PythonIncrementalParserOptions {
|
|
|
27
35
|
maxTrees?: number;
|
|
28
36
|
/** Override path to the Python WASM grammar (tests). */
|
|
29
37
|
wasmPath?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Bounded attempts to boot the WASM runtime + grammar under transient
|
|
40
|
+
* contention (default 3). SMI-5567.
|
|
41
|
+
*/
|
|
42
|
+
maxInitAttempts?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Backoff (ms) to wait before the next init attempt, given the 1-based
|
|
45
|
+
* attempt number that just failed. Defaults to {@link jitteredInitBackoffMs}.
|
|
46
|
+
* Tests inject `() => 0` for deterministic, delay-free runs. SMI-5567.
|
|
47
|
+
*/
|
|
48
|
+
initBackoffMs?: (attempt: number) => number;
|
|
30
49
|
}
|
|
31
50
|
/** Resolver that returns the WASM dependencies. Exposed for tests. */
|
|
32
51
|
export interface WebTreeSitterDeps {
|
|
@@ -47,6 +66,8 @@ export declare class PythonIncrementalParser {
|
|
|
47
66
|
private readonly maxTrees;
|
|
48
67
|
private readonly wasmPath;
|
|
49
68
|
private readonly loader;
|
|
69
|
+
private readonly maxInitAttempts;
|
|
70
|
+
private readonly initBackoffMs;
|
|
50
71
|
private readonly cache;
|
|
51
72
|
private parser;
|
|
52
73
|
private language;
|
|
@@ -89,5 +110,7 @@ export declare class PythonIncrementalParser {
|
|
|
89
110
|
private touch;
|
|
90
111
|
private evictLRU;
|
|
91
112
|
private safeDelete;
|
|
113
|
+
/** Free a parser allocated on a failed init attempt (SMI-5567). */
|
|
114
|
+
private safeDeleteParser;
|
|
92
115
|
}
|
|
93
116
|
//# sourceMappingURL=pythonIncremental.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythonIncremental.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAA;AACxF,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"pythonIncremental.d.ts","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,cAAc,CAAA;AACxF,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAA;AA6B/F;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,IAAI,MAAM,CAsC9C;AAWD,2CAA2C;AAC3C,MAAM,WAAW,8BAA8B;IAC7C,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CAC5C;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,gBAAgB,CAAA;IAClC,QAAQ,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;KAAE,CAAA;IAC7D,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAuBlE;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAI;gBAGpB,OAAO,GAAE,8BAAmC,EAC5C,MAAM,GAAE,mBAAmC;IAS7C,yEAAyE;IACzE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,gFAAgF;IAChF,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;OAGG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK3E;;;;;;OAMG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IA8DhE,gEAAgE;IAChE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOlC,0CAA0C;IAC1C,OAAO,IAAI,IAAI;IAgBf,kEAAkE;IAClE,IAAI,SAAS,IAAI,MAAM,CAEtB;YAMa,UAAU;YAWV,MAAM;IA0DpB,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,UAAU;IAQlB,mEAAmE;IACnE,OAAO,CAAC,gBAAgB;CAOzB"}
|
|
@@ -226,4 +226,141 @@ describe('SMI-4316 · doInit catch emits one-shot warn', () => {
|
|
|
226
226
|
expect(initWarns).toHaveLength(0);
|
|
227
227
|
});
|
|
228
228
|
});
|
|
229
|
+
/**
|
|
230
|
+
* A loader stub that counts every WASM resource it hands out. `initFailUntil`
|
|
231
|
+
* makes `init()` throw while `initCalls < initFailUntil` (so it first succeeds
|
|
232
|
+
* on the Nth call); `langLoadFailUntil` does the same for `Language.load()`
|
|
233
|
+
* (which throws only after a `Parser` has been constructed, exercising the
|
|
234
|
+
* partial-parser-cleanup path).
|
|
235
|
+
*/
|
|
236
|
+
function makeCountingLoader(opts) {
|
|
237
|
+
const state = {
|
|
238
|
+
initCalls: 0,
|
|
239
|
+
parserConstructed: 0,
|
|
240
|
+
parserDeleted: 0,
|
|
241
|
+
langLoadCalls: 0,
|
|
242
|
+
languagesCreated: 0,
|
|
243
|
+
};
|
|
244
|
+
const loader = async () => {
|
|
245
|
+
const ParserStub = class {
|
|
246
|
+
constructor() {
|
|
247
|
+
state.parserConstructed += 1;
|
|
248
|
+
}
|
|
249
|
+
setLanguage() { }
|
|
250
|
+
parse() {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
253
|
+
delete() {
|
|
254
|
+
state.parserDeleted += 1;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const deps = {
|
|
258
|
+
init: async () => {
|
|
259
|
+
state.initCalls += 1;
|
|
260
|
+
if (opts.initFailUntil && state.initCalls < opts.initFailUntil) {
|
|
261
|
+
throw new Error(`init boom #${state.initCalls}`);
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
Parser: ParserStub,
|
|
265
|
+
Language: {
|
|
266
|
+
load: async () => {
|
|
267
|
+
state.langLoadCalls += 1;
|
|
268
|
+
if (opts.langLoadFailUntil && state.langLoadCalls < opts.langLoadFailUntil) {
|
|
269
|
+
throw new Error(`language load boom #${state.langLoadCalls}`);
|
|
270
|
+
}
|
|
271
|
+
state.languagesCreated += 1;
|
|
272
|
+
return {};
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
// Constructable, args ignored — PythonQuerySet just `new Query(lang, src)`s.
|
|
276
|
+
Query: class {
|
|
277
|
+
constructor(..._args) {
|
|
278
|
+
void _args;
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
return deps;
|
|
283
|
+
};
|
|
284
|
+
return { loader, state };
|
|
285
|
+
}
|
|
286
|
+
describe('SMI-5567 · doInit bounded retry', () => {
|
|
287
|
+
beforeEach(() => {
|
|
288
|
+
loggerSpies.warn.mockReset();
|
|
289
|
+
resetRateLimiter();
|
|
290
|
+
existsSyncMock.mockReturnValue(true);
|
|
291
|
+
});
|
|
292
|
+
it('recovers when init() fails N-1 times then succeeds within the budget', async () => {
|
|
293
|
+
const { PythonIncrementalParser } = await getSUT();
|
|
294
|
+
// init fails on calls 1 and 2, succeeds on call 3 (== budget of 3).
|
|
295
|
+
const { loader, state } = makeCountingLoader({ initFailUntil: 3 });
|
|
296
|
+
const parser = new PythonIncrementalParser({ wasmPath: '/fake/python.wasm', maxInitAttempts: 3, initBackoffMs: () => 0 }, loader);
|
|
297
|
+
await parser.ensureReady();
|
|
298
|
+
expect(state.initCalls).toBe(3);
|
|
299
|
+
expect(parser.isReady).toBe(true);
|
|
300
|
+
expect(parser.hasFailedInit).toBe(false);
|
|
301
|
+
// No warn on a successful (recovered) init.
|
|
302
|
+
expect(loggerSpies.warn).not.toHaveBeenCalled();
|
|
303
|
+
});
|
|
304
|
+
it('applies the injected backoff once per inter-attempt gap (jitter wiring)', async () => {
|
|
305
|
+
const { PythonIncrementalParser } = await getSUT();
|
|
306
|
+
const { loader } = makeCountingLoader({ initFailUntil: 3 });
|
|
307
|
+
const backoff = vi.fn((_attempt) => 0);
|
|
308
|
+
const parser = new PythonIncrementalParser({ wasmPath: '/fake/python.wasm', maxInitAttempts: 3, initBackoffMs: backoff }, loader);
|
|
309
|
+
await parser.ensureReady();
|
|
310
|
+
// Backoff fires between attempts only: after attempt 1 and attempt 2, never
|
|
311
|
+
// after the final (3rd) attempt. It is called with the just-failed 1-based
|
|
312
|
+
// attempt number, so a fixed delay is impossible by construction.
|
|
313
|
+
expect(backoff.mock.calls.map((c) => c[0])).toEqual([1, 2]);
|
|
314
|
+
expect(parser.isReady).toBe(true);
|
|
315
|
+
});
|
|
316
|
+
it('does not leak or double-instantiate across a failed-then-retried init', async () => {
|
|
317
|
+
const { PythonIncrementalParser } = await getSUT();
|
|
318
|
+
// Language.load fails on calls 1 and 2 (AFTER a Parser was constructed each
|
|
319
|
+
// time), succeeds on call 3. This is the partial-parser-cleanup path.
|
|
320
|
+
const { loader, state } = makeCountingLoader({ langLoadFailUntil: 3 });
|
|
321
|
+
const parser = new PythonIncrementalParser({ wasmPath: '/fake/python.wasm', maxInitAttempts: 3, initBackoffMs: () => 0 }, loader);
|
|
322
|
+
await parser.ensureReady();
|
|
323
|
+
expect(parser.isReady).toBe(true);
|
|
324
|
+
expect(parser.hasFailedInit).toBe(false);
|
|
325
|
+
// One Parser constructed per attempt (3), but the two from the failed
|
|
326
|
+
// attempts were freed — exactly one survives.
|
|
327
|
+
expect(state.parserConstructed).toBe(3);
|
|
328
|
+
expect(state.parserDeleted).toBe(2);
|
|
329
|
+
expect(state.parserConstructed - state.parserDeleted).toBe(1);
|
|
330
|
+
// Exactly one Language survived — no double-instantiation of the grammar.
|
|
331
|
+
expect(state.languagesCreated).toBe(1);
|
|
332
|
+
});
|
|
333
|
+
it('fails gracefully and diagnosably when the retry budget is exhausted', async () => {
|
|
334
|
+
const { PythonIncrementalParser } = await getSUT();
|
|
335
|
+
// Never succeeds within 3 attempts.
|
|
336
|
+
const { loader, state } = makeCountingLoader({ initFailUntil: 99 });
|
|
337
|
+
const parser = new PythonIncrementalParser({ wasmPath: '/fake/python.wasm', maxInitAttempts: 3, initBackoffMs: () => 0 }, loader);
|
|
338
|
+
await parser.ensureReady();
|
|
339
|
+
expect(state.initCalls).toBe(3); // bounded — did not loop unbounded
|
|
340
|
+
expect(parser.isReady).toBe(false);
|
|
341
|
+
expect(parser.hasFailedInit).toBe(true);
|
|
342
|
+
// A single diagnostic warn carrying the actual last error + attempt count,
|
|
343
|
+
// so a recurrence doesn't require re-deriving the SMI-5567 analysis.
|
|
344
|
+
expect(loggerSpies.warn).toHaveBeenCalledTimes(1);
|
|
345
|
+
const [message, payload] = loggerSpies.warn.mock.calls[0];
|
|
346
|
+
expect(message).toContain('init failed');
|
|
347
|
+
const p = payload;
|
|
348
|
+
expect(p.attempts).toBe(3);
|
|
349
|
+
expect(p.error).toBe('init boom #3'); // the LAST error, not a generic flag
|
|
350
|
+
expect(typeof p.stack).toBe('string');
|
|
351
|
+
});
|
|
352
|
+
it('jitteredInitBackoffMs is bounded per attempt and NOT a fixed delay', async () => {
|
|
353
|
+
const { jitteredInitBackoffMs } = await getSUT();
|
|
354
|
+
const attempt1 = Array.from({ length: 200 }, () => jitteredInitBackoffMs(1));
|
|
355
|
+
const attempt2 = Array.from({ length: 200 }, () => jitteredInitBackoffMs(2));
|
|
356
|
+
// Full-jitter bounds: [0, base*2^(n-1)). base = 25 → attempt1 < 25, attempt2 < 50.
|
|
357
|
+
expect(Math.min(...attempt1)).toBeGreaterThanOrEqual(0);
|
|
358
|
+
expect(Math.max(...attempt1)).toBeLessThan(25);
|
|
359
|
+
expect(Math.max(...attempt2)).toBeLessThan(50);
|
|
360
|
+
// Later attempts back off further (wider ceiling).
|
|
361
|
+
expect(Math.max(...attempt2)).toBeGreaterThan(Math.max(...attempt1) - 1);
|
|
362
|
+
// Jitter: the samples must spread, not collapse to a single fixed value.
|
|
363
|
+
expect(new Set(attempt1.map((v) => Math.round(v))).size).toBeGreaterThan(1);
|
|
364
|
+
});
|
|
365
|
+
});
|
|
229
366
|
//# sourceMappingURL=pythonIncremental.hardening.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythonIncremental.hardening.test.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.hardening.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pythonIncremental.hardening.test.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.hardening.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,32 @@ function firstLine(s) {
|
|
|
30
30
|
}
|
|
31
31
|
/** Maximum number of cached trees (per SMI-1309 / SMI-4293 spec). */
|
|
32
32
|
const DEFAULT_MAX_TREES = 100;
|
|
33
|
+
/**
|
|
34
|
+
* SMI-5567: bounded attempts to boot the WASM runtime + grammar. Under
|
|
35
|
+
* full-suite parallel vitest load (or real concurrent usage), many workers
|
|
36
|
+
* boot their own web-tree-sitter runtime at once and instantiation can fail
|
|
37
|
+
* transiently; a small bounded retry recovers instead of permanently falling
|
|
38
|
+
* back to regex. Retrying `Parser.init()` is safe: web-tree-sitter guards the
|
|
39
|
+
* emscripten module behind a module-level singleton (`initializeBinding`:
|
|
40
|
+
* `if (!Module) Module = await createModule()`), and a failed instantiation
|
|
41
|
+
* leaves that singleton null — so a retry re-instantiates cleanly with no
|
|
42
|
+
* double-init or leaked partial module. Verified against web-tree-sitter@0.25.10
|
|
43
|
+
* source + an empirical failed-then-retried probe.
|
|
44
|
+
*/
|
|
45
|
+
const DEFAULT_MAX_INIT_ATTEMPTS = 3;
|
|
46
|
+
/** Base backoff (ms) for the jittered init retry. */
|
|
47
|
+
const INIT_BACKOFF_BASE_MS = 25;
|
|
48
|
+
/**
|
|
49
|
+
* Full-jitter backoff: a random point in `[0, base * 2^(attempt-1))` ms for the
|
|
50
|
+
* 1-based `attempt` that just failed. Jitter (not a fixed delay) is deliberate —
|
|
51
|
+
* the failure mode is many workers colliding during WASM instantiation, so a
|
|
52
|
+
* fixed delay would make them retry in lockstep and collide again (SMI-5567,
|
|
53
|
+
* plan-review finding #11). Exported for unit testing of the jitter bounds.
|
|
54
|
+
*/
|
|
55
|
+
export function jitteredInitBackoffMs(attempt) {
|
|
56
|
+
const ceiling = INIT_BACKOFF_BASE_MS * 2 ** Math.max(0, attempt - 1);
|
|
57
|
+
return Math.random() * ceiling;
|
|
58
|
+
}
|
|
33
59
|
/** Resolve the path to the Python WASM grammar distributed via tree-sitter-wasms. */
|
|
34
60
|
export function resolvePythonWasmPath() {
|
|
35
61
|
// Caller is inside packages/core/dist or packages/core/src; tree-sitter-wasms
|
|
@@ -74,6 +100,8 @@ export class PythonIncrementalParser {
|
|
|
74
100
|
maxTrees;
|
|
75
101
|
wasmPath;
|
|
76
102
|
loader;
|
|
103
|
+
maxInitAttempts;
|
|
104
|
+
initBackoffMs;
|
|
77
105
|
cache = new Map();
|
|
78
106
|
parser = null;
|
|
79
107
|
language = null;
|
|
@@ -85,6 +113,8 @@ export class PythonIncrementalParser {
|
|
|
85
113
|
this.maxTrees = options.maxTrees ?? DEFAULT_MAX_TREES;
|
|
86
114
|
this.wasmPath = options.wasmPath ?? resolvePythonWasmPath();
|
|
87
115
|
this.loader = loader;
|
|
116
|
+
this.maxInitAttempts = Math.max(1, options.maxInitAttempts ?? DEFAULT_MAX_INIT_ATTEMPTS);
|
|
117
|
+
this.initBackoffMs = options.initBackoffMs ?? jitteredInitBackoffMs;
|
|
88
118
|
}
|
|
89
119
|
/** True when the WASM runtime and Python grammar loaded successfully. */
|
|
90
120
|
get isReady() {
|
|
@@ -222,15 +252,46 @@ export class PythonIncrementalParser {
|
|
|
222
252
|
}
|
|
223
253
|
}
|
|
224
254
|
async doInit() {
|
|
255
|
+
// SMI-5567: bounded, jittered retry around the WASM boot + grammar load.
|
|
256
|
+
// Only the fallible boot sequence is retried; `this.loader()` (the module
|
|
257
|
+
// import) is deterministic — a failed import won't recover — so it stays
|
|
258
|
+
// outside the loop and fails fast without incurring backoff delays.
|
|
259
|
+
let lastError = null;
|
|
260
|
+
let attemptsMade = 0;
|
|
225
261
|
try {
|
|
226
262
|
const deps = await this.loader();
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
263
|
+
for (let attempt = 1; attempt <= this.maxInitAttempts; attempt += 1) {
|
|
264
|
+
attemptsMade = attempt;
|
|
265
|
+
let parser = null;
|
|
266
|
+
try {
|
|
267
|
+
await deps.init();
|
|
268
|
+
parser = new deps.Parser();
|
|
269
|
+
const language = await deps.Language.load(this.wasmPath);
|
|
270
|
+
parser.setLanguage(language);
|
|
271
|
+
// Commit only after every step succeeds, so a mid-sequence failure
|
|
272
|
+
// never leaves a half-initialised parser visible via `isReady`.
|
|
273
|
+
this.parser = parser;
|
|
274
|
+
this.language = language;
|
|
275
|
+
this.queries = new PythonQuerySet(deps.Query, language);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
lastError = error;
|
|
280
|
+
// Free the WASM parser allocated on this failed attempt so repeated
|
|
281
|
+
// retries can't accumulate orphaned parser handles in the WASM heap
|
|
282
|
+
// (a retry re-instantiates the runtime cleanly — see the module-level
|
|
283
|
+
// note on DEFAULT_MAX_INIT_ATTEMPTS).
|
|
284
|
+
if (parser)
|
|
285
|
+
this.safeDeleteParser(parser);
|
|
286
|
+
if (attempt < this.maxInitAttempts) {
|
|
287
|
+
const delayMs = this.initBackoffMs(attempt);
|
|
288
|
+
if (delayMs > 0)
|
|
289
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Every attempt failed — surface the real last error to the catch below.
|
|
294
|
+
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
234
295
|
}
|
|
235
296
|
catch (error) {
|
|
236
297
|
this.initFailed = true;
|
|
@@ -238,11 +299,14 @@ export class PythonIncrementalParser {
|
|
|
238
299
|
this.language = null;
|
|
239
300
|
this.queries = null;
|
|
240
301
|
// One-shot warn per parser instance: fires at most once in `doInit`.
|
|
241
|
-
// Log `{ wasmPath, error, stack }` for operator diagnostics
|
|
242
|
-
//
|
|
243
|
-
//
|
|
302
|
+
// Log `{ wasmPath, attempts, error, stack }` for operator diagnostics —
|
|
303
|
+
// surfacing the actual last error's message (not just flipping
|
|
304
|
+
// `initFailed`) so a recurrence is diagnosable without re-deriving the
|
|
305
|
+
// SMI-5567 analysis. The WASM path is not secret; the stack points inside
|
|
306
|
+
// web-tree-sitter / resolvePythonWasmPath, not user source.
|
|
244
307
|
logger.warn('Python tree-sitter init failed; regex fallback in use', {
|
|
245
308
|
wasmPath: this.wasmPath,
|
|
309
|
+
attempts: attemptsMade,
|
|
246
310
|
error: error instanceof Error ? error.message : String(error),
|
|
247
311
|
stack: error instanceof Error ? error.stack : undefined,
|
|
248
312
|
});
|
|
@@ -283,5 +347,14 @@ export class PythonIncrementalParser {
|
|
|
283
347
|
// Already-deleted trees throw; swallow for robustness.
|
|
284
348
|
}
|
|
285
349
|
}
|
|
350
|
+
/** Free a parser allocated on a failed init attempt (SMI-5567). */
|
|
351
|
+
safeDeleteParser(parser) {
|
|
352
|
+
try {
|
|
353
|
+
parser.delete();
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// A parser that failed mid-boot may not be fully constructed; ignore.
|
|
357
|
+
}
|
|
358
|
+
}
|
|
286
359
|
}
|
|
287
360
|
//# sourceMappingURL=pythonIncremental.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pythonIncremental.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAkB,MAAM,sBAAsB,CAAA;AAE/F,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC,CAAA;AAEtD,sGAAsG;AACtG,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,CAAA;AACjD,CAAC;AAED,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,qFAAqF;AACrF,MAAM,UAAU,qBAAqB;IACnC,8EAA8E;IAC9E,4DAA4D;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG;QACjB,kCAAkC;QAClC,IAAI,CAAC,OAAO,CACV,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,yBAAyB,CAC1B;QACD,+DAA+D;QAC/D,IAAI,CAAC,OAAO,CACV,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,yBAAyB,CAC1B;KACF,CAAA;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAChD,CAAC;IACD,sEAAsE;IACtE,sEAAsE;IACtE,uCAAuC;IACvC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;AACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"pythonIncremental.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/pythonIncremental.ts"],"names":[],"mappings":"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"}
|
|
@@ -151,7 +151,12 @@ describe('Python query extraction vs regex baseline (finding H3)', () => {
|
|
|
151
151
|
queryParser.dispose();
|
|
152
152
|
});
|
|
153
153
|
it('boots the WASM parser for the regression guard', () => {
|
|
154
|
-
|
|
154
|
+
// SMI-5567: report *why* a boot failure happened (hasFailedInit), not just
|
|
155
|
+
// that isReady is false — a future flake under parallel WASM-init contention
|
|
156
|
+
// should be diagnosable from the assertion message alone.
|
|
157
|
+
expect(queryParser.isReady, `WASM parser did not boot for the regression guard: isReady=${queryParser.isReady}, ` +
|
|
158
|
+
`hasFailedInit=${queryParser.hasFailedInit} (true ⇒ retry budget exhausted; ` +
|
|
159
|
+
`see PythonIncrementalParser.doInit + the logger.warn payload for the last error)`).toBe(true);
|
|
155
160
|
});
|
|
156
161
|
for (const fixture of FIXTURES) {
|
|
157
162
|
it(`query extraction ⊇ regex baseline for fixture "${fixture.name}"`, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryExtractionMatchesOrExceedsRegex.test.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"queryExtractionMatchesOrExceedsRegex.test.js","sourceRoot":"","sources":["../../../../src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous-audit email digest state (SMI-5541 Wave 2C Stage 2).
|
|
3
|
+
*
|
|
4
|
+
* Persists two fields under the `audit` namespace of `~/.skillsmith/config.json`
|
|
5
|
+
* to make the background auto-notify (MCP-startup) throttled and non-spammy:
|
|
6
|
+
*
|
|
7
|
+
* - `lastNotifyAt` — an ISO timestamp gating how often the background scan +
|
|
8
|
+
* push runs (reuses the 24h `shouldAutoPush` throttle from `device-identity`).
|
|
9
|
+
* - `lastDigestHash` — the sha256 of the findings we last EMAILED, so an
|
|
10
|
+
* identical security picture is not re-emailed the next day (client-side
|
|
11
|
+
* dedup, independent of the server's own consent/nothing-to-report gates).
|
|
12
|
+
*
|
|
13
|
+
* The SERVER remains the source of truth for consent (`audit_email_enabled`);
|
|
14
|
+
* these fields are purely local rate-limiting + dedup and never gate whether an
|
|
15
|
+
* explicit `sklx audit security --email` push is attempted.
|
|
16
|
+
*
|
|
17
|
+
* @module @skillsmith/core/config/audit-notify-state
|
|
18
|
+
*/
|
|
19
|
+
/** The persisted background auto-notify state. */
|
|
20
|
+
export interface AuditNotifyState {
|
|
21
|
+
/** ISO timestamp of the last background digest attempt, or `undefined`. */
|
|
22
|
+
lastNotifyAt?: string;
|
|
23
|
+
/** sha256 of the last-emailed findings, or `undefined` if never emailed. */
|
|
24
|
+
lastDigestHash?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Return the persisted auto-notify state (both fields may be `undefined`).
|
|
28
|
+
*
|
|
29
|
+
* Pure read — no side effects.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAuditNotifyState(): AuditNotifyState;
|
|
32
|
+
/**
|
|
33
|
+
* Advance the auto-notify throttle timestamp, and optionally record the hash of
|
|
34
|
+
* the just-emailed findings.
|
|
35
|
+
*
|
|
36
|
+
* `lastNotifyAt` is ALWAYS updated (so the background run backs off for the
|
|
37
|
+
* throttle window regardless of outcome). `lastDigestHash` is updated only when
|
|
38
|
+
* `hash` is supplied — a caller records it after a successful send, and omits it
|
|
39
|
+
* on a not-consented / not-verified outcome so a later opt-in still re-pushes
|
|
40
|
+
* the same findings. Any existing `deviceId`/`lastPushAt` etc. are preserved.
|
|
41
|
+
*
|
|
42
|
+
* @param timestampIso - ISO 8601 timestamp (e.g. `new Date().toISOString()`).
|
|
43
|
+
* @param hash - sha256 of the emailed findings; omit to leave the stored hash.
|
|
44
|
+
*/
|
|
45
|
+
export declare function recordAuditNotify(timestampIso: string, hash?: string): void;
|
|
46
|
+
//# sourceMappingURL=audit-notify-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-notify-state.d.ts","sourceRoot":"","sources":["../../../src/config/audit-notify-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAS3E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous-audit email digest state (SMI-5541 Wave 2C Stage 2).
|
|
3
|
+
*
|
|
4
|
+
* Persists two fields under the `audit` namespace of `~/.skillsmith/config.json`
|
|
5
|
+
* to make the background auto-notify (MCP-startup) throttled and non-spammy:
|
|
6
|
+
*
|
|
7
|
+
* - `lastNotifyAt` — an ISO timestamp gating how often the background scan +
|
|
8
|
+
* push runs (reuses the 24h `shouldAutoPush` throttle from `device-identity`).
|
|
9
|
+
* - `lastDigestHash` — the sha256 of the findings we last EMAILED, so an
|
|
10
|
+
* identical security picture is not re-emailed the next day (client-side
|
|
11
|
+
* dedup, independent of the server's own consent/nothing-to-report gates).
|
|
12
|
+
*
|
|
13
|
+
* The SERVER remains the source of truth for consent (`audit_email_enabled`);
|
|
14
|
+
* these fields are purely local rate-limiting + dedup and never gate whether an
|
|
15
|
+
* explicit `sklx audit security --email` push is attempted.
|
|
16
|
+
*
|
|
17
|
+
* @module @skillsmith/core/config/audit-notify-state
|
|
18
|
+
*/
|
|
19
|
+
import { loadConfig, saveConfig } from './index.js';
|
|
20
|
+
/**
|
|
21
|
+
* Return the persisted auto-notify state (both fields may be `undefined`).
|
|
22
|
+
*
|
|
23
|
+
* Pure read — no side effects.
|
|
24
|
+
*/
|
|
25
|
+
export function getAuditNotifyState() {
|
|
26
|
+
const audit = loadConfig().audit;
|
|
27
|
+
return {
|
|
28
|
+
lastNotifyAt: audit?.lastNotifyAt,
|
|
29
|
+
lastDigestHash: audit?.lastDigestHash,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Advance the auto-notify throttle timestamp, and optionally record the hash of
|
|
34
|
+
* the just-emailed findings.
|
|
35
|
+
*
|
|
36
|
+
* `lastNotifyAt` is ALWAYS updated (so the background run backs off for the
|
|
37
|
+
* throttle window regardless of outcome). `lastDigestHash` is updated only when
|
|
38
|
+
* `hash` is supplied — a caller records it after a successful send, and omits it
|
|
39
|
+
* on a not-consented / not-verified outcome so a later opt-in still re-pushes
|
|
40
|
+
* the same findings. Any existing `deviceId`/`lastPushAt` etc. are preserved.
|
|
41
|
+
*
|
|
42
|
+
* @param timestampIso - ISO 8601 timestamp (e.g. `new Date().toISOString()`).
|
|
43
|
+
* @param hash - sha256 of the emailed findings; omit to leave the stored hash.
|
|
44
|
+
*/
|
|
45
|
+
export function recordAuditNotify(timestampIso, hash) {
|
|
46
|
+
const existing = loadConfig().audit;
|
|
47
|
+
saveConfig({
|
|
48
|
+
audit: {
|
|
49
|
+
...existing,
|
|
50
|
+
lastNotifyAt: timestampIso,
|
|
51
|
+
...(hash !== undefined ? { lastDigestHash: hash } : {}),
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=audit-notify-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-notify-state.js","sourceRoot":"","sources":["../../../src/config/audit-notify-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAUnD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,KAAK,CAAA;IAChC,OAAO;QACL,YAAY,EAAE,KAAK,EAAE,YAAY;QACjC,cAAc,EAAE,KAAK,EAAE,cAAc;KACtC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,IAAa;IACnE,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC,KAAK,CAAA;IACnC,UAAU,CAAC;QACT,KAAK,EAAE;YACL,GAAG,QAAQ;YACX,YAAY,EAAE,YAAY;YAC1B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5541: Continuous-audit email digest state tests.
|
|
3
|
+
*
|
|
4
|
+
* Uses the same HOME-mutation harness as `device-identity.test.ts` so each test
|
|
5
|
+
* begins with a blank `~/.skillsmith/config.json` and exercises the real
|
|
6
|
+
* `loadConfig`/`saveConfig` round-trip (not a mock).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=audit-notify-state.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-notify-state.test.d.ts","sourceRoot":"","sources":["../../../src/config/audit-notify-state.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|