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.
Files changed (133) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/NOTICE +4 -0
  3. package/README.md +54 -388
  4. package/SECURITY.md +5 -3
  5. package/dist/cli.js +105 -16
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/ask.d.ts +5 -1
  8. package/dist/commands/ask.js +27 -10
  9. package/dist/commands/ask.js.map +1 -1
  10. package/dist/commands/auth.d.ts +14 -0
  11. package/dist/commands/auth.js +134 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/batch.d.ts +28 -0
  14. package/dist/commands/batch.js +221 -0
  15. package/dist/commands/batch.js.map +1 -0
  16. package/dist/commands/classify.d.ts +34 -0
  17. package/dist/commands/classify.js +187 -0
  18. package/dist/commands/classify.js.map +1 -0
  19. package/dist/commands/compact.d.ts +29 -0
  20. package/dist/commands/compact.js +146 -0
  21. package/dist/commands/compact.js.map +1 -0
  22. package/dist/commands/config.d.ts +2 -1
  23. package/dist/commands/config.js +27 -10
  24. package/dist/commands/config.js.map +1 -1
  25. package/dist/commands/extract.d.ts +18 -0
  26. package/dist/commands/extract.js +108 -0
  27. package/dist/commands/extract.js.map +1 -0
  28. package/dist/commands/find.d.ts +5 -1
  29. package/dist/commands/find.js +30 -15
  30. package/dist/commands/find.js.map +1 -1
  31. package/dist/commands/match.d.ts +18 -0
  32. package/dist/commands/match.js +118 -0
  33. package/dist/commands/match.js.map +1 -0
  34. package/dist/commands/models.js +12 -10
  35. package/dist/commands/models.js.map +1 -1
  36. package/dist/commands/rerank.d.ts +15 -0
  37. package/dist/commands/rerank.js +82 -0
  38. package/dist/commands/rerank.js.map +1 -0
  39. package/dist/commands/route.d.ts +19 -0
  40. package/dist/commands/route.js +120 -0
  41. package/dist/commands/route.js.map +1 -0
  42. package/dist/commands/screen.d.ts +5 -1
  43. package/dist/commands/screen.js +27 -10
  44. package/dist/commands/screen.js.map +1 -1
  45. package/dist/commands/verify.d.ts +5 -1
  46. package/dist/commands/verify.js +23 -12
  47. package/dist/commands/verify.js.map +1 -1
  48. package/dist/config.d.ts +66 -6
  49. package/dist/config.js +53 -2
  50. package/dist/config.js.map +1 -1
  51. package/dist/context.d.ts +4 -0
  52. package/dist/context.js +11 -5
  53. package/dist/context.js.map +1 -1
  54. package/dist/core/ask.js +8 -3
  55. package/dist/core/ask.js.map +1 -1
  56. package/dist/core/batch.d.ts +42 -0
  57. package/dist/core/batch.js +93 -0
  58. package/dist/core/batch.js.map +1 -0
  59. package/dist/core/classify.d.ts +103 -0
  60. package/dist/core/classify.js +216 -0
  61. package/dist/core/classify.js.map +1 -0
  62. package/dist/core/compact.d.ts +32 -0
  63. package/dist/core/compact.js +47 -0
  64. package/dist/core/compact.js.map +1 -0
  65. package/dist/core/extract.d.ts +58 -0
  66. package/dist/core/extract.js +214 -0
  67. package/dist/core/extract.js.map +1 -0
  68. package/dist/core/find.js +3 -0
  69. package/dist/core/find.js.map +1 -1
  70. package/dist/core/match.d.ts +55 -0
  71. package/dist/core/match.js +114 -0
  72. package/dist/core/match.js.map +1 -0
  73. package/dist/core/rerank.d.ts +47 -0
  74. package/dist/core/rerank.js +60 -0
  75. package/dist/core/rerank.js.map +1 -0
  76. package/dist/core/route.d.ts +74 -0
  77. package/dist/core/route.js +153 -0
  78. package/dist/core/route.js.map +1 -0
  79. package/dist/core/transcript.d.ts +15 -0
  80. package/dist/core/transcript.js +118 -0
  81. package/dist/core/transcript.js.map +1 -0
  82. package/dist/credentials.d.ts +30 -0
  83. package/dist/credentials.js +161 -0
  84. package/dist/credentials.js.map +1 -0
  85. package/dist/errors.js.map +1 -1
  86. package/dist/index.d.ts +10 -0
  87. package/dist/index.js +10 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/input.js +1 -1
  90. package/dist/input.js.map +1 -1
  91. package/dist/lib.d.ts +2 -0
  92. package/dist/lib.js +9 -0
  93. package/dist/lib.js.map +1 -1
  94. package/dist/output.d.ts +41 -3
  95. package/dist/output.js +131 -6
  96. package/dist/output.js.map +1 -1
  97. package/dist/provider.d.ts +8 -0
  98. package/dist/provider.js +44 -4
  99. package/dist/provider.js.map +1 -1
  100. package/dist/vendor/compaction/compact.d.ts +29 -0
  101. package/dist/vendor/compaction/compact.js +236 -0
  102. package/dist/vendor/compaction/compact.js.map +1 -0
  103. package/dist/vendor/compaction/index.d.ts +4 -0
  104. package/dist/vendor/compaction/index.js +8 -0
  105. package/dist/vendor/compaction/index.js.map +1 -0
  106. package/dist/vendor/compaction/request.d.ts +19 -0
  107. package/dist/vendor/compaction/request.js +53 -0
  108. package/dist/vendor/compaction/request.js.map +1 -0
  109. package/dist/vendor/compaction/state.d.ts +28 -0
  110. package/dist/vendor/compaction/state.js +258 -0
  111. package/dist/vendor/compaction/state.js.map +1 -0
  112. package/dist/vendor/compaction/types.d.ts +177 -0
  113. package/dist/vendor/compaction/types.js +4 -0
  114. package/dist/vendor/compaction/types.js.map +1 -0
  115. package/docs/ask.md +52 -0
  116. package/docs/auth.md +53 -0
  117. package/docs/batch.md +48 -0
  118. package/docs/classify.md +55 -0
  119. package/docs/compact.md +58 -0
  120. package/docs/config.md +81 -0
  121. package/docs/extract.md +59 -0
  122. package/docs/find.md +49 -0
  123. package/docs/guidelines.md +19 -0
  124. package/docs/library.md +41 -0
  125. package/docs/match.md +52 -0
  126. package/docs/output.md +65 -0
  127. package/docs/recipes.md +78 -0
  128. package/docs/rerank.md +44 -0
  129. package/docs/route.md +57 -0
  130. package/docs/screen.md +53 -0
  131. package/docs/troubleshooting.md +17 -0
  132. package/docs/verify.md +58 -0
  133. 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":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,uBAAuB,EAAsB,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAa,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAc3F,SAAS,GAAG,CAAC,IAAY,EAAE,GAAuB,EAAE,QAAgB,EAAE,GAAG,GAAG,CAAC;IAC3E,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG;QAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,yBAAyB,GAAG,GAAG,CAAC,CAAC;IAChG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAmB,EAAE,GAAmB;IAC5E,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC;QACzF,sBAAsB,EAAE,GAAG,CAAC,mBAAmB,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC;QACxF,cAAc,EAAE,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACpF,gBAAgB,EAAE,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC5F,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;QAC7E,YAAY,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;QACrF,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,EAAE,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAA8B;IAC3D,IAAI,GAAW,CAAC;IAChB,IAAI,UAAU,KAAK,SAAS;QAAE,GAAG,GAAG,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;SACnE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;;QACxD,MAAM,IAAI,QAAQ,CAAC,uEAAuE,CAAC,CAAC;IACjG,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAA8B,EAC9B,KAAmB,EACnB,GAAmB;IAEnB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GAAG,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,IAAI,CACF,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EACjC;YACE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM;YACpC,eAAe,EAAE,UAAU,CAAC,OAAO;YACnC,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;YACxC,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;YACjC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;YAChC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI;SAC7B,EACD,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CACX,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxG,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QACxE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CACF,GAAG,CAAC,MAAM,EACV,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EACvF,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAC/D,CAAC;IACF,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAkB,EAAE,GAAmB,EAAE,MAAc,EAAE,KAAc;IACnG,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ;QAC3B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC;QAC/C,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,mBAAmB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ,KAAK,CAAC,CAAC,cAAc,MAAM,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ;QAC7I,KAAK,CACH,CAAC,EACD,KAAK,EACL,GAAG,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,cAAc,wBAAwB,CAAC,CAAC,YAAY,oBAAoB,CAAC,CAAC,MAAM,oBAAoB,CAAC,CAAC,WAAW,YAAY,CAAC,CAAC,UAAU,IAAI,YAAY,QAAQ,CAAC,CAAC,QAAQ,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAClP;KACF,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,KAAK,MAAM;QACV,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,KAAK,aAAa;YACnB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC;YAChC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC9B,CAAC,CAAC,EAAE;QACJ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACf,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7B,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC;KAChC,CAAC,CAAC;IACH,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;QACzG,IAAI,EAAE;YACJ,KAAK,CACH,CAAC,EACD,KAAK,EACL,KAAK;gBACH,CAAC,CAAC,iCAAiC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,MAAM,yBAAyB;gBAC9F,CAAC,CAAC,qDAAqD,MAAM,yBAAyB,CACzF;SACF;QACD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,GAAkF;IAElF,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,4IAA4I,CAC7I;SACA,QAAQ,CAAC,cAAc,EAAE,+EAA+E,CAAC;SACzG,MAAM,CACL,mBAAmB,EACnB,0FAA0F,CAC3F;SACA,MAAM,CACL,sBAAsB,EACtB,6EAA6E,CAC9E;SACA,MAAM,CACL,uBAAuB,EACvB,6EAA6E,CAC9E;SACA,MAAM,CAAC,wBAAwB,EAAE,oEAAoE,CAAC;SACtG,MAAM,CACL,0BAA0B,EAC1B,0EAA0E,CAC3E;SACA,MAAM,CAAC,qBAAqB,EAAE,sEAAsE,CAAC;SACrG,MAAM,CACL,qBAAqB,EACrB,oFAAoF,CACrF;SACA,MAAM,CAAC,kBAAkB,EAAE,qDAAqD,CAAC;SACjF,MAAM,CAAC,kBAAkB,EAAE,oDAAoD,CAAC;SAChF,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;uDAeiD,CAClD;SACA,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,KAAmB,EAAE,GAAY,EAAE,EAAE;QAClF,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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
