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,244 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ /**
4
+ * JSON-RPC 2.0 server over stdio (newline-delimited JSON) — the LIVE channel for
5
+ * the desktop app / API (ADR-0007/0010). This REPLACES file-read as the live
6
+ * channel; the ~/.prismalens workspace stays the durable record (events.jsonl +
7
+ * report.json), written exactly as the `investigate` command writes it.
8
+ *
9
+ * Wire framing: one JSON value per line in BOTH directions — requests on stdin,
10
+ * responses + notifications on stdout.
11
+ *
12
+ * Methods:
13
+ * - initialize -> { protocolVersion, serverInfo: { name, version } }
14
+ * - investigate -> drives the shared conductor (`conductRun`, ADR-0018), emitting
15
+ * an `investigate/event` NOTIFICATION per canonical event, then resolving with
16
+ * { runId, report }. A no-evidence run resolves to a JSON-RPC error (-32000).
17
+ *
18
+ * Robustness: a malformed or failed request becomes a JSON-RPC error response —
19
+ * the server never crashes on bad input.
20
+ */
21
+ import { randomUUID } from "node:crypto";
22
+ import { resolve } from "node:path";
23
+ import { createInterface } from "node:readline";
24
+ import { conductRun } from "@prismalens/engine";
25
+ import { JSONRPCErrorException, JSONRPCServer, } from "json-rpc-2.0";
26
+ import { resolveRunSandbox } from "../cli/investigate.js";
27
+ import { loadConfig } from "../config/loader.js";
28
+ import { resolveRepoSlug } from "../core/detect-repo.js";
29
+ import { createFileSessionStore } from "../core/file-session-store.js";
30
+ import { resolveInvestigation, } from "../core/run-investigation.js";
31
+ import { createSessionManager } from "../core/session.js";
32
+ const PROTOCOL_VERSION = 1;
33
+ // JSON-RPC 2.0 error codes (spec-reserved range + one server-defined code).
34
+ const PARSE_ERROR = -32700;
35
+ const INVALID_PARAMS = -32602;
36
+ const INTERNAL_ERROR = -32603;
37
+ /** No evidence gathered — the harness branch failed (mirrors the engine guard). */
38
+ const NO_EVIDENCE = -32000;
39
+ // ---------------------------------------------------------------------------
40
+ // Param parsing (typesafe — no `as any`)
41
+ // ---------------------------------------------------------------------------
42
+ function isRecord(x) {
43
+ return x !== null && typeof x === "object" && !Array.isArray(x);
44
+ }
45
+ function str(x) {
46
+ return typeof x === "string" ? x : undefined;
47
+ }
48
+ /** Coerce raw RPC params into the typed investigate shape (drops anything else). */
49
+ function parseInvestigateParams(raw) {
50
+ const p = isRecord(raw) ? raw : {};
51
+ const out = {};
52
+ if (isRecord(p.alert))
53
+ out.alert = p.alert;
54
+ const query = str(p.query);
55
+ if (query)
56
+ out.query = query;
57
+ const repo = str(p.repo);
58
+ if (repo)
59
+ out.repo = repo;
60
+ const harness = str(p.harness);
61
+ if (harness)
62
+ out.harness = harness;
63
+ const model = str(p.model);
64
+ if (model)
65
+ out.model = model;
66
+ const config = str(p.config);
67
+ if (config)
68
+ out.config = config;
69
+ const service = str(p.service);
70
+ if (service)
71
+ out.service = service;
72
+ const mode = str(p.mode);
73
+ if (mode)
74
+ out.mode = mode;
75
+ if (typeof p.dangerouslySkipPermissions === "boolean") {
76
+ out.dangerouslySkipPermissions = p.dangerouslySkipPermissions;
77
+ }
78
+ return out;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Server
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Run the JSON-RPC server until the input stream closes. Reads requests
85
+ * line-by-line, dispatches by method, and writes responses/notifications back as
86
+ * newline-delimited JSON. Resolves when stdin ends.
87
+ */
88
+ export async function runJsonRpcServer(options) {
89
+ const input = options.input ?? process.stdin;
90
+ const output = options.output ?? process.stdout;
91
+ const write = (message) => {
92
+ output.write(`${JSON.stringify(message)}\n`);
93
+ };
94
+ const notify = (method, params) => {
95
+ write({ jsonrpc: "2.0", method, params });
96
+ };
97
+ // --- methods ---
98
+ const handleInitialize = () => ({
99
+ protocolVersion: PROTOCOL_VERSION,
100
+ serverInfo: { name: "prismalens", version: options.version },
101
+ });
102
+ const handleInvestigate = async (rawParams) => {
103
+ const params = parseInvestigateParams(rawParams);
104
+ // cwd = --repo (a local repo path) else the current directory. Merge config
105
+ // (global -> project -> --model), mirroring the `investigate` command.
106
+ const cwd = params.repo ? resolve(params.repo) : process.cwd();
107
+ const config = await loadConfig({
108
+ ...(params.config ? { configPath: params.config } : {}),
109
+ cwd,
110
+ cliOverrides: { ...(params.model ? { model: params.model } : {}) },
111
+ });
112
+ // The single posture dial (ADR-0017): dangerouslySkipPermissions wins over
113
+ // mode, aliasing straight to "dangerous".
114
+ const permissionMode = params.dangerouslySkipPermissions
115
+ ? "dangerous"
116
+ : params.mode;
117
+ // Resolve the isolation boundary (ADR-0020) from `agent.sandbox`, exactly as the
118
+ // `investigate` command does — the serve path must NOT silently drop to the
119
+ // cooperative floor when config asks for enforcement (ADR-0017). An explicit
120
+ // srt/e2b that cannot arm (or is asked of a non-ACP harness) becomes a JSON-RPC
121
+ // error; `auto` degrades honestly, its requested-vs-actual pair threaded into the
122
+ // run fidelity below. The boundary is CALLER-OWNED — torn down in the finally.
123
+ const harnessName = params.harness ?? config.agent.default;
124
+ let selection;
125
+ try {
126
+ selection = (await resolveRunSandbox(harnessName, config.agent.sandbox, config)).selection;
127
+ }
128
+ catch (err) {
129
+ throw new JSONRPCErrorException(err instanceof Error ? err.message : String(err), INVALID_PARAMS);
130
+ }
131
+ try {
132
+ let resolved;
133
+ try {
134
+ resolved = resolveInvestigation({
135
+ ...(params.alert ? { alert: params.alert } : {}),
136
+ ...(params.query ? { query: params.query } : {}),
137
+ ...(params.repo ? { repo: params.repo } : {}),
138
+ ...(params.harness ? { harness: params.harness } : {}),
139
+ ...(params.service ? { service: params.service } : {}),
140
+ ...(permissionMode ? { permissionMode } : {}),
141
+ ...(selection
142
+ ? {
143
+ sandbox: selection.sandbox,
144
+ requestedSandbox: selection.requested,
145
+ }
146
+ : {}),
147
+ }, config);
148
+ }
149
+ catch (err) {
150
+ throw new JSONRPCErrorException(err instanceof Error ? err.message : String(err), INVALID_PARAMS);
151
+ }
152
+ const { context, harness, synth, harnessName, fidelity, maxBranches } = resolved;
153
+ const primaryAlert = context.alerts[0];
154
+ // Persist to the session workspace exactly as the investigate command does,
155
+ // wrapped as a conductRun store adapter (ADR-0018).
156
+ const runId = randomUUID();
157
+ const repoSlug = await resolveRepoSlug(config.repo, cwd);
158
+ const sessions = createSessionManager(config.workspace.base_dir);
159
+ const fileSession = createFileSessionStore(sessions, {
160
+ runId,
161
+ alertname: primaryAlert.alertname,
162
+ agent: harnessName,
163
+ ...(repoSlug ? { repo: repoSlug } : {}),
164
+ });
165
+ // Drive the supervisor LIVE via the shared conductor: emit each canonical
166
+ // event as an `investigate/event` notification; conductRun owns persistence
167
+ // + the terminal report/no-evidence/error outcome.
168
+ const outcome = await conductRun({
169
+ context,
170
+ harness,
171
+ synth,
172
+ fidelity,
173
+ runId,
174
+ ...(maxBranches !== undefined ? { maxBranches } : {}),
175
+ }, {
176
+ sink: (event) => {
177
+ notify("investigate/event", { runId, event });
178
+ },
179
+ store: fileSession.store,
180
+ });
181
+ if (!outcome.report) {
182
+ throw new JSONRPCErrorException(outcome.error ?? "investigation produced no evidence", outcome.failureKind === "no-evidence" ? NO_EVIDENCE : INTERNAL_ERROR, { runId });
183
+ }
184
+ return { runId: outcome.runId, report: outcome.report };
185
+ }
186
+ finally {
187
+ // The serve path owns the resolved boundary's lifecycle (ADR-0020) — tear it
188
+ // down whichever way the run exited (report, no-evidence, error, or throw).
189
+ if (selection)
190
+ await selection.sandbox.destroy();
191
+ }
192
+ };
193
+ const server = new JSONRPCServer();
194
+ server.addMethod("initialize", () => handleInitialize());
195
+ server.addMethod("investigate", (params) => handleInvestigate(params));
196
+ server.mapErrorToJSONRPCErrorResponse = (id, error) => {
197
+ if (error instanceof JSONRPCErrorException) {
198
+ return {
199
+ jsonrpc: "2.0",
200
+ id,
201
+ error: {
202
+ code: error.code,
203
+ message: error.message,
204
+ ...(error.data !== undefined ? { data: error.data } : {}),
205
+ },
206
+ };
207
+ }
208
+ return {
209
+ jsonrpc: "2.0",
210
+ id,
211
+ error: {
212
+ code: INTERNAL_ERROR,
213
+ message: error instanceof Error ? error.message : String(error),
214
+ },
215
+ };
216
+ };
217
+ const handleLine = (line) => {
218
+ const trimmed = line.trim();
219
+ if (!trimmed)
220
+ return;
221
+ let parsed;
222
+ try {
223
+ parsed = JSON.parse(trimmed);
224
+ }
225
+ catch {
226
+ write({
227
+ jsonrpc: "2.0",
228
+ id: null,
229
+ error: { code: PARSE_ERROR, message: "Parse error: invalid JSON" },
230
+ });
231
+ return;
232
+ }
233
+ void server.receive(parsed).then((response) => {
234
+ if (response)
235
+ write(response);
236
+ });
237
+ };
238
+ const rl = createInterface({ input, crlfDelay: Number.POSITIVE_INFINITY });
239
+ rl.on("line", handleLine);
240
+ await new Promise((resolveClose) => {
241
+ rl.on("close", () => resolveClose());
242
+ });
243
+ }
244
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/jsonrpc/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * JSON-RPC 2.0 wire types — the newline-delimited JSON framing shared over stdio:
3
+ * one JSON value per line in both directions. Requests and responses now come
4
+ * from json-rpc-2.0; only the outbound notification (which the library does not
5
+ * model) stays hand-framed here.
6
+ */
7
+ export interface JsonRpcNotification {
8
+ jsonrpc: "2.0";
9
+ method: string;
10
+ params: unknown;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/jsonrpc/types.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAChB"}
@@ -0,0 +1,4 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/jsonrpc/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The package version, read from package.json at runtime so the number lives
3
+ * in exactly one place (bumped by changesets). Walks up from this file until
4
+ * the CLI's own package.json is found — the depth differs between dev
5
+ * (src/version.ts via tsx) and the build (dist/src/version.js).
6
+ */
7
+ export declare function cliVersion(): string;
8
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAcnC"}
@@ -0,0 +1,27 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright 2026 Sumit Patel
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ /**
7
+ * The package version, read from package.json at runtime so the number lives
8
+ * in exactly one place (bumped by changesets). Walks up from this file until
9
+ * the CLI's own package.json is found — the depth differs between dev
10
+ * (src/version.ts via tsx) and the build (dist/src/version.js).
11
+ */
12
+ export function cliVersion() {
13
+ let dir = dirname(fileURLToPath(import.meta.url));
14
+ for (let i = 0; i < 4; i++) {
15
+ try {
16
+ const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
17
+ if (pkg.name === "prismalens" && pkg.version)
18
+ return pkg.version;
19
+ }
20
+ catch {
21
+ // not here — keep walking up
22
+ }
23
+ dir = dirname(dir);
24
+ }
25
+ return "0.0.0";
26
+ }
27
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6BAA6B;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACzB,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACrB,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACR,CAAC;YACzC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACR,6BAA6B;QAC9B,CAAC;QACD,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "prismalens",
3
+ "version": "0.0.1",
4
+ "description": "AI root-cause investigation from your terminal — point it at a repo, pipe it an alert, get an evidence-linked report",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "bin": {
8
+ "prismalens": "./dist/bin/prismalens.js",
9
+ "pl": "./dist/bin/prismalens.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "NOTICE"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/prismalens/prismalens.git",
18
+ "directory": "packages/cli"
19
+ },
20
+ "homepage": "https://prismalens.io",
21
+ "bugs": "https://github.com/prismalens/prismalens/issues",
22
+ "keywords": [
23
+ "sre",
24
+ "incident-response",
25
+ "root-cause-analysis",
26
+ "investigation",
27
+ "observability",
28
+ "devops",
29
+ "ai",
30
+ "cli"
31
+ ],
32
+ "engines": {
33
+ "node": ">=22"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "dependencies": {
39
+ "citty": "^0.2.2",
40
+ "consola": "^3.4.2",
41
+ "env-paths": "^4.0.0",
42
+ "json-rpc-2.0": "^1.7.1",
43
+ "yaml": "^2.9.0",
44
+ "zod": "^3.25.76",
45
+ "@prismalens/config": "0.0.1",
46
+ "@prismalens/engine": "0.0.1",
47
+ "@prismalens/contracts": "0.0.1"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^24.13.2",
51
+ "tsx": "^4.22.5",
52
+ "typescript": "^5.9.3",
53
+ "vitest": "^4.1.9"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc",
57
+ "typecheck": "tsc --noEmit",
58
+ "dev": "tsx bin/prismalens.ts",
59
+ "test": "vitest run"
60
+ }
61
+ }