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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Routing: pick a handler for a request and fill its closed-set arguments in
|
|
2
|
+
// one call. Argument questions for every handler are asked speculatively in the
|
|
3
|
+
// same request; code reads only the chosen handler's answers.
|
|
4
|
+
// Patterns: function_calling and intent-routing.
|
|
5
|
+
import { choice, noul, score } from "@typesafe-ai/sdk";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { formatZodError } from "../config.js";
|
|
8
|
+
import { sanitizeId } from "../lib.js";
|
|
9
|
+
const entry = z.union([z.string(), z.null()]);
|
|
10
|
+
const argSchema = z.discriminatedUnion("type", [
|
|
11
|
+
z.object({
|
|
12
|
+
type: z.literal("choice"),
|
|
13
|
+
instructions: z.string().optional(),
|
|
14
|
+
options: z.union([z.array(z.string().min(1)).min(2), z.record(z.string().min(1), entry)]),
|
|
15
|
+
}),
|
|
16
|
+
z.object({ type: z.literal("noul"), instructions: z.string() }),
|
|
17
|
+
z.object({
|
|
18
|
+
type: z.literal("score"),
|
|
19
|
+
instructions: z.string().optional(),
|
|
20
|
+
levels: z.array(z.string()).min(2),
|
|
21
|
+
}),
|
|
22
|
+
]);
|
|
23
|
+
const handlerSchema = z.object({
|
|
24
|
+
description: z.string().nullable().optional(),
|
|
25
|
+
args: z.record(z.string().regex(/^[A-Za-z0-9_.-]+$/), argSchema).optional(),
|
|
26
|
+
});
|
|
27
|
+
export const handlersSchema = z.record(z.string().min(1), z.union([handlerSchema, z.string(), z.null()]));
|
|
28
|
+
export const NONE_HANDLER = "none";
|
|
29
|
+
/** Accept `{name: "description"}`, `{name: null}`, or `{name: {description, args}}`. */
|
|
30
|
+
export function parseHandlers(input) {
|
|
31
|
+
const result = handlersSchema.safeParse(input);
|
|
32
|
+
if (!result.success)
|
|
33
|
+
throw new Error(`Invalid handlers: ${formatZodError(result.error)}`);
|
|
34
|
+
const out = {};
|
|
35
|
+
for (const [name, spec] of Object.entries(result.data)) {
|
|
36
|
+
if (name === NONE_HANDLER)
|
|
37
|
+
throw new Error(`"${NONE_HANDLER}" is reserved; rename that handler.`);
|
|
38
|
+
if (!sanitizeId(name) || sanitizeId(name) !== name) {
|
|
39
|
+
throw new Error(`Handler name "${name}" must use only letters, digits, _, -, or . (no spaces).`);
|
|
40
|
+
}
|
|
41
|
+
if (spec === null || typeof spec === "string")
|
|
42
|
+
out[name] = { description: spec, args: {} };
|
|
43
|
+
else
|
|
44
|
+
out[name] = { description: spec.description ?? null, args: spec.args ?? {} };
|
|
45
|
+
}
|
|
46
|
+
if (Object.keys(out).length === 0)
|
|
47
|
+
throw new Error("At least one handler is required.");
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/** Parse the `a:description,b,c:description` shorthand. */
|
|
51
|
+
export function parseHandlerList(raw) {
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const part of raw
|
|
54
|
+
.split(/(?<!\\),/)
|
|
55
|
+
.map((s) => s.replace(/\\,/g, ",").trim())
|
|
56
|
+
.filter(Boolean)) {
|
|
57
|
+
const colon = part.indexOf(":");
|
|
58
|
+
const name = (colon === -1 ? part : part.slice(0, colon)).trim();
|
|
59
|
+
const description = colon === -1 ? null : part.slice(colon + 1).trim() || null;
|
|
60
|
+
out[name] = { description, args: {} };
|
|
61
|
+
}
|
|
62
|
+
return parseHandlers(Object.fromEntries(Object.entries(out).map(([k, v]) => [k, { description: v.description }])));
|
|
63
|
+
}
|
|
64
|
+
function argKey(handler, arg) {
|
|
65
|
+
return `arg__${handler}__${arg}`;
|
|
66
|
+
}
|
|
67
|
+
export function buildRouteRequest(input) {
|
|
68
|
+
const criteria = Object.fromEntries(Object.entries(input.handlers).map(([name, h]) => [name, h.description]));
|
|
69
|
+
criteria[NONE_HANDLER] = "None of the handlers applies to this request";
|
|
70
|
+
const questions = {
|
|
71
|
+
handler: choice(input.instructions ?? "Which handler should process this request?", criteria),
|
|
72
|
+
};
|
|
73
|
+
for (const [name, h] of Object.entries(input.handlers)) {
|
|
74
|
+
for (const [arg, spec] of Object.entries(h.args)) {
|
|
75
|
+
const premise = `Assuming the request should be handled by \`${name}\``;
|
|
76
|
+
if (spec.type === "choice") {
|
|
77
|
+
const options = Array.isArray(spec.options)
|
|
78
|
+
? Object.fromEntries(spec.options.map((o) => [o, null]))
|
|
79
|
+
: spec.options;
|
|
80
|
+
questions[argKey(name, arg)] = choice(`${premise}: ${spec.instructions ?? `which value should the argument \`${arg}\` take?`}`, { ...options, unspecified: "The request does not say" });
|
|
81
|
+
}
|
|
82
|
+
else if (spec.type === "noul") {
|
|
83
|
+
questions[argKey(name, arg)] = noul(`${premise}: ${spec.instructions}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
questions[argKey(name, arg)] = score(`${premise}: ${spec.instructions ?? `how should the argument \`${arg}\` be rated?`}`, spec.levels);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { state: input.request, questions };
|
|
91
|
+
}
|
|
92
|
+
export async function runRoute(ask, input) {
|
|
93
|
+
const { state, questions } = buildRouteRequest(input);
|
|
94
|
+
const { answers, usage, provider, model } = await ask(state, questions);
|
|
95
|
+
const h = answers.handler;
|
|
96
|
+
const chosen = h?.choice;
|
|
97
|
+
const confidence = typeof h?.confidence === "number" ? h.confidence : null;
|
|
98
|
+
const probabilities = h?.probabilities ?? {};
|
|
99
|
+
const args = {};
|
|
100
|
+
if (chosen && chosen !== NONE_HANDLER && input.handlers[chosen]) {
|
|
101
|
+
for (const [arg, spec] of Object.entries(input.handlers[chosen].args)) {
|
|
102
|
+
const a = answers[argKey(chosen, arg)];
|
|
103
|
+
if (spec.type === "noul") {
|
|
104
|
+
const p = typeof a?.noul === "number" ? a.noul : null;
|
|
105
|
+
args[arg] = {
|
|
106
|
+
type: "noul",
|
|
107
|
+
value: p === null ? null : p >= 0.5 ? "yes" : "no",
|
|
108
|
+
probability: p ?? undefined,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
else if (spec.type === "choice") {
|
|
112
|
+
const v = a?.choice;
|
|
113
|
+
args[arg] = {
|
|
114
|
+
type: "choice",
|
|
115
|
+
value: v === undefined || v === "unspecified" ? null : v,
|
|
116
|
+
confidence: typeof a?.confidence === "number" ? a.confidence : undefined,
|
|
117
|
+
probabilities: a?.probabilities ?? undefined,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
args[arg] = {
|
|
122
|
+
type: "score",
|
|
123
|
+
value: typeof a?.score === "number" ? Number(a.score.toFixed(4)) : null,
|
|
124
|
+
confidence: typeof a?.confidence === "number" ? a.confidence : undefined,
|
|
125
|
+
probabilities: a?.probabilities ?? undefined,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const handler = chosen === undefined || chosen === NONE_HANDLER ? null : chosen;
|
|
131
|
+
return {
|
|
132
|
+
command: "route",
|
|
133
|
+
model,
|
|
134
|
+
provider,
|
|
135
|
+
handler,
|
|
136
|
+
confidence,
|
|
137
|
+
action: handler === null
|
|
138
|
+
? "none"
|
|
139
|
+
: confidence !== null && confidence >= input.minConfidence
|
|
140
|
+
? "auto"
|
|
141
|
+
: "review",
|
|
142
|
+
probabilities,
|
|
143
|
+
args,
|
|
144
|
+
min_confidence: input.minConfidence,
|
|
145
|
+
usage,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export const ROUTE_FAIL_CONDITIONS = ["review", "unrouted"];
|
|
149
|
+
export function routeFailed(out, conditions) {
|
|
150
|
+
return ((conditions.includes("review") && out.action === "review") ||
|
|
151
|
+
(conditions.includes("unrouted") && out.action === "none"));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/core/route.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Message } from "../vendor/compaction/types.js";
|
|
2
|
+
export type TranscriptFormat = "claude-code-jsonl" | "messages-json";
|
|
3
|
+
export interface ParsedTranscript {
|
|
4
|
+
format: TranscriptFormat;
|
|
5
|
+
messages: Message[];
|
|
6
|
+
/** Entries skipped from a session log (sidechains, non-message records). */
|
|
7
|
+
skipped: number;
|
|
8
|
+
}
|
|
9
|
+
/** Convert one Claude Code session record into a Message, or null if it is not a message. */
|
|
10
|
+
export declare function sessionRecordToMessage(record: unknown): Message | null;
|
|
11
|
+
/**
|
|
12
|
+
* Parse a transcript. A JSON array of Message objects is used as is; anything
|
|
13
|
+
* else is treated as JSONL, one Claude Code session record per line.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseTranscript(raw: string): ParsedTranscript;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Transcript adapters: turn a Claude Code session log (.jsonl) or a plain
|
|
2
|
+
// Message[] JSON file into the compaction library's Message shape.
|
|
3
|
+
function blockText(content) {
|
|
4
|
+
if (typeof content === "string")
|
|
5
|
+
return content;
|
|
6
|
+
if (Array.isArray(content)) {
|
|
7
|
+
return content
|
|
8
|
+
.map((b) => (b && typeof b === "object" && typeof b.text === "string" ? b.text : ""))
|
|
9
|
+
.filter(Boolean)
|
|
10
|
+
.join("\n");
|
|
11
|
+
}
|
|
12
|
+
if (content === null || content === undefined)
|
|
13
|
+
return "";
|
|
14
|
+
try {
|
|
15
|
+
return JSON.stringify(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return String(content);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Convert one Claude Code session record into a Message, or null if it is not a message. */
|
|
22
|
+
export function sessionRecordToMessage(record) {
|
|
23
|
+
if (!record || typeof record !== "object")
|
|
24
|
+
return null;
|
|
25
|
+
const r = record;
|
|
26
|
+
if ((r.type !== "user" && r.type !== "assistant") || r.isSidechain)
|
|
27
|
+
return null;
|
|
28
|
+
const content = r.message?.content;
|
|
29
|
+
const role = r.type;
|
|
30
|
+
const texts = [];
|
|
31
|
+
const toolUses = [];
|
|
32
|
+
const toolResults = [];
|
|
33
|
+
if (typeof content === "string")
|
|
34
|
+
texts.push(content);
|
|
35
|
+
else if (Array.isArray(content)) {
|
|
36
|
+
for (const raw of content) {
|
|
37
|
+
if (!raw || typeof raw !== "object")
|
|
38
|
+
continue;
|
|
39
|
+
if (raw.type === "text" && typeof raw.text === "string")
|
|
40
|
+
texts.push(raw.text);
|
|
41
|
+
else if (raw.type === "tool_use" && typeof raw.id === "string") {
|
|
42
|
+
toolUses.push({
|
|
43
|
+
tool_use_id: raw.id,
|
|
44
|
+
tool: typeof raw.name === "string" ? raw.name : "tool",
|
|
45
|
+
input: raw.input && typeof raw.input === "object" ? raw.input : {},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else if (raw.type === "tool_result" && typeof raw.tool_use_id === "string") {
|
|
49
|
+
toolResults.push({
|
|
50
|
+
tool_use_id: raw.tool_use_id,
|
|
51
|
+
text: blockText(raw.content),
|
|
52
|
+
isError: Boolean(raw.is_error),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const message = { role, text: texts.join("\n"), toolUses };
|
|
58
|
+
if (toolResults.length > 0)
|
|
59
|
+
message.toolResults = toolResults;
|
|
60
|
+
if (message.text.trim().length === 0 && toolUses.length === 0 && toolResults.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
return message;
|
|
63
|
+
}
|
|
64
|
+
function isMessageArray(v) {
|
|
65
|
+
return (Array.isArray(v) &&
|
|
66
|
+
v.every((m) => m &&
|
|
67
|
+
typeof m === "object" &&
|
|
68
|
+
(m.role === "user" || m.role === "assistant") &&
|
|
69
|
+
(m.text === undefined || typeof m.text === "string") &&
|
|
70
|
+
(m.toolUses === undefined || Array.isArray(m.toolUses))));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse a transcript. A JSON array of Message objects is used as is; anything
|
|
74
|
+
* else is treated as JSONL, one Claude Code session record per line.
|
|
75
|
+
*/
|
|
76
|
+
export function parseTranscript(raw) {
|
|
77
|
+
const trimmed = raw.trim();
|
|
78
|
+
if (trimmed.length === 0)
|
|
79
|
+
throw new Error("Transcript is empty.");
|
|
80
|
+
if (trimmed.startsWith("[")) {
|
|
81
|
+
let parsed;
|
|
82
|
+
try {
|
|
83
|
+
parsed = JSON.parse(trimmed);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
throw new Error(`Transcript is not valid JSON: ${err.message}`);
|
|
87
|
+
}
|
|
88
|
+
if (!isMessageArray(parsed)) {
|
|
89
|
+
throw new Error("A JSON transcript must be an array of {role, text?, toolUses?[], toolResults?[]} messages.");
|
|
90
|
+
}
|
|
91
|
+
// `text` and `toolUses` may be omitted (a tool-result-only message has neither).
|
|
92
|
+
const messages = parsed.map((m) => ({ ...m, text: m.text ?? "", toolUses: m.toolUses ?? [] }));
|
|
93
|
+
return { format: "messages-json", messages, skipped: 0 };
|
|
94
|
+
}
|
|
95
|
+
const messages = [];
|
|
96
|
+
let skipped = 0;
|
|
97
|
+
const lines = trimmed.split(/\r?\n/);
|
|
98
|
+
lines.forEach((line, i) => {
|
|
99
|
+
if (line.trim().length === 0)
|
|
100
|
+
return;
|
|
101
|
+
let record;
|
|
102
|
+
try {
|
|
103
|
+
record = JSON.parse(line);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
throw new Error(`Transcript line ${i + 1} is not valid JSON: ${err.message}`);
|
|
107
|
+
}
|
|
108
|
+
const message = sessionRecordToMessage(record);
|
|
109
|
+
if (message)
|
|
110
|
+
messages.push(message);
|
|
111
|
+
else
|
|
112
|
+
skipped++;
|
|
113
|
+
});
|
|
114
|
+
if (messages.length === 0)
|
|
115
|
+
throw new Error("Transcript contains no user or assistant messages.");
|
|
116
|
+
return { format: "claude-code-jsonl", messages, skipped };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/core/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const CREDENTIAL_PROVIDERS: readonly ["typesafe", "openrouter"];
|
|
2
|
+
export type CredentialProvider = (typeof CREDENTIAL_PROVIDERS)[number];
|
|
3
|
+
export declare const ENV_VAR: Record<CredentialProvider, string>;
|
|
4
|
+
export type StoreKind = "keychain" | "file";
|
|
5
|
+
export type CredentialSource = "env" | StoreKind | "none";
|
|
6
|
+
export interface CredentialStore {
|
|
7
|
+
kind: StoreKind;
|
|
8
|
+
/** Human-readable location, for `auth status`. */
|
|
9
|
+
location: string;
|
|
10
|
+
get(provider: CredentialProvider): string | undefined;
|
|
11
|
+
set(provider: CredentialProvider, secret: string): void;
|
|
12
|
+
delete(provider: CredentialProvider): boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function credentialsPath(env?: NodeJS.ProcessEnv): string;
|
|
15
|
+
export declare function fileStore(env?: NodeJS.ProcessEnv): CredentialStore;
|
|
16
|
+
/**
|
|
17
|
+
* Pick the store. `JEV_CREDENTIAL_STORE=file|keychain` forces one; otherwise the
|
|
18
|
+
* OS keychain when a supported tool exists, else the file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveStore(env?: NodeJS.ProcessEnv): CredentialStore;
|
|
21
|
+
export interface ResolvedCredential {
|
|
22
|
+
provider: CredentialProvider;
|
|
23
|
+
source: CredentialSource;
|
|
24
|
+
/** Set only when the value came from a store and should be injected into the env. */
|
|
25
|
+
value?: string;
|
|
26
|
+
}
|
|
27
|
+
/** For each provider, where its key comes from. Does not touch the store when the env already has a key. */
|
|
28
|
+
export declare function resolveCredentials(env: NodeJS.ProcessEnv, store?: CredentialStore): ResolvedCredential[];
|
|
29
|
+
/** A copy of `env` with stored keys filled in where the environment had none. */
|
|
30
|
+
export declare function withStoredCredentials(env: NodeJS.ProcessEnv, store?: CredentialStore): NodeJS.ProcessEnv;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// Stored credentials: OS keychain where available, else a 0600 file. Used to
|
|
2
|
+
// fill TYPESAFE_API_KEY / OPENROUTER_API_KEY when the environment lacks them.
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { configPath } from "./config.js";
|
|
7
|
+
import { CliError } from "./errors.js";
|
|
8
|
+
export const CREDENTIAL_PROVIDERS = ["typesafe", "openrouter"];
|
|
9
|
+
export const ENV_VAR = {
|
|
10
|
+
typesafe: "TYPESAFE_API_KEY",
|
|
11
|
+
openrouter: "OPENROUTER_API_KEY",
|
|
12
|
+
};
|
|
13
|
+
const SERVICE = "jevctl";
|
|
14
|
+
// ── file backend ────────────────────────────────────────────────────────────
|
|
15
|
+
export function credentialsPath(env = process.env) {
|
|
16
|
+
return env.JEV_CREDENTIALS || join(dirname(configPath(env)), "credentials.json");
|
|
17
|
+
}
|
|
18
|
+
export function fileStore(env = process.env) {
|
|
19
|
+
const path = credentialsPath(env);
|
|
20
|
+
const read = () => {
|
|
21
|
+
if (!existsSync(path))
|
|
22
|
+
return {};
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
25
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new CliError(`Credentials file ${path} is not valid JSON. Fix or delete it.`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
const write = (data) => {
|
|
32
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
33
|
+
writeFileSync(path, `${JSON.stringify(data, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
34
|
+
chmodSync(path, 0o600);
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
kind: "file",
|
|
38
|
+
location: path,
|
|
39
|
+
get: (p) => read()[p] || undefined,
|
|
40
|
+
set: (p, secret) => write({ ...read(), [p]: secret }),
|
|
41
|
+
delete: (p) => {
|
|
42
|
+
const data = read();
|
|
43
|
+
if (!(p in data))
|
|
44
|
+
return false;
|
|
45
|
+
delete data[p];
|
|
46
|
+
if (Object.keys(data).length === 0) {
|
|
47
|
+
unlinkSync(path);
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
write(data);
|
|
51
|
+
return true;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ── keychain backends ───────────────────────────────────────────────────────
|
|
56
|
+
function run(cmd, args, input) {
|
|
57
|
+
try {
|
|
58
|
+
const out = execFileSync(cmd, args, { input, stdio: ["pipe", "pipe", "ignore"], encoding: "utf8" });
|
|
59
|
+
return { ok: true, out: out.trimEnd() };
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return { ok: false, out: "" };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function hasCommand(cmd) {
|
|
66
|
+
return run(process.platform === "win32" ? "where" : "which", [cmd]).ok;
|
|
67
|
+
}
|
|
68
|
+
function macKeychain() {
|
|
69
|
+
const account = (p) => `${p}-api-key`;
|
|
70
|
+
return {
|
|
71
|
+
kind: "keychain",
|
|
72
|
+
location: `macOS Keychain (service "${SERVICE}")`,
|
|
73
|
+
get: (p) => {
|
|
74
|
+
const r = run("security", ["find-generic-password", "-s", SERVICE, "-a", account(p), "-w"]);
|
|
75
|
+
return r.ok && r.out ? r.out : undefined;
|
|
76
|
+
},
|
|
77
|
+
set: (p, secret) => {
|
|
78
|
+
const r = run("security", [
|
|
79
|
+
"add-generic-password",
|
|
80
|
+
"-U",
|
|
81
|
+
"-s",
|
|
82
|
+
SERVICE,
|
|
83
|
+
"-a",
|
|
84
|
+
account(p),
|
|
85
|
+
"-w",
|
|
86
|
+
secret,
|
|
87
|
+
]);
|
|
88
|
+
if (!r.ok)
|
|
89
|
+
throw new CliError("Could not write to the macOS Keychain.");
|
|
90
|
+
},
|
|
91
|
+
delete: (p) => run("security", ["delete-generic-password", "-s", SERVICE, "-a", account(p)]).ok,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function linuxSecretTool() {
|
|
95
|
+
const attrs = (p) => ["service", SERVICE, "account", `${p}-api-key`];
|
|
96
|
+
return {
|
|
97
|
+
kind: "keychain",
|
|
98
|
+
location: `Secret Service via secret-tool (service "${SERVICE}")`,
|
|
99
|
+
get: (p) => {
|
|
100
|
+
const r = run("secret-tool", ["lookup", ...attrs(p)]);
|
|
101
|
+
return r.ok && r.out ? r.out : undefined;
|
|
102
|
+
},
|
|
103
|
+
set: (p, secret) => {
|
|
104
|
+
const r = run("secret-tool", ["store", "--label", `jev ${p} API key`, ...attrs(p)], secret);
|
|
105
|
+
if (!r.ok)
|
|
106
|
+
throw new CliError("Could not store the key with secret-tool (is a Secret Service daemon running?).");
|
|
107
|
+
},
|
|
108
|
+
delete: (p) => run("secret-tool", ["clear", ...attrs(p)]).ok,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Pick the store. `JEV_CREDENTIAL_STORE=file|keychain` forces one; otherwise the
|
|
113
|
+
* OS keychain when a supported tool exists, else the file.
|
|
114
|
+
*/
|
|
115
|
+
export function resolveStore(env = process.env) {
|
|
116
|
+
const forced = env.JEV_CREDENTIAL_STORE?.toLowerCase();
|
|
117
|
+
if (forced === "file")
|
|
118
|
+
return fileStore(env);
|
|
119
|
+
if (forced && forced !== "keychain" && forced !== "auto") {
|
|
120
|
+
throw new CliError(`JEV_CREDENTIAL_STORE must be auto, keychain, or file (got "${env.JEV_CREDENTIAL_STORE}").`);
|
|
121
|
+
}
|
|
122
|
+
if (process.platform === "darwin" && hasCommand("security"))
|
|
123
|
+
return macKeychain();
|
|
124
|
+
if (process.platform === "linux" && hasCommand("secret-tool"))
|
|
125
|
+
return linuxSecretTool();
|
|
126
|
+
if (forced === "keychain")
|
|
127
|
+
throw new CliError("No supported keychain tool found on this system (macOS `security` or Linux `secret-tool`).");
|
|
128
|
+
return fileStore(env);
|
|
129
|
+
}
|
|
130
|
+
/** For each provider, where its key comes from. Does not touch the store when the env already has a key. */
|
|
131
|
+
export function resolveCredentials(env, store) {
|
|
132
|
+
let lazy = store;
|
|
133
|
+
const getStore = () => {
|
|
134
|
+
lazy ??= resolveStore(env);
|
|
135
|
+
return lazy;
|
|
136
|
+
};
|
|
137
|
+
return CREDENTIAL_PROVIDERS.map((provider) => {
|
|
138
|
+
if (env[ENV_VAR[provider]]?.trim())
|
|
139
|
+
return { provider, source: "env" };
|
|
140
|
+
let value;
|
|
141
|
+
try {
|
|
142
|
+
value = getStore().get(provider);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
value = undefined;
|
|
146
|
+
}
|
|
147
|
+
return value ? { provider, source: getStore().kind, value } : { provider, source: "none" };
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** A copy of `env` with stored keys filled in where the environment had none. */
|
|
151
|
+
export function withStoredCredentials(env, store) {
|
|
152
|
+
if (env.JEV_NO_STORED_CREDENTIALS === "1")
|
|
153
|
+
return env;
|
|
154
|
+
const out = { ...env };
|
|
155
|
+
for (const c of resolveCredentials(env, store)) {
|
|
156
|
+
if (c.value)
|
|
157
|
+
out[ENV_VAR[c.provider]] = c.value;
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,8DAA8D;IAC9D,EAAE,EAAE,CAAC;IACL,uDAAuD;IACvD,KAAK,EAAE,CAAC;IACR,mEAAmE;IACnE,QAAQ,EAAE,CAAC;CACH,CAAC;AAEX,sEAAsE;AACtE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,QAAQ,CAAS;IAC1B,YAAY,OAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,8DAA8D;IAC9D,EAAE,EAAE,CAAC;IACL,uDAAuD;IACvD,KAAK,EAAE,CAAC;IACR,mEAAmE;IACnE,QAAQ,EAAE,CAAC;CACH,CAAC;AAEX,sEAAsE;AACtE,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,QAAQ,CAAS;IAC1B,YAAY,OAAe,EAAE,QAAQ,GAAW,IAAI,CAAC,KAAK;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAI,GAA+C,CAAC,MAAM;YACnE,CAAC,CAAC,UAAW,GAA2B,CAAC,MAAM,GAAG;YAClD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
export * from "./config.js";
|
|
2
2
|
export * from "./core/ask.js";
|
|
3
|
+
export * from "./core/batch.js";
|
|
4
|
+
export * from "./core/classify.js";
|
|
5
|
+
export * from "./core/compact.js";
|
|
6
|
+
export * from "./core/extract.js";
|
|
3
7
|
export * from "./core/find.js";
|
|
8
|
+
export * from "./core/match.js";
|
|
9
|
+
export * from "./core/rerank.js";
|
|
10
|
+
export * from "./core/route.js";
|
|
4
11
|
export * from "./core/screen.js";
|
|
12
|
+
export * from "./core/transcript.js";
|
|
5
13
|
export * from "./core/verify.js";
|
|
14
|
+
export * from "./credentials.js";
|
|
6
15
|
export * from "./errors.js";
|
|
7
16
|
export * from "./lib.js";
|
|
8
17
|
export * from "./provider.js";
|
|
18
|
+
export * as compaction from "./vendor/compaction/index.js";
|
package/dist/index.js
CHANGED
|
@@ -3,10 +3,20 @@
|
|
|
3
3
|
// your own Node scripts without shelling out.
|
|
4
4
|
export * from "./config.js";
|
|
5
5
|
export * from "./core/ask.js";
|
|
6
|
+
export * from "./core/batch.js";
|
|
7
|
+
export * from "./core/classify.js";
|
|
8
|
+
export * from "./core/compact.js";
|
|
9
|
+
export * from "./core/extract.js";
|
|
6
10
|
export * from "./core/find.js";
|
|
11
|
+
export * from "./core/match.js";
|
|
12
|
+
export * from "./core/rerank.js";
|
|
13
|
+
export * from "./core/route.js";
|
|
7
14
|
export * from "./core/screen.js";
|
|
15
|
+
export * from "./core/transcript.js";
|
|
8
16
|
export * from "./core/verify.js";
|
|
17
|
+
export * from "./credentials.js";
|
|
9
18
|
export * from "./errors.js";
|
|
10
19
|
export * from "./lib.js";
|
|
11
20
|
export * from "./provider.js";
|
|
21
|
+
export * as compaction from "./vendor/compaction/index.js";
|
|
12
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,8CAA8C;AAE9C,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,8CAA8C;AAE9C,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,OAAO,KAAK,UAAU,MAAM,8BAA8B,CAAC"}
|
package/dist/input.js
CHANGED
|
@@ -76,7 +76,7 @@ export function nonEmptyLines(text) {
|
|
|
76
76
|
*/
|
|
77
77
|
export function parseList(text, label = "list") {
|
|
78
78
|
const trimmed = text.trim();
|
|
79
|
-
if (trimmed.startsWith("[")) {
|
|
79
|
+
if (trimmed.startsWith("[") || trimmed.startsWith("{")) {
|
|
80
80
|
const parsed = parseJson(trimmed, label);
|
|
81
81
|
if (!Array.isArray(parsed) || !parsed.every((x) => typeof x === "string")) {
|
|
82
82
|
throw new CliError(`${label} must be a JSON array of strings.`);
|
package/dist/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -61,3 +61,5 @@ export declare function rankCandidates<T extends {
|
|
|
61
61
|
export declare function parseFailOn<T extends string>(raw: string | undefined, allowed: readonly T[], fallback: T[]): T[];
|
|
62
62
|
/** Parse a probability-like flag (0..1). */
|
|
63
63
|
export declare function parseProbability(name: string, raw: string | number | undefined, fallback: number): number;
|
|
64
|
+
/** Split an array into consecutive groups of at most `size`. */
|
|
65
|
+
export declare function chunk<T>(items: readonly T[], size: number): T[][];
|
package/dist/lib.js
CHANGED
|
@@ -120,4 +120,13 @@ export function parseProbability(name, raw, fallback) {
|
|
|
120
120
|
throw new Error(`${name} must be a number between 0 and 1.`);
|
|
121
121
|
return n;
|
|
122
122
|
}
|
|
123
|
+
/** Split an array into consecutive groups of at most `size`. */
|
|
124
|
+
export function chunk(items, size) {
|
|
125
|
+
if (size < 1)
|
|
126
|
+
throw new Error("chunk size must be at least 1");
|
|
127
|
+
const out = [];
|
|
128
|
+
for (let i = 0; i < items.length; i += size)
|
|
129
|
+
out.push(items.slice(i, i + size));
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
123
132
|
//# sourceMappingURL=lib.js.map
|