- export declare function configShow(ctx: CommandContext, env: NodeJS.ProcessEnv): Promise<number>;
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;
@@ -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, table } from "../output.js";
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
- if (secret.length <= 8)
11
- return "*".repeat(secret.length);
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
- export async function configShow(ctx, env) {
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 lines = [table(rows, { color: c })];
60
- if (problem)
61
- lines.push("", paint(c, "yellow", problem));
62
- return lines.join("\n");
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":"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"}
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,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,UAAU,IAAI,CAAC,MAA0B;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,+FAA+F;IAC/F,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAsB;IACrD,OAAO;QACL,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC5C,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAChD,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,wBAAwB,IAAI,GAAG,CAAC,oBAAoB,CAAC;QACpF,qBAAqB,EAAE,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACtD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI;KACjD,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB,EAAE,MAAyB;IAC7E,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;IACnC,CAAC;IACD,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,UAAU,CAAC,IAAI,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,gBAAgB,CAAC,GAAG,CAAC;QAClC,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrG,iBAAiB,EAAE,QAAQ;QAC3B,OAAO;KACR,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,IAAI,GAAe;YACvB,CAAC,aAAa,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,EAAE,CAAC;YAChG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1F,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3D,CAAC,2BAA2B,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7F;gBACE,4BAA4B;gBAC5B,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE;aACjF;YACD;gBACE,oCAAoC;gBACpC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;aAC1E;YACD,CAAC,uBAAuB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACnE,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3D,CAAC,mBAAmB,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC7E,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC/D;gBACE,uDAAuD;gBACvD,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE;aAClH;SACF,CAAC;QACF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnG,CAAC;QACD,OAAO;YACL,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE;YAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,GAAkF;IAElF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAEjG,MAAM;SACH,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CACV,6FAA6F,CAC9F;SACA,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,GAAY,EAAE,EAAE;QAC9C,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,6FAA6F,CAC9F;SACA,QAAQ,CACP,OAAO,EACP,wFAAwF,CACzF;SACA,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9D,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;SAC5C,MAAM,CAAC,CAAC,GAAW,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAA4B,CAAC;QAChE,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,GAAG,kBAAkB,IAAI,GAAG,CAAC,CAAC;QAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oFAAoF,CAAC;SACjG,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,qDAAqD,CAAC,CAAC;QACvG,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;QACrE,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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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"}
@@ -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): string;
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;
@@ -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 { nonEmptyLines, parseItems, readFile, readInput } from "../input.js";
4
+ import { parseItems, readFile, readInput } from "../input.js";
5
5
  import { MAX_CANDIDATES, parseFailOn, parseProbability } from "../lib.js";
