@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.
- package/README.md +2 -2
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +8 -7
- package/dist/db/db.js.map +1 -1
- package/dist/db/queries.d.ts +4 -3
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +9 -5
- package/dist/db/queries.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/observability/exporter-file.d.ts +30 -0
- package/dist/observability/exporter-file.d.ts.map +1 -0
- package/dist/observability/exporter-file.js +125 -0
- package/dist/observability/exporter-file.js.map +1 -0
- package/dist/observability/exporter-pretty.d.ts +27 -0
- package/dist/observability/exporter-pretty.d.ts.map +1 -0
- package/dist/observability/exporter-pretty.js +84 -0
- package/dist/observability/exporter-pretty.js.map +1 -0
- package/dist/observability/index.d.ts +2 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +2 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/layer.d.ts +29 -0
- package/dist/observability/layer.d.ts.map +1 -0
- package/dist/observability/layer.js +45 -0
- package/dist/observability/layer.js.map +1 -0
- package/dist/parsers/opencode.d.ts +23 -0
- package/dist/parsers/opencode.d.ts.map +1 -0
- package/dist/parsers/opencode.js +358 -0
- package/dist/parsers/opencode.js.map +1 -0
- package/dist/security/index.d.ts +3 -3
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +2 -2
- package/dist/security/index.js.map +1 -1
- package/dist/security/profile.d.ts +1 -1
- package/dist/security/profile.d.ts.map +1 -1
- package/dist/security/profile.js +17 -8
- package/dist/security/profile.js.map +1 -1
- package/dist/security/purge.d.ts +19 -0
- package/dist/security/purge.d.ts.map +1 -1
- package/dist/security/purge.js +36 -2
- package/dist/security/purge.js.map +1 -1
- package/dist/security/repo.d.ts +53 -4
- package/dist/security/repo.d.ts.map +1 -1
- package/dist/security/repo.js +134 -9
- package/dist/security/repo.js.map +1 -1
- package/dist/security/scan.d.ts.map +1 -1
- package/dist/security/scan.js +3 -1
- package/dist/security/scan.js.map +1 -1
- package/dist/security/types.d.ts +18 -0
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/worker.d.ts +18 -2
- package/dist/security/worker.d.ts.map +1 -1
- package/dist/security/worker.js +54 -6
- package/dist/security/worker.js.map +1 -1
- package/dist/sync/source-paths.d.ts.map +1 -1
- package/dist/sync/source-paths.js +36 -4
- package/dist/sync/source-paths.js.map +1 -1
- package/dist/sync/syncer.d.ts +1 -0
- package/dist/sync/syncer.d.ts.map +1 -1
- package/dist/sync/syncer.js +102 -2
- package/dist/sync/syncer.js.map +1 -1
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +8 -2
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/security/index.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/security/index.js
CHANGED
|
@@ -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
|