prismalens 0.2.0 → 0.4.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 (119) hide show
  1. package/README.md +29 -13
  2. package/dist/bin/prismalens.js +39 -50
  3. package/dist/chunk-2Z7QZSIS.js +20 -0
  4. package/dist/chunk-5BT3XQOG.js +2990 -0
  5. package/dist/chunk-6N4PHBII.js +30 -0
  6. package/dist/chunk-CTKCK7QT.js +387 -0
  7. package/dist/chunk-CVSS5JPC.js +130 -0
  8. package/dist/chunk-HPE5CTO4.js +22 -0
  9. package/dist/chunk-PTBCAI34.js +34 -0
  10. package/dist/chunk-PVQVFRIV.js +452 -0
  11. package/dist/chunk-QDK5PAI3.js +155 -0
  12. package/dist/chunk-SSEIMBQ2.js +204 -0
  13. package/dist/chunk-TGP6QTFO.js +156 -0
  14. package/dist/chunk-V6M6ISKI.js +161 -0
  15. package/dist/chunk-XH6DIKTA.js +83 -0
  16. package/dist/src/cli/auth.js +112 -101
  17. package/dist/src/cli/doctor.js +184 -187
  18. package/dist/src/cli/flags.js +6 -29
  19. package/dist/src/cli/grouping.js +16 -227
  20. package/dist/src/cli/init.js +58 -52
  21. package/dist/src/cli/investigate.js +23 -465
  22. package/dist/src/cli/listen.js +550 -286
  23. package/dist/src/cli/report.js +70 -67
  24. package/dist/src/cli/serve.js +260 -30
  25. package/dist/src/cli/status.js +87 -86
  26. package/package.json +16 -7
  27. package/dist/bin/prismalens.d.ts +0 -3
  28. package/dist/bin/prismalens.d.ts.map +0 -1
  29. package/dist/bin/prismalens.js.map +0 -1
  30. package/dist/src/cli/auth.d.ts +0 -3
  31. package/dist/src/cli/auth.d.ts.map +0 -1
  32. package/dist/src/cli/auth.js.map +0 -1
  33. package/dist/src/cli/doctor.d.ts +0 -18
  34. package/dist/src/cli/doctor.d.ts.map +0 -1
  35. package/dist/src/cli/doctor.js.map +0 -1
  36. package/dist/src/cli/flags.d.ts +0 -2
  37. package/dist/src/cli/flags.d.ts.map +0 -1
  38. package/dist/src/cli/flags.js.map +0 -1
  39. package/dist/src/cli/grouping.d.ts +0 -18
  40. package/dist/src/cli/grouping.d.ts.map +0 -1
  41. package/dist/src/cli/grouping.js.map +0 -1
  42. package/dist/src/cli/init.d.ts +0 -3
  43. package/dist/src/cli/init.d.ts.map +0 -1
  44. package/dist/src/cli/init.js.map +0 -1
  45. package/dist/src/cli/investigate.d.ts +0 -115
  46. package/dist/src/cli/investigate.d.ts.map +0 -1
  47. package/dist/src/cli/investigate.js.map +0 -1
  48. package/dist/src/cli/listen.d.ts +0 -56
  49. package/dist/src/cli/listen.d.ts.map +0 -1
  50. package/dist/src/cli/listen.js.map +0 -1
  51. package/dist/src/cli/report.d.ts +0 -24
  52. package/dist/src/cli/report.d.ts.map +0 -1
  53. package/dist/src/cli/report.js.map +0 -1
  54. package/dist/src/cli/serve.d.ts +0 -3
  55. package/dist/src/cli/serve.d.ts.map +0 -1
  56. package/dist/src/cli/serve.js.map +0 -1
  57. package/dist/src/cli/status.d.ts +0 -19
  58. package/dist/src/cli/status.d.ts.map +0 -1
  59. package/dist/src/cli/status.js.map +0 -1
  60. package/dist/src/config/loader.d.ts +0 -22
  61. package/dist/src/config/loader.d.ts.map +0 -1
  62. package/dist/src/config/loader.js +0 -193
  63. package/dist/src/config/loader.js.map +0 -1
  64. package/dist/src/config/schema.d.ts +0 -463
  65. package/dist/src/config/schema.d.ts.map +0 -1
  66. package/dist/src/config/schema.js +0 -217
  67. package/dist/src/config/schema.js.map +0 -1
  68. package/dist/src/core/caps.d.ts +0 -36
  69. package/dist/src/core/caps.d.ts.map +0 -1
  70. package/dist/src/core/caps.js +0 -36
  71. package/dist/src/core/caps.js.map +0 -1
  72. package/dist/src/core/db.d.ts +0 -3
  73. package/dist/src/core/db.d.ts.map +0 -1
  74. package/dist/src/core/db.js +0 -105
  75. package/dist/src/core/db.js.map +0 -1
  76. package/dist/src/core/detect-repo.d.ts +0 -4
  77. package/dist/src/core/detect-repo.d.ts.map +0 -1
  78. package/dist/src/core/detect-repo.js +0 -28
  79. package/dist/src/core/detect-repo.js.map +0 -1
  80. package/dist/src/core/file-session-store.d.ts +0 -10
  81. package/dist/src/core/file-session-store.d.ts.map +0 -1
  82. package/dist/src/core/file-session-store.js +0 -34
  83. package/dist/src/core/file-session-store.js.map +0 -1
  84. package/dist/src/core/parse-stdin.d.ts +0 -2
  85. package/dist/src/core/parse-stdin.d.ts.map +0 -1
  86. package/dist/src/core/parse-stdin.js +0 -21
  87. package/dist/src/core/parse-stdin.js.map +0 -1
  88. package/dist/src/core/run-investigation.d.ts +0 -54
  89. package/dist/src/core/run-investigation.d.ts.map +0 -1
  90. package/dist/src/core/run-investigation.js +0 -200
  91. package/dist/src/core/run-investigation.js.map +0 -1
  92. package/dist/src/core/session.d.ts +0 -63
  93. package/dist/src/core/session.d.ts.map +0 -1
  94. package/dist/src/core/session.js +0 -45
  95. package/dist/src/core/session.js.map +0 -1
  96. package/dist/src/core/slack-notify.d.ts +0 -9
  97. package/dist/src/core/slack-notify.d.ts.map +0 -1
  98. package/dist/src/core/slack-notify.js +0 -57
  99. package/dist/src/core/slack-notify.js.map +0 -1
  100. package/dist/src/core/sqlite-session-store.d.ts +0 -39
  101. package/dist/src/core/sqlite-session-store.d.ts.map +0 -1
  102. package/dist/src/core/sqlite-session-store.js +0 -239
  103. package/dist/src/core/sqlite-session-store.js.map +0 -1
  104. package/dist/src/http/server.d.ts +0 -31
  105. package/dist/src/http/server.d.ts.map +0 -1
  106. package/dist/src/http/server.js +0 -164
  107. package/dist/src/http/server.js.map +0 -1
  108. package/dist/src/jsonrpc/server.d.ts +0 -15
  109. package/dist/src/jsonrpc/server.d.ts.map +0 -1
  110. package/dist/src/jsonrpc/server.js +0 -244
  111. package/dist/src/jsonrpc/server.js.map +0 -1
  112. package/dist/src/jsonrpc/types.d.ts +0 -12
  113. package/dist/src/jsonrpc/types.d.ts.map +0 -1
  114. package/dist/src/jsonrpc/types.js +0 -4
  115. package/dist/src/jsonrpc/types.js.map +0 -1
  116. package/dist/src/version.d.ts +0 -8
  117. package/dist/src/version.d.ts.map +0 -1
  118. package/dist/src/version.js +0 -27
  119. package/dist/src/version.js.map +0 -1
