@spool-lab/core 0.4.20 → 0.5.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 (70) hide show
  1. package/README.md +2 -2
  2. package/dist/db/db.d.ts.map +1 -1
  3. package/dist/db/db.js +8 -7
  4. package/dist/db/db.js.map +1 -1
  5. package/dist/db/queries.d.ts +4 -3
  6. package/dist/db/queries.d.ts.map +1 -1
  7. package/dist/db/queries.js +9 -5
  8. package/dist/db/queries.js.map +1 -1
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/observability/exporter-file.d.ts +30 -0
  14. package/dist/observability/exporter-file.d.ts.map +1 -0
  15. package/dist/observability/exporter-file.js +125 -0
  16. package/dist/observability/exporter-file.js.map +1 -0
  17. package/dist/observability/exporter-pretty.d.ts +27 -0
  18. package/dist/observability/exporter-pretty.d.ts.map +1 -0
  19. package/dist/observability/exporter-pretty.js +84 -0
  20. package/dist/observability/exporter-pretty.js.map +1 -0
  21. package/dist/observability/index.d.ts +2 -0
  22. package/dist/observability/index.d.ts.map +1 -0
  23. package/dist/observability/index.js +2 -0
  24. package/dist/observability/index.js.map +1 -0
  25. package/dist/observability/layer.d.ts +29 -0
  26. package/dist/observability/layer.d.ts.map +1 -0
  27. package/dist/observability/layer.js +45 -0
  28. package/dist/observability/layer.js.map +1 -0
  29. package/dist/parsers/opencode.d.ts +23 -0
  30. package/dist/parsers/opencode.d.ts.map +1 -0
  31. package/dist/parsers/opencode.js +358 -0
  32. package/dist/parsers/opencode.js.map +1 -0
  33. package/dist/security/index.d.ts +3 -3
  34. package/dist/security/index.d.ts.map +1 -1
  35. package/dist/security/index.js +2 -2
  36. package/dist/security/index.js.map +1 -1
  37. package/dist/security/profile.d.ts +1 -1
  38. package/dist/security/profile.d.ts.map +1 -1
  39. package/dist/security/profile.js +17 -8
  40. package/dist/security/profile.js.map +1 -1
  41. package/dist/security/purge.d.ts +19 -0
  42. package/dist/security/purge.d.ts.map +1 -1
  43. package/dist/security/purge.js +36 -2
  44. package/dist/security/purge.js.map +1 -1
  45. package/dist/security/repo.d.ts +53 -4
  46. package/dist/security/repo.d.ts.map +1 -1
  47. package/dist/security/repo.js +134 -9
  48. package/dist/security/repo.js.map +1 -1
  49. package/dist/security/scan.d.ts.map +1 -1
  50. package/dist/security/scan.js +3 -1
  51. package/dist/security/scan.js.map +1 -1
  52. package/dist/security/types.d.ts +18 -0
  53. package/dist/security/types.d.ts.map +1 -1
  54. package/dist/security/worker.d.ts +18 -2
  55. package/dist/security/worker.d.ts.map +1 -1
  56. package/dist/security/worker.js +54 -6
  57. package/dist/security/worker.js.map +1 -1
  58. package/dist/sync/source-paths.d.ts.map +1 -1
  59. package/dist/sync/source-paths.js +36 -4
  60. package/dist/sync/source-paths.js.map +1 -1
  61. package/dist/sync/syncer.d.ts +1 -0
  62. package/dist/sync/syncer.d.ts.map +1 -1
  63. package/dist/sync/syncer.js +102 -2
  64. package/dist/sync/syncer.js.map +1 -1
  65. package/dist/sync/watcher.d.ts.map +1 -1
  66. package/dist/sync/watcher.js +8 -2
  67. package/dist/sync/watcher.js.map +1 -1
  68. package/dist/types.d.ts +2 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +7 -1
