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.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +312 -0
- package/dist/bin/prismalens.d.ts +3 -0
- package/dist/bin/prismalens.d.ts.map +1 -0
- package/dist/bin/prismalens.js +32 -0
- package/dist/bin/prismalens.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +3 -0
- package/dist/src/cli/doctor.d.ts.map +1 -0
- package/dist/src/cli/doctor.js +156 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/init.d.ts +3 -0
- package/dist/src/cli/init.d.ts.map +1 -0
- package/dist/src/cli/init.js +85 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/investigate.d.ts +101 -0
- package/dist/src/cli/investigate.d.ts.map +1 -0
- package/dist/src/cli/investigate.js +452 -0
- package/dist/src/cli/investigate.js.map +1 -0
- package/dist/src/cli/serve.d.ts +3 -0
- package/dist/src/cli/serve.d.ts.map +1 -0
- package/dist/src/cli/serve.js +26 -0
- package/dist/src/cli/serve.js.map +1 -0
- package/dist/src/config/loader.d.ts +22 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +155 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +336 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +160 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/core/detect-repo.d.ts +4 -0
- package/dist/src/core/detect-repo.d.ts.map +1 -0
- package/dist/src/core/detect-repo.js +28 -0
- package/dist/src/core/detect-repo.js.map +1 -0
- package/dist/src/core/file-session-store.d.ts +10 -0
- package/dist/src/core/file-session-store.d.ts.map +1 -0
- package/dist/src/core/file-session-store.js +34 -0
- package/dist/src/core/file-session-store.js.map +1 -0
- package/dist/src/core/parse-stdin.d.ts +2 -0
- package/dist/src/core/parse-stdin.d.ts.map +1 -0
- package/dist/src/core/parse-stdin.js +30 -0
- package/dist/src/core/parse-stdin.js.map +1 -0
- package/dist/src/core/run-investigation.d.ts +42 -0
- package/dist/src/core/run-investigation.d.ts.map +1 -0
- package/dist/src/core/run-investigation.js +144 -0
- package/dist/src/core/run-investigation.js.map +1 -0
- package/dist/src/core/session.d.ts +42 -0
- package/dist/src/core/session.d.ts.map +1 -0
- package/dist/src/core/session.js +168 -0
- package/dist/src/core/session.js.map +1 -0
- package/dist/src/jsonrpc/server.d.ts +15 -0
- package/dist/src/jsonrpc/server.d.ts.map +1 -0
- package/dist/src/jsonrpc/server.js +244 -0
- package/dist/src/jsonrpc/server.js.map +1 -0
- package/dist/src/jsonrpc/types.d.ts +12 -0
- package/dist/src/jsonrpc/types.d.ts.map +1 -0
- package/dist/src/jsonrpc/types.js +4 -0
- package/dist/src/jsonrpc/types.js.map +1 -0
- package/dist/src/version.d.ts +8 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +27 -0
- package/dist/src/version.js.map +1 -0
- 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 @@
|
|
|
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
|
+
}
|