6
- import { clip, emit, formatProbability, paint, table, usageLine } from "../output.js";
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
- const lines = nonEmptyLines(readInput(flags.lines, "lines"));
25
- lines.forEach((line, i) => {
26
- items.push({ id: `L${i + 1}`, text: line });
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
- const lines = [
68
- `${verdict} (exists ${formatProbability(out.exists)}) ${paint(c, "dim", out.query)}`,
69
- "",
70
- table([["#", "Prob", "Id", "Text"], ...rows], { color: c }),
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<n>)")
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":"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"}
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC,OAAO,EACL,gBAAgB,EAEhB,oBAAoB,EAEpB,UAAU,EACV,OAAO,GACR,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAa,MAAM,cAAc,CAAC;AAY/E,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,UAAU;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IACzG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC,oBAAoB,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,KAAK;YAAE,MAAM,IAAI,QAAQ,CAAC,GAAG,IAAI,qDAAqD,CAAC,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,gGAAgG;QAChG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;aAC5B,KAAK,CAAC,OAAO,CAAC;aACd,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACP,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAAC,mFAAmF,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,QAAQ,CAAC,wBAAwB,KAAK,CAAC,MAAM,mBAAmB,cAAc,YAAY,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,KAAgB,EAAE,GAAmB;IACnF,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE;QAClD,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAEnE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAe,EAAE,GAAmB;IAC7D,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,OAAO,GACX,GAAG,CAAC,cAAc,KAAK,UAAU;QAC/B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC;QACvC,CAAC,CAAC,GAAG,CAAC,cAAc,KAAK,QAAQ;YAC/B,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,cAAc,CAAC;YACrC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC;QAClC,GAAG,CAAC,EAAE;QACN,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,OAAO,aAAa,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;QACrD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAgB,EAChB,GAAkF;IAElF,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,wEAAwE,cAAc,uBAAuB,CAC9G;SACA,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CACL,wBAAwB,EACxB,mFAAmF,CACpF;SACA,MAAM,CAAC,wBAAwB,EAAE,4CAA4C,CAAC;SAC9E,MAAM,CACL,mBAAmB,EACnB,8EAA8E,CAC/E;SACA,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;SAC1E,MAAM,CAAC,aAAa,EAAE,8EAA8E,CAAC;SACrG,MAAM,CAAC,cAAc,EAAE,uEAAuE,CAAC;SAC/F,MAAM,CACL,kBAAkB,EAClB,6CAA6C,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CACpG;SACA,WAAW,CACV,OAAO,EACP;;;;8EAIwE,CACzE;SACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,KAAgB,EAAE,GAAY,EAAE,EAAE;QAC9D,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,KAAgB,EAAE,GAAmB;IACpE,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE;QAClD,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC"}
@@ -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;