@zigrivers/mmr 1.3.0 → 1.4.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/README.md +444 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/ack.d.ts +11 -0
- package/dist/commands/ack.d.ts.map +1 -0
- package/dist/commands/ack.js +123 -0
- package/dist/commands/ack.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +248 -14
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/jobs.d.ts.map +1 -1
- package/dist/commands/jobs.js +3 -4
- package/dist/commands/jobs.js.map +1 -1
- package/dist/commands/reconcile.d.ts.map +1 -1
- package/dist/commands/reconcile.js +12 -5
- package/dist/commands/reconcile.js.map +1 -1
- package/dist/commands/results.d.ts.map +1 -1
- package/dist/commands/results.js +13 -5
- package/dist/commands/results.js.map +1 -1
- package/dist/commands/review.d.ts +25 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +459 -44
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/sessions.d.ts +58 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +266 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/config/defaults.d.ts +2 -2
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +76 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +279 -36
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +897 -53
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +155 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/core/ack-store.d.ts +109 -0
- package/dist/core/ack-store.d.ts.map +1 -0
- package/dist/core/ack-store.js +363 -0
- package/dist/core/ack-store.js.map +1 -0
- package/dist/core/auth.d.ts +10 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +106 -35
- package/dist/core/auth.js.map +1 -1
- package/dist/core/compensator.d.ts +33 -4
- package/dist/core/compensator.d.ts.map +1 -1
- package/dist/core/compensator.js +120 -15
- package/dist/core/compensator.js.map +1 -1
- package/dist/core/diff-introspect.d.ts +21 -0
- package/dist/core/diff-introspect.d.ts.map +1 -0
- package/dist/core/diff-introspect.js +42 -0
- package/dist/core/diff-introspect.js.map +1 -0
- package/dist/core/dispatcher.d.ts +10 -0
- package/dist/core/dispatcher.d.ts.map +1 -1
- package/dist/core/dispatcher.js +91 -20
- package/dist/core/dispatcher.js.map +1 -1
- package/dist/core/git-show.d.ts +31 -0
- package/dist/core/git-show.d.ts.map +1 -0
- package/dist/core/git-show.js +72 -0
- package/dist/core/git-show.js.map +1 -0
- package/dist/core/host-isolation.d.ts +24 -0
- package/dist/core/host-isolation.d.ts.map +1 -0
- package/dist/core/host-isolation.js +107 -0
- package/dist/core/host-isolation.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +20 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +125 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/job-store.d.ts +7 -1
- package/dist/core/job-store.d.ts.map +1 -1
- package/dist/core/job-store.js +21 -1
- package/dist/core/job-store.js.map +1 -1
- package/dist/core/jsonpath.d.ts +15 -0
- package/dist/core/jsonpath.d.ts.map +1 -0
- package/dist/core/jsonpath.js +63 -0
- package/dist/core/jsonpath.js.map +1 -0
- package/dist/core/oss-examples.d.ts +18 -0
- package/dist/core/oss-examples.d.ts.map +1 -0
- package/dist/core/oss-examples.js +66 -0
- package/dist/core/oss-examples.js.map +1 -0
- package/dist/core/parser.d.ts +8 -3
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +157 -6
- package/dist/core/parser.js.map +1 -1
- package/dist/core/project-root.d.ts +10 -0
- package/dist/core/project-root.d.ts.map +1 -0
- package/dist/core/project-root.js +23 -0
- package/dist/core/project-root.js.map +1 -0
- package/dist/core/reconciler.d.ts +1 -1
- package/dist/core/reconciler.d.ts.map +1 -1
- package/dist/core/reconciler.js +100 -18
- package/dist/core/reconciler.js.map +1 -1
- package/dist/core/redact.d.ts +17 -0
- package/dist/core/redact.d.ts.map +1 -0
- package/dist/core/redact.js +140 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/results-pipeline.d.ts +8 -2
- package/dist/core/results-pipeline.d.ts.map +1 -1
- package/dist/core/results-pipeline.js +50 -3
- package/dist/core/results-pipeline.js.map +1 -1
- package/dist/core/runtime-probe.d.ts +14 -0
- package/dist/core/runtime-probe.d.ts.map +1 -0
- package/dist/core/runtime-probe.js +57 -0
- package/dist/core/runtime-probe.js.map +1 -0
- package/dist/core/stable-id.d.ts +19 -0
- package/dist/core/stable-id.d.ts.map +1 -0
- package/dist/core/stable-id.js +148 -0
- package/dist/core/stable-id.js.map +1 -0
- package/dist/core/trust-mode.d.ts +29 -0
- package/dist/core/trust-mode.d.ts.map +1 -0
- package/dist/core/trust-mode.js +103 -0
- package/dist/core/trust-mode.js.map +1 -0
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js +9 -0
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/text.d.ts.map +1 -1
- package/dist/formatters/text.js +9 -0
- package/dist/formatters/text.js.map +1 -1
- package/dist/types.d.ts +44 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
export const NEUTRAL_HOME_PLACEHOLDER = '{{neutral_home}}';
|
|
5
|
+
export const NEUTRAL_CWD_PLACEHOLDER = '{{neutral_cwd}}';
|
|
6
|
+
// This helper is grok-specific in practice: the only channel that opts into the
|
|
7
|
+
// neutral-posture placeholders is the builtin `grok` channel, and the
|
|
8
|
+
// credential-preservation step below knows about grok's `~/.grok/auth.json`.
|
|
9
|
+
// Hence the `mmr-grok-` temp-dir prefix. If another agentic CLI ever needs
|
|
10
|
+
// isolation, generalize the prefix + credential path together.
|
|
11
|
+
const PREFIX = 'mmr-grok-';
|
|
12
|
+
function needsIsolation(env, cwd) {
|
|
13
|
+
if (cwd === NEUTRAL_CWD_PLACEHOLDER)
|
|
14
|
+
return true;
|
|
15
|
+
return Object.values(env).some((v) => v === NEUTRAL_HOME_PLACEHOLDER);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Expand {{neutral_home}}/{{neutral_cwd}} placeholders into a single fresh
|
|
19
|
+
* per-call temp directory (unique → safe for parallel channel runs; each call
|
|
20
|
+
* owns its dir lifetime). Returns the concrete env/cwd plus a synchronous
|
|
21
|
+
* cleanup fn. When no placeholder is present, returns the inputs unchanged with
|
|
22
|
+
* a no-op cleanup.
|
|
23
|
+
*/
|
|
24
|
+
export function withNeutralPosture(env, cwd) {
|
|
25
|
+
if (!needsIsolation(env, cwd)) {
|
|
26
|
+
return { env, cwd, cleanup: () => { } };
|
|
27
|
+
}
|
|
28
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), PREFIX));
|
|
29
|
+
// mkdtemp already creates 0700, but enforce it explicitly: this dir holds a
|
|
30
|
+
// credential symlink and whatever grok writes to its HOME during a review.
|
|
31
|
+
try {
|
|
32
|
+
fs.chmodSync(dir, 0o700);
|
|
33
|
+
}
|
|
34
|
+
catch { /* best effort */ }
|
|
35
|
+
// Preserve grok's file-backed credentials so an isolated HOME doesn't break
|
|
36
|
+
// auth on non-keychain platforms (Linux/CI store creds at ~/.grok/auth.json).
|
|
37
|
+
// We symlink ONLY auth.json — NOT config.toml/skills/, so host config stays empty.
|
|
38
|
+
try {
|
|
39
|
+
const realHome = process.env.HOME || os.homedir();
|
|
40
|
+
const cred = path.join(realHome, '.grok', 'auth.json');
|
|
41
|
+
if (fs.existsSync(cred)) {
|
|
42
|
+
const grokDir = path.join(dir, '.grok');
|
|
43
|
+
fs.mkdirSync(grokDir, { recursive: true });
|
|
44
|
+
fs.chmodSync(grokDir, 0o700);
|
|
45
|
+
fs.symlinkSync(cred, path.join(grokDir, 'auth.json'));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch { /* best effort — keychain platforms don't need it */ }
|
|
49
|
+
const outEnv = {};
|
|
50
|
+
for (const [k, v] of Object.entries(env)) {
|
|
51
|
+
outEnv[k] = v === NEUTRAL_HOME_PLACEHOLDER ? dir : v;
|
|
52
|
+
}
|
|
53
|
+
const outCwd = cwd === NEUTRAL_CWD_PLACEHOLDER ? dir : cwd;
|
|
54
|
+
// When we neutralize the cwd, also override the inherited cwd-pointing env
|
|
55
|
+
// vars. The dispatcher/auth spawn with `cwd: outCwd` (a real chdir), but
|
|
56
|
+
// PWD/OLDPWD/INIT_CWD still flow from process.env and would otherwise point
|
|
57
|
+
// at the original working tree — tools that trust $PWD over getcwd() could
|
|
58
|
+
// then read the repo. Pin them all to the neutral dir.
|
|
59
|
+
if (outCwd === dir) {
|
|
60
|
+
outEnv.PWD = dir;
|
|
61
|
+
outEnv.OLDPWD = dir;
|
|
62
|
+
outEnv.INIT_CWD = dir;
|
|
63
|
+
}
|
|
64
|
+
let removed = false;
|
|
65
|
+
return {
|
|
66
|
+
env: outEnv,
|
|
67
|
+
cwd: outCwd,
|
|
68
|
+
cleanup: () => {
|
|
69
|
+
if (removed)
|
|
70
|
+
return;
|
|
71
|
+
removed = true;
|
|
72
|
+
try {
|
|
73
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
catch { /* best effort */ }
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Backstop for dirs orphaned by SIGKILL/crashes: remove stale mmr-grok-* temp
|
|
81
|
+
* dirs older than `maxAgeMs`. Call once at process start. Best-effort/sync.
|
|
82
|
+
* Default is 24h — comfortably longer than any plausible review timeout, so the
|
|
83
|
+
* sweep never reaps the HOME/cwd of a still-running long review.
|
|
84
|
+
*/
|
|
85
|
+
export function sweepStaleNeutralDirs(maxAgeMs = 24 * 60 * 60 * 1000) {
|
|
86
|
+
const tmp = os.tmpdir();
|
|
87
|
+
let entries = [];
|
|
88
|
+
try {
|
|
89
|
+
entries = fs.readdirSync(tmp);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
for (const name of entries) {
|
|
96
|
+
if (!name.startsWith(PREFIX))
|
|
97
|
+
continue;
|
|
98
|
+
const full = path.join(tmp, name);
|
|
99
|
+
try {
|
|
100
|
+
const st = fs.statSync(full);
|
|
101
|
+
if (st.isDirectory() && now - st.mtimeMs > maxAgeMs)
|
|
102
|
+
fs.rmSync(full, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
catch { /* best effort */ }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=host-isolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-isolation.js","sourceRoot":"","sources":["../../src/core/host-isolation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { JobStore } from './job-store.js';
|
|
2
|
+
import type { HttpChannelParsed } from '../config/schema.js';
|
|
3
|
+
export interface DispatchHttpOptions {
|
|
4
|
+
channel: HttpChannelParsed;
|
|
5
|
+
prompt: string;
|
|
6
|
+
/** Per-channel timeout in seconds. */
|
|
7
|
+
timeout: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Dispatch a review prompt to an HTTP (openai-chat) channel.
|
|
11
|
+
*
|
|
12
|
+
* Security invariant (T1-C / §5 decision 1): the API key value read from
|
|
13
|
+
* `process.env[api_key_env]` is used ONLY to build the request header. It is
|
|
14
|
+
* NEVER persisted or logged. Failure diagnostics are SYNTHETIC strings derived
|
|
15
|
+
* from the status code / error name — never the response body, because a
|
|
16
|
+
* misconfigured or hostile endpoint can reflect the Authorization header back
|
|
17
|
+
* in its body, and persisting that would leak the secret to disk.
|
|
18
|
+
*/
|
|
19
|
+
export declare function dispatchHttpChannel(store: JobStore, jobId: string, channelName: string, opts: DispatchHttpOptions): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=http-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-dispatcher.d.ts","sourceRoot":"","sources":["../../src/core/http-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAG5D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAA;CAChB;AAsCD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/** Status-code → ChannelStatus mapping per §5 decision 8 / T1-C. */
|
|
2
|
+
function classifyStatus(status) {
|
|
3
|
+
if (status === 200)
|
|
4
|
+
return 'completed';
|
|
5
|
+
if (status === 401)
|
|
6
|
+
return 'auth_failed';
|
|
7
|
+
return 'failed';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* True when the channel's parser consumes JSON, so we request
|
|
11
|
+
* `response_format: {type:'json_object'}`. `regex-findings` is a text scanner
|
|
12
|
+
* (it runs a RegExp over prose output), so it must NOT force JSON.
|
|
13
|
+
*/
|
|
14
|
+
function impliesJsonOutput(parser) {
|
|
15
|
+
if (typeof parser === 'string') {
|
|
16
|
+
return parser === 'default' || parser === 'gemini' || parser === 'doc-conformance';
|
|
17
|
+
}
|
|
18
|
+
return parser.kind === 'unwrap-jsonpath';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract the assistant message from an openai-chat completion envelope so the
|
|
22
|
+
* saved channel output matches what a subprocess channel writes (the model's
|
|
23
|
+
* direct text), letting the existing parsers consume it unchanged. Falls back
|
|
24
|
+
* to the raw body if the response is not the expected envelope shape.
|
|
25
|
+
*/
|
|
26
|
+
function extractOpenAiContent(body) {
|
|
27
|
+
try {
|
|
28
|
+
const parsed = JSON.parse(body);
|
|
29
|
+
const content = parsed?.choices?.[0]?.message?.content;
|
|
30
|
+
if (typeof content === 'string')
|
|
31
|
+
return content;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Not JSON / not the expected shape — fall through to the raw body.
|
|
35
|
+
}
|
|
36
|
+
return body;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Dispatch a review prompt to an HTTP (openai-chat) channel.
|
|
40
|
+
*
|
|
41
|
+
* Security invariant (T1-C / §5 decision 1): the API key value read from
|
|
42
|
+
* `process.env[api_key_env]` is used ONLY to build the request header. It is
|
|
43
|
+
* NEVER persisted or logged. Failure diagnostics are SYNTHETIC strings derived
|
|
44
|
+
* from the status code / error name — never the response body, because a
|
|
45
|
+
* misconfigured or hostile endpoint can reflect the Authorization header back
|
|
46
|
+
* in its body, and persisting that would leak the secret to disk.
|
|
47
|
+
*/
|
|
48
|
+
export async function dispatchHttpChannel(store, jobId, channelName, opts) {
|
|
49
|
+
const { channel, prompt, timeout } = opts;
|
|
50
|
+
const startedAt = new Date().toISOString();
|
|
51
|
+
store.updateChannel(jobId, channelName, { status: 'running', started_at: startedAt });
|
|
52
|
+
const finalize = (status, logDetail) => {
|
|
53
|
+
// Synthetic diagnostics only — surfaced by the results pipeline via the
|
|
54
|
+
// channel log. NEVER the response body (secret-reflection risk).
|
|
55
|
+
if (logDetail)
|
|
56
|
+
store.saveChannelLog(jobId, channelName, logDetail);
|
|
57
|
+
// Match the subprocess dispatcher's persisted shape: only completed
|
|
58
|
+
// channels carry output_parser (it drives parsing); error paths write
|
|
59
|
+
// status + completed_at only.
|
|
60
|
+
const update = { status, completed_at: new Date().toISOString() };
|
|
61
|
+
if (status === 'completed')
|
|
62
|
+
update.output_parser = channel.output_parser;
|
|
63
|
+
store.updateChannel(jobId, channelName, update);
|
|
64
|
+
};
|
|
65
|
+
const headers = {
|
|
66
|
+
'content-type': 'application/json',
|
|
67
|
+
...(channel.headers ?? {}),
|
|
68
|
+
};
|
|
69
|
+
if (channel.api_key_env) {
|
|
70
|
+
const value = process.env[channel.api_key_env];
|
|
71
|
+
if (!value) {
|
|
72
|
+
// Env-var name only — never the value (absent here anyway).
|
|
73
|
+
finalize('auth_failed', `API key env var ${channel.api_key_env} not set`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Drop any case-variant of the target header from `channel.headers` so the
|
|
77
|
+
// api-key header is authoritative and we never emit a duplicate (fetch
|
|
78
|
+
// implementations normalize header casing inconsistently).
|
|
79
|
+
const target = channel.api_key_header.toLowerCase();
|
|
80
|
+
for (const k of Object.keys(headers)) {
|
|
81
|
+
if (k.toLowerCase() === target)
|
|
82
|
+
delete headers[k];
|
|
83
|
+
}
|
|
84
|
+
headers[channel.api_key_header] = `${channel.api_key_prefix}${value}`;
|
|
85
|
+
}
|
|
86
|
+
const body = {
|
|
87
|
+
model: channel.model,
|
|
88
|
+
messages: [{ role: 'user', content: prompt }],
|
|
89
|
+
};
|
|
90
|
+
if (impliesJsonOutput(channel.output_parser)) {
|
|
91
|
+
body.response_format = { type: 'json_object' };
|
|
92
|
+
}
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const timer = setTimeout(() => controller.abort(), Math.max(0, timeout * 1000));
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(channel.endpoint, {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers,
|
|
99
|
+
body: JSON.stringify(body),
|
|
100
|
+
signal: controller.signal,
|
|
101
|
+
});
|
|
102
|
+
const status = classifyStatus(res.status);
|
|
103
|
+
if (status === 'completed') {
|
|
104
|
+
// Save the model's direct output (unwrapped from the envelope) so the
|
|
105
|
+
// existing parsers consume it exactly like subprocess stdout.
|
|
106
|
+
store.saveChannelOutput(jobId, channelName, extractOpenAiContent(await res.text()));
|
|
107
|
+
finalize('completed');
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
finalize(status, `HTTP ${res.status}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err.name === 'AbortError') {
|
|
115
|
+
finalize('timeout', `request timed out after ${timeout}s`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
finalize('failed', 'request failed');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
clearTimeout(timer);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=http-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-dispatcher.js","sourceRoot":"","sources":["../../src/core/http-dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/core/job-store.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import type { JobMetadata, ChannelJobEntry, Severity, OutputFormat } from '../types.js';
|
|
1
|
+
import type { JobMetadata, ChannelJobEntry, Severity, OutputFormat, ReviewControls } from '../types.js';
|
|
2
2
|
import type { ReconciledResults } from '../types.js';
|
|
3
3
|
export interface CreateJobOpts {
|
|
4
4
|
fix_threshold: Severity;
|
|
5
5
|
format: OutputFormat;
|
|
6
6
|
channels: string[];
|
|
7
|
+
session_id?: string;
|
|
8
|
+
round?: number;
|
|
9
|
+
review_controls?: ReviewControls;
|
|
10
|
+
trust_mode?: 'base-ref' | 'untrusted-head' | 'non-git';
|
|
11
|
+
proposed_acks?: string[];
|
|
12
|
+
proposed_config_change?: boolean;
|
|
7
13
|
}
|
|
8
14
|
export declare class JobStore {
|
|
9
15
|
private readonly jobsDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-store.d.ts","sourceRoot":"","sources":["../../src/core/job-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"job-store.d.ts","sourceRoot":"","sources":["../../src/core/job-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGpD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,QAAQ,CAAA;IACvB,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,cAAc,CAAA;IAChC,UAAU,CAAC,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAA;IACtD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;CACjC;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;gBAEpB,OAAO,EAAE,MAAM;IAK3B,iEAAiE;IACjE,OAAO,CAAC,mBAAmB;IAM3B,+DAA+D;IAC/D,OAAO,CAAC,eAAe;IAKvB,mDAAmD;IACnD,OAAO,CAAC,UAAU;IAKlB,mCAAmC;IACnC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAYhC,yEAAyE;IACzE,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,WAAW;IA8B3C,qCAAqC;IACrC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAKnD,4FAA4F;IAC5F,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAkCnC,qCAAqC;IACrC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,qCAAqC;IACrC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIjC,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3C,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI/B,yCAAyC;IACzC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAKxE,qCAAqC;IACrC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAKzD,kCAAkC;IAClC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjE;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM7D,sFAAsF;IACtF,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASxF,6EAA6E;IAC7E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAuBrF,8BAA8B;IAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAO5D,2DAA2D;IAC3D,QAAQ,IAAI,WAAW,EAAE;IAqBzB,wEAAwE;IACxE,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAgBxC,sDAAsD;IACtD,OAAO,CAAC,eAAe;CAQxB"}
|
package/dist/core/job-store.js
CHANGED
|
@@ -26,7 +26,15 @@ export class JobStore {
|
|
|
26
26
|
}
|
|
27
27
|
/** Full path to a job directory */
|
|
28
28
|
getJobDir(jobId) {
|
|
29
|
-
|
|
29
|
+
// Containment guard: a job id is a path component, never a traversal.
|
|
30
|
+
// Reject any value (absolute, or containing `..`/separators) that would
|
|
31
|
+
// resolve outside jobsDir before it reaches the filesystem.
|
|
32
|
+
const resolved = path.resolve(this.jobsDir, jobId);
|
|
33
|
+
const rel = path.relative(this.jobsDir, resolved);
|
|
34
|
+
if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) {
|
|
35
|
+
throw new Error(`Invalid job id (path escape): ${jobId}`);
|
|
36
|
+
}
|
|
37
|
+
return resolved;
|
|
30
38
|
}
|
|
31
39
|
/** Create a new job with its directory structure and initial metadata */
|
|
32
40
|
createJob(opts) {
|
|
@@ -46,6 +54,18 @@ export class JobStore {
|
|
|
46
54
|
created_at: new Date().toISOString(),
|
|
47
55
|
channels,
|
|
48
56
|
};
|
|
57
|
+
if (opts.session_id !== undefined)
|
|
58
|
+
metadata.session_id = opts.session_id;
|
|
59
|
+
if (opts.round !== undefined)
|
|
60
|
+
metadata.round = opts.round;
|
|
61
|
+
if (opts.review_controls !== undefined)
|
|
62
|
+
metadata.review_controls = opts.review_controls;
|
|
63
|
+
if (opts.trust_mode !== undefined)
|
|
64
|
+
metadata.trust_mode = opts.trust_mode;
|
|
65
|
+
if (opts.proposed_acks !== undefined)
|
|
66
|
+
metadata.proposed_acks = opts.proposed_acks;
|
|
67
|
+
if (opts.proposed_config_change !== undefined)
|
|
68
|
+
metadata.proposed_config_change = opts.proposed_config_change;
|
|
49
69
|
this.saveJob(jobId, metadata);
|
|
50
70
|
return metadata;
|
|
51
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-store.js","sourceRoot":"","sources":["../../src/core/job-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAA;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"job-store.js","sourceRoot":"","sources":["../../src/core/job-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal jsonpath subset used by the `unwrap-jsonpath` parser kind.
|
|
3
|
+
*
|
|
4
|
+
* Supported forms:
|
|
5
|
+
* $ - root
|
|
6
|
+
* $.foo - property
|
|
7
|
+
* $.foo.bar - nested property
|
|
8
|
+
* $.foo[0] - array index
|
|
9
|
+
* $.foo[0].bar - property of an indexed element
|
|
10
|
+
*
|
|
11
|
+
* Returns `undefined` when the path does not resolve. Throws only for
|
|
12
|
+
* structural errors in the path itself.
|
|
13
|
+
*/
|
|
14
|
+
export declare function jsonpathGet(root: unknown, path: string): unknown;
|
|
15
|
+
//# sourceMappingURL=jsonpath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.d.ts","sourceRoot":"","sources":["../../src/core/jsonpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuChE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal jsonpath subset used by the `unwrap-jsonpath` parser kind.
|
|
3
|
+
*
|
|
4
|
+
* Supported forms:
|
|
5
|
+
* $ - root
|
|
6
|
+
* $.foo - property
|
|
7
|
+
* $.foo.bar - nested property
|
|
8
|
+
* $.foo[0] - array index
|
|
9
|
+
* $.foo[0].bar - property of an indexed element
|
|
10
|
+
*
|
|
11
|
+
* Returns `undefined` when the path does not resolve. Throws only for
|
|
12
|
+
* structural errors in the path itself.
|
|
13
|
+
*/
|
|
14
|
+
export function jsonpathGet(root, path) {
|
|
15
|
+
if (!path.startsWith('$')) {
|
|
16
|
+
throw new Error(`jsonpath must start with $ (got: ${path})`);
|
|
17
|
+
}
|
|
18
|
+
if (path === '$')
|
|
19
|
+
return root;
|
|
20
|
+
let cursor = root;
|
|
21
|
+
let i = 1;
|
|
22
|
+
while (i < path.length) {
|
|
23
|
+
const ch = path[i];
|
|
24
|
+
if (ch === '.') {
|
|
25
|
+
i += 1;
|
|
26
|
+
if (path[i] === '[')
|
|
27
|
+
continue;
|
|
28
|
+
const match = /^[A-Za-z_][A-Za-z0-9_-]*/.exec(path.slice(i));
|
|
29
|
+
if (!match)
|
|
30
|
+
throw new Error(`jsonpath malformed empty property at offset ${i - 1} (path: ${path})`);
|
|
31
|
+
if (isPrototypeSensitiveKey(match[0]))
|
|
32
|
+
return undefined;
|
|
33
|
+
if (cursor === null || typeof cursor !== 'object')
|
|
34
|
+
return undefined;
|
|
35
|
+
cursor = cursor[match[0]];
|
|
36
|
+
i += match[0].length;
|
|
37
|
+
}
|
|
38
|
+
else if (ch === '[') {
|
|
39
|
+
const end = path.indexOf(']', i + 1);
|
|
40
|
+
if (end === -1) {
|
|
41
|
+
throw new Error(`jsonpath malformed: unclosed [ at offset ${i} (path: ${path})`);
|
|
42
|
+
}
|
|
43
|
+
const inside = path.slice(i + 1, end);
|
|
44
|
+
if (!/^\d+$/.test(inside)) {
|
|
45
|
+
throw new Error(`jsonpath invalid index "${inside}" (only numeric indices supported) at offset ${i} (path: ${path})`);
|
|
46
|
+
}
|
|
47
|
+
if (!Array.isArray(cursor))
|
|
48
|
+
return undefined;
|
|
49
|
+
cursor = cursor[Number.parseInt(inside, 10)];
|
|
50
|
+
i = end + 1;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
throw new Error(`jsonpath unexpected character "${ch}" at offset ${i} (path: ${path})`);
|
|
54
|
+
}
|
|
55
|
+
if (cursor === undefined)
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
return cursor;
|
|
59
|
+
}
|
|
60
|
+
function isPrototypeSensitiveKey(key) {
|
|
61
|
+
return key === '__proto__' || key === 'constructor' || key === 'prototype';
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=jsonpath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.js","sourceRoot":"","sources":["../../src/core/jsonpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,IAAY;IACrD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,GAAG,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAE7B,IAAI,MAAM,GAAY,IAAI,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAClB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,CAAC,IAAI,CAAC,CAAA;YACN,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,SAAQ;YAC7B,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5D,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,CAAA;YACnG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAA;YACvD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAA;YACnE,MAAM,GAAI,MAAkC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACtD,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QACtB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YACpC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,WAAW,IAAI,GAAG,CAAC,CAAA;YAClF,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,gDAAgD,CAAC,WAAW,IAAI,GAAG,CACrG,CAAA;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAA;YAC5C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;YAC5C,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,eAAe,CAAC,WAAW,IAAI,GAAG,CAAC,CAAA;QACzF,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;IAC5C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW;IAC1C,OAAO,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface OssProbeSpec {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
timeoutMs: number;
|
|
5
|
+
}
|
|
6
|
+
export type OssRuntimeId = 'ollama' | 'lms' | 'llama-server' | 'local-ai-delegate';
|
|
7
|
+
export interface OssRuntime {
|
|
8
|
+
id: OssRuntimeId;
|
|
9
|
+
probe: OssProbeSpec;
|
|
10
|
+
}
|
|
11
|
+
export declare const OSS_RUNTIMES: OssRuntime[];
|
|
12
|
+
/**
|
|
13
|
+
* Commented YAML block for the given runtime. The block is meant to be
|
|
14
|
+
* pasted directly into a generated .mmr.yaml; every line is prefixed with
|
|
15
|
+
* `# ` so the user must explicitly opt in by uncommenting and editing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function exampleBlockFor(id: OssRuntimeId): string;
|
|
18
|
+
//# sourceMappingURL=oss-examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss-examples.d.ts","sourceRoot":"","sources":["../../src/core/oss-examples.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,KAAK,GAAG,cAAc,GAAG,mBAAmB,CAAA;AAElF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;CACpB;AAeD,eAAO,MAAM,YAAY,EAAE,UAAU,EAEE,CAAA;AAEvC;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CA8CxD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog of OSS runtimes available to config-init probing. v3.28 ships
|
|
3
|
+
* subprocess support only; HTTP-shaped runtimes (lms, llama-server) get
|
|
4
|
+
* commented-out stubs that note v3.30 will enable them. local-ai-delegate
|
|
5
|
+
* documents a subprocess shim users can adapt in v3.28.
|
|
6
|
+
*/
|
|
7
|
+
const OSS_RUNTIME_PROBES = {
|
|
8
|
+
ollama: { command: 'ollama', args: ['list'], timeoutMs: 1000 },
|
|
9
|
+
lms: { command: 'lms', args: ['ps'], timeoutMs: 1000 },
|
|
10
|
+
'llama-server': { command: 'llama-server', args: ['--help'], timeoutMs: 1000 },
|
|
11
|
+
'local-ai-delegate': { command: 'local-ai-delegate', args: ['--version'], timeoutMs: 1000 },
|
|
12
|
+
};
|
|
13
|
+
export const OSS_RUNTIMES = Object.entries(OSS_RUNTIME_PROBES).map(([id, probe]) => ({ id, probe }));
|
|
14
|
+
/**
|
|
15
|
+
* Commented YAML block for the given runtime. The block is meant to be
|
|
16
|
+
* pasted directly into a generated .mmr.yaml; every line is prefixed with
|
|
17
|
+
* `# ` so the user must explicitly opt in by uncommenting and editing.
|
|
18
|
+
*/
|
|
19
|
+
export function exampleBlockFor(id) {
|
|
20
|
+
switch (id) {
|
|
21
|
+
case 'ollama':
|
|
22
|
+
return [
|
|
23
|
+
'# example: ollama (subprocess, JSON output)',
|
|
24
|
+
'# Uncomment and adjust to enable a local Ollama channel.',
|
|
25
|
+
'# ollama-base:',
|
|
26
|
+
'# abstract: true # template only',
|
|
27
|
+
'# command: ollama run',
|
|
28
|
+
'# auth:',
|
|
29
|
+
'# check: "ollama list"',
|
|
30
|
+
'# timeout: 5 # seconds',
|
|
31
|
+
'# failure_exit_codes: [1]',
|
|
32
|
+
'# recovery: "ollama serve"',
|
|
33
|
+
'# qwen-local:',
|
|
34
|
+
'# extends: ollama-base',
|
|
35
|
+
'# flags: ["qwen2.5-coder:32b", "--format", "json"]',
|
|
36
|
+
].join('\n');
|
|
37
|
+
case 'lms':
|
|
38
|
+
return [
|
|
39
|
+
'# example: lms (LM Studio, HTTP) - requires MMR v3.30+',
|
|
40
|
+
'# LM Studio exposes /v1/chat/completions only; HTTP channel kind',
|
|
41
|
+
'# ships in v3.30. Leaving as a placeholder for now.',
|
|
42
|
+
].join('\n');
|
|
43
|
+
case 'llama-server':
|
|
44
|
+
return [
|
|
45
|
+
'# example: llama-server (llama.cpp HTTP) - requires MMR v3.30+',
|
|
46
|
+
'# llama-server exposes /v1/chat/completions only; HTTP channel',
|
|
47
|
+
'# kind ships in v3.30. Leaving as a placeholder for now.',
|
|
48
|
+
].join('\n');
|
|
49
|
+
case 'local-ai-delegate':
|
|
50
|
+
return [
|
|
51
|
+
'# example: local-ai-delegate (MCP bridge subprocess shim)',
|
|
52
|
+
'# The local-ai-delegate MCP server proxies an OpenAI-compatible',
|
|
53
|
+
'# endpoint to a locally-hosted model. Native HTTP channel kind ships',
|
|
54
|
+
'# in v3.30; this v3.28 example assumes a shell shim wrapper.',
|
|
55
|
+
'# local-ai-delegate-base:',
|
|
56
|
+
'# abstract: true # template only',
|
|
57
|
+
'# command: local-ai-delegate review',
|
|
58
|
+
'# local-ai-delegate-local:',
|
|
59
|
+
'# extends: local-ai-delegate-base',
|
|
60
|
+
'# flags: ["--format", "json"]',
|
|
61
|
+
].join('\n');
|
|
62
|
+
}
|
|
63
|
+
const exhaustive = id;
|
|
64
|
+
return exhaustive;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=oss-examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss-examples.js","sourceRoot":"","sources":["../../src/core/oss-examples.ts"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,MAAM,kBAAkB,GAAuC;IAC7D,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9D,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IACtD,cAAc,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9E,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;CAC5F,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GACvB,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAClC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAEvC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAAgB;IAC9C,QAAQ,EAAE,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO;gBACL,6CAA6C;gBAC7C,4DAA4D;gBAC5D,kBAAkB;gBAClB,uEAAuE;gBACvE,2BAA2B;gBAC3B,aAAa;gBACb,8BAA8B;gBAC9B,iEAAiE;gBACjE,iCAAiC;gBACjC,kCAAkC;gBAClC,iBAAiB;gBACjB,4BAA4B;gBAC5B,wDAAwD;aACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,KAAK,KAAK;YACR,OAAO;gBACL,wDAAwD;gBACxD,oEAAoE;gBACpE,uDAAuD;aACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,KAAK,cAAc;YACjB,OAAO;gBACL,gEAAgE;gBAChE,kEAAkE;gBAClE,4DAA4D;aAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,KAAK,mBAAmB;YACtB,OAAO;gBACL,2DAA2D;gBAC3D,mEAAmE;gBACnE,wEAAwE;gBACxE,gEAAgE;gBAChE,6BAA6B;gBAC7B,uEAAuE;gBACvE,yCAAyC;gBACzC,8BAA8B;gBAC9B,uCAAuC;gBACvC,mCAAmC;aACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IACD,MAAM,UAAU,GAAU,EAAE,CAAA;IAC5B,OAAO,UAAU,CAAA;AACnB,CAAC"}
|
package/dist/core/parser.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OutputParserConfig } from '../config/schema.js';
|
|
1
2
|
import type { Finding } from '../types.js';
|
|
2
3
|
export interface ParsedOutput {
|
|
3
4
|
approved: boolean;
|
|
@@ -27,11 +28,15 @@ export declare function validateFinding(f: unknown): Finding;
|
|
|
27
28
|
export declare function validateFindingStrict(f: unknown): Finding;
|
|
28
29
|
export declare function validateParsedOutputStrict(obj: unknown): ParsedOutput;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* Build or look up a parser.
|
|
32
|
+
*
|
|
33
|
+
* String form looks up a built-in parser by name. Object form is intentionally
|
|
34
|
+
* routed through buildParser so structured configs are never silently ignored.
|
|
31
35
|
*/
|
|
32
|
-
export declare function getParser(
|
|
36
|
+
export declare function getParser(spec: string | OutputParserConfig): Parser;
|
|
37
|
+
export declare function buildParser(spec: OutputParserConfig): Parser;
|
|
33
38
|
/**
|
|
34
39
|
* Wraps getParser in try/catch, returns error finding on parse failure.
|
|
35
40
|
*/
|
|
36
|
-
export declare function parseChannelOutput(raw: string,
|
|
41
|
+
export declare function parseChannelOutput(raw: string, parserSpec: string | OutputParserConfig): ParsedOutput;
|
|
37
42
|
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAG1C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAA;AAElD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgChD;AA8DD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAU/D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAcnD;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAsBzD;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAarE;AAqED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,MAAM,CAKnE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAqB5D;AA2CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,YAAY,CAmBrG"}
|