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 @@
|
|
|
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 @@
|
|
|
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"}
|