jevctl 0.1.0 → 0.2.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/CHANGELOG.md +50 -1
- package/NOTICE +4 -0
- package/README.md +54 -388
- package/SECURITY.md +5 -3
- package/dist/cli.js +105 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/ask.d.ts +5 -1
- package/dist/commands/ask.js +27 -10
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/auth.d.ts +14 -0
- package/dist/commands/auth.js +158 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/batch.d.ts +28 -0
- package/dist/commands/batch.js +221 -0
- package/dist/commands/batch.js.map +1 -0
- package/dist/commands/classify.d.ts +34 -0
- package/dist/commands/classify.js +187 -0
- package/dist/commands/classify.js.map +1 -0
- package/dist/commands/compact.d.ts +29 -0
- package/dist/commands/compact.js +146 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/config.d.ts +2 -1
- package/dist/commands/config.js +27 -10
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/extract.d.ts +18 -0
- package/dist/commands/extract.js +108 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/find.d.ts +5 -1
- package/dist/commands/find.js +30 -15
- package/dist/commands/find.js.map +1 -1
- package/dist/commands/match.d.ts +18 -0
- package/dist/commands/match.js +118 -0
- package/dist/commands/match.js.map +1 -0
- package/dist/commands/models.js +12 -10
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/rerank.d.ts +15 -0
- package/dist/commands/rerank.js +82 -0
- package/dist/commands/rerank.js.map +1 -0
- package/dist/commands/route.d.ts +19 -0
- package/dist/commands/route.js +120 -0
- package/dist/commands/route.js.map +1 -0
- package/dist/commands/screen.d.ts +5 -1
- package/dist/commands/screen.js +27 -10
- package/dist/commands/screen.js.map +1 -1
- package/dist/commands/verify.d.ts +5 -1
- package/dist/commands/verify.js +23 -12
- package/dist/commands/verify.js.map +1 -1
- package/dist/config.d.ts +66 -6
- package/dist/config.js +53 -2
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +4 -0
- package/dist/context.js +11 -5
- package/dist/context.js.map +1 -1
- package/dist/core/ask.js +8 -3
- package/dist/core/ask.js.map +1 -1
- package/dist/core/batch.d.ts +42 -0
- package/dist/core/batch.js +93 -0
- package/dist/core/batch.js.map +1 -0
- package/dist/core/classify.d.ts +103 -0
- package/dist/core/classify.js +216 -0
- package/dist/core/classify.js.map +1 -0
- package/dist/core/compact.d.ts +32 -0
- package/dist/core/compact.js +47 -0
- package/dist/core/compact.js.map +1 -0
- package/dist/core/extract.d.ts +58 -0
- package/dist/core/extract.js +214 -0
- package/dist/core/extract.js.map +1 -0
- package/dist/core/find.js +3 -0
- package/dist/core/find.js.map +1 -1
- package/dist/core/match.d.ts +55 -0
- package/dist/core/match.js +114 -0
- package/dist/core/match.js.map +1 -0
- package/dist/core/rerank.d.ts +47 -0
- package/dist/core/rerank.js +60 -0
- package/dist/core/rerank.js.map +1 -0
- package/dist/core/route.d.ts +74 -0
- package/dist/core/route.js +153 -0
- package/dist/core/route.js.map +1 -0
- package/dist/core/transcript.d.ts +15 -0
- package/dist/core/transcript.js +118 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/credentials.d.ts +30 -0
- package/dist/credentials.js +161 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/input.js +1 -1
- package/dist/input.js.map +1 -1
- package/dist/lib.d.ts +2 -0
- package/dist/lib.js +9 -0
- package/dist/lib.js.map +1 -1
- package/dist/output.d.ts +41 -3
- package/dist/output.js +131 -6
- package/dist/output.js.map +1 -1
- package/dist/provider.d.ts +8 -0
- package/dist/provider.js +44 -4
- package/dist/provider.js.map +1 -1
- package/dist/vendor/compaction/compact.d.ts +29 -0
- package/dist/vendor/compaction/compact.js +236 -0
- package/dist/vendor/compaction/compact.js.map +1 -0
- package/dist/vendor/compaction/index.d.ts +4 -0
- package/dist/vendor/compaction/index.js +8 -0
- package/dist/vendor/compaction/index.js.map +1 -0
- package/dist/vendor/compaction/request.d.ts +19 -0
- package/dist/vendor/compaction/request.js +53 -0
- package/dist/vendor/compaction/request.js.map +1 -0
- package/dist/vendor/compaction/state.d.ts +28 -0
- package/dist/vendor/compaction/state.js +258 -0
- package/dist/vendor/compaction/state.js.map +1 -0
- package/dist/vendor/compaction/types.d.ts +177 -0
- package/dist/vendor/compaction/types.js +4 -0
- package/dist/vendor/compaction/types.js.map +1 -0
- package/docs/ask.md +52 -0
- package/docs/auth.md +53 -0
- package/docs/batch.md +48 -0
- package/docs/classify.md +55 -0
- package/docs/compact.md +58 -0
- package/docs/config.md +81 -0
- package/docs/extract.md +59 -0
- package/docs/find.md +49 -0
- package/docs/guidelines.md +19 -0
- package/docs/library.md +41 -0
- package/docs/match.md +52 -0
- package/docs/output.md +65 -0
- package/docs/recipes.md +78 -0
- package/docs/rerank.md +44 -0
- package/docs/route.md +57 -0
- package/docs/screen.md +53 -0
- package/docs/troubleshooting.md +17 -0
- package/docs/verify.md +58 -0
- package/package.json +9 -6
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { COMPACT_FAIL_CONDITIONS, compactFailed, runCompact } from "../core/compact.js";
|
|
4
|
+
import { parseTranscript } from "../core/transcript.js";
|
|
5
|
+
import { CliError, EXIT } from "../errors.js";
|
|
6
|
+
import { readInput, readStdin } from "../input.js";
|
|
7
|
+
import { parseFailOn, parseProbability } from "../lib.js";
|
|
8
|
+
import { clip, emit, formatProbability, paint } from "../output.js";
|
|
9
|
+
import { collectToolCalls, fitState, resolveOptions } from "../vendor/compaction/index.js";
|
|
10
|
+
function int(name, raw, fallback, min = 0) {
|
|
11
|
+
if (raw === undefined)
|
|
12
|
+
return fallback;
|
|
13
|
+
const n = Number(raw);
|
|
14
|
+
if (!Number.isInteger(n) || n < min)
|
|
15
|
+
throw new CliError(`${name} must be an integer ≥ ${min}.`);
|
|
16
|
+
return n;
|
|
17
|
+
}
|
|
18
|
+
export function resolveCompactOptions(flags, ctx) {
|
|
19
|
+
const c = ctx.config.compact;
|
|
20
|
+
return {
|
|
21
|
+
goal: flags.goal,
|
|
22
|
+
keepThreshold: parseProbability("--keep-threshold", flags.keepThreshold, c.keepThreshold),
|
|
23
|
+
preserveRecentMessages: int("--preserve-recent", flags.preserveRecent, c.preserveRecent),
|
|
24
|
+
maxStateTokens: int("--max-state-tokens", flags.maxStateTokens, c.maxStateTokens, 1),
|
|
25
|
+
maxRequestTokens: int("--max-request-tokens", flags.maxRequestTokens, c.maxRequestTokens, 1),
|
|
26
|
+
truncateHeadChars: int("--truncate-head", flags.truncateHead, c.truncateHead),
|
|
27
|
+
minReduction: parseProbability("--min-reduction", flags.minReduction, c.minReduction),
|
|
28
|
+
failOn: parseFailOn(flags.failOn, COMPACT_FAIL_CONDITIONS, []),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function loadTranscript(positional) {
|
|
32
|
+
let raw;
|
|
33
|
+
if (positional !== undefined)
|
|
34
|
+
raw = readInput(positional, "transcript");
|
|
35
|
+
else if (!process.stdin.isTTY)
|
|
36
|
+
raw = readStdin("transcript");
|
|
37
|
+
else
|
|
38
|
+
throw new CliError("Provide a transcript: @session.jsonl, @messages.json, or - for stdin.");
|
|
39
|
+
try {
|
|
40
|
+
return parseTranscript(raw);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new CliError(err.message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function compactAction(positional, flags, ctx) {
|
|
47
|
+
const { failOn, minReduction, ...options } = resolveCompactOptions(flags, ctx);
|
|
48
|
+
const transcript = loadTranscript(positional);
|
|
49
|
+
if (ctx.dryRun) {
|
|
50
|
+
const resolved = resolveOptions(options);
|
|
51
|
+
const calls = collectToolCalls(transcript.messages, resolved.preserveRecentMessages);
|
|
52
|
+
const candidates = calls.filter((c) => !c.pinned);
|
|
53
|
+
const fitted = candidates.length ? fitState(transcript.messages, calls, resolved) : null;
|
|
54
|
+
emit({ ...ctx.output, format: "json" }, {
|
|
55
|
+
model: ctx.config.model,
|
|
56
|
+
format: transcript.format,
|
|
57
|
+
messages: transcript.messages.length,
|
|
58
|
+
skipped_records: transcript.skipped,
|
|
59
|
+
tool_calls: calls.length,
|
|
60
|
+
candidates: candidates.length,
|
|
61
|
+
pinned: calls.length - candidates.length,
|
|
62
|
+
state_tokens: fitted?.tokens ?? 0,
|
|
63
|
+
state_stage: fitted?.stage ?? "",
|
|
64
|
+
state: fitted?.state ?? null,
|
|
65
|
+
}, () => ({}));
|
|
66
|
+
return EXIT.OK;
|
|
67
|
+
}
|
|
68
|
+
const output = await runCompact(ctx.ask(), { messages: transcript.messages, minReduction, ...options });
|
|
69
|
+
if (flags.out) {
|
|
70
|
+
const path = flags.out.startsWith("@") ? flags.out.slice(1) : flags.out;
|
|
71
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
72
|
+
writeFileSync(path, `${JSON.stringify(output.messages, null, 2)}\n`, "utf8");
|
|
73
|
+
}
|
|
74
|
+
emit(ctx.output, flags.out ? { ...output, messages: undefined, messages_written_to: flags.out } : output, () => renderCompact(output, ctx, transcript.format, flags.out));
|
|
75
|
+
return compactFailed(output, failOn) ? EXIT.JUDGMENT : EXIT.OK;
|
|
76
|
+
}
|
|
77
|
+
export function renderCompact(out, ctx, format, wrote) {
|
|
78
|
+
const c = ctx.output.color;
|
|
79
|
+
const s = out.stats;
|
|
80
|
+
const pct = `${Math.round(out.reduction * 100)}%`;
|
|
81
|
+
const headline = out.worth_it
|
|
82
|
+
? paint(c, ["bold", "green"], `${pct} smaller`)
|
|
83
|
+
: paint(c, ["bold", "yellow"], `${pct} smaller (below ${Math.round(out.min_reduction * 100)}% minimum)`);
|
|
84
|
+
const head = [
|
|
85
|
+
`${headline} ${s.messagesBefore} → ${s.messagesAfter} messages · ${s.charsBefore.toLocaleString()} → ${s.charsAfter.toLocaleString()} chars`,
|
|
86
|
+
paint(c, "dim", `${s.calls} tool calls: ${s.kept} kept · ${s.resultsDropped} results truncated · ${s.callsDropped} calls dropped · ${s.pinned} pinned · state ~${s.stateTokens} tokens (${s.stateStage || "no request"}) in ${s.requests} request(s), ${s.ms} ms`),
|
|
87
|
+
];
|
|
88
|
+
const decided = out.decisions.filter((d) => d.reason !== "pinned");
|
|
89
|
+
const style = (a) => a === "keep"
|
|
90
|
+
? paint(c, "green", a)
|
|
91
|
+
: a === "drop_result"
|
|
92
|
+
? paint(c, "yellow", "truncate")
|
|
93
|
+
: paint(c, "red", "drop");
|
|
94
|
+
const rows = decided.map((d) => [
|
|
95
|
+
d.id,
|
|
96
|
+
clip(d.tool, 14),
|
|
97
|
+
style(d.action),
|
|
98
|
+
formatProbability(d.keepCall),
|
|
99
|
+
formatProbability(d.keepResult),
|
|
100
|
+
]);
|
|
101
|
+
return {
|
|
102
|
+
head,
|
|
103
|
+
table: decided.length ? { columns: ["Call", "Tool", "Action", "P(call)", "P(result)"], rows } : undefined,
|
|
104
|
+
tail: [
|
|
105
|
+
paint(c, "dim", wrote
|
|
106
|
+
? `compacted messages written to ${wrote.replace(/^@/, "")} (${format} in, messages JSON out)`
|
|
107
|
+
: `add --out <file> to write the compacted messages (${format} in, messages JSON out)`),
|
|
108
|
+
],
|
|
109
|
+
usage: { usage: out.usage, model: out.model, provider: out.provider },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function registerCompact(program, run) {
|
|
113
|
+
program
|
|
114
|
+
.command("compact")
|
|
115
|
+
.description("Shrink an agent transcript without summarizing: Jev decides which old tool calls and results still matter; everything kept stays verbatim.")
|
|
116
|
+
.argument("[transcript]", "@session.jsonl (Claude Code), @messages.json, or - for stdin (default: stdin)")
|
|
117
|
+
.option("-g, --goal <text>", "the ongoing task, so Jev knows what still matters (default: the last three user prompts)")
|
|
118
|
+
.option("--keep-threshold <p>", "keep a call or result when Jev's probability is at least this (default 0.5)")
|
|
119
|
+
.option("--preserve-recent <n>", "newest messages never touched; the first message is always kept (default 6)")
|
|
120
|
+
.option("--max-state-tokens <n>", "estimated token budget for the history sent to Jev (default 25000)")
|
|
121
|
+
.option("--max-request-tokens <n>", "estimated budget for history plus one batch of questions (default 30000)")
|
|
122
|
+
.option("--truncate-head <n>", "characters of a dropped result to keep before the note (default 300)")
|
|
123
|
+
.option("--min-reduction <p>", "below this reduction ratio the result is flagged not worth applying (default 0.25)")
|
|
124
|
+
.option("-o, --out <path>", "write the compacted transcript (messages JSON) here")
|
|
125
|
+
.option("--fail-on <list>", "exit 2 when: low-reduction, or none (default none)")
|
|
126
|
+
.addHelpText("after", `
|
|
127
|
+
Input formats:
|
|
128
|
+
Claude Code session log ~/.claude/projects/<project>/<session>.jsonl (one record per line)
|
|
129
|
+
Messages JSON [{"role","text","toolUses":[{"tool_use_id","tool","input"}],"toolResults":[{"tool_use_id","text"}]}]
|
|
130
|
+
|
|
131
|
+
Text messages are never removed or shortened. Only tool calls and their results outside the pinned
|
|
132
|
+
first and newest messages are candidates. A dropped result keeps its first --truncate-head chars plus a
|
|
133
|
+
note; a dropped call disappears with its result. The assistant can always re-run a tool.
|
|
134
|
+
|
|
135
|
+
Examples:
|
|
136
|
+
jev compact @~/.claude/projects/-me-repo/abc123.jsonl
|
|
137
|
+
jev compact @session.jsonl --goal "fix the flaky auth test" --out compacted.json --json
|
|
138
|
+
jev compact @messages.json --keep-threshold 0.6 --fail-on low-reduction
|
|
139
|
+
|
|
140
|
+
In-session use: install the jev Claude Code plugin; its hook replaces Claude Code's compaction summary
|
|
141
|
+
with this exact procedure. See plugin/hooks/README.md.`)
|
|
142
|
+
.action(async (transcript, flags, cmd) => {
|
|
143
|
+
await run((ctx) => compactAction(transcript, flags, ctx), cmd);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=compact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/commands/compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,6 @@ export declare function credentialReport(env: NodeJS.ProcessEnv): {
|
|
|
9
9
|
CLOUDFLARE_ACCOUNT_ID: string | null;
|
|
10
10
|
TYPESAFE_BASE_URL: string | null;
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
/** `rawEnv` is the shell environment; `ctx.env` additionally holds stored credentials. */
|
|
13
|
+
export declare function configShow(ctx: CommandContext, rawEnv: NodeJS.ProcessEnv): Promise<number>;
|
|
13
14
|
export declare function registerConfig(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
package/dist/commands/config.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { existsSync, unlinkSync } from "node:fs";
|
|
2
2
|
import { configPath, DEFAULT_CONFIG, readConfigFile, setConfigValue, writeConfigFile } from "../config.js";
|
|
3
|
+
import { resolveCredentials } from "../credentials.js";
|
|
3
4
|
import { CliError, EXIT } from "../errors.js";
|
|
4
|
-
import { emit, paint
|
|
5
|
+
import { emit, paint } from "../output.js";
|
|
5
6
|
import { resolveProvider } from "../provider.js";
|
|
6
7
|
/** Mask a secret to its first four and last two characters. */
|
|
7
8
|
export function mask(secret) {
|
|
8
9
|
if (!secret)
|
|
9
10
|
return null;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return `${secret.slice(0, 4)}…${secret.slice(-2)}`;
|
|
11
|
+
// Show only the last four characters, regardless of source, so env and stored keys look alike.
|
|
12
|
+
return secret.length > 8 ? `…${secret.slice(-4)}` : "********";
|
|
13
13
|
}
|
|
14
14
|
export function credentialReport(env) {
|
|
15
15
|
return {
|
|
@@ -20,7 +20,9 @@ export function credentialReport(env) {
|
|
|
20
20
|
TYPESAFE_BASE_URL: env.TYPESAFE_BASE_URL ?? null,
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
/** `rawEnv` is the shell environment; `ctx.env` additionally holds stored credentials. */
|
|
24
|
+
export async function configShow(ctx, rawEnv) {
|
|
25
|
+
const env = ctx.env;
|
|
24
26
|
const path = configPath(env);
|
|
25
27
|
let resolved = null;
|
|
26
28
|
let problem = null;
|
|
@@ -35,13 +37,13 @@ export async function configShow(ctx, env) {
|
|
|
35
37
|
config_file_exists: existsSync(path),
|
|
36
38
|
config: ctx.config,
|
|
37
39
|
credentials: credentialReport(env),
|
|
40
|
+
credential_sources: Object.fromEntries(resolveCredentials(rawEnv).map((c) => [c.provider, c.source])),
|
|
38
41
|
resolved_provider: resolved,
|
|
39
42
|
problem,
|
|
40
43
|
};
|
|
41
44
|
emit(ctx.output, payload, () => {
|
|
42
45
|
const c = ctx.output.color;
|
|
43
46
|
const rows = [
|
|
44
|
-
["Key", "Value"],
|
|
45
47
|
["config file", `${path}${payload.config_file_exists ? "" : paint(c, "dim", " (not present)")}`],
|
|
46
48
|
["provider", `${ctx.config.provider}${resolved ? paint(c, "dim", ` → ${resolved}`) : ""}`],
|
|
47
49
|
["model", ctx.config.model],
|
|
@@ -53,13 +55,28 @@ export async function configShow(ctx, env) {
|
|
|
53
55
|
"find.topK / found / absent",
|
|
54
56
|
`${ctx.config.find.topK} / ${ctx.config.find.found} / ${ctx.config.find.absent}`,
|
|
55
57
|
],
|
|
58
|
+
[
|
|
59
|
+
"classify.minConfidence / threshold",
|
|
60
|
+
`${ctx.config.classify.minConfidence} / ${ctx.config.classify.threshold}`,
|
|
61
|
+
],
|
|
62
|
+
["extract.minConfidence", String(ctx.config.extract.minConfidence)],
|
|
63
|
+
["batch.concurrency", String(ctx.config.batch.concurrency)],
|
|
64
|
+
["rerank.topK / min", `${ctx.config.rerank.topK} / ${ctx.config.rerank.min}`],
|
|
65
|
+
["route.minConfidence", String(ctx.config.route.minConfidence)],
|
|
66
|
+
[
|
|
67
|
+
"compact.keepThreshold / preserveRecent / minReduction",
|
|
68
|
+
`${ctx.config.compact.keepThreshold} / ${ctx.config.compact.preserveRecent} / ${ctx.config.compact.minReduction}`,
|
|
69
|
+
],
|
|
56
70
|
];
|
|
57
71
|
for (const [k, v] of Object.entries(payload.credentials))
|
|
58
72
|
rows.push([k, v ?? paint(c, "dim", "unset")]);
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return
|
|
73
|
+
for (const [k, v] of Object.entries(payload.credential_sources)) {
|
|
74
|
+
rows.push([`${k} key source`, v === "none" ? paint(c, "dim", "none (run: jev auth login)") : v]);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
table: { columns: ["Key", "Value"], rows },
|
|
78
|
+
tail: problem ? [paint(c, "yellow", problem)] : undefined,
|
|
79
|
+
};
|
|
63
80
|
});
|
|
64
81
|
return problem ? EXIT.ERROR : EXIT.OK;
|
|
65
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3G,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import type { BatchItemRunner } from "../core/batch.js";
|
|
4
|
+
import { type ExtractOutput, type FieldSpec } from "../core/extract.js";
|
|
5
|
+
import { type View } from "../output.js";
|
|
6
|
+
export interface ExtractFlags {
|
|
7
|
+
want?: string[];
|
|
8
|
+
context?: string;
|
|
9
|
+
minConfidence?: string;
|
|
10
|
+
failOn?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveFields(flags: ExtractFlags): FieldSpec[];
|
|
13
|
+
export declare function resolveExtractText(positional: string | undefined): string;
|
|
14
|
+
export declare function extractAction(positional: string | undefined, flags: ExtractFlags, ctx: CommandContext): Promise<number>;
|
|
15
|
+
export declare function renderExtract(out: ExtractOutput, ctx: CommandContext): View;
|
|
16
|
+
/** Batch: each row's text is extracted with the shared field specs. */
|
|
17
|
+
export declare function prepareExtractBatch(flags: ExtractFlags, ctx: CommandContext): BatchItemRunner;
|
|
18
|
+
export declare function registerExtract(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { BUILTIN_FIELDS, buildExtractRequest, EXTRACT_FAIL_CONDITIONS, extractFailed, parseFieldSpec, runExtract, } from "../core/extract.js";
|
|
2
|
+
import { CliError, EXIT } from "../errors.js";
|
|
3
|
+
import { readInput, readStdin } from "../input.js";
|
|
4
|
+
import { parseFailOn, parseProbability } from "../lib.js";
|
|
5
|
+
import { clip, emit, formatProbability, paint } from "../output.js";
|
|
6
|
+
export function resolveFields(flags) {
|
|
7
|
+
const raw = flags.want ?? [];
|
|
8
|
+
if (raw.length === 0)
|
|
9
|
+
throw new CliError(`Provide at least one --want field. Builtins: ${Object.keys(BUILTIN_FIELDS).join(", ")}.`);
|
|
10
|
+
try {
|
|
11
|
+
// Allow comma-separated builtins in one flag: --want email,phone
|
|
12
|
+
return raw
|
|
13
|
+
.flatMap((entry) => entry.includes("=")
|
|
14
|
+
? [entry]
|
|
15
|
+
: entry
|
|
16
|
+
.split(",")
|
|
17
|
+
.map((s) => s.trim())
|
|
18
|
+
.filter(Boolean))
|
|
19
|
+
.map(parseFieldSpec);
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
throw new CliError(err.message);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function resolveExtractText(positional) {
|
|
26
|
+
if (positional !== undefined)
|
|
27
|
+
return readInput(positional, "text");
|
|
28
|
+
if (process.stdin.isTTY)
|
|
29
|
+
throw new CliError("Provide text as an argument, @file, or pipe it on stdin.");
|
|
30
|
+
return readStdin("text");
|
|
31
|
+
}
|
|
32
|
+
export async function extractAction(positional, flags, ctx) {
|
|
33
|
+
const fields = resolveFields(flags);
|
|
34
|
+
const text = resolveExtractText(positional);
|
|
35
|
+
const minConfidence = parseProbability("--min-confidence", flags.minConfidence, ctx.config.extract.minConfidence);
|
|
36
|
+
const failOn = parseFailOn(flags.failOn, EXTRACT_FAIL_CONDITIONS, []);
|
|
37
|
+
if (ctx.dryRun) {
|
|
38
|
+
const { state, questions } = buildExtractRequest({ text, fields, context: flags.context });
|
|
39
|
+
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
|
|
40
|
+
return EXIT.OK;
|
|
41
|
+
}
|
|
42
|
+
const output = await runExtract(ctx.ask(), { text, fields, context: flags.context, minConfidence });
|
|
43
|
+
emit(ctx.output, output, () => renderExtract(output, ctx));
|
|
44
|
+
return extractFailed(output, failOn) ? EXIT.JUDGMENT : EXIT.OK;
|
|
45
|
+
}
|
|
46
|
+
export function renderExtract(out, ctx) {
|
|
47
|
+
const c = ctx.output.color;
|
|
48
|
+
const rows = Object.entries(out.fields).map(([name, f]) => [
|
|
49
|
+
name,
|
|
50
|
+
f.value === null ? paint(c, "dim", "-") : paint(c, "green", clip(f.value, 40)),
|
|
51
|
+
f.normalized === null || f.normalized === undefined || f.normalized === f.value
|
|
52
|
+
? ""
|
|
53
|
+
: clip(typeof f.normalized === "string" ? f.normalized : JSON.stringify(f.normalized), 30),
|
|
54
|
+
formatProbability(f.confidence),
|
|
55
|
+
f.action === "review"
|
|
56
|
+
? paint(c, "yellow", f.action)
|
|
57
|
+
: f.action === "none"
|
|
58
|
+
? paint(c, "dim", `none${f.reason ? ` (${f.reason})` : ""}`)
|
|
59
|
+
: "auto",
|
|
60
|
+
String(f.candidates),
|
|
61
|
+
]);
|
|
62
|
+
return {
|
|
63
|
+
table: { columns: ["Field", "Value", "Normalized", "Conf", "Action", "Cands"], rows },
|
|
64
|
+
usage: { usage: out.usage, model: out.model, provider: out.provider },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Batch: each row's text is extracted with the shared field specs. */
|
|
68
|
+
export function prepareExtractBatch(flags, ctx) {
|
|
69
|
+
const fields = resolveFields(flags);
|
|
70
|
+
const minConfidence = parseProbability("--min-confidence", flags.minConfidence, ctx.config.extract.minConfidence);
|
|
71
|
+
const failOn = parseFailOn(flags.failOn, EXTRACT_FAIL_CONDITIONS, []);
|
|
72
|
+
return async (row) => {
|
|
73
|
+
const output = await runExtract(ctx.ask(), {
|
|
74
|
+
text: row.text,
|
|
75
|
+
fields,
|
|
76
|
+
context: flags.context,
|
|
77
|
+
minConfidence,
|
|
78
|
+
});
|
|
79
|
+
return { output, failed: extractFailed(output, failOn) };
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function registerExtract(program, run) {
|
|
83
|
+
program
|
|
84
|
+
.command("extract")
|
|
85
|
+
.description("Pull values out of text without hallucination: regex finds candidates, Jev picks the right one, code normalizes it.")
|
|
86
|
+
.argument("[text]", "text to extract from, @file, or - for stdin (default: stdin)")
|
|
87
|
+
.option("-w, --want <field>", "field to extract (repeatable, or comma-separated builtins)", collect, [])
|
|
88
|
+
.option("-c, --context <text>", 'what the document is, e.g. "supplier invoice"; sharpens the questions')
|
|
89
|
+
.option("--min-confidence <p>", "confidence below which a value is flagged 'review' (default 0.6)")
|
|
90
|
+
.option("--fail-on <list>", `exit 2 when any field is: ${EXTRACT_FAIL_CONDITIONS.join(", ")}, or none (default none)`)
|
|
91
|
+
.addHelpText("after", `
|
|
92
|
+
Fields:
|
|
93
|
+
Builtins: ${Object.keys(BUILTIN_FIELDS).join(", ")}
|
|
94
|
+
Custom: name=/regex/ e.g. invoice=/INV-\\d+/
|
|
95
|
+
name=/regex/:description e.g. po=/PO\\s?\\d{6}/:the purchase order number
|
|
96
|
+
name=builtin:description e.g. "sender=email:the sender's address" (quote descriptions with spaces)
|
|
97
|
+
|
|
98
|
+
Examples:
|
|
99
|
+
jev extract @invoice.txt --want amount,date --want invoice=/INV-\\d+/ --context "supplier invoice"
|
|
100
|
+
cat email.eml | jev extract --want "sender=email:the sender" --want "reply_by=date:the reply deadline" --json`)
|
|
101
|
+
.action(async (text, flags, cmd) => {
|
|
102
|
+
await run((ctx) => extractAction(text, flags, ctx), cmd);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function collect(value, previous) {
|
|
106
|
+
return [...previous, value];
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/find.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { CommandContext } from "../context.js";
|
|
3
|
+
import type { BatchItemRunner } from "../core/batch.js";
|
|
3
4
|
import { type CandidateInput, type FindOutput } from "../core/find.js";
|
|
5
|
+
import { type View } from "../output.js";
|
|
4
6
|
export interface FindFlags {
|
|
5
7
|
candidates?: string;
|
|
6
8
|
files?: string[];
|
|
@@ -12,5 +14,7 @@ export interface FindFlags {
|
|
|
12
14
|
}
|
|
13
15
|
export declare function collectCandidates(flags: FindFlags): CandidateInput[];
|
|
14
16
|
export declare function findAction(query: string, flags: FindFlags, ctx: CommandContext): Promise<number>;
|
|
15
|
-
export declare function renderFind(out: FindOutput, ctx: CommandContext):
|
|
17
|
+
export declare function renderFind(out: FindOutput, ctx: CommandContext): View;
|
|
16
18
|
export declare function registerFind(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
19
|
+
/** Batch: each row is a query ranked against the shared candidates. */
|
|
20
|
+
export declare function prepareFindBatch(flags: FindFlags, ctx: CommandContext): BatchItemRunner;
|
package/dist/commands/find.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { statSync } from "node:fs";
|
|
2
2
|
import { buildFindRequest, FIND_FAIL_CONDITIONS, findFailed, runFind, } from "../core/find.js";
|
|
3
3
|
import { CliError, EXIT } from "../errors.js";
|
|
4
|
-
import {
|
|
4
|
+
import { parseItems, readFile, readInput } from "../input.js";
|
|
5
5
|
import { MAX_CANDIDATES, parseFailOn, parseProbability } from "../lib.js";
|
|
6
|
-
import { clip, emit, formatProbability, paint
|
|
6
|
+
import { clip, emit, formatProbability, paint } from "../output.js";
|
|
7
7
|
export function collectCandidates(flags) {
|
|
8
8
|
const items = [];
|
|
9
9
|
if (flags.candidates)
|
|
@@ -21,9 +21,13 @@ export function collectCandidates(flags) {
|
|
|
21
21
|
items.push({ id: path, text: readFile(path, "candidate file") });
|
|
22
22
|
}
|
|
23
23
|
if (flags.lines) {
|
|
24
|
-
|
|
25
|
-
lines
|
|
26
|
-
|
|
24
|
+
// Ids are source line numbers (1-based, blank lines counted) so a hit can be found in the file.
|
|
25
|
+
readInput(flags.lines, "lines")
|
|
26
|
+
.split(/\r?\n/)
|
|
27
|
+
.forEach((raw, i) => {
|
|
28
|
+
const line = raw.trim();
|
|
29
|
+
if (line.length > 0)
|
|
30
|
+
items.push({ id: `L${i + 1}`, text: line });
|
|
27
31
|
});
|
|
28
32
|
}
|
|
29
33
|
if (items.length === 0) {
|
|
@@ -44,7 +48,7 @@ export async function findAction(query, flags, ctx) {
|
|
|
44
48
|
const failOn = parseFailOn(flags.failOn, FIND_FAIL_CONDITIONS, []);
|
|
45
49
|
if (ctx.dryRun) {
|
|
46
50
|
const { state, questions } = buildFindRequest({ query, candidates });
|
|
47
|
-
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () =>
|
|
51
|
+
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
|
|
48
52
|
return EXIT.OK;
|
|
49
53
|
}
|
|
50
54
|
const output = await runFind(ctx.ask(), { query, candidates, topK, found, absent });
|
|
@@ -64,14 +68,11 @@ export function renderFind(out, ctx) {
|
|
|
64
68
|
hit.id,
|
|
65
69
|
clip(hit.text, 60),
|
|
66
70
|
]);
|
|
67
|
-
|
|
68
|
-
`${verdict} (exists ${formatProbability(out.exists)}) ${paint(c, "dim", out.query)}
|
|
69
|
-
"",
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (!ctx.output.quiet)
|
|
73
|
-
lines.push("", paint(c, "dim", usageLine(out.usage, out.model, out.provider)));
|
|
74
|
-
return lines.join("\n");
|
|
71
|
+
return {
|
|
72
|
+
head: [`${verdict} (exists ${formatProbability(out.exists)}) ${paint(c, "dim", out.query)}`],
|
|
73
|
+
table: { columns: ["#", "Prob", "Id", "Text"], rows },
|
|
74
|
+
usage: { usage: out.usage, model: out.model, provider: out.provider },
|
|
75
|
+
};
|
|
75
76
|
}
|
|
76
77
|
export function registerFind(program, run) {
|
|
77
78
|
program
|
|
@@ -80,7 +81,7 @@ export function registerFind(program, run) {
|
|
|
80
81
|
.argument("<query>", "what you are looking for")
|
|
81
82
|
.option("-c, --candidates <ref>", "JSON candidates (@file or -): array of strings, array of {id,text}, or {id: text}")
|
|
82
83
|
.option("-f, --files <paths...>", "treat each file as a candidate (id = path)")
|
|
83
|
-
.option("-l, --lines <ref>", "treat each non-empty line of @file or - as a candidate (id = L<
|
|
84
|
+
.option("-l, --lines <ref>", "treat each non-empty line of @file or - as a candidate (id = L<line number>)")
|
|
84
85
|
.option("-k, --top-k <n>", "how many ranked results to return (default 5)")
|
|
85
86
|
.option("--found <p>", "exists probability at or above which the verdict is 'answered' (default 0.7)")
|
|
86
87
|
.option("--absent <p>", "exists probability below which the verdict is 'absent' (default 0.35)")
|
|
@@ -94,4 +95,18 @@ Examples:
|
|
|
94
95
|
await run((ctx) => findAction(query, flags, ctx), cmd);
|
|
95
96
|
});
|
|
96
97
|
}
|
|
98
|
+
/** Batch: each row is a query ranked against the shared candidates. */
|
|
99
|
+
export function prepareFindBatch(flags, ctx) {
|
|
100
|
+
const candidates = collectCandidates(flags);
|
|
101
|
+
const topK = flags.topK === undefined ? ctx.config.find.topK : Number(flags.topK);
|
|
102
|
+
if (!Number.isInteger(topK) || topK < 1 || topK > 50)
|
|
103
|
+
throw new CliError("--top-k must be an integer from 1 to 50.");
|
|
104
|
+
const found = parseProbability("--found", flags.found, ctx.config.find.found);
|
|
105
|
+
const absent = parseProbability("--absent", flags.absent, ctx.config.find.absent);
|
|
106
|
+
const failOn = parseFailOn(flags.failOn, FIND_FAIL_CONDITIONS, []);
|
|
107
|
+
return async (row) => {
|
|
108
|
+
const output = await runFind(ctx.ask(), { query: row.text, candidates, topK, found, absent });
|
|
109
|
+
return { output, failed: findFailed(output, failOn) };
|
|
110
|
+
};
|
|
111
|
+
}
|
|
97
112
|
//# sourceMappingURL=find.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import { type MatchOutput, type MatchPair } from "../core/match.js";
|
|
4
|
+
import { type View } from "../output.js";
|
|
5
|
+
export interface MatchFlags {
|
|
6
|
+
pairs?: string;
|
|
7
|
+
left?: string;
|
|
8
|
+
right?: string;
|
|
9
|
+
dedupe?: string;
|
|
10
|
+
kind?: string;
|
|
11
|
+
failOn?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Pairs JSON: array of [a, b] or {left, right}. */
|
|
14
|
+
export declare function parsePairs(raw: string): MatchPair[];
|
|
15
|
+
export declare function collectPairs(flags: MatchFlags): MatchPair[];
|
|
16
|
+
export declare function matchAction(flags: MatchFlags, ctx: CommandContext): Promise<number>;
|
|
17
|
+
export declare function renderMatch(out: MatchOutput, ctx: CommandContext): View;
|
|
18
|
+
export declare function registerMatch(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|