@@ -0,0 +1,84 @@
1
+ import { SpanStatusCode } from '@opentelemetry/api';
2
+ const ANSI = {
3
+ reset: '\x1b[0m',
4
+ dim: '\x1b[2m',
5
+ red: '\x1b[31m',
6
+ green: '\x1b[32m',
7
+ yellow: '\x1b[33m',
8
+ blue: '\x1b[34m',
9
+ magenta: '\x1b[35m',
10
+ cyan: '\x1b[36m',
11
+ gray: '\x1b[90m',
12
+ };
13
+ /** Span exporter that prints one line per finished span to the console.
14
+ * Format: `HH:MM:SS.mmm [span.name] (Nms) k1=v1 k2=v2`.
15
+ * Designed for the dev loop — file-backed structured output lives in
16
+ * the file exporter. */
17
+ export class PrettyConsoleSpanExporter {
18
+ sink;
19
+ color;
20
+ constructor(opts = {}) {
21
+ this.sink = opts.sink ?? ((line) => process.stdout.write(line + '\n'));
22
+ this.color = opts.noColor ? false : process.stdout.isTTY === true;
23
+ }
24
+ export(spans, resultCallback) {
25
+ for (const span of spans)
26
+ this.sink(this.format(span));
27
+ resultCallback({ code: 0 });
28
+ }
29
+ shutdown() { return Promise.resolve(); }
30
+ forceFlush() { return Promise.resolve(); }
31
+ format(span) {
32
+ const ts = formatTimestamp(span.endTime);
33
+ const durMs = hrTimeToMs(span.duration);
34
+ const isError = span.status.code === SpanStatusCode.ERROR;
35
+ const name = isError ? this.tint(span.name, ANSI.red) : this.tint(span.name, ANSI.cyan);
36
+ const dur = this.tint(`(${formatDuration(durMs)})`, ANSI.gray);
37
+ const attrs = formatAttributes(span.attributes);
38
+ const attrsTinted = attrs ? ' ' + this.tint(attrs, ANSI.yellow) : '';
39
+ const statusSuffix = isError && span.status.message
40
+ ? ' ' + this.tint(`error: ${span.status.message}`, ANSI.red)
41
+ : '';
42
+ return `${this.tint(ts, ANSI.dim)} [${name}] ${dur}${attrsTinted}${statusSuffix}`;
43
+ }
44
+ tint(s, code) {
45
+ return this.color ? `${code}${s}${ANSI.reset}` : s;
46
+ }
47
+ }
48
+ function pad2(n) { return n < 10 ? `0${n}` : `${n}`; }
49
+ function pad3(n) { return n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`; }
50
+ function formatTimestamp(hr) {
51
+ const ms = hr[0] * 1000 + Math.floor(hr[1] / 1_000_000);
52
+ const d = new Date(ms);
53
+ return `${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}.${pad3(d.getMilliseconds())}`;
54
+ }
55
+ function hrTimeToMs(hr) {
56
+ return hr[0] * 1000 + hr[1] / 1_000_000;
57
+ }
58
+ function formatDuration(ms) {
59
+ if (ms < 1)
60
+ return `${ms.toFixed(2)}ms`;
61
+ if (ms < 1000)
62
+ return `${ms.toFixed(1)}ms`;
63
+ return `${(ms / 1000).toFixed(2)}s`;
64
+ }
65
+ function formatAttributes(attrs) {
66
+ const entries = Object.entries(attrs);
67
+ if (entries.length === 0)
68
+ return '';
69
+ return entries
70
+ .map(([k, v]) => `${k}=${formatValue(v)}`)
71
+ .join(' ');
72
+ }
73
+ function formatValue(v) {
74
+ if (v == null)
75
+ return String(v);
76
+ if (typeof v === 'string')
77
+ return v.length > 60 ? `${v.slice(0, 57)}…` : v;
78
+ if (typeof v === 'number' || typeof v === 'boolean')
79
+ return String(v);
80
+ if (Array.isArray(v))
81
+ return `[${v.length}]`;
82
+ return JSON.stringify(v).slice(0, 60);
83
+ }
84
+ //# sourceMappingURL=exporter-pretty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporter-pretty.js","sourceRoot":"","sources":["../../src/observability/exporter-pretty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { observabilityLayer, makeObservabilityRuntime, type ObservabilityConfig, type ObservabilityEnv, } from './layer.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { observabilityLayer, makeObservabilityRuntime, } from './layer.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { type SpanExporter } from '@opentelemetry/sdk-trace-base';
2
+ import { Effect, Layer, ManagedRuntime } from 'effect';
3
+ export type ObservabilityEnv = 'dev' | 'prod' | 'test';
4
+ interface CommonConfig {
5
+ readonly serviceName: string;
6
+ readonly serviceVersion?: string;
7
+ }
8
+ export type ObservabilityConfig = (CommonConfig & {
9
+ readonly env: 'dev';
10
+ }) | (CommonConfig & {
11
+ readonly env: 'prod';
12
+ readonly logsDir: string;
13
+ }) | (CommonConfig & {
14
+ readonly env: 'test';
15
+ readonly testExporter?: SpanExporter;
16
+ });
17
+ /** Effect Layer that wires `Effect.withSpan` to either a pretty console
18
+ * exporter (dev), a rotating jsonl file exporter (prod), or the
19
+ * supplied test exporter / noop (test). */
20
+ export declare function observabilityLayer(config: ObservabilityConfig): Layer.Layer<never>;
21
+ /** Build a ManagedRuntime carrying the observability layer + a typed
22
+ * promise runner. Lets main / scan-worker / sync-worker share the
23
+ * same env-detection + cast pattern instead of each rolling its own. */
24
+ export declare function makeObservabilityRuntime(config: ObservabilityConfig): {
25
+ readonly runtime: ManagedRuntime.ManagedRuntime<never, never>;
26
+ readonly run: <A, E>(eff: Effect.Effect<A, E>) => Promise<A>;
27
+ };
28
+ export {};
29
+ //# sourceMappingURL=layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.d.ts","sourceRoot":"","sources":["../../src/observability/layer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAItD,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtD,UAAU,YAAY;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,MAAM,mBAAmB,GAC3B,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;CAAE,CAAC,GACxC,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACnE,CAAC,YAAY,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAAA;AAEnF;;4CAE4C;AAC5C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAQlF;AAqBD;;yEAEyE;AACzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG;IACrE,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAC7D,CAOA"}
@@ -0,0 +1,45 @@
1
+ import { NodeSdk } from '@effect/opentelemetry';
2
+ import { SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base';
3
+ import { ManagedRuntime } from 'effect';
4
+ import { PrettyConsoleSpanExporter } from './exporter-pretty.js';
5
+ import { RotatingFileSpanExporter } from './exporter-file.js';
6
+ /** Effect Layer that wires `Effect.withSpan` to either a pretty console
7
+ * exporter (dev), a rotating jsonl file exporter (prod), or the
8
+ * supplied test exporter / noop (test). */
9
+ export function observabilityLayer(config) {
10
+ return NodeSdk.layer(() => ({
11
+ resource: {
12
+ serviceName: config.serviceName,
13
+ ...(config.serviceVersion ? { serviceVersion: config.serviceVersion } : {}),
14
+ },
15
+ spanProcessor: makeProcessor(config),
16
+ }));
17
+ }
18
+ function makeProcessor(config) {
19
+ switch (config.env) {
20
+ case 'test':
21
+ return new SimpleSpanProcessor(config.testExporter ?? noopExporter);
22
+ case 'dev':
23
+ return new SimpleSpanProcessor(new PrettyConsoleSpanExporter());
24
+ case 'prod':
25
+ // SimpleSpanProcessor on purpose: BatchSpanProcessor batches for
26
+ // network export, but our prod sink is a local file. Per-span
27
+ // writes keep logs current for live `tail -f` debugging.
28
+ return new SimpleSpanProcessor(new RotatingFileSpanExporter({ dir: config.logsDir }));
29
+ }
30
+ }
31
+ const noopExporter = {
32
+ export: (_spans, cb) => cb({ code: 0 }),
33
+ shutdown: () => Promise.resolve(),
34
+ };
35
+ /** Build a ManagedRuntime carrying the observability layer + a typed
36
+ * promise runner. Lets main / scan-worker / sync-worker share the
37
+ * same env-detection + cast pattern instead of each rolling its own. */
38
+ export function makeObservabilityRuntime(config) {
39
+ const runtime = ManagedRuntime.make(observabilityLayer(config));
40
+ return {
41
+ runtime,
42
+ run: (eff) => runtime.runPromise(eff),
43
+ };
44
+ }
45
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.js","sourceRoot":"","sources":["../../src/observability/layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EACL,mBAAmB,GAGpB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAiB,cAAc,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAc7D;;4CAE4C;AAC5C,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE;YACR,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E;QACD,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC;KACrC,CAAC,CAAC,CAAA;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAA2B;IAChD,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,YAAY,IAAI,YAAY,CAAC,CAAA;QACrE,KAAK,KAAK;YACR,OAAO,IAAI,mBAAmB,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAA;QACjE,KAAK,MAAM;YACT,iEAAiE;YACjE,8DAA8D;YAC9D,yDAAyD;YACzD,OAAO,IAAI,mBAAmB,CAAC,IAAI,wBAAwB,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAiB;IACjC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACvC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;CAClC,CAAA;AAED;;yEAEyE;AACzE,MAAM,UAAU,wBAAwB,CAAC,MAA2B;IAIlE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/D,OAAO;QACL,OAAO;QACP,GAAG,EAAE,CAAO,GAAwB,EAAE,EAAE,CACtC,OAAO,CAAC,UAAU,CAAC,GAA8B,CAAC;KACrD,CAAA;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ParseSessionResult, ParsedSession } from '../types.js';
2
+ export declare const OPENCODE_INDEX_VERSION = "opencode-v3-session-model-json";
3
+ export declare const OPENCODE_DB_NAME = "opencode.db";
4
+ export declare function makeOpenCodeSessionFilePath(dbPath: string, sessionId: string): string;
5
+ export declare function parseOpenCodeSessionFilePath(filePath: string): {
6
+ dbPath: string;
7
+ sessionId: string;
8
+ } | null;
9
+ export declare function isOpenCodeDatabaseFile(filePath: string): boolean;
10
+ /**
11
+ * Map an OpenCode DB sidecar path (`opencode.db-wal` / `-shm` / `-journal`) back
12
+ * to the main `opencode.db`. Non-sidecar paths are returned unchanged. The watcher
13
+ * uses this so WAL-mode writes — which land in `-wal` and leave the main file's
14
+ * mtime stale until checkpoint — still schedule a re-index of the database.
15
+ */
16
+ export declare function normalizeOpenCodeWatchPath(filePath: string): string;
17
+ export declare function listOpenCodeSessionFilePaths(dbPath: string): string[];
18
+ export declare function getOpenCodeSessionIndexedMtime(filePath: string): string;
19
+ export declare function loadOpenCodeSession(filePath: string): ParseSessionResult;
20
+ export declare function parseOpenCodeSession(filePath: string): ParsedSession | null;
21
+ export declare function openCodeDbPathFromSessionPath(filePath: string): string;
22
+ export declare function openCodeDbDisplayPath(filePath: string): string;
23
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/parsers/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAiB,aAAa,EAAE,MAAM,aAAa,CAAA;AAGnF,eAAO,MAAM,sBAAsB,mCAAmC,CAAA;AACtE,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AA4D7C,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO3G;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BrE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgCvE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAqExE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAO3E;AAsLD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,358 @@
1
+ import Database from 'better-sqlite3';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { stripSpoolSystemPrelude } from './spool-prelude.js';
4
+ export const OPENCODE_INDEX_VERSION = 'opencode-v3-session-model-json';
5
+ export const OPENCODE_DB_NAME = 'opencode.db';
6
+ const OPENCODE_SESSION_SEPARATOR = '#session=';
7
+ const OPENCODE_SUBAGENT_PARENT_PREFIX = 'opencode-subagent:';
8
+ const OPENCODE_SUBAGENT_HEADER_PREFIX = 'OpenCode subagent:';
9
+ // WAL/SHM/journal sidecars share the DB's basename + a suffix; watcher events on
10
+ // them must map back to the main file so commits append to -wal (whose writes the
11
+ // main file's mtime does not reflect until checkpoint) still trigger a re-index.
12
+ const OPENCODE_DB_SIDECAR_SUFFIXES = ['-wal', '-shm', '-journal'];
13
+ // Guards the recursive session-tree walks against pathological/corrupt parent
14
+ // chains. Real OpenCode trees are shallow (root → subagent → subagent); a cycle
15
+ // is unreachable from a NULL-parent root, but this bounds the walk regardless.
16
+ const OPENCODE_MAX_SESSION_DEPTH = 64;
17
+ const sessionMtimeCache = new Map();
18
+ export function makeOpenCodeSessionFilePath(dbPath, sessionId) {
19
+ return `${dbPath}${OPENCODE_SESSION_SEPARATOR}${encodeURIComponent(sessionId)}`;
20
+ }
21
+ export function parseOpenCodeSessionFilePath(filePath) {
22
+ const idx = filePath.lastIndexOf(OPENCODE_SESSION_SEPARATOR);
23
+ if (idx === -1)
24
+ return null;
25
+ const dbPath = filePath.slice(0, idx);
26
+ const encodedSessionId = filePath.slice(idx + OPENCODE_SESSION_SEPARATOR.length);
27
+ if (!dbPath || !encodedSessionId)
28
+ return null;
29
+ return { dbPath, sessionId: decodeURIComponent(encodedSessionId) };
30
+ }
31
+ export function isOpenCodeDatabaseFile(filePath) {
32
+ return basename(filePath) === OPENCODE_DB_NAME;
33
+ }
34
+ /**
35
+ * Map an OpenCode DB sidecar path (`opencode.db-wal` / `-shm` / `-journal`) back
36
+ * to the main `opencode.db`. Non-sidecar paths are returned unchanged. The watcher
37
+ * uses this so WAL-mode writes — which land in `-wal` and leave the main file's
38
+ * mtime stale until checkpoint — still schedule a re-index of the database.
39
+ */
40
+ export function normalizeOpenCodeWatchPath(filePath) {
41
+ const base = basename(filePath);
42
+ for (const suffix of OPENCODE_DB_SIDECAR_SUFFIXES) {
43
+ if (base === OPENCODE_DB_NAME + suffix) {
44
+ return join(dirname(filePath), OPENCODE_DB_NAME);
45
+ }
46
+ }
47
+ return filePath;
48
+ }
49
+ export function listOpenCodeSessionFilePaths(dbPath) {
50
+ const db = openOpenCodeDb(dbPath);
51
+ try {
52
+ const rows = db.prepare(`
53
+ WITH RECURSIVE active_sessions(id, root_id, time_updated, depth) AS (
54
+ SELECT id, id AS root_id, time_updated, 0 AS depth
55
+ FROM session
56
+ WHERE parent_id IS NULL AND time_archived IS NULL
57
+
58
+ UNION ALL
59
+
60
+ SELECT child.id, active_sessions.root_id, child.time_updated, active_sessions.depth + 1
61
+ FROM session child
62
+ JOIN active_sessions ON child.parent_id = active_sessions.id
63
+ WHERE child.time_archived IS NULL AND active_sessions.depth < ${OPENCODE_MAX_SESSION_DEPTH}
64
+ )
65
+ SELECT root_id AS id, MAX(time_updated) AS time_updated
66
+ FROM active_sessions
67
+ GROUP BY root_id
68
+ ORDER BY time_updated DESC, root_id DESC
69
+ `).all();
70
+ sessionMtimeCache.set(dbPath, new Map(rows.map(row => [row.id, row.time_updated])));
71
+ return rows.map(row => makeOpenCodeSessionFilePath(dbPath, row.id));
72
+ }
73
+ finally {
74
+ db.close();
75
+ }
76
+ }
77
+ export function getOpenCodeSessionIndexedMtime(filePath) {
78
+ const parsed = parseOpenCodeSessionFilePath(filePath);
79
+ if (!parsed) {
80
+ throw new Error(`OpenCode session path is missing ${OPENCODE_SESSION_SEPARATOR}: ${filePath}`);
81
+ }
82
+ const cached = sessionMtimeCache.get(parsed.dbPath)?.get(parsed.sessionId);
83
+ if (cached !== undefined)
84
+ return `${cached}::${OPENCODE_INDEX_VERSION}`;
85
+ const db = openOpenCodeDb(parsed.dbPath);
86
+ try {
87
+ const row = db.prepare(`
88
+ WITH RECURSIVE descendants(id, time_updated, depth) AS (
89
+ SELECT id, time_updated, 0 AS depth
90
+ FROM session
91
+ WHERE id = ? AND parent_id IS NULL AND time_archived IS NULL
92
+
93
+ UNION ALL
94
+
95
+ SELECT child.id, child.time_updated, descendants.depth + 1
96
+ FROM session child
97
+ JOIN descendants ON child.parent_id = descendants.id
98
+ WHERE child.time_archived IS NULL AND descendants.depth < ${OPENCODE_MAX_SESSION_DEPTH}
99
+ )
100
+ SELECT MAX(time_updated) AS time_updated
101
+ FROM descendants
102
+ `).get(parsed.sessionId);
103
+ if (!row?.time_updated)
104
+ throw new Error(`OpenCode parent session not found: ${parsed.sessionId}`);
105
+ return `${row.time_updated}::${OPENCODE_INDEX_VERSION}`;
106
+ }
107
+ finally {
108
+ db.close();
109
+ }
110
+ }
111
+ export function loadOpenCodeSession(filePath) {
112
+ const parsedPath = parseOpenCodeSessionFilePath(filePath);
113
+ if (!parsedPath)
114
+ return { kind: 'skipped' };
115
+ const db = openOpenCodeDb(parsedPath.dbPath);
116
+ try {
117
+ const session = db.prepare(`
118
+ SELECT id, parent_id, directory, title, time_created, time_updated, model, agent
119
+ FROM session
120
+ WHERE id = ? AND time_archived IS NULL
121
+ `).get(parsedPath.sessionId);
122
+ if (!session)
123
+ return { kind: 'filtered' };
124
+ // Subagent rows (parent_id set) are folded into their parent, never indexed
125
+ // standalone — surfacing them here would duplicate work already shown under
126
+ // the parent. listOpenCodeSessionFilePaths only ever yields root ids, so this
127
+ // guards the direct-load path (e.g. a stale indexed child path).
128
+ if (session.parent_id)
129
+ return { kind: 'filtered' };
130
+ let cwd = session.directory || '';
131
+ let model = normalizeModel(session.model);
132
+ const messages = loadMessagesForOpenCodeSession(db, session, {
133
+ sidechain: false,
134
+ onCwd: value => { if (!cwd)
135
+ cwd = value; },
136
+ onModel: value => { if (!model)
137
+ model = value; },
138
+ });
139
+ const childSessions = listOpenCodeChildSessions(db, session.id);
140
+ let endedAtMs = Math.max(session.time_updated, ...childSessions.map(child => child.time_updated));
141
+ for (const child of childSessions) {
142
+ const groupKey = `${OPENCODE_SUBAGENT_PARENT_PREFIX}${child.id}`;
143
+ const childMessages = loadMessagesForOpenCodeSession(db, child, {
144
+ sidechain: true,
145
+ uuidPrefix: `${child.id}:`,
146
+ parentUuid: groupKey,
147
+ });
148
+ if (childMessages.length === 0)
149
+ continue;
150
+ endedAtMs = Math.max(endedAtMs, child.time_updated);
151
+ messages.push(makeSubagentHeaderMessage(child, groupKey));
152
+ messages.push(...childMessages);
153
+ }
154
+ if (messages.length === 0)
155
+ return { kind: 'skipped' };
156
+ messages.sort(compareParsedMessages);
157
+ messages.forEach((message, index) => { message.seq = index; });
158
+ const firstUserMessage = messages.find(message => !message.isSidechain && message.role === 'user' && message.contentText.trim().length > 0);
159
+ const title = session.title?.trim()
160
+ || firstUserMessage?.contentText.replace(/<[^>]+>/g, '').trim().slice(0, 120)
161
+ || '(no title)';
162
+ return {
163
+ kind: 'parsed',
164
+ session: {
165
+ source: 'opencode',
166
+ sessionUuid: session.id,
167
+ filePath,
168
+ title,
169
+ cwd,
170
+ model,
171
+ startedAt: toIso(session.time_created),
172
+ endedAt: toIso(endedAtMs),
173
+ messages,
174
+ },
175
+ };
176
+ }
177
+ finally {
178
+ db.close();
179
+ }
180
+ }
181
+ export function parseOpenCodeSession(filePath) {
182
+ try {
183
+ const result = loadOpenCodeSession(filePath);
184
+ return result.kind === 'parsed' ? result.session : null;
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ function openOpenCodeDb(dbPath) {
191
+ const db = new Database(dbPath, { readonly: true, fileMustExist: true });
192
+ // OpenCode may hold a write lock while checkpointing the WAL; wait briefly
193
+ // instead of throwing SQLITE_BUSY and churning the sync error log.
194
+ db.pragma('busy_timeout = 5000');
195
+ return db;
196
+ }
197
+ function groupPartsByMessage(partRows) {
198
+ const byMessage = new Map();
199
+ for (const row of partRows) {
200
+ const list = byMessage.get(row.message_id) ?? [];
201
+ list.push(row);
202
+ byMessage.set(row.message_id, list);
203
+ }
204
+ return byMessage;
205
+ }
206
+ function listOpenCodeChildSessions(db, sessionId) {
207
+ return db.prepare(`
208
+ WITH RECURSIVE child_sessions(
209
+ id, parent_id, directory, title, time_created, time_updated, model, agent, depth
210
+ ) AS (
211
+ SELECT id, parent_id, directory, title, time_created, time_updated, model, agent, 1 AS depth
212
+ FROM session
213
+ WHERE parent_id = ? AND time_archived IS NULL
214
+
215
+ UNION ALL
216
+
217
+ SELECT child.id, child.parent_id, child.directory, child.title, child.time_created,
218
+ child.time_updated, child.model, child.agent, child_sessions.depth + 1
219
+ FROM session child
220
+ JOIN child_sessions ON child.parent_id = child_sessions.id
221
+ WHERE child.time_archived IS NULL AND child_sessions.depth < ${OPENCODE_MAX_SESSION_DEPTH}
222
+ )
223
+ SELECT id, parent_id, directory, title, time_created, time_updated, model, agent
224
+ FROM child_sessions
225
+ ORDER BY time_created ASC, depth ASC, id ASC
226
+ `).all(sessionId);
227
+ }
228
+ function loadMessagesForOpenCodeSession(db, session, opts) {
229
+ const messageRows = db.prepare(`
230
+ SELECT id, time_created, data
231
+ FROM message
232
+ WHERE session_id = ?
233
+ ORDER BY time_created ASC, id ASC
234
+ `).all(session.id);
235
+ if (messageRows.length === 0)
236
+ return [];
237
+ const partRows = db.prepare(`
238
+ SELECT id, message_id, time_created, data
239
+ FROM part
240
+ WHERE session_id = ?
241
+ ORDER BY message_id ASC, time_created ASC, id ASC
242
+ `).all(session.id);
243
+ const partsByMessage = groupPartsByMessage(partRows);
244
+ const messages = [];
245
+ for (const messageRow of messageRows) {
246
+ const messageData = parseJson(messageRow.data);
247
+ if (!messageData)
248
+ continue;
249
+ const role = messageData.role;
250
+ if (role !== 'user' && role !== 'assistant')
251
+ continue;
252
+ const cwd = messageData.path?.cwd ?? messageData.path?.root;
253
+ if (cwd)
254
+ opts.onCwd?.(cwd);
255
+ const model = modelFromMessage(messageData);
256
+ if (model)
257
+ opts.onModel?.(model);
258
+ const parts = (partsByMessage.get(messageRow.id) ?? [])
259
+ .map(part => parseJson(part.data))
260
+ .filter((part) => Boolean(part));
261
+ const contentText = extractText(parts);
262
+ const toolNames = extractToolNames(parts);
263
+ if (!contentText && toolNames.length === 0)
264
+ continue;
265
+ messages.push({
266
+ uuid: `${opts.uuidPrefix ?? ''}${messageRow.id}`,
267
+ parentUuid: opts.parentUuid ?? messageData.parentID ?? null,
268
+ role,
269
+ contentText,
270
+ timestamp: toIso(messageRow.time_created),
271
+ isSidechain: opts.sidechain,
272
+ toolNames,
273
+ seq: messages.length,
274
+ });
275
+ }
276
+ return messages;
277
+ }
278
+ function makeSubagentHeaderMessage(session, groupKey) {
279
+ const title = session.title?.trim() || session.id;
280
+ const agent = session.agent?.trim();
281
+ const label = agent ? `@${agent} · ${title}` : title;
282
+ return {
283
+ uuid: `${session.id}:header`,
284
+ parentUuid: groupKey,
285
+ role: 'system',
286
+ contentText: `${OPENCODE_SUBAGENT_HEADER_PREFIX} ${label}`,
287
+ timestamp: toIso(session.time_created),
288
+ isSidechain: true,
289
+ toolNames: agent ? [agent] : [],
290
+ seq: 0,
291
+ };
292
+ }
293
+ function compareParsedMessages(a, b) {
294
+ const byTimestamp = a.timestamp.localeCompare(b.timestamp);
295
+ if (byTimestamp !== 0)
296
+ return byTimestamp;
297
+ if (a.isSidechain !== b.isSidechain)
298
+ return a.isSidechain ? 1 : -1;
299
+ return a.uuid.localeCompare(b.uuid);
300
+ }
301
+ function extractText(parts) {
302
+ return stripSpoolSystemPrelude(parts
303
+ .filter(part => part.type === 'text' && typeof part.text === 'string')
304
+ .map(part => part.text ?? '')
305
+ .join('\n'))
306
+ .trim();
307
+ }
308
+ function extractToolNames(parts) {
309
+ return Array.from(new Set(parts
310
+ .filter(part => part.type === 'tool' && typeof part.tool === 'string' && part.tool.trim().length > 0)
311
+ .map(part => part.tool)));
312
+ }
313
+ function modelFromMessage(message) {
314
+ const providerId = message.model?.providerID ?? message.providerID;
315
+ const modelId = message.model?.modelID ?? message.modelID;
316
+ if (providerId && modelId)
317
+ return `${providerId}/${modelId}`;
318
+ return modelId ?? '';
319
+ }
320
+ // OpenCode stores `session.model` as a serialized JSON object
321
+ // (`{"id","providerID","variant"?}`), not a plain string — so trim alone would
322
+ // leak raw JSON into the model field. Parse it into the same `provider/model`
323
+ // shape modelFromMessage produces; fall back to the trimmed string for any
324
+ // non-JSON or unparseable value.
325
+ function normalizeModel(model) {
326
+ if (!model)
327
+ return '';
328
+ const trimmed = model.trim();
329
+ if (!trimmed.startsWith('{'))
330
+ return trimmed;
331
+ const parsed = parseJson(trimmed);
332
+ if (!parsed)
333
+ return trimmed;
334
+ const providerId = parsed.providerID;
335
+ const modelId = parsed.modelID ?? parsed.id;
336
+ if (providerId && modelId)
337
+ return `${providerId}/${modelId}`;
338
+ return modelId ?? '';
339
+ }
340
+ function parseJson(raw) {
341
+ try {
342
+ return JSON.parse(raw);
343
+ }
344
+ catch {
345
+ return null;
346
+ }
347
+ }
348
+ function toIso(ms) {
349
+ const date = new Date(ms);
350
+ return Number.isNaN(date.getTime()) ? new Date().toISOString() : date.toISOString();
351
+ }
352
+ export function openCodeDbPathFromSessionPath(filePath) {
353
+ return parseOpenCodeSessionFilePath(filePath)?.dbPath ?? filePath;
354
+ }
355
+ export function openCodeDbDisplayPath(filePath) {
356
+ return dirname(openCodeDbPathFromSessionPath(filePath));
357
+ }
358
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/parsers/opencode.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- export type { FindingState, FindingRow, SessionWithFindingCounts, RiskByCategoryRow, DismissScope, FindingsChange, ScanStatus, } from './types.js';
1
+ export type { FindingState, FindingRow, SessionWithFindingCounts, RiskByCategoryRow, OccurrenceBySession, DismissScope, FindingsChange, ScanStatus, } from './types.js';
2
2
  export { REDACT_DETECTOR_VERSION, currentProfileString, parseProfile, profilesMatch, providersInProfile, } from './profile.js';
3
3
  export type { ProfileOpts, ParsedProfile } from './profile.js';
4
- export { insertFindings, deleteActiveFindings, deleteRefreshableFindings, updateSessionCounts, setSessionScanProfile, invalidateAllScanProfiles, invalidateSessionScanProfile, listSessionsNeedingScan, listFindings, listFindingsPage, listSessionsWithFindings, listSessionsWithFindingsPage, countSessionsWithFindings, riskByCategory, getFindingValue, getFindingValues, getAllowlists, isAllowlisted, addAllowlistSession, addAllowlistGlobal, removeAllowlistSession, removeAllowlistGlobal, listAllowlistEntries, dismissFinding, undismissFinding, } from './repo.js';
4
+ export { insertFindings, deleteActiveFindings, deleteRefreshableFindings, updateSessionCounts, setSessionScanProfile, invalidateAllScanProfiles, invalidateSessionScanProfile, listSessionsNeedingScan, listFindings, listFindingsPage, listSessionsWithFindings, listSessionsWithFindingsPage, countSessionsWithFindings, occurrencesByValueHash, riskByCategory, lastScanCompletedAt, getFindingValue, getFindingValues, getAllowlists, isAllowlisted, addAllowlistSession, addAllowlistGlobal, removeAllowlistSession, removeAllowlistGlobal, listAllowlistEntries, countAllowlistEntries, dismissFinding, dismissFindings, undismissFinding, } from './repo.js';
5
5
  export type { FindingFilter, SessionFindingFilter, FindingInput, AllowlistEntryRow, AllowlistSnapshot, Page, } from './repo.js';
6
6
  export { scanSession, ScanError } from './scan.js';
7
7
  export type { ScanResult, ScanSessionDeps } from './scan.js';
8
- export { purgeFinding, purgeFindings, orderForBulkPurge, PurgeError } from './purge.js';
8
+ export { purgeFinding, purgeFindings, purgeEverywhere, orderForBulkPurge, PurgeError } from './purge.js';
9
9
  export type { PurgeResult, PurgeDeps } from './purge.js';
10
10
  export { makeScanWorker, waitForIdle } from './worker.js';
11
11
  export type { ScanWorker, WorkerConfig } from './worker.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE9D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,IAAI,GACL,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvF,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC3E,YAAY,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,UAAU,EACV,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,kBAAkB,GACnB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE9D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,IAAI,GACL,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACxG,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC3E,YAAY,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,kBAAkB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  export { REDACT_DETECTOR_VERSION, currentProfileString, parseProfile, profilesMatch, providersInProfile, } from './profile.js';
2
- export { insertFindings, deleteActiveFindings, deleteRefreshableFindings, updateSessionCounts, setSessionScanProfile, invalidateAllScanProfiles, invalidateSessionScanProfile, listSessionsNeedingScan, listFindings, listFindingsPage, listSessionsWithFindings, listSessionsWithFindingsPage, countSessionsWithFindings, riskByCategory, getFindingValue, getFindingValues, getAllowlists, isAllowlisted, addAllowlistSession, addAllowlistGlobal, removeAllowlistSession, removeAllowlistGlobal, listAllowlistEntries, dismissFinding, undismissFinding, } from './repo.js';
2
+ export { insertFindings, deleteActiveFindings, deleteRefreshableFindings, updateSessionCounts, setSessionScanProfile, invalidateAllScanProfiles, invalidateSessionScanProfile, listSessionsNeedingScan, listFindings, listFindingsPage, listSessionsWithFindings, listSessionsWithFindingsPage, countSessionsWithFindings, occurrencesByValueHash, riskByCategory, lastScanCompletedAt, getFindingValue, getFindingValues, getAllowlists, isAllowlisted, addAllowlistSession, addAllowlistGlobal, removeAllowlistSession, removeAllowlistGlobal, listAllowlistEntries, countAllowlistEntries, dismissFinding, dismissFindings, undismissFinding, } from './repo.js';
3
3
  export { scanSession, ScanError } from './scan.js';
4
- export { purgeFinding, purgeFindings, orderForBulkPurge, PurgeError } from './purge.js';
4
+ export { purgeFinding, purgeFindings, purgeEverywhere, orderForBulkPurge, PurgeError } from './purge.js';
5
5
  export { makeScanWorker, waitForIdle } from './worker.js';
6
6
  export { listBackups, deleteBackups, backupDirFor } from './maintenance.js';
7
7
  //# sourceMappingURL=index.js.map