@@ -1,200 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright 2026 Sumit Patel
3
- /**
4
- * CLI investigation input-resolution (ADR-0010/0011).
5
- *
6
- * The shared resolver — alert coercion, harness construction, `config → engine
7
- * inputs` — lives in `@prismalens/engine` (env-clean, reused by the web worker).
8
- * This module is the CLI's thin SHIM over it: it applies `pl.config.yaml` over the
9
- * shared `INVESTIGATION_DEFAULTS` fallbacks and reads BYO-key secrets from the
10
- * environment (ADR-0006), then calls the engine resolver. Keeping the
11
- * `resolveInvestigation(args, config)` signature means `investigate` and the
12
- * JSON-RPC `serve` path stay in lockstep, unchanged.
13
- */
14
- import { resolve } from "node:path";
15
- import { ensureV1, resolveCredentials } from "@prismalens/config/credentials";
16
- import { INVESTIGATION_DEFAULTS } from "@prismalens/config/investigation";
17
- import { AUTO_SELECT_PROVIDER_IDS, getDefaultModel, } from "@prismalens/config/llm";
18
- import { coerceFiringAlert, resolveInvestigation as engineResolveInvestigation, } from "@prismalens/engine";
19
- /**
20
- * Resolve a seed alert + merged `pl.config.yaml` into the inputs
21
- * `investigateIncidentStream` wants: applies the shared host-local fallbacks, reads
22
- * the BYO-key secrets from env, and delegates the actual build to the engine
23
- * resolver. Throws (via the engine) on a hard input error.
24
- */
25
- export function isSynthConfigured(config) {
26
- if (config.synth.provider) {
27
- return (resolveCredentials(config.synth.provider, config.synth.base_url)
28
- .source !== "none");
29
- }
30
- for (const id of AUTO_SELECT_PROVIDER_IDS) {
31
- if (resolveCredentials(id).source !== "none") {
32
- return true;
33
- }
34
- }
35
- return false;
36
- }
37
- export function resolveInvestigation(args, config) {
38
- // cwd = --repo (a local repo path) else the current directory.
39
- const cwd = args.repo ? resolve(args.repo) : process.cwd();
40
- let providerId = config.synth.provider;
41
- let creds;
42
- if (providerId) {
43
- creds = resolveCredentials(providerId, config.synth.base_url);
44
- if (providerId === "custom" && !creds.baseURL) {
45
- throw new Error("Custom LLM provider requires synth.base_url to be configured.");
46
- }
47
- }
48
- else {
49
- for (const id of AUTO_SELECT_PROVIDER_IDS) {
50
- const candidate = resolveCredentials(id);
51
- if (candidate.source !== "none") {
52
- providerId = id;
53
- break;
54
- }
55
- }
56
- if (providerId) {
57
- creds = resolveCredentials(providerId, config.synth.base_url);
58
- }
59
- else {
60
- creds = { providerId: "ollama", source: "none" };
61
- providerId = "ollama";
62
- }
63
- }
64
- const synthModel = config.synth.model ??
65
- config.agent.model ??
66
- getDefaultModel(providerId) ??
67
- "";
68
- if (!synthModel && creds.source !== "none") {
69
- throw new Error("No synthesis model configured (set synth.model or agent.model).");
70
- }
71
- // Context enrichment (ADR-0015) — a single-alert CLI run is NOT context-free: it
72
- // still knows the service/repos/logs from `prismalens.config.yaml`.
73
- const service = selectService(args, config);
74
- const repos = config.repo
75
- ? [config.repo]
76
- : Object.keys(config.repos).length > 0
77
- ? Object.keys(config.repos)
78
- : undefined;
79
- const logs = config.logs.url
80
- ? {
81
- ...(config.logs.kind ? { kind: config.logs.kind } : {}),
82
- url: config.logs.url,
83
- }
84
- : undefined;
85
- // The single posture dial (ADR-0017): --mode / RPC `mode` wins; else
86
- // `agent.permissions.mode` (defaults to "read-only"). Native passthrough is
87
- // per-harness config, keyed by the resolved harness name.
88
- const harnessName = args.harness ?? config.agent.default;
89
- const permissionMode = args.permissionMode ??
90
- config.agent.permissions.mode;
91
- const harnessNative = config.harnesses[harnessName]?.native;
92
- // Best-effort resource caps (ADR-0020): map the snake_case config knobs to the
93
- // engine's SandboxLimits shape, dropping unset ones so "no cap" stays no cap
94
- // (never a lying default). Only present when at least one knob is set.
95
- const limits = toSandboxLimits(config.agent.limits);
96
- const telemetry = {
97
- prometheusUrl: config.telemetry.prometheusUrl ??
98
- INVESTIGATION_DEFAULTS.telemetry.prometheusUrl,
99
- alertmanagerUrl: config.telemetry.alertmanagerUrl ??
100
- INVESTIGATION_DEFAULTS.telemetry.alertmanagerUrl,
101
- apiUrl: config.telemetry.apiUrl ?? INVESTIGATION_DEFAULTS.telemetry.apiUrl,
102
- };
103
- const request = {
104
- query: args.query,
105
- harness: harnessName,
106
- permissionMode,
107
- ...(harnessNative ? { harnessNative } : {}),
108
- ...(args.sandbox ? { sandbox: args.sandbox } : {}),
109
- ...(args.requestedSandbox
110
- ? { requestedSandbox: args.requestedSandbox }
111
- : {}),
112
- ...(limits ? { limits } : {}),
113
- // Per-alert fan-out cap (ADR-0016 decision 2): wire `agent.max_branches` when
114
- // set; unset leaves the engine default (mirrors the `limits` thread-through).
115
- ...(config.agent.max_branches
116
- ? { maxBranches: config.agent.max_branches }
117
- : {}),
118
- ...(args.maxTurns ? { maxTurns: args.maxTurns } : {}),
119
- ...(args.isolateSettings ? { isolateSettings: args.isolateSettings } : {}),
120
- model: config.agent.model,
121
- cwd,
122
- synth: {
123
- providerId: providerId,
124
- model: synthModel,
125
- apiKey: creds.apiKey ?? "",
126
- baseURL: creds.baseURL,
127
- configured: creds.source !== "none",
128
- },
129
- harnessEnv: {
130
- OPENAI_API_KEY: process.env.OLLAMA_API_KEY ?? process.env.OPENAI_API_KEY,
131
- OPENAI_BASE_URL: ensureV1(process.env.OLLAMA_BASE_URL ??
132
- process.env.OPENAI_BASE_URL ??
133
- INVESTIGATION_DEFAULTS.synth.baseURL),
134
- },
135
- initTimeoutMs: INVESTIGATION_DEFAULTS.harnessInitTimeoutMs,
136
- };
137
- if (args.alerts && args.alerts.length > 0) {
138
- request.context = {
139
- alerts: args.alerts.map(coerceFiringAlert),
140
- telemetry,
141
- ...(service ? { service } : {}),
142
- ...(repos ? { repos } : {}),
143
- ...(logs ? { logs } : {}),
144
- };
145
- }
146
- else {
147
- request.alert = args.alert;
148
- request.telemetry = telemetry;
149
- if (service)
150
- request.service = service;
151
- if (repos)
152
- request.repos = repos;
153
- if (logs)
154
- request.logs = logs;
155
- }
156
- return engineResolveInvestigation(request);
157
- }
158
- /**
159
- * Map the parsed `agent.limits` (snake_case, all optional) into the engine's
160
- * {@link SandboxLimits} (camelCase), dropping unset knobs. Returns `undefined` when
161
- * nothing is set so the request stays limit-free — an omitted cap is never coerced to
162
- * a lying value (ADR-0020).
163
- */
164
- function toSandboxLimits(limits) {
165
- const out = {
166
- ...(limits.wall_clock_ms ? { wallClockMs: limits.wall_clock_ms } : {}),
167
- ...(limits.memory_mb ? { memoryMb: limits.memory_mb } : {}),
168
- ...(limits.cpu_cores ? { cpuCores: limits.cpu_cores } : {}),
169
- };
170
- return Object.keys(out).length > 0 ? out : undefined;
171
- }
172
- /**
173
- * Label-driven service selection (ADR-0015 §4): `--service` wins; else the alert's
174
- * own service label; no match in the catalog → no service context (degrade to
175
- * telemetry + cwd, today's behaviour — never an error).
176
- */
177
- function selectService(args, config) {
178
- const name = args.service ?? pickServiceLabel(args.alerts?.[0] ?? args.alert);
179
- if (!name)
180
- return undefined;
181
- const cfg = config.services[name];
182
- if (!cfg)
183
- return undefined;
184
- return {
185
- name,
186
- ...(cfg.tier ? { tier: cfg.tier } : {}),
187
- ...(cfg.repo ? { repo: cfg.repo } : {}),
188
- ...(cfg.depends_on.length > 0 ? { dependsOn: cfg.depends_on } : {}),
189
- };
190
- }
191
- /**
192
- * The alert's service identity label — `service`, else `namespace`, else `job`.
193
- * Exported for the `listen` path's per-payload repo resolution (issue #58 AC5).
194
- */
195
- export function pickServiceLabel(alert) {
196
- const labels = (alert?.labels ?? {});
197
- const pick = labels.service ?? labels.namespace ?? labels.job;
198
- return typeof pick === "string" && pick ? pick : undefined;
199
- }
200
- //# sourceMappingURL=run-investigation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"run-investigation.js","sourceRoot":"","sources":["../../../src/core/run-investigation.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- import type { CanonicalEvent, InvestigationReport } from "@prismalens/contracts";
2
- export type SessionStatus = "running" | "done" | "errored" | "suppressed";
3
- export interface SessionRecord {
4
- runId: string;
5
- status: SessionStatus;
6
- alertname?: string;
7
- /** Harness backend driving the run (agent.default). */
8
- agent?: string;
9
- /** Repository under investigation (owner/name). */
10
- repo?: string;
11
- /** Absolute path to this run's workspace dir. */
12
- workspacePath: string;
13
- error?: string;
14
- /** Which cap suppressed this dispatch (only set when status === "suppressed"). */
15
- suppressionReason?: string;
16
- createdAt: string;
17
- updatedAt: string;
18
- completedAt?: string;
19
- }
20
- export interface CreateSessionInput {
21
- runId: string;
22
- alertname?: string;
23
- agent?: string;
24
- repo?: string;
25
- }
26
- export interface GroupRecord {
27
- groupKey: string;
28
- formedBy: "window" | "overlay";
29
- alerts: Record<string, unknown>[];
30
- lateAlerts: Record<string, unknown>[];
31
- }
32
- export interface SessionManager {
33
- /** Resolved workspace base dir. */
34
- readonly baseDir: string;
35
- /** Absolute path to a run's workspace dir. */
36
- workspaceDir(runId: string): string;
37
- create(input: CreateSessionInput): Promise<SessionRecord>;
38
- get(runId: string): Promise<SessionRecord | null>;
39
- update(runId: string, updates: Partial<Omit<SessionRecord, "runId">>): Promise<SessionRecord>;
40
- list(filter?: {
41
- status?: SessionStatus[];
42
- }): Promise<SessionRecord[]>;
43
- /** Append one canonical event to the run's events.jsonl. */
44
- appendEvent(runId: string, event: CanonicalEvent): Promise<void>;
45
- readEvents(runId: string): Promise<CanonicalEvent[]>;
46
- writeReport(runId: string, report: InvestigationReport): Promise<void>;
47
- readReport(runId: string): Promise<InvestigationReport | null>;
48
- writeGroupRecord(runId: string, rec: GroupRecord): Promise<void>;
49
- appendGroupAlert(runId: string, alert: Record<string, unknown>): Promise<void>;
50
- /** Persist an over-cap dispatch decision (issue #62): a terminal `suppressed`
51
- * run row with the cap that tripped, no workspace. Visible in `pl status`. */
52
- recordSuppressed(input: {
53
- runId: string;
54
- reason: string;
55
- alertname?: string;
56
- }): Promise<void>;
57
- /** Release any underlying handle (e.g. the sqlite connection). Optional so
58
- * pure in-memory/file managers need not implement it. */
59
- close?(): void;
60
- }
61
- export declare function resolveBaseDir(baseDir?: string): string;
62
- export declare function createSessionManager(baseDir?: string): SessionManager;
63
- //# sourceMappingURL=session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright 2026 Sumit Patel
3
- /**
4
- * Workspace + session manager for engine runs (ADR-0010), simplified from the
5
- * retired pl orchestrator's session-manager.
6
- *
7
- * Layout under `<workspace.base_dir>` (default ~/.prismalens):
8
- * prismalens.db - sqlite store for all run metadata
9
- * runs/<runId>/ - per-run workspace dir
10
- */
11
- import { homedir } from "node:os";
12
- import { join, resolve } from "node:path";
13
- import { getAppDataDir } from "@prismalens/config/investigation";
14
- import { openDatabase } from "./db.js";
15
- import { SqliteSessionManager } from "./sqlite-session-store.js";
16
- const RUN_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
17
- function expandHome(p) {
18
- if (p === "~")
19
- return homedir();
20
- if (p.startsWith("~/"))
21
- return join(homedir(), p.slice(2));
22
- return p;
23
- }
24
- export function resolveBaseDir(baseDir) {
25
- // Honor PRISMALENS_USER_FOLDER for the default workspace (via getAppDataDir);
26
- // an explicit `workspace.base_dir` override still wins.
27
- if (!baseDir || baseDir === "~/.prismalens")
28
- return getAppDataDir();
29
- return resolve(expandHome(baseDir));
30
- }
31
- export function createSessionManager(baseDir) {
32
- const base = resolveBaseDir(baseDir);
33
- const db = openDatabase(base);
34
- const runsRoot = join(base, "runs");
35
- function assertRunId(runId) {
36
- if (!RUN_ID_RE.test(runId))
37
- throw new Error(`Invalid runId: "${runId}"`);
38
- }
39
- function workspaceDir(runId) {
40
- assertRunId(runId);
41
- return join(runsRoot, runId);
42
- }
43
- return new SqliteSessionManager(base, db, workspaceDir, assertRunId);
44
- }
45
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAE7B;;;;;;;GAOG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAKjE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAsEjE,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAE3C,SAAS,UAAU,CAAC,CAAS;IAC5B,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,CAAC;AACV,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC9C,8EAA8E;IAC9E,wDAAwD;IACxD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,eAAe;QAAE,OAAO,aAAa,EAAE,CAAC;IACpE,OAAO,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACpD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpC,SAAS,WAAW,CAAC,KAAa;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,SAAS,YAAY,CAAC,KAAa;QAClC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;AACtE,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { ConductedOutcome } from "@prismalens/engine";
2
- export declare function buildSlackMessage(input: {
3
- alertname: string;
4
- runId: string;
5
- outcome: ConductedOutcome;
6
- }): string;
7
- export declare function postToSlack(webhookUrl: string, text: string): Promise<void>;
8
- export declare function notifyRun(webhookUrl: string, alertname: string, outcome: ConductedOutcome): Promise<void>;
9
- //# sourceMappingURL=slack-notify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"slack-notify.d.ts","sourceRoot":"","sources":["../../../src/core/slack-notify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;CAC1B,GAAG,MAAM,CA8BT;AAED,wBAAsB,WAAW,CAChC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,SAAS,CAC9B,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -1,57 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- // Copyright 2026 Sumit Patel
3
- export function buildSlackMessage(input) {
4
- const { alertname, runId, outcome } = input;
5
- if (outcome.failureKind === "cancelled") {
6
- return "";
7
- }
8
- if (outcome.failureKind === "error") {
9
- return `${alertname}\nInvestigation errored: ${outcome.error ?? "unknown error"}\nRun ${runId} — pl report ${runId}`;
10
- }
11
- if (outcome.failureKind === "no-evidence") {
12
- return `${alertname}\nInvestigated — insufficient evidence to determine a cause.\nRun ${runId} — pl report ${runId}`;
13
- }
14
- const report = outcome.report;
15
- if (!report) {
16
- return "";
17
- }
18
- let message = `${alertname}\n${report.summary}\nRoot cause: ${report.rootCause ?? "not determined"}`;
19
- if (report.hypotheses.length > 0) {
20
- const topHypothesis = report.hypotheses[0];
21
- message += `\nTop hypothesis: ${topHypothesis.statement} (${topHypothesis.evidence.length} evidence)`;
22
- }
23
- message += `\nRun ${runId} — pl report ${runId}`;
24
- return message;
25
- }
26
- export async function postToSlack(webhookUrl, text) {
27
- const res = await fetch(webhookUrl, {
28
- method: "POST",
29
- headers: { "Content-Type": "application/json" },
30
- body: JSON.stringify({ text }),
31
- signal: AbortSignal.timeout(5000),
32
- });
33
- if (!res.ok) {
34
- throw new Error(`Slack webhook returned ${res.status}`);
35
- }
36
- }
37
- export async function notifyRun(webhookUrl, alertname, outcome) {
38
- try {
39
- const text = buildSlackMessage({
40
- alertname,
41
- runId: outcome.runId,
42
- outcome,
43
- });
44
- if (!text) {
45
- return;
46
- }
47
- await postToSlack(webhookUrl, text);
48
- }
49
- catch (err) {
50
- console.error(JSON.stringify({
51
- event: "slack_delivery_failed",
52
- runId: outcome.runId,
53
- error: err instanceof Error ? err.message : String(err),
54
- }));
55
- }
56
- }
57
- //# sourceMappingURL=slack-notify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"slack-notify.js","sourceRoot":"","sources":["../../../src/core/slack-notify.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAI7B,MAAM,UAAU,iBAAiB,CAAC,KAIjC;IACA,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE5C,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO,GAAG,SAAS,4BAA4B,OAAO,CAAC,KAAK,IAAI,eAAe,SAAS,KAAK,gBAAgB,KAAK,EAAE,CAAC;IACtH,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,aAAa,EAAE,CAAC;QAC3C,OAAO,GAAG,SAAS,qEAAqE,KAAK,gBAAgB,KAAK,EAAE,CAAC;IACtH,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,OAAO,GAAG,GAAG,SAAS,KAAK,MAAM,CAAC,OAAO,iBAAiB,MAAM,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC;IAErG,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,IAAI,qBAAqB,aAAa,CAAC,SAAS,KAAK,aAAa,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC;IACvG,CAAC;IAED,OAAO,IAAI,SAAS,KAAK,gBAAgB,KAAK,EAAE,CAAC;IAEjD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,UAAkB,EAClB,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,UAAkB,EAClB,SAAiB,EACjB,OAAyB;IAEzB,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC;YAC9B,SAAS;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO;SACP,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,OAAO;QACR,CAAC;QACD,MAAM,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CACZ,IAAI,CAAC,SAAS,CAAC;YACd,KAAK,EAAE,uBAAuB;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACvD,CAAC,CACF,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -1,39 +0,0 @@
1
- import type { DatabaseSync } from "node:sqlite";
2
- import type { CanonicalEvent, InvestigationReport } from "@prismalens/contracts";
3
- import type { CreateSessionInput, GroupRecord, SessionManager, SessionRecord, SessionStatus } from "./session.js";
4
- export declare class SqliteSessionManager implements SessionManager {
5
- readonly baseDir: string;
6
- private db;
7
- readonly workspaceDir: (runId: string) => string;
8
- private assertRunId;
9
- constructor(baseDir: string, db: DatabaseSync, workspaceDir: (runId: string) => string, assertRunId: (runId: string) => void);
10
- create(input: CreateSessionInput): Promise<SessionRecord>;
11
- get(runId: string): Promise<SessionRecord | null>;
12
- update(runId: string, updates: Partial<Omit<SessionRecord, "runId">>): Promise<SessionRecord>;
13
- list(filter?: {
14
- status?: SessionStatus[];
15
- }): Promise<SessionRecord[]>;
16
- appendEvent(runId: string, event: CanonicalEvent): Promise<void>;
17
- readEvents(runId: string): Promise<CanonicalEvent[]>;
18
- writeReport(runId: string, report: InvestigationReport): Promise<void>;
19
- readReport(runId: string): Promise<InvestigationReport | null>;
20
- /**
21
- * Persist a group's record (ADR-0012 grouping): upsert the `groups` row with
22
- * the key + how it formed (taken from the record, never hardcoded), then
23
- * replace its `group_alerts` with the formative alerts (late=0) followed by
24
- * any already-attached late alerts (late=1), each in order. The group row may
25
- * already exist (a plain `create()` seeds one) — we keep its created_at.
26
- */
27
- writeGroupRecord(runId: string, rec: GroupRecord): Promise<void>;
28
- /** Attach a late alert to an existing group, appended in arrival order. */
29
- appendGroupAlert(runId: string, alert: Record<string, unknown>): Promise<void>;
30
- recordSuppressed(input: {
31
- runId: string;
32
- reason: string;
33
- alertname?: string;
34
- }): Promise<void>;
35
- /** Release the underlying db handle. Callers that own a transient manager
36
- * (e.g. one per `pl listen` run) must close it or leak a connection. */
37
- close(): void;
38
- }
39
- //# sourceMappingURL=sqlite-session-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sqlite-session-store.d.ts","sourceRoot":"","sources":["../../../src/core/sqlite-session-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EACX,cAAc,EACd,mBAAmB,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,MAAM,cAAc,CAAC;AA8CtB,qBAAa,oBAAqB,YAAW,cAAc;aAEzC,OAAO,EAAE,MAAM;IAC/B,OAAO,CAAC,EAAE;aACM,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM;IACvD,OAAO,CAAC,WAAW;gBAHH,OAAO,EAAE,MAAM,EACvB,EAAE,EAAE,YAAY,EACR,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EAC/C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IAGvC,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuCzD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOjD,MAAM,CACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,GAC5C,OAAO,CAAC,aAAa,CAAC;IA2DnB,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBrE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQpD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAapE;;;;;;OAMG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BtE,2EAA2E;IACrE,gBAAgB,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAmBV,gBAAgB,CAAC,KAAK,EAAE;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCjB;4EACwE;IACxE,KAAK,IAAI,IAAI;CAGb"}