prismalens 0.0.1

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 (64) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +312 -0
  4. package/dist/bin/prismalens.d.ts +3 -0
  5. package/dist/bin/prismalens.d.ts.map +1 -0
  6. package/dist/bin/prismalens.js +32 -0
  7. package/dist/bin/prismalens.js.map +1 -0
  8. package/dist/src/cli/doctor.d.ts +3 -0
  9. package/dist/src/cli/doctor.d.ts.map +1 -0
  10. package/dist/src/cli/doctor.js +156 -0
  11. package/dist/src/cli/doctor.js.map +1 -0
  12. package/dist/src/cli/init.d.ts +3 -0
  13. package/dist/src/cli/init.d.ts.map +1 -0
  14. package/dist/src/cli/init.js +85 -0
  15. package/dist/src/cli/init.js.map +1 -0
  16. package/dist/src/cli/investigate.d.ts +101 -0
  17. package/dist/src/cli/investigate.d.ts.map +1 -0
  18. package/dist/src/cli/investigate.js +452 -0
  19. package/dist/src/cli/investigate.js.map +1 -0
  20. package/dist/src/cli/serve.d.ts +3 -0
  21. package/dist/src/cli/serve.d.ts.map +1 -0
  22. package/dist/src/cli/serve.js +26 -0
  23. package/dist/src/cli/serve.js.map +1 -0
  24. package/dist/src/config/loader.d.ts +22 -0
  25. package/dist/src/config/loader.d.ts.map +1 -0
  26. package/dist/src/config/loader.js +155 -0
  27. package/dist/src/config/loader.js.map +1 -0
  28. package/dist/src/config/schema.d.ts +336 -0
  29. package/dist/src/config/schema.d.ts.map +1 -0
  30. package/dist/src/config/schema.js +160 -0
  31. package/dist/src/config/schema.js.map +1 -0
  32. package/dist/src/core/detect-repo.d.ts +4 -0
  33. package/dist/src/core/detect-repo.d.ts.map +1 -0
  34. package/dist/src/core/detect-repo.js +28 -0
  35. package/dist/src/core/detect-repo.js.map +1 -0
  36. package/dist/src/core/file-session-store.d.ts +10 -0
  37. package/dist/src/core/file-session-store.d.ts.map +1 -0
  38. package/dist/src/core/file-session-store.js +34 -0
  39. package/dist/src/core/file-session-store.js.map +1 -0
  40. package/dist/src/core/parse-stdin.d.ts +2 -0
  41. package/dist/src/core/parse-stdin.d.ts.map +1 -0
  42. package/dist/src/core/parse-stdin.js +30 -0
  43. package/dist/src/core/parse-stdin.js.map +1 -0
  44. package/dist/src/core/run-investigation.d.ts +42 -0
  45. package/dist/src/core/run-investigation.d.ts.map +1 -0
  46. package/dist/src/core/run-investigation.js +144 -0
  47. package/dist/src/core/run-investigation.js.map +1 -0
  48. package/dist/src/core/session.d.ts +42 -0
  49. package/dist/src/core/session.d.ts.map +1 -0
  50. package/dist/src/core/session.js +168 -0
  51. package/dist/src/core/session.js.map +1 -0
  52. package/dist/src/jsonrpc/server.d.ts +15 -0
  53. package/dist/src/jsonrpc/server.d.ts.map +1 -0
  54. package/dist/src/jsonrpc/server.js +244 -0
  55. package/dist/src/jsonrpc/server.js.map +1 -0
  56. package/dist/src/jsonrpc/types.d.ts +12 -0
  57. package/dist/src/jsonrpc/types.d.ts.map +1 -0
  58. package/dist/src/jsonrpc/types.js +4 -0
  59. package/dist/src/jsonrpc/types.js.map +1 -0
  60. package/dist/src/version.d.ts +8 -0
  61. package/dist/src/version.d.ts.map +1 -0
  62. package/dist/src/version.js +27 -0
  63. package/dist/src/version.js.map +1 -0
  64. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Session repo label: an explicit config `repo` (owner/name) wins; else git
