jevctl 0.1.0 → 0.2.0
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 +44 -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 +134 -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
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,77 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// jev: TypeSafe's Jev model at the command line.
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
|
+
import { styleText } from "node:util";
|
|
4
5
|
import { Command } from "commander";
|
|
5
6
|
import { registerAsk } from "./commands/ask.js";
|
|
7
|
+
import { registerAuth } from "./commands/auth.js";
|
|
8
|
+
import { registerBatch } from "./commands/batch.js";
|
|
9
|
+
import { registerClassify } from "./commands/classify.js";
|
|
10
|
+
import { registerCompact } from "./commands/compact.js";
|
|
6
11
|
import { registerConfig } from "./commands/config.js";
|
|
12
|
+
import { registerExtract } from "./commands/extract.js";
|
|
7
13
|
import { registerFind } from "./commands/find.js";
|
|
14
|
+
import { registerMatch } from "./commands/match.js";
|
|
8
15
|
import { registerModels } from "./commands/models.js";
|
|
16
|
+
import { registerRerank } from "./commands/rerank.js";
|
|
17
|
+
import { registerRoute } from "./commands/route.js";
|
|
9
18
|
import { registerScreen } from "./commands/screen.js";
|
|
10
19
|
import { registerVerify } from "./commands/verify.js";
|
|
11
20
|
import { buildContext } from "./context.js";
|
|
12
21
|
import { CliError, describeError, EXIT } from "./errors.js";
|
|
13
22
|
const require = createRequire(import.meta.url);
|
|
14
23
|
const { version, description } = require("../package.json");
|
|
24
|
+
/** One-line summaries and groups for the top-level command list. Full descriptions live on each command. */
|
|
25
|
+
const COMMANDS = {
|
|
26
|
+
verify: { group: "Judgments", summary: "Check claims against evidence; verdict + probabilities per claim" },
|
|
27
|
+
screen: {
|
|
28
|
+
group: "Judgments",
|
|
29
|
+
summary: "Flag prompt injection, filler, and irrelevance before an agent reads text",
|
|
30
|
+
},
|
|
31
|
+
classify: { group: "Judgments", summary: "Assign one, several, or hierarchical labels with confidence" },
|
|
32
|
+
extract: {
|
|
33
|
+
group: "Judgments",
|
|
34
|
+
summary: "Pull typed values out of text (regex candidates, Jev picks, code normalizes)",
|
|
35
|
+
},
|
|
36
|
+
match: {
|
|
37
|
+
group: "Judgments",
|
|
38
|
+
summary: "Decide if record pairs are the same thing: same, different, or unclear",
|
|
39
|
+
},
|
|
40
|
+
route: {
|
|
41
|
+
group: "Judgments",
|
|
42
|
+
summary: "Pick a handler for a request and fill its arguments from closed sets",
|
|
43
|
+
},
|
|
44
|
+
ask: { group: "Judgments", summary: "Ask raw yes/no, choice, or score questions about any state" },
|
|
45
|
+
find: { group: "Ranking", summary: "Rank up to 250 candidates against a plain-language query" },
|
|
46
|
+
rerank: { group: "Ranking", summary: "Score each candidate's relevance independently and sort" },
|
|
47
|
+
compact: {
|
|
48
|
+
group: "Pipelines",
|
|
49
|
+
summary: "Shrink an agent transcript by dropping stale tool calls, verbatim otherwise",
|
|
50
|
+
},
|
|
51
|
+
batch: { group: "Pipelines", summary: "Run a command over many rows with a concurrency pool; emits JSONL" },
|
|
52
|
+
models: { group: "Account", summary: "List the models available to your account" },
|
|
53
|
+
auth: { group: "Account", summary: "Store, inspect, or remove API keys (keychain or 0600 file)" },
|
|
54
|
+
config: { group: "Account", summary: "Show or edit the jev configuration file" },
|
|
55
|
+
};
|
|
56
|
+
const HELP_FOOTER = `
|
|
57
|
+
Examples:
|
|
58
|
+
jev verify "Helmets are optional for adults" --evidence @ordinance.txt
|
|
59
|
+
curl -s https://example.com | jev screen --purpose "extract pricing" --fail-on block,review
|
|
60
|
+
jev classify "The invoice total is wrong" --labels billing,bug,feature --json
|
|
61
|
+
jev find "how do I rotate API keys" --files docs/*.md -k 3
|
|
62
|
+
jev batch classify -i @tickets.txt -- --labels billing,technical,sales
|
|
63
|
+
|
|
64
|
+
Exit codes:
|
|
65
|
+
0 success
|
|
66
|
+
1 usage, configuration, input, or transport error
|
|
67
|
+
2 a --fail-on judgment condition matched (e.g. a contradicted claim)
|
|
68
|
+
|
|
69
|
+
Credentials (first found wins unless --provider is set; environment first, then the jev auth login store):
|
|
70
|
+
TYPESAFE_API_KEY https://console.typesafe.ai/settings/keys
|
|
71
|
+
OPENROUTER_API_KEY (sk-or-...) OpenRouter Decisions API
|
|
72
|
+
CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID Cloudflare Workers AI
|
|
73
|
+
|
|
74
|
+
Website: https://jevcli.vectorz.app Docs: https://docs.typesafe.ai Per-command help: jev <command> --help`;
|
|
15
75
|
export function createProgram() {
|
|
16
76
|
const program = new Command();
|
|
17
77
|
program
|
|
@@ -20,26 +80,28 @@ export function createProgram() {
|
|
|
20
80
|
.version(version, "-V, --version", "print the version")
|
|
21
81
|
.showHelpAfterError("(run with --help for usage)")
|
|
22
82
|
.showSuggestionAfterError()
|
|
83
|
+
.configureHelp({
|
|
84
|
+
helpWidth: Math.min(process.stdout.columns || 100, 110),
|
|
85
|
+
styleTitle: (s) => styleText("bold", s),
|
|
86
|
+
styleCommandText: (s) => styleText("cyan", s),
|
|
87
|
+
styleSubcommandText: (s) => styleText("cyan", s),
|
|
88
|
+
styleOptionText: (s) => styleText("green", s),
|
|
89
|
+
styleArgumentText: (s) => styleText("yellow", s),
|
|
90
|
+
})
|
|
91
|
+
.optionsGroup("Output:")
|
|
23
92
|
.option("--json", "print results as JSON (same as --format json)")
|
|
24
|
-
.option("--
|
|
93
|
+
.option("--md", "Markdown output (same as --format md)")
|
|
94
|
+
.option("--format <fmt>", "text, json, jsonl, csv, tsv, or md")
|
|
95
|
+
.option("--pluck <path>", "print one value from the JSON result, e.g. label or results[].verdict")
|
|
96
|
+
.option("-q, --quiet", "omit the usage/model footer in text output")
|
|
97
|
+
.option("--no-color", "disable colored output")
|
|
98
|
+
.optionsGroup("Model and transport:")
|
|
25
99
|
.option("-m, --model <name>", "Jev model, e.g. jev-latest or jev-1.13.0")
|
|
26
100
|
.option("-P, --provider <name>", "auto, typesafe, openrouter, or cloudflare")
|
|
27
101
|
.option("--timeout <ms>", "per-request timeout in milliseconds")
|
|
28
|
-
.option("--no-color", "disable colored output")
|
|
29
|
-
.option("-q, --quiet", "omit the usage/model footer in text output")
|
|
30
102
|
.option("--dry-run", "print the request that would be sent and exit without calling the API")
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
0 success
|
|
34
|
-
1 usage, configuration, input, or transport error
|
|
35
|
-
2 a --fail-on judgment condition matched (e.g. a contradicted claim)
|
|
36
|
-
|
|
37
|
-
Credentials (first found wins unless --provider is set):
|
|
38
|
-
TYPESAFE_API_KEY https://console.typesafe.ai/settings/keys
|
|
39
|
-
OPENROUTER_API_KEY (sk-or-...) OpenRouter Decisions API
|
|
40
|
-
CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID Cloudflare Workers AI
|
|
41
|
-
|
|
42
|
-
Docs: https://docs.typesafe.ai`);
|
|
103
|
+
.optionsGroup("Options:")
|
|
104
|
+
.addHelpText("after", HELP_FOOTER);
|
|
43
105
|
const run = async (fn, cmd) => {
|
|
44
106
|
const flags = cmd.optsWithGlobals();
|
|
45
107
|
const ctx = buildContext(flags);
|
|
@@ -47,12 +109,39 @@ Docs: https://docs.typesafe.ai`);
|
|
|
47
109
|
if (code !== EXIT.OK)
|
|
48
110
|
process.exitCode = code;
|
|
49
111
|
};
|
|
112
|
+
// Registration order is the order shown in --help.
|
|
50
113
|
registerVerify(program, run);
|
|
51
114
|
registerScreen(program, run);
|
|
52
|
-
|
|
115
|
+
registerClassify(program, run);
|
|
116
|
+
registerExtract(program, run);
|
|
117
|
+
registerMatch(program, run);
|
|
118
|
+
registerRoute(program, run);
|
|
53
119
|
registerAsk(program, run);
|
|
120
|
+
registerFind(program, run);
|
|
121
|
+
registerRerank(program, run);
|
|
122
|
+
registerCompact(program, run);
|
|
123
|
+
registerBatch(program, run);
|
|
54
124
|
registerModels(program, run);
|
|
125
|
+
registerAuth(program, run);
|
|
55
126
|
registerConfig(program, run);
|
|
127
|
+
for (const cmd of program.commands) {
|
|
128
|
+
const meta = COMMANDS[cmd.name()];
|
|
129
|
+
if (!meta)
|
|
130
|
+
throw new Error(`jev: no help metadata for command "${cmd.name()}"`);
|
|
131
|
+
cmd.summary(meta.summary).helpGroup(`${meta.group}:`);
|
|
132
|
+
}
|
|
133
|
+
program
|
|
134
|
+
.helpCommand(false)
|
|
135
|
+
.command("help [command]")
|
|
136
|
+
.summary("Show help for a command")
|
|
137
|
+
.description("Show help for a command, e.g. jev help verify. Same as jev <command> --help.")
|
|
138
|
+
.helpGroup("Account:")
|
|
139
|
+
.action((name) => {
|
|
140
|
+
const target = name ? program.commands.find((c) => c.name() === name) : program;
|
|
141
|
+
if (!target)
|
|
142
|
+
throw new CliError(`unknown command '${name}' (run jev --help for the list)`, EXIT.ERROR);
|
|
143
|
+
target.outputHelp();
|
|
144
|
+
});
|
|
56
145
|
return program;
|
|
57
146
|
}
|
|
58
147
|
export async function main(argv = process.argv) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,iDAAiD;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyC,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,OAAO,GAAG,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/ask.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { CommandContext } from "../context.js";
|
|
3
3
|
import { type AskOutput, type RawQuestions } from "../core/ask.js";
|
|
4
|
+
import type { BatchItemRunner } from "../core/batch.js";
|
|
5
|
+
import { type View } from "../output.js";
|
|
4
6
|
export interface AskFlags {
|
|
5
7
|
questions?: string;
|
|
6
8
|
noul?: string[];
|
|
@@ -11,5 +13,7 @@ export interface AskFlags {
|
|
|
11
13
|
export declare function resolveState(positional: string | undefined, flags: AskFlags): unknown;
|
|
12
14
|
export declare function resolveQuestions(flags: AskFlags): RawQuestions;
|
|
13
15
|
export declare function askAction(positional: string | undefined, flags: AskFlags, ctx: CommandContext): Promise<number>;
|
|
14
|
-
export declare function renderAsk(out: AskOutput, ctx: CommandContext):
|
|
16
|
+
export declare function renderAsk(out: AskOutput, ctx: CommandContext): View;
|
|
15
17
|
export declare function registerAsk(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
18
|
+
/** Batch: each row is the state; questions are shared. Rows with a "state" field send it as-is. */
|
|
19
|
+
export declare function prepareAskBatch(flags: AskFlags, ctx: CommandContext): BatchItemRunner;
|
package/dist/commands/ask.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parseQuestions, questionsFromFlags, runAsk, } from "../core/ask.js";
|
|
2
2
|
import { CliError, EXIT } from "../errors.js";
|
|
3
3
|
import { parseJson, readInput, readStdin } from "../input.js";
|
|
4
|
-
import { emit, formatProbability, paint
|
|
4
|
+
import { emit, formatProbability, paint } from "../output.js";
|
|
5
5
|
export function resolveState(positional, flags) {
|
|
6
6
|
let raw;
|
|
7
7
|
if (positional !== undefined)
|
|
@@ -34,7 +34,7 @@ export async function askAction(positional, flags, ctx) {
|
|
|
34
34
|
const state = resolveState(positional, flags);
|
|
35
35
|
const questions = resolveQuestions(flags);
|
|
36
36
|
if (ctx.dryRun) {
|
|
37
|
-
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () =>
|
|
37
|
+
emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
|
|
38
38
|
return EXIT.OK;
|
|
39
39
|
}
|
|
40
40
|
const output = await runAsk(ctx.ask(), { state, questions });
|
|
@@ -43,32 +43,36 @@ export async function askAction(positional, flags, ctx) {
|
|
|
43
43
|
}
|
|
44
44
|
export function renderAsk(out, ctx) {
|
|
45
45
|
const c = ctx.output.color;
|
|
46
|
-
const
|
|
46
|
+
const head = [];
|
|
47
|
+
const kv = [];
|
|
47
48
|
for (const [id, answer] of Object.entries(out.answers)) {
|
|
49
|
+
// biome-ignore lint/suspicious/noExplicitAny: answer payloads are the SDK's loosely typed union
|
|
48
50
|
const a = answer;
|
|
49
51
|
if (a?.type === "noul") {
|
|
50
|
-
|
|
52
|
+
head.push(`${paint(c, "bold", id)}: ${formatProbability(a.noul)}`);
|
|
53
|
+
kv.push([id, formatProbability(a.noul)]);
|
|
51
54
|
}
|
|
52
55
|
else if (a?.type === "choice") {
|
|
53
56
|
const dist = Object.entries(a.probabilities ?? {})
|
|
54
57
|
.sort(([, x], [, y]) => y - x)
|
|
55
58
|
.map(([k, v]) => `${k} ${formatProbability(v)}`)
|
|
56
59
|
.join(", ");
|
|
57
|
-
|
|
60
|
+
head.push(`${paint(c, "bold", id)}: ${paint(c, "green", String(a.choice))} conf ${formatProbability(a.confidence)} [${dist}]`);
|
|
61
|
+
kv.push([id, `${a.choice} (conf ${formatProbability(a.confidence)})`]);
|
|
58
62
|
}
|
|
59
63
|
else if (a?.type === "score") {
|
|
60
64
|
const levels = Object.entries(a.probabilities ?? {})
|
|
61
65
|
.map(([k, v]) => `${k} ${formatProbability(v)}`)
|
|
62
66
|
.join(", ");
|
|
63
|
-
|
|
67
|
+
head.push(`${paint(c, "bold", id)}: ${paint(c, "green", Number(a.score).toFixed(2))} conf ${formatProbability(a.confidence)} [${levels}]`);
|
|
68
|
+
kv.push([id, `${Number(a.score).toFixed(2)} (conf ${formatProbability(a.confidence)})`]);
|
|
64
69
|
}
|
|
65
70
|
else {
|
|
66
|
-
|
|
71
|
+
head.push(`${paint(c, "bold", id)}: ${JSON.stringify(answer)}`);
|
|
72
|
+
kv.push([id, JSON.stringify(answer)]);
|
|
67
73
|
}
|
|
68
74
|
}
|
|
69
|
-
|
|
70
|
-
lines.push(paint(c, "dim", usageLine(out.usage, out.model, out.provider)));
|
|
71
|
-
return lines.join("\n");
|
|
75
|
+
return { head, kv, usage: { usage: out.usage, model: out.model, provider: out.provider } };
|
|
72
76
|
}
|
|
73
77
|
export function registerAsk(program, run) {
|
|
74
78
|
program
|
|
@@ -93,4 +97,17 @@ Examples:
|
|
|
93
97
|
function collect(value, previous) {
|
|
94
98
|
return [...previous, value];
|
|
95
99
|
}
|
|
100
|
+
/** Batch: each row is the state; questions are shared. Rows with a "state" field send it as-is. */
|
|
101
|
+
export function prepareAskBatch(flags, ctx) {
|
|
102
|
+
const questions = resolveQuestions(flags);
|
|
103
|
+
return async (row) => {
|
|
104
|
+
const state = row.state !== undefined && typeof row.state !== "string"
|
|
105
|
+
? row.state
|
|
106
|
+
: flags.stateJson
|
|
107
|
+
? parseJson(row.text, `row ${row.id} state`)
|
|
108
|
+
: row.text;
|
|
109
|
+
const output = await runAsk(ctx.ask(), { state, questions });
|
|
110
|
+
return { output, failed: false };
|
|
111
|
+
};
|
|
112
|
+
}
|
|
96
113
|
//# sourceMappingURL=ask.js.map
|
package/dist/commands/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,cAAc,EACd,kBAAkB,EAElB,MAAM,GACP,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import { type CredentialProvider } from "../credentials.js";
|
|
4
|
+
/** Prompt for a secret with echo off. Falls back to reading one line from a pipe. */
|
|
5
|
+
export declare function promptSecret(prompt: string): Promise<string>;
|
|
6
|
+
export declare function validateKey(provider: CredentialProvider, key: string): void;
|
|
7
|
+
export declare function authLogin(providerName: string | undefined, flags: {
|
|
8
|
+
keyStdin?: boolean;
|
|
9
|
+
}, ctx: CommandContext, env?: NodeJS.ProcessEnv): Promise<number>;
|
|
10
|
+
export declare function authStatus(ctx: CommandContext, env?: NodeJS.ProcessEnv): number;
|
|
11
|
+
export declare function authLogout(providerName: string | undefined, flags: {
|
|
12
|
+
all?: boolean;
|
|
13
|
+
}, ctx: CommandContext, env?: NodeJS.ProcessEnv): number;
|
|
14
|
+
export declare function registerAuth(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import { Writable } from "node:stream";
|
|
3
|
+
import { CREDENTIAL_PROVIDERS, ENV_VAR, resolveCredentials, resolveStore, } from "../credentials.js";
|
|
4
|
+
import { CliError, EXIT } from "../errors.js";
|
|
5
|
+
import { readStdin } from "../input.js";
|
|
6
|
+
import { emit, paint } from "../output.js";
|
|
7
|
+
import { mask } from "./config.js";
|
|
8
|
+
function providerArg(raw) {
|
|
9
|
+
const p = (raw ?? "typesafe").toLowerCase();
|
|
10
|
+
if (!CREDENTIAL_PROVIDERS.includes(p)) {
|
|
11
|
+
throw new CliError(`Unknown provider "${raw}". Allowed: ${CREDENTIAL_PROVIDERS.join(", ")}.`);
|
|
12
|
+
}
|
|
13
|
+
return p;
|
|
14
|
+
}
|
|
15
|
+
/** Prompt for a secret with echo off. Falls back to reading one line from a pipe. */
|
|
16
|
+
export async function promptSecret(prompt) {
|
|
17
|
+
if (!process.stdin.isTTY)
|
|
18
|
+
return readStdin("API key").split(/\r?\n/)[0]?.trim() ?? "";
|
|
19
|
+
const muted = new Writable({
|
|
20
|
+
write(_chunk, _enc, cb) {
|
|
21
|
+
cb();
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const rl = createInterface({ input: process.stdin, output: muted, terminal: true });
|
|
25
|
+
process.stderr.write(prompt);
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
rl.question("", (answer) => {
|
|
28
|
+
rl.close();
|
|
29
|
+
process.stderr.write("\n");
|
|
30
|
+
resolve(answer.trim());
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function validateKey(provider, key) {
|
|
35
|
+
if (!key)
|
|
36
|
+
throw new CliError("No key entered.");
|
|
37
|
+
if (/\s/.test(key))
|
|
38
|
+
throw new CliError("The key contains whitespace; paste it without spaces or line breaks.");
|
|
39
|
+
if (provider === "openrouter" && !key.startsWith("sk-or-"))
|
|
40
|
+
throw new CliError("OpenRouter keys start with sk-or-.");
|
|
41
|
+
}
|
|
42
|
+
export async function authLogin(providerName, flags, ctx, env = process.env) {
|
|
43
|
+
const provider = providerArg(providerName);
|
|
44
|
+
const store = resolveStore(env);
|
|
45
|
+
const key = flags.keyStdin
|
|
46
|
+
? (readStdin("API key").split(/\r?\n/)[0]?.trim() ?? "")
|
|
47
|
+
: await promptSecret(`Paste your ${provider} API key (input hidden): `);
|
|
48
|
+
validateKey(provider, key);
|
|
49
|
+
store.set(provider, key);
|
|
50
|
+
const note = env[ENV_VAR[provider]]
|
|
51
|
+
? ` Note: ${ENV_VAR[provider]} is set in this shell and will take precedence until you unset it.`
|
|
52
|
+
: "";
|
|
53
|
+
emit(ctx.output, { command: "auth", action: "login", provider, store: store.kind, location: store.location }, () => ({ head: [`Stored the ${provider} key in ${store.location}.${note}`] }));
|
|
54
|
+
return EXIT.OK;
|
|
55
|
+
}
|
|
56
|
+
export function authStatus(ctx, env = process.env) {
|
|
57
|
+
const store = resolveStore(env);
|
|
58
|
+
const rows = resolveCredentials(env, store).map((c) => {
|
|
59
|
+
const value = c.source === "env" ? env[ENV_VAR[c.provider]] : c.value;
|
|
60
|
+
return { provider: c.provider, env_var: ENV_VAR[c.provider], source: c.source, key: mask(value) };
|
|
61
|
+
});
|
|
62
|
+
const payload = {
|
|
63
|
+
command: "auth",
|
|
64
|
+
action: "status",
|
|
65
|
+
store: store.kind,
|
|
66
|
+
location: store.location,
|
|
67
|
+
credentials: rows,
|
|
68
|
+
};
|
|
69
|
+
emit(ctx.output, payload, () => {
|
|
70
|
+
const c = ctx.output.color;
|
|
71
|
+
return {
|
|
72
|
+
table: {
|
|
73
|
+
columns: ["Provider", "Source", "Key"],
|
|
74
|
+
rows: rows.map(({ provider, source, key: masked }) => [
|
|
75
|
+
provider,
|
|
76
|
+
source === "none" ? paint(c, "dim", "none") : source,
|
|
77
|
+
masked ?? paint(c, "dim", "-"),
|
|
78
|
+
]),
|
|
79
|
+
},
|
|
80
|
+
tail: [paint(c, "dim", `store: ${store.location}`)],
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
return rows.some((r) => r.source !== "none") ? EXIT.OK : EXIT.ERROR;
|
|
84
|
+
}
|
|
85
|
+
export function authLogout(providerName, flags, ctx, env = process.env) {
|
|
86
|
+
const store = resolveStore(env);
|
|
87
|
+
const providers = flags.all ? [...CREDENTIAL_PROVIDERS] : [providerArg(providerName)];
|
|
88
|
+
const removed = providers.filter((p) => store.delete(p));
|
|
89
|
+
emit(ctx.output, { command: "auth", action: "logout", removed, store: store.kind }, () => ({
|
|
90
|
+
head: [
|
|
91
|
+
removed.length
|
|
92
|
+
? `Removed ${removed.join(", ")} from ${store.location}.`
|
|
93
|
+
: `Nothing stored for ${providers.join(", ")} in ${store.location}.`,
|
|
94
|
+
],
|
|
95
|
+
}));
|
|
96
|
+
return EXIT.OK;
|
|
97
|
+
}
|
|
98
|
+
export function registerAuth(program, run) {
|
|
99
|
+
const auth = program
|
|
100
|
+
.command("auth")
|
|
101
|
+
.description("Store the API key in the OS keychain (or a 0600 file) instead of exporting it.");
|
|
102
|
+
auth
|
|
103
|
+
.command("login")
|
|
104
|
+
.description("Prompt for a key (hidden input) and store it. Reads one line from stdin when piped or with --key-stdin.")
|
|
105
|
+
.argument("[provider]", "typesafe (default) or openrouter")
|
|
106
|
+
.option("--key-stdin", "read the key from stdin (for scripts and password managers)")
|
|
107
|
+
.addHelpText("after", `
|
|
108
|
+
Examples:
|
|
109
|
+
jev auth login
|
|
110
|
+
op read "op://Private/TypeSafe/credential" | jev auth login --key-stdin
|
|
111
|
+
jev auth login openrouter
|
|
112
|
+
|
|
113
|
+
Where it goes: macOS Keychain (service "jevctl"), Linux Secret Service via secret-tool, otherwise
|
|
114
|
+
~/.config/jev/credentials.json with mode 0600. Force one with JEV_CREDENTIAL_STORE=file|keychain.
|
|
115
|
+
Resolution order at run time: environment variable, then the store. JEV_NO_STORED_CREDENTIALS=1 disables the store.`)
|
|
116
|
+
.action(async (provider, flags, cmd) => {
|
|
117
|
+
await run((ctx) => authLogin(provider, flags, ctx), cmd);
|
|
118
|
+
});
|
|
119
|
+
auth
|
|
120
|
+
.command("status", { isDefault: true })
|
|
121
|
+
.description("Show where each provider's key comes from (env, keychain, file, none), masked.")
|
|
122
|
+
.action(async (_flags, cmd) => {
|
|
123
|
+
await run(async (ctx) => authStatus(ctx, process.env), cmd);
|
|
124
|
+
});
|
|
125
|
+
auth
|
|
126
|
+
.command("logout")
|
|
127
|
+
.description("Remove a stored key.")
|
|
128
|
+
.argument("[provider]", "typesafe (default) or openrouter")
|
|
129
|
+
.option("--all", "remove every stored key")
|
|
130
|
+
.action(async (provider, flags, cmd) => {
|
|
131
|
+
await run(async (ctx) => authLogout(provider, flags, ctx), cmd);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { CommandContext } from "../context.js";
|
|
3
|
+
import { type BatchItemRunner } from "../core/batch.js";
|
|
4
|
+
type Register = (program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>) => void;
|
|
5
|
+
type Prepare = (flags: any, ctx: CommandContext) => BatchItemRunner;
|
|
6
|
+
/** Commands that accept one text input per row. */
|
|
7
|
+
export declare const BATCHABLE: Record<string, {
|
|
8
|
+
register: Register;
|
|
9
|
+
prepare: Prepare;
|
|
10
|
+
rowIs: string;
|
|
11
|
+
}>;
|
|
12
|
+
export interface BatchFlags {
|
|
13
|
+
input?: string;
|
|
14
|
+
output?: string;
|
|
15
|
+
concurrency?: string;
|
|
16
|
+
failFast?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse the sub-command's own flags by running its commander definition in capture mode.
|
|
20
|
+
* Commands with a required positional (find, rerank) get a placeholder so parsing succeeds;
|
|
21
|
+
* any other positional means the user passed a text argument that each row should supply.
|
|
22
|
+
*/
|
|
23
|
+
export declare function captureSubFlags(command: string, argv: string[]): Promise<Record<string, unknown>>;
|
|
24
|
+
export declare function batchAction(command: string, subArgs: string[], flags: BatchFlags, ctx: CommandContext): Promise<number>;
|
|
25
|
+
/** One-cell summary of a sub-command result, for csv/tsv/md batch tables. */
|
|
26
|
+
export declare function summarizeResult(result: unknown): string;
|
|
27
|
+
export declare function registerBatch(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
|
|
28
|
+
export {};
|