2
+ * auto-detect from cwd; else none. */
3
+ export declare function resolveRepoSlug(configRepo: string | undefined, cwd?: string): Promise<string | undefined>;
4
+ //# sourceMappingURL=detect-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-repo.d.ts","sourceRoot":"","sources":["../../../src/core/detect-repo.ts"],"names":[],"mappings":"AA+BA;sCACsC;AACtC,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,GAAE,MAAsB,GACzB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B"}
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ /**
4
+ * Resolve the repository label under investigation. Precedence: an explicit
5
+ * config `repo` value (owner/name) wins; else git origin auto-detect from the
6
+ * working directory; else `undefined`.
7
+ *
8
+ * Uses node:child_process directly (no tinyexec dependency).
9
+ */
10
+ import { execFile } from "node:child_process";
11
+ import { promisify } from "node:util";
12
+ const execFileAsync = promisify(execFile);
13
+ const REPO_PATTERN = /(?:github\.com|gitlab\.com|bitbucket\.org)[/:](.+?)(?:\.git)?$/;
14
+ async function detectRepo(cwd) {
15
+ try {
16
+ const { stdout } = await execFileAsync("git", ["remote", "get-url", "origin"], { cwd });
17
+ return stdout.trim().match(REPO_PATTERN)?.[1];
18
+ }
19
+ catch {
20
+ return undefined;
21
+ }
22
+ }
23
+ /** Session repo label: an explicit config `repo` (owner/name) wins; else git
24
+ * auto-detect from cwd; else none. */
25
+ export async function resolveRepoSlug(configRepo, cwd = process.cwd()) {
26
+ return configRepo ?? (await detectRepo(cwd));
27
+ }
28
+ //# sourceMappingURL=detect-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-repo.js","sourceRoot":"","sources":["../../../src/core/detect-repo.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAE7B;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,YAAY,GACjB,gEAAgE,CAAC;AAElE,KAAK,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACrC,KAAK,EACL,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC/B,EAAE,GAAG,EAAE,CACP,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;sCACsC;AACtC,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,UAA8B,EAC9B,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,OAAO,UAAU,IAAI,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { InvestigationStore } from "@prismalens/engine";
2
+ import type { CreateSessionInput, SessionManager } from "./session.js";
3
+ export interface FileSessionStore {
4
+ store: InvestigationStore;
5
+ /** The created session's workspace dir. Throws if read before `create()` resolves. */
6
+ workspacePath(): string;
7
+ }
8
+ /** Build a `conductRun`-ready store over `sessions`, scoped to one run's `meta`. */
9
+ export declare function createFileSessionStore(sessions: SessionManager, meta: CreateSessionInput): FileSessionStore;
10
+ //# sourceMappingURL=file-session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-session-store.d.ts","sourceRoot":"","sources":["../../../src/core/file-session-store.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EACX,kBAAkB,EAClB,cAAc,EAEd,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,sFAAsF;IACtF,aAAa,IAAI,MAAM,CAAC;CACxB;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,kBAAkB,GACtB,gBAAgB,CAiClB"}
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ /** Build a `conductRun`-ready store over `sessions`, scoped to one run's `meta`. */
4
+ export function createFileSessionStore(sessions, meta) {
5
+ let session;
6
+ const store = {
7
+ async create() {
8
+ session = await sessions.create(meta);
9
+ },
10
+ async append(event) {
11
+ await sessions.appendEvent(meta.runId, event);
12
+ },
13
+ async finish(report) {
14
+ await sessions.writeReport(meta.runId, report);
15
+ await sessions.update(meta.runId, {
16
+ status: "done",
17
+ completedAt: new Date().toISOString(),
18
+ });
19
+ },
20
+ async fail() {
21
+ await sessions.update(meta.runId, { status: "errored" });
22
+ },
23
+ };
24
+ return {
25
+ store,
26
+ workspacePath() {
27
+ if (!session) {
28
+ throw new Error("workspacePath() called before store.create() resolved");
29
+ }
30
+ return session.workspacePath;
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=file-session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-session-store.js","sourceRoot":"","sources":["../../../src/core/file-session-store.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AA4B7B,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CACrC,QAAwB,EACxB,IAAwB;IAExB,IAAI,OAAkC,CAAC;IAEvC,MAAM,KAAK,GAAuB;QACjC,KAAK,CAAC,MAAM;YACX,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,KAAqB;YACjC,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,MAA2B;YACvC,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI;YACT,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC;KACD,CAAC;IAEF,OAAO;QACN,KAAK;QACL,aAAa;YACZ,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACd,uDAAuD,CACvD,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,aAAa,CAAC;QAC9B,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function parseStdin(): Promise<Record<string, unknown> | undefined>;
2
+ //# sourceMappingURL=parse-stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdin.d.ts","sourceRoot":"","sources":["../../../src/core/parse-stdin.ts"],"names":[],"mappings":"AAaA,wBAAsB,UAAU,IAAI,OAAO,CAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CACnC,CAiBA"}
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ /**
4
+ * Read JSON from piped stdin (salvaged from the retired pl orchestrator). Used to
5
+ * accept a webhook-shaped alert payload piped into `prismalens investigate`.
6
+ *
7
+ * Returns `undefined` if:
8
+ * - stdin is a TTY (interactive terminal, no pipe), or
9
+ * - the piped data is empty or not valid JSON.
10
+ */
11
+ import consola from "consola";
12
+ export async function parseStdin() {
13
+ if (process.stdin.isTTY)
14
+ return undefined;
15
+ const chunks = [];
16
+ for await (const chunk of process.stdin) {
17
+ chunks.push(chunk);
18
+ }
19
+ const raw = Buffer.concat(chunks).toString("utf-8").trim();
20
+ if (!raw)
21
+ return undefined;
22
+ try {
23
+ return JSON.parse(raw);
24
+ }
25
+ catch {
26
+ consola.warn("Invalid JSON on stdin, ignoring");
27
+ return undefined;
28
+ }
29
+ }
30
+ //# sourceMappingURL=parse-stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdin.js","sourceRoot":"","sources":["../../../src/core/parse-stdin.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAE7B;;;;;;;GAOG;AACH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,UAAU;IAG/B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { type ResolvedInvestigation, type Sandbox } from "@prismalens/engine";
2
+ import type { PlConfig } from "../config/schema.js";
3
+ export type { ResolvedInvestigation };
4
+ export interface ResolveInvestigationArgs {
5
+ /** Raw alert payload (piped JSON / RPC param) coerced into a FiringAlert. */
6
+ alert?: Record<string, unknown>;
7
+ /** Free-text fallback → a synthesized alert when no alert payload is supplied. */
8
+ query?: string;
9
+ /** Repository the harness investigates (its cwd). Defaults to `process.cwd()`. */
10
+ repo?: string;
11
+ /** Harness backend override; else `config.agent.default`. */
12
+ harness?: string;
13
+ /**
14
+ * Service name to select from `config.services` — overrides the alert's own
15
+ * service label. Covers `--query` runs that carry no labels (ADR-0015 §4).
16
+ */
17
+ service?: string;
18
+ /** The posture dial override (ADR-0017); else `config.agent.permissions.mode`. */
19
+ permissionMode?: string;
20
+ /**
21
+ * The resolved isolation boundary (ADR-0020), CALLER-OWNED — the command resolves
22
+ * it from `--sandbox`/`agent.sandbox` (`resolveSandbox`) and destroys it after the
23
+ * run. Forwarded to the engine so the harness spawns into it.
24
+ */
25
+ sandbox?: Sandbox;
26
+ /**
27
+ * What the CLI asked for (ADR-0020 honest fidelity, structured
28
+ * `fidelity.sandbox` field) — `selection.requested` from `resolveSandbox`,
29
+ * threaded alongside the resolved `sandbox` so a degrade (e.g. `auto` ->
30
+ * `process-floor`) is reported honestly in the run-metadata, not just the
31
+ * console warning.
32
+ */
33
+ requestedSandbox?: string;
34
+ }
35
+ /**
36
+ * Resolve a seed alert + merged `pl.config.yaml` into the inputs
37
+ * `investigateIncidentStream` wants: applies the shared host-local fallbacks, reads
38
+ * the BYO-key secrets from env, and delegates the actual build to the engine
39
+ * resolver. Throws (via the engine) on a hard input error.
40
+ */
41
+ export declare function resolveInvestigation(args: ResolveInvestigationArgs, config: PlConfig): ResolvedInvestigation;
42
+ //# sourceMappingURL=run-investigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-investigation.d.ts","sourceRoot":"","sources":["../../../src/core/run-investigation.ts"],"names":[],"mappings":"AAmBA,OAAO,EAGN,KAAK,qBAAqB,EAC1B,KAAK,OAAO,EAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,YAAY,EAAE,qBAAqB,EAAE,CAAC;AAEtC,MAAM,WAAW,wBAAwB;IACxC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,wBAAwB,EAC9B,MAAM,EAAE,QAAQ,GACd,qBAAqB,CA4FvB"}
@@ -0,0 +1,144 @@
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 { INVESTIGATION_DEFAULTS } from "@prismalens/config/investigation";
16
+ import { getDefaultModel } from "@prismalens/config/llm";
17
+ import { resolveInvestigation as engineResolveInvestigation, } from "@prismalens/engine";
18
+ /**
19
+ * Resolve a seed alert + merged `pl.config.yaml` into the inputs
20
+ * `investigateIncidentStream` wants: applies the shared host-local fallbacks, reads
21
+ * the BYO-key secrets from env, and delegates the actual build to the engine
22
+ * resolver. Throws (via the engine) on a hard input error.
23
+ */
24
+ export function resolveInvestigation(args, config) {
25
+ // cwd = --repo (a local repo path) else the current directory.
26
+ const cwd = args.repo ? resolve(args.repo) : process.cwd();
27
+ // BYO-key (ADR-0006): the engine never reads env — the CLI injects it here.
28
+ const openaiBaseUrl = process.env.OLLAMA_BASE_URL ??
29
+ process.env.OPENAI_BASE_URL ??
30
+ INVESTIGATION_DEFAULTS.synth.baseURL;
31
+ const apiKey = process.env.OLLAMA_API_KEY ?? process.env.OPENAI_API_KEY ?? "";
32
+ // Tier-1 reduce model: explicit agent.model wins; else the provider default
33
+ // (ADR-0013). The CLI synth endpoint is OpenAI-compatible (ollama/openai base URL).
34
+ const synthModel = config.agent.model ?? getDefaultModel("ollama");
35
+ if (!synthModel) {
36
+ throw new Error("No synthesis model configured (set agent.model).");
37
+ }
38
+ // Context enrichment (ADR-0015) — a single-alert CLI run is NOT context-free: it
39
+ // still knows the service/repos/logs from `prismalens.config.yaml`.
40
+ const service = selectService(args, config);
41
+ const repos = config.repo
42
+ ? [config.repo]
43
+ : Object.keys(config.repos).length > 0
44
+ ? Object.keys(config.repos)
45
+ : undefined;
46
+ const logs = config.logs.url
47
+ ? {
48
+ ...(config.logs.kind ? { kind: config.logs.kind } : {}),
49
+ url: config.logs.url,
50
+ }
51
+ : undefined;
52
+ // The single posture dial (ADR-0017): --mode / RPC `mode` wins; else
53
+ // `agent.permissions.mode` (defaults to "read-only"). Native passthrough is
54
+ // per-harness config, keyed by the resolved harness name.
55
+ const harnessName = args.harness ?? config.agent.default;
56
+ const permissionMode = args.permissionMode ??
57
+ config.agent.permissions.mode;
58
+ const harnessNative = config.harnesses[harnessName]?.native;
59
+ // Best-effort resource caps (ADR-0020): map the snake_case config knobs to the
60
+ // engine's SandboxLimits shape, dropping unset ones so "no cap" stays no cap
61
+ // (never a lying default). Only present when at least one knob is set.
62
+ const limits = toSandboxLimits(config.agent.limits);
63
+ const request = {
64
+ alert: args.alert,
65
+ query: args.query,
66
+ ...(service ? { service } : {}),
67
+ ...(repos ? { repos } : {}),
68
+ ...(logs ? { logs } : {}),
69
+ harness: harnessName,
70
+ permissionMode,
71
+ ...(harnessNative ? { harnessNative } : {}),
72
+ ...(args.sandbox ? { sandbox: args.sandbox } : {}),
73
+ ...(args.requestedSandbox
74
+ ? { requestedSandbox: args.requestedSandbox }
75
+ : {}),
76
+ ...(limits ? { limits } : {}),
77
+ // Per-alert fan-out cap (ADR-0016 decision 2): wire `agent.max_branches` when
78
+ // set; unset leaves the engine default (mirrors the `limits` thread-through).
79
+ ...(config.agent.max_branches
80
+ ? { maxBranches: config.agent.max_branches }
81
+ : {}),
82
+ model: config.agent.model,
83
+ cwd,
84
+ telemetry: {
85
+ prometheusUrl: config.telemetry.prometheusUrl ??
86
+ INVESTIGATION_DEFAULTS.telemetry.prometheusUrl,
87
+ alertmanagerUrl: config.telemetry.alertmanagerUrl ??
88
+ INVESTIGATION_DEFAULTS.telemetry.alertmanagerUrl,
89
+ apiUrl: config.telemetry.apiUrl ?? INVESTIGATION_DEFAULTS.telemetry.apiUrl,
90
+ },
91
+ synth: {
92
+ providerId: "ollama",
93
+ model: synthModel,
94
+ apiKey,
95
+ baseURL: openaiBaseUrl,
96
+ },
97
+ harnessEnv: {
98
+ OPENAI_API_KEY: process.env.OLLAMA_API_KEY ?? process.env.OPENAI_API_KEY,
99
+ OPENAI_BASE_URL: openaiBaseUrl,
100
+ },
101
+ initTimeoutMs: INVESTIGATION_DEFAULTS.harnessInitTimeoutMs,
102
+ };
103
+ return engineResolveInvestigation(request);
104
+ }
105
+ /**
106
+ * Map the parsed `agent.limits` (snake_case, all optional) into the engine's
107
+ * {@link SandboxLimits} (camelCase), dropping unset knobs. Returns `undefined` when
108
+ * nothing is set so the request stays limit-free — an omitted cap is never coerced to
109
+ * a lying value (ADR-0020).
110
+ */
111
+ function toSandboxLimits(limits) {
112
+ const out = {
113
+ ...(limits.wall_clock_ms ? { wallClockMs: limits.wall_clock_ms } : {}),
114
+ ...(limits.memory_mb ? { memoryMb: limits.memory_mb } : {}),
115
+ ...(limits.cpu_cores ? { cpuCores: limits.cpu_cores } : {}),
116
+ };
117
+ return Object.keys(out).length > 0 ? out : undefined;
118
+ }
119
+ /**
120
+ * Label-driven service selection (ADR-0015 §4): `--service` wins; else the alert's
121
+ * own service label; no match in the catalog → no service context (degrade to
122
+ * telemetry + cwd, today's behaviour — never an error).
123
+ */
124
+ function selectService(args, config) {
125
+ const name = args.service ?? pickServiceLabel(args.alert);
126
+ if (!name)
127
+ return undefined;
128
+ const cfg = config.services[name];
129
+ if (!cfg)
130
+ return undefined;
131
+ return {
132
+ name,
133
+ ...(cfg.tier ? { tier: cfg.tier } : {}),
134
+ ...(cfg.repo ? { repo: cfg.repo } : {}),
135
+ ...(cfg.depends_on.length > 0 ? { dependsOn: cfg.depends_on } : {}),
136
+ };
137
+ }
138
+ /** The alert's service identity label — `service`, else `namespace`, else `job`. */
139
+ function pickServiceLabel(alert) {
140
+ const labels = (alert?.labels ?? {});
141
+ const pick = labels.service ?? labels.namespace ?? labels.job;
142
+ return typeof pick === "string" && pick ? pick : undefined;
143
+ }
144
+ //# sourceMappingURL=run-investigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-investigation.js","sourceRoot":"","sources":["../../../src/core/run-investigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { CanonicalEvent, InvestigationReport } from "@prismalens/contracts";
2
+ export type SessionStatus = "running" | "done" | "errored";
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
+ createdAt: string;
14
+ updatedAt: string;
15
+ completedAt?: string;
16
+ }
17
+ export interface CreateSessionInput {
18
+ runId: string;
19
+ alertname?: string;
20
+ agent?: string;
21
+ repo?: string;
22
+ }
23
+ export interface SessionManager {
24
+ /** Resolved workspace base dir. */
25
+ readonly baseDir: string;
26
+ /** Absolute path to a run's workspace dir. */
27
+ workspaceDir(runId: string): string;
28
+ create(input: CreateSessionInput): Promise<SessionRecord>;
29
+ get(runId: string): Promise<SessionRecord | null>;
30
+ update(runId: string, updates: Partial<Omit<SessionRecord, "runId">>): Promise<SessionRecord>;
31
+ list(filter?: {
32
+ status?: SessionStatus[];
33
+ }): Promise<SessionRecord[]>;
34
+ /** Append one canonical event to the run's events.jsonl. */
35
+ appendEvent(runId: string, event: CanonicalEvent): Promise<void>;
36
+ readEvents(runId: string): Promise<CanonicalEvent[]>;
37
+ writeReport(runId: string, report: InvestigationReport): Promise<void>;
38
+ readReport(runId: string): Promise<InvestigationReport | null>;
39
+ }
40
+ export declare function resolveBaseDir(baseDir?: string): string;
41
+ export declare function createSessionManager(baseDir?: string): SessionManager;
42
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EACX,cAAc,EACd,mBAAmB,EACnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,CACL,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,GAC5C,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACtE,4DAA4D;IAC5D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACrD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;CAC/D;AAUD,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAKvD;AAQD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAiJrE"}
@@ -0,0 +1,168 @@
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
+ * sessions.json — the run index (runId -> SessionRecord)
9
+ * runs/<runId>/session.json — per-run metadata mirror
10
+ * runs/<runId>/events.jsonl — the canonical event stream (one JSON/line)
11
+ * runs/<runId>/report.json — the synthesized InvestigationReport
12
+ *
13
+ * The index is the source of truth for create/get/update/list; each run dir also
14
+ * mirrors its metadata so a run is self-describing on disk.
15
+ */
16
+ import { appendFile, mkdir, readFile, rename, writeFile, } from "node:fs/promises";
17
+ import { homedir } from "node:os";
18
+ import { join, resolve } from "node:path";
19
+ import { getAppDataDir } from "@prismalens/config/investigation";
20
+ const RUN_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
21
+ function expandHome(p) {
22
+ if (p === "~")
23
+ return homedir();
24
+ if (p.startsWith("~/"))
25
+ return join(homedir(), p.slice(2));
26
+ return p;
27
+ }
28
+ export function resolveBaseDir(baseDir) {
29
+ // Honor PRISMALENS_USER_FOLDER for the default workspace (via getAppDataDir);
30
+ // an explicit `workspace.base_dir` override still wins.
31
+ if (!baseDir || baseDir === "~/.prismalens")
32
+ return getAppDataDir();
33
+ return resolve(expandHome(baseDir));
34
+ }
35
+ async function writeJsonAtomic(path, data) {
36
+ const tmp = `${path}.tmp`;
37
+ await writeFile(tmp, JSON.stringify(data, null, 2), "utf-8");
38
+ await rename(tmp, path);
39
+ }
40
+ export function createSessionManager(baseDir) {
41
+ const base = resolveBaseDir(baseDir);
42
+ const runsRoot = join(base, "runs");
43
+ const indexPath = join(base, "sessions.json");
44
+ function assertRunId(runId) {
45
+ if (!RUN_ID_RE.test(runId))
46
+ throw new Error(`Invalid runId: "${runId}"`);
47
+ }
48
+ function workspaceDir(runId) {
49
+ assertRunId(runId);
50
+ return join(runsRoot, runId);
51
+ }
52
+ function metaPath(runId) {
53
+ return join(workspaceDir(runId), "session.json");
54
+ }
55
+ async function readIndex() {
56
+ try {
57
+ const raw = await readFile(indexPath, "utf-8");
58
+ return JSON.parse(raw);
59
+ }
60
+ catch (err) {
61
+ if (err.code === "ENOENT")
62
+ return {};
63
+ throw err;
64
+ }
65
+ }
66
+ async function upsertIndex(record) {
67
+ const index = await readIndex();
68
+ index[record.runId] = record;
69
+ await mkdir(base, { recursive: true });
70
+ await writeJsonAtomic(indexPath, index);
71
+ }
72
+ const manager = {
73
+ baseDir: base,
74
+ workspaceDir,
75
+ async create(input) {
76
+ assertRunId(input.runId);
77
+ const dir = workspaceDir(input.runId);
78
+ await mkdir(dir, { recursive: true });
79
+ const now = new Date().toISOString();
80
+ const record = {
81
+ runId: input.runId,
82
+ status: "running",
83
+ ...(input.alertname !== undefined
84
+ ? { alertname: input.alertname }
85
+ : {}),
86
+ ...(input.agent !== undefined ? { agent: input.agent } : {}),
87
+ ...(input.repo !== undefined ? { repo: input.repo } : {}),
88
+ workspacePath: dir,
89
+ createdAt: now,
90
+ updatedAt: now,
91
+ };
92
+ await writeJsonAtomic(metaPath(input.runId), record);
93
+ await upsertIndex(record);
94
+ return record;
95
+ },
96
+ async get(runId) {
97
+ assertRunId(runId);
98
+ const index = await readIndex();
99
+ const fromIndex = index[runId];
100
+ if (fromIndex)
101
+ return fromIndex;
102
+ try {
103
+ return JSON.parse(await readFile(metaPath(runId), "utf-8"));
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ },
109
+ async update(runId, updates) {
110
+ const existing = await manager.get(runId);
111
+ if (!existing)
112
+ throw new Error(`Session "${runId}" not found`);
113
+ const merged = {
114
+ ...existing,
115
+ ...updates,
116
+ runId,
117
+ updatedAt: new Date().toISOString(),
118
+ };
119
+ await writeJsonAtomic(metaPath(runId), merged);
120
+ await upsertIndex(merged);
121
+ return merged;
122
+ },
123
+ async list(filter) {
124
+ const index = await readIndex();
125
+ let records = Object.values(index);
126
+ if (filter?.status) {
127
+ const wanted = filter.status;
128
+ records = records.filter((r) => wanted.includes(r.status));
129
+ }
130
+ return records.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
131
+ },
132
+ async appendEvent(runId, event) {
133
+ const dir = workspaceDir(runId);
134
+ await mkdir(dir, { recursive: true });
135
+ await appendFile(join(dir, "events.jsonl"), `${JSON.stringify(event)}\n`, "utf-8");
136
+ },
137
+ async readEvents(runId) {
138
+ try {
139
+ const raw = await readFile(join(workspaceDir(runId), "events.jsonl"), "utf-8");
140
+ return raw
141
+ .split("\n")
142
+ .filter((line) => line.trim().length > 0)
143
+ .map((line) => JSON.parse(line));
144
+ }
145
+ catch (err) {
146
+ if (err.code === "ENOENT")
147
+ return [];
148
+ throw err;
149
+ }
150
+ },
151
+ async writeReport(runId, report) {
152
+ const dir = workspaceDir(runId);
153
+ await mkdir(dir, { recursive: true });
154
+ await writeJsonAtomic(join(dir, "report.json"), report);
155
+ },
156
+ async readReport(runId) {
157
+ try {
158
+ const raw = await readFile(join(workspaceDir(runId), "report.json"), "utf-8");
159
+ return JSON.parse(raw);
160
+ }
161
+ catch {
162
+ return null;
163
+ }
164
+ },
165
+ };
166
+ return manager;
167
+ }
168
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface JsonRpcServerOptions {
2
+ /** serverInfo.version reported by `initialize`. */
3
+ version: string;
4
+ /** Request stream (newline-delimited). Defaults to process.stdin. */
5
+ input?: NodeJS.ReadableStream;
6
+ /** Response/notification stream. Defaults to process.stdout. */
7
+ output?: NodeJS.WritableStream;
8
+ }
9
+ /**
10
+ * Run the JSON-RPC server until the input stream closes. Reads requests
11
+ * line-by-line, dispatches by method, and writes responses/notifications back as
12
+ * newline-delimited JSON. Resolves when stdin ends.
13
+ */
14
+ export declare function runJsonRpcServer(options: JsonRpcServerOptions): Promise<void>;
15
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/jsonrpc/server.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,oBAAoB;IACpC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAyDD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAyLf"}