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,118 @@
1
+ import { allPairs, buildMatchRequest, crossPairs, MATCH_FAIL_CONDITIONS, MAX_PAIRS, matchFailed, runMatch, } from "../core/match.js";
2
+ import { CliError, EXIT } from "../errors.js";
3
+ import { parseItems, parseJson, readInput } from "../input.js";
4
+ import { parseFailOn } from "../lib.js";
5
+ import { clip, emit, formatProbability, paint } from "../output.js";
6
+ function toItem(v, label) {
7
+ if (typeof v === "string")
8
+ return { text: v };
9
+ if (v && typeof v === "object" && typeof v.text === "string") {
10
+ const { id, text } = v;
11
+ return id === undefined ? { text } : { id: String(id), text };
12
+ }
13
+ throw new CliError(`${label} must be a string or an object with a "text" field.`);
14
+ }
15
+ /** Pairs JSON: array of [a, b] or {left, right}. */
16
+ export function parsePairs(raw) {
17
+ const parsed = parseJson(raw, "pairs");
18
+ if (!Array.isArray(parsed))
19
+ throw new CliError("pairs must be a JSON array.");
20
+ return parsed.map((entry, i) => {
21
+ if (Array.isArray(entry) && entry.length === 2)
22
+ return { left: toItem(entry[0], `pairs[${i}][0]`), right: toItem(entry[1], `pairs[${i}][1]`) };
23
+ if (entry && typeof entry === "object" && "left" in entry && "right" in entry) {
24
+ const e = entry;
25
+ return { left: toItem(e.left, `pairs[${i}].left`), right: toItem(e.right, `pairs[${i}].right`) };
26
+ }
27
+ throw new CliError(`pairs[${i}] must be [left, right] or {"left", "right"}.`);
28
+ });
29
+ }
30
+ /** Give unnamed items positional ids so results can be read back. */
31
+ function withIds(items, prefix) {
32
+ return items.map((it, i) => (it.id === undefined ? { ...it, id: `${prefix}${i + 1}` } : it));
33
+ }
34
+ export function collectPairs(flags) {
35
+ const modes = [flags.pairs, flags.left || flags.right, flags.dedupe].filter(Boolean).length;
36
+ if (modes !== 1)
37
+ throw new CliError("Provide exactly one of --pairs <ref>, --left <ref> --right <ref>, or --dedupe <ref>.");
38
+ let pairs;
39
+ if (flags.pairs)
40
+ pairs = parsePairs(readInput(flags.pairs, "pairs"));
41
+ else if (flags.dedupe) {
42
+ const items = withIds(parseItems(readInput(flags.dedupe, "items"), "items"), "item");
43
+ if (items.length < 2)
44
+ throw new CliError("--dedupe needs at least two items.");
45
+ pairs = allPairs(items);
46
+ }
47
+ else {
48
+ if (!flags.left || !flags.right)
49
+ throw new CliError("--left and --right must be given together.");
50
+ const left = withIds(parseItems(readInput(flags.left, "left"), "left"), "L");
51
+ const right = withIds(parseItems(readInput(flags.right, "right"), "right"), "R");
52
+ pairs = crossPairs(left, right);
53
+ }
54
+ if (pairs.length === 0)
55
+ throw new CliError("No pairs to compare.");
56
+ if (pairs.length > MAX_PAIRS) {
57
+ throw new CliError(`${pairs.length} pairs exceeds the limit of ${MAX_PAIRS}. Block candidates first (e.g. by name prefix or postcode) and match within blocks.`);
58
+ }
59
+ return pairs;
60
+ }
61
+ export async function matchAction(flags, ctx) {
62
+ const pairs = collectPairs(flags);
63
+ const failOn = parseFailOn(flags.failOn, MATCH_FAIL_CONDITIONS, []);
64
+ if (ctx.dryRun) {
65
+ const { state, questions } = buildMatchRequest(pairs.slice(0, 50), flags.kind);
66
+ emit({ ...ctx.output, format: "json" }, {
67
+ model: ctx.config.model,
68
+ pairs: pairs.length,
69
+ note: pairs.length > 50 ? "showing the first request of several" : undefined,
70
+ state,
71
+ questions,
72
+ }, () => ({}));
73
+ return EXIT.OK;
74
+ }
75
+ const output = await runMatch(ctx.ask(), { pairs, kind: flags.kind });
76
+ emit(ctx.output, output, () => renderMatch(output, ctx));
77
+ return matchFailed(output, failOn) ? EXIT.JUDGMENT : EXIT.OK;
78
+ }
79
+ export function renderMatch(out, ctx) {
80
+ const c = ctx.output.color;
81
+ const style = (d) => d === "same" ? paint(c, "green", d) : d === "different" ? paint(c, "dim", d) : paint(c, "yellow", d);
82
+ const rows = out.results.map((r) => [
83
+ style(r.decision),
84
+ formatProbability(r.confidence),
85
+ clip(r.left === r.left_text ? r.left : `${r.left}: ${r.left_text}`, 40),
86
+ clip(r.right === r.right_text ? r.right : `${r.right}: ${r.right_text}`, 40),
87
+ ]);
88
+ const s = out.summary;
89
+ return {
90
+ table: { columns: ["Decision", "Conf", "Left", "Right"], rows },
91
+ tail: [`${s.same} same · ${s.unclear} unclear · ${s.different} different`],
92
+ usage: { usage: out.usage, model: out.model, provider: out.provider },
93
+ };
94
+ }
95
+ export function registerMatch(program, run) {
96
+ program
97
+ .command("match")
98
+ .description("Decide whether pairs of records describe the same thing: same, different, or unclear (send to a person).")
99
+ .option("-p, --pairs <ref>", 'JSON pairs: [["a","b"], ...] or [{"left": {...}, "right": {...}}, ...]')
100
+ .option("--left <ref>", "JSON items; every left item is compared with every right item")
101
+ .option("--right <ref>", "JSON items for --left")
102
+ .option("-d, --dedupe <ref>", "JSON items; every pair within the list is compared")
103
+ .option("-k, --kind <text>", 'what the records are, e.g. "products in a catalogue" or "customer contacts"')
104
+ .option("--fail-on <list>", `exit 2 when any pair is: ${MATCH_FAIL_CONDITIONS.join(", ")}, or none (default none)`)
105
+ .addHelpText("after", `
106
+ Items are strings or {id, text}. Up to ${MAX_PAIRS} pairs per call, sent in groups of 50.
107
+ The decision is the most likely of three levels; there is no threshold to tune. "unclear" is a
108
+ real outcome meaning a person should look, not a low-confidence "same".
109
+
110
+ Examples:
111
+ jev match --dedupe @contacts.json --kind "customer contacts" --fail-on same
112
+ jev match --left @our-catalog.json --right @supplier-feed.json --kind "beer products" --json
113
+ jev match --pairs @candidate-pairs.json`)
114
+ .action(async (flags, cmd) => {
115
+ await run((ctx) => matchAction(flags, ctx), cmd);
116
+ });
117
+ }
118
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../src/commands/match.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { TypeSafeClient } from "@typesafe-ai/sdk";
2
2
  import { CliError, EXIT } from "../errors.js";
3
- import { emit, paint, table } from "../output.js";
3
+ import { emit, paint } from "../output.js";
4
4
  import { resolveProvider } from "../provider.js";
5
5
  export async function modelsAction(ctx, env) {
6
6
  const provider = resolveProvider(env, ctx.config.provider);
@@ -14,14 +14,16 @@ export async function modelsAction(ctx, env) {
14
14
  });
15
15
  const models = await client.models.list();
16
16
  const payload = { command: "models", provider, models, default: ctx.config.model };
17
- emit(ctx.output, payload, () => {
18
- const rows = models.map((m) => [
19
- m.name === ctx.config.model ? paint(ctx.output.color, "green", m.name) : m.name,
20
- m.release_date,
21
- m.description,
22
- ]);
23
- return table([["Name", "Released", "Description"], ...rows], { color: ctx.output.color });
24
- });
17
+ emit(ctx.output, payload, () => ({
18
+ table: {
19
+ columns: ["Name", "Released", "Description"],
20
+ rows: models.map((m) => [
21
+ m.name === ctx.config.model ? paint(ctx.output.color, "green", m.name) : m.name,
22
+ m.release_date,
23
+ m.description,
24
+ ]),
25
+ },
26
+ }));
25
27
  return EXIT.OK;
26
28
  }
27
29
  export function registerModels(program, run) {
@@ -29,7 +31,7 @@ export function registerModels(program, run) {
29
31
  .command("models")
30
32
  .description("List the models available to your TypeSafe account.")
31
33
  .action(async (_flags, cmd) => {
32
- await run((ctx) => modelsAction(ctx, process.env), cmd);
34
+ await run((ctx) => modelsAction(ctx, ctx.env), cmd);
33
35
  });
34
36
  }
35
37
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAmB,EAAE,GAAsB;IAC5E,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,4DAA4D,QAAQ,0BAA0B,CAC/F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,gBAAgB;QAC5B,OAAO,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;QAC3C,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACnF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7B,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YAC/E,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,WAAW;SACd,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,GAAkF;IAElF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,GAAY,EAAE,EAAE;QAC9C,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,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,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAmB,EAAE,GAAsB;IAC5E,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,4DAA4D,QAAQ,0BAA0B,CAC/F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,gBAAgB;QAC5B,OAAO,EAAE,GAAG,CAAC,iBAAiB,IAAI,SAAS;QAC3C,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACnF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE;YACL,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC;YAC5C,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACtB,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC/E,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,WAAW;aACd,CAAC;SACH;KACF,CAAC,CAAC,CAAC;IACJ,OAAO,IAAI,CAAC,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,GAAkF;IAElF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,GAAY,EAAE,EAAE;QAC9C,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandContext } from "../context.js";
3
+ import type { BatchItemRunner } from "../core/batch.js";
4
+ import { type RerankOutput } from "../core/rerank.js";
5
+ import { type View } from "../output.js";
6
+ import { type FindFlags } from "./find.js";
7
+ export interface RerankFlags extends Pick<FindFlags, "candidates" | "files" | "lines" | "topK" | "failOn"> {
8
+ min?: string;
9
+ criteria?: string;
10
+ }
11
+ export declare function rerankAction(query: string, flags: RerankFlags, ctx: CommandContext): Promise<number>;
12
+ export declare function renderRerank(out: RerankOutput, ctx: CommandContext): View;
13
+ /** Batch: each row is a query reranked against the shared candidates. */
14
+ export declare function prepareRerankBatch(flags: RerankFlags, ctx: CommandContext): BatchItemRunner;
15
+ export declare function registerRerank(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
@@ -0,0 +1,82 @@
1
+ import { buildRerankRequest, RERANK_FAIL_CONDITIONS, rerankFailed, runRerank, } from "../core/rerank.js";
2
+ import { CliError, EXIT } from "../errors.js";
3
+ import { parseFailOn, parseProbability } from "../lib.js";
4
+ import { clip, emit, formatProbability, paint } from "../output.js";
5
+ import { collectCandidates } from "./find.js";
6
+ function resolve(flags, ctx) {
7
+ const candidates = collectCandidates(flags);
8
+ const topK = flags.topK === undefined ? ctx.config.rerank.topK : Number(flags.topK);
9
+ if (!Number.isInteger(topK) || topK < 1 || topK > 250)
10
+ throw new CliError("--top-k must be an integer from 1 to 250.");
11
+ const min = parseProbability("--min", flags.min, ctx.config.rerank.min);
12
+ const failOn = parseFailOn(flags.failOn, RERANK_FAIL_CONDITIONS, []);
13
+ return { candidates, topK, min, failOn };
14
+ }
15
+ export async function rerankAction(query, flags, ctx) {
16
+ const { candidates, topK, min, failOn } = resolve(flags, ctx);
17
+ if (ctx.dryRun) {
18
+ const { state, questions } = buildRerankRequest({ query, candidates, criteria: flags.criteria });
19
+ emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
20
+ return EXIT.OK;
21
+ }
22
+ const output = await runRerank(ctx.ask(), { query, candidates, topK, min, criteria: flags.criteria });
23
+ emit(ctx.output, output, () => renderRerank(output, ctx));
24
+ return rerankFailed(output, failOn) ? EXIT.JUDGMENT : EXIT.OK;
25
+ }
26
+ export function renderRerank(out, ctx) {
27
+ const c = ctx.output.color;
28
+ const rows = out.ranked.map((h, i) => [
29
+ String(i + 1),
30
+ h.kept
31
+ ? paint(c, "green", formatProbability(h.relevance))
32
+ : paint(c, "dim", formatProbability(h.relevance)),
33
+ h.kept ? "keep" : paint(c, "dim", "drop"),
34
+ h.id,
35
+ clip(h.text, 60),
36
+ ]);
37
+ return {
38
+ head: [
39
+ `${out.kept.length} of ${out.ranked.length} shown are relevant (min ${out.min}) ${paint(c, "dim", out.query)}`,
40
+ ],
41
+ table: { columns: ["#", "Rel", "Keep", "Id", "Text"], rows },
42
+ usage: { usage: out.usage, model: out.model, provider: out.provider },
43
+ };
44
+ }
45
+ /** Batch: each row is a query reranked against the shared candidates. */
46
+ export function prepareRerankBatch(flags, ctx) {
47
+ const { candidates, topK, min, failOn } = resolve(flags, ctx);
48
+ return async (row) => {
49
+ const output = await runRerank(ctx.ask(), {
50
+ query: row.text,
51
+ candidates,
52
+ topK,
53
+ min,
54
+ criteria: flags.criteria,
55
+ });
56
+ return { output, failed: rerankFailed(output, failOn) };
57
+ };
58
+ }
59
+ export function registerRerank(program, run) {
60
+ program
61
+ .command("rerank")
62
+ .description("Score each candidate's relevance to a query independently and sort. Use on search results before showing or using them.")
63
+ .argument("<query>", "what the results should be relevant to")
64
+ .option("-c, --candidates <ref>", "JSON candidates (@file or -): array of strings, array of {id,text}, or {id: text}")
65
+ .option("-f, --files <paths...>", "treat each file as a candidate (id = path)")
66
+ .option("-l, --lines <ref>", "treat each non-empty line of @file or - as a candidate (id = L<line number>)")
67
+ .option("-k, --top-k <n>", "how many ranked results to return (default 10)")
68
+ .option("--min <p>", "relevance at or above which a candidate is kept (default 0.5)")
69
+ .option("--criteria <text>", 'what counts as relevant, e.g. "a passage stating the legal rule, not commentary"')
70
+ .option("--fail-on <list>", "exit 2 when: empty (nothing kept), or none (default none)")
71
+ .addHelpText("after", `
72
+ Unlike find, rerank scores every candidate on its own, so several can be relevant or none can.
73
+ Use find to pick the single best answer; use rerank to filter and order a result list.
74
+
75
+ Examples:
76
+ jev rerank "how do I rotate API keys" --candidates @bm25-top30.json -k 10
77
+ jev rerank "statute of limitations for contract claims" --lines @passages.txt --min 0.7 --fail-on empty`)
78
+ .action(async (query, flags, cmd) => {
79
+ await run((ctx) => rerankAction(query, flags, ctx), cmd);
80
+ });
81
+ }
82
+ //# sourceMappingURL=rerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rerank.js","sourceRoot":"","sources":["../../src/commands/rerank.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EAEtB,YAAY,EACZ,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC9C,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,iBAAiB,EAAkB,MAAM,WAAW,CAAC;AAO9D,SAAS,OAAO,CAAC,KAAkB,EAAE,GAAmB;IACtD,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG;QACnD,MAAM,IAAI,QAAQ,CAAC,2CAA2C,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,KAAkB,EAAE,GAAmB;IACvF,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjG,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;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAiB,EAAE,GAAmB;IACjE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC,CAAC,IAAI;YACJ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACnD,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC;QACzC,CAAC,CAAC,EAAE;QACJ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;SAChH;QACD,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;QAC5D,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,yEAAyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,KAAkB,EAAE,GAAmB;IACxE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE;YACxC,KAAK,EAAE,GAAG,CAAC,IAAI;YACf,UAAU;YACV,IAAI;YACJ,GAAG;YACH,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,GAAkF;IAElF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,yHAAyH,CAC1H;SACA,QAAQ,CAAC,SAAS,EAAE,wCAAwC,CAAC;SAC7D,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,gDAAgD,CAAC;SAC3E,MAAM,CAAC,WAAW,EAAE,+DAA+D,CAAC;SACpF,MAAM,CACL,mBAAmB,EACnB,kFAAkF,CACnF;SACA,MAAM,CAAC,kBAAkB,EAAE,2DAA2D,CAAC;SACvF,WAAW,CACV,OAAO,EACP;;;;;;0GAMoG,CACrG;SACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,KAAkB,EAAE,GAAY,EAAE,EAAE;QAChE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Command } from "commander";
2
+ import type { CommandContext } from "../context.js";
3
+ import type { BatchItemRunner } from "../core/batch.js";
4
+ import { type RouteOutput } from "../core/route.js";
5
+ import { type View } from "../output.js";
6
+ export interface RouteFlags {
7
+ handlers?: string;
8
+ handlersJson?: string;
9
+ instructions?: string;
10
+ minConfidence?: string;
11
+ stateJson?: boolean;
12
+ failOn?: string;
13
+ }
14
+ export declare function resolveRequest(positional: string | undefined, flags: RouteFlags): unknown;
15
+ export declare function routeAction(positional: string | undefined, flags: RouteFlags, ctx: CommandContext): Promise<number>;
16
+ export declare function renderRoute(out: RouteOutput, ctx: CommandContext): View;
17
+ /** Batch: each row is a request routed with the shared handlers. */
18
+ export declare function prepareRouteBatch(flags: RouteFlags, ctx: CommandContext): BatchItemRunner;
19
+ export declare function registerRoute(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
@@ -0,0 +1,120 @@
1
+ import { buildRouteRequest, parseHandlerList, parseHandlers, ROUTE_FAIL_CONDITIONS, routeFailed, runRoute, } from "../core/route.js";
2
+ import { CliError, EXIT } from "../errors.js";
3
+ import { parseJson, readInput, readStdin } from "../input.js";
4
+ import { parseFailOn, parseProbability } from "../lib.js";
5
+ import { emit, formatProbability, paint } from "../output.js";
6
+ function resolve(flags, ctx) {
7
+ if (Boolean(flags.handlers) === Boolean(flags.handlersJson)) {
8
+ throw new CliError("Provide exactly one of --handlers <list> or --handlers-json <ref>.");
9
+ }
10
+ let handlers;
11
+ try {
12
+ handlers = flags.handlers
13
+ ? parseHandlerList(flags.handlers)
14
+ : parseHandlers(parseJson(readInput(flags.handlersJson, "handlers"), "handlers"));
15
+ }
16
+ catch (err) {
17
+ if (err instanceof CliError)
18
+ throw err;
19
+ throw new CliError(err.message);
20
+ }
21
+ const minConfidence = parseProbability("--min-confidence", flags.minConfidence, ctx.config.route.minConfidence);
22
+ const failOn = parseFailOn(flags.failOn, ROUTE_FAIL_CONDITIONS, []);
23
+ return { handlers, minConfidence, failOn };
24
+ }
25
+ export function resolveRequest(positional, flags) {
26
+ let raw;
27
+ if (positional !== undefined)
28
+ raw = readInput(positional, "request");
29
+ else if (!process.stdin.isTTY)
30
+ raw = readStdin("request");
31
+ else
32
+ throw new CliError("Provide the request as an argument, @file, or pipe it on stdin.");
33
+ return flags.stateJson ? parseJson(raw, "request") : raw;
34
+ }
35
+ export async function routeAction(positional, flags, ctx) {
36
+ const { handlers, minConfidence, failOn } = resolve(flags, ctx);
37
+ const request = resolveRequest(positional, flags);
38
+ if (ctx.dryRun) {
39
+ const { state, questions } = buildRouteRequest({ request, handlers, instructions: flags.instructions });
40
+ emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
41
+ return EXIT.OK;
42
+ }
43
+ const output = await runRoute(ctx.ask(), {
44
+ request,
45
+ handlers,
46
+ instructions: flags.instructions,
47
+ minConfidence,
48
+ });
49
+ emit(ctx.output, output, () => renderRoute(output, ctx));
50
+ return routeFailed(output, failOn) ? EXIT.JUDGMENT : EXIT.OK;
51
+ }
52
+ export function renderRoute(out, ctx) {
53
+ const c = ctx.output.color;
54
+ const dist = Object.entries(out.probabilities)
55
+ .sort(([, a], [, b]) => b - a)
56
+ .map(([k, v]) => `${k} ${formatProbability(v)}`)
57
+ .join(", ");
58
+ const head = [
59
+ out.handler === null
60
+ ? `${paint(c, ["bold", "yellow"], "no handler")} conf ${formatProbability(out.confidence)}`
61
+ : `${paint(c, ["bold", "green"], out.handler)} conf ${formatProbability(out.confidence)} ${out.action === "review" ? paint(c, "yellow", "review") : paint(c, "dim", "auto")}`,
62
+ paint(c, "dim", `[${dist}]`),
63
+ ];
64
+ const kv = [
65
+ ["handler", out.handler ?? ""],
66
+ ["confidence", formatProbability(out.confidence)],
67
+ ["action", out.action],
68
+ ];
69
+ for (const [name, a] of Object.entries(out.args)) {
70
+ const extra = a.type === "noul" ? `p ${formatProbability(a.probability)}` : `conf ${formatProbability(a.confidence)}`;
71
+ head.push(` ${name} = ${a.value === null ? paint(c, "dim", "unspecified") : paint(c, "green", String(a.value))} ${paint(c, "dim", extra)}`);
72
+ kv.push([`arg.${name}`, a.value === null ? "" : String(a.value)]);
73
+ }
74
+ return { head, kv, usage: { usage: out.usage, model: out.model, provider: out.provider } };
75
+ }
76
+ /** Batch: each row is a request routed with the shared handlers. */
77
+ export function prepareRouteBatch(flags, ctx) {
78
+ const { handlers, minConfidence, failOn } = resolve(flags, ctx);
79
+ return async (row) => {
80
+ const request = row.state !== undefined && typeof row.state !== "string"
81
+ ? row.state
82
+ : flags.stateJson
83
+ ? parseJson(row.text, `row ${row.id}`)
84
+ : row.text;
85
+ const output = await runRoute(ctx.ask(), {
86
+ request,
87
+ handlers,
88
+ instructions: flags.instructions,
89
+ minConfidence,
90
+ });
91
+ return { output, failed: routeFailed(output, failOn) };
92
+ };
93
+ }
94
+ export function registerRoute(program, run) {
95
+ program
96
+ .command("route")
97
+ .description("Pick the handler for a request and fill its arguments from closed sets, in one call.")
98
+ .argument("[request]", "the request text, @file, or - for stdin (default: stdin)")
99
+ .option("-H, --handlers <list>", "handlers without arguments: name:description,name2:description")
100
+ .option("--handlers-json <ref>", "handlers with arguments as JSON (see below)")
101
+ .option("-i, --instructions <text>", "the routing question to ask instead of the default")
102
+ .option("--min-confidence <p>", "confidence below which the route is flagged 'review' (default 0.6)")
103
+ .option("--state-json", "parse the request as JSON")
104
+ .option("--fail-on <list>", `exit 2 when: ${ROUTE_FAIL_CONDITIONS.join(", ")} (no handler fits), or none (default none)`)
105
+ .addHelpText("after", `
106
+ Handlers JSON: {"name": "description" | null | {"description": "...", "args": {"argName": spec}}}
107
+ spec: {"type": "choice", "options": ["a","b"] | {"a": "desc"}, "instructions"?: "..."}
108
+ {"type": "noul", "instructions": "yes/no question"}
109
+ {"type": "score", "levels": ["low","mid","high"], "instructions"?: "..."}
110
+ A "none" option is always added so the model can say nothing fits (action: none).
111
+ Argument questions for every handler run in the same request; only the chosen handler's are returned.
112
+
113
+ Examples:
114
+ jev route "cancel my order and refund me" -H "refund:money back,cancel:stop an order,support:everything else"
115
+ jev route @message.txt --handlers-json @handlers.json --fail-on review,unrouted --json`)
116
+ .action(async (request, flags, cmd) => {
117
+ await run((ctx) => routeAction(request, flags, ctx), cmd);
118
+ });
119
+ }
120
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/commands/route.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 ScreenOutput } from "../core/screen.js";
5
+ import { type View } from "../output.js";
4
6
  export interface ScreenFlags {
5
7
  purpose?: string;
6
8
  blockAt?: string;
@@ -9,5 +11,7 @@ export interface ScreenFlags {
9
11
  }
10
12
  export declare function resolveScreenText(positional: string | undefined): string;
11
13
  export declare function screenAction(positional: string | undefined, flags: ScreenFlags, ctx: CommandContext): Promise<number>;
12
- export declare function renderScreen(out: ScreenOutput, ctx: CommandContext): string;
14
+ export declare function renderScreen(out: ScreenOutput, ctx: CommandContext): View;
13
15
  export declare function registerScreen(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
16
+ /** Batch: each row's text is screened with the shared flags. */
17
+ export declare function prepareScreenBatch(flags: ScreenFlags, ctx: CommandContext): BatchItemRunner;
@@ -2,7 +2,7 @@ import { buildScreenRequest, runScreen, SCREEN_FAIL_CONDITIONS, screenFailed, }
2
2
  import { CliError, EXIT } from "../errors.js";
3
3
  import { readInput, readStdin } from "../input.js";
4
4
  import { parseFailOn, parseProbability } from "../lib.js";
5
- import { emit, formatProbability, paint, usageLine } from "../output.js";
5
+ import { emit, formatProbability, paint } from "../output.js";
6
6
  export function resolveScreenText(positional) {
7
7
  if (positional !== undefined)
8
8
  return readInput(positional, "text");
@@ -17,7 +17,7 @@ export async function screenAction(positional, flags, ctx) {
17
17
  const failOn = parseFailOn(flags.failOn, SCREEN_FAIL_CONDITIONS, ["block"]);
18
18
  if (ctx.dryRun) {
19
19
  const { state, questions } = buildScreenRequest({ text, purpose: flags.purpose });
20
- emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => "");
20
+ emit({ ...ctx.output, format: "json" }, { model: ctx.config.model, state, questions }, () => ({}));
21
21
  return EXIT.OK;
22
22
  }
23
23
  const output = await runScreen(ctx.ask(), { text, purpose: flags.purpose, blockAt, reviewAt });
@@ -35,14 +35,21 @@ export function renderScreen(out, ctx) {
35
35
  ? paint(c, ["bold", "dim"], action.toUpperCase())
36
36
  : paint(c, ["bold", "green"], action.toUpperCase());
37
37
  const p = out.probabilities;
38
- const lines = [
39
- `${styled} ${out.recommendation.reason}`,
40
- `injection ${formatProbability(p.injection)} · substance ${formatProbability(p.substance)} · relevance ${formatProbability(p.relevance)}`,
41
- paint(c, "dim", `thresholds: block ≥ ${out.thresholds.block_at}, review ${out.thresholds.review_at}`),
42
- ];
43
- if (!ctx.output.quiet)
44
- lines.push(paint(c, "dim", usageLine(out.usage, out.model, out.provider)));
45
- return lines.join("\n");
38
+ return {
39
+ head: [
40
+ `${styled} ${out.recommendation.reason}`,
41
+ `injection ${formatProbability(p.injection)} · substance ${formatProbability(p.substance)} · relevance ${formatProbability(p.relevance)}`,
42
+ paint(c, "dim", `thresholds: block ≥ ${out.thresholds.block_at}, review ≥ ${out.thresholds.review_at}`),
43
+ ],
44
+ kv: [
45
+ ["action", action],
46
+ ["reason", out.recommendation.reason],
47
+ ["injection", formatProbability(p.injection)],
48
+ ["substance", formatProbability(p.substance)],
49
+ ["relevance", formatProbability(p.relevance)],
50
+ ],
51
+ usage: { usage: out.usage, model: out.model, provider: out.provider },
52
+ };
46
53
  }
47
54
  export function registerScreen(program, run) {
48
55
  program
@@ -61,4 +68,14 @@ Examples:
61
68
  await run((ctx) => screenAction(text, flags, ctx), cmd);
62
69
  });
63
70
  }
71
+ /** Batch: each row's text is screened with the shared flags. */
72
+ export function prepareScreenBatch(flags, ctx) {
73
+ const blockAt = parseProbability("--block-at", flags.blockAt, ctx.config.screen.blockAt);
74
+ const reviewAt = parseProbability("--review-at", flags.reviewAt, ctx.config.screen.reviewAt);
75
+ const failOn = parseFailOn(flags.failOn, SCREEN_FAIL_CONDITIONS, ["block"]);
76
+ return async (row) => {
77
+ const output = await runScreen(ctx.ask(), { text: row.text, purpose: flags.purpose, blockAt, reviewAt });
78
+ return { output, failed: screenFailed(output, failOn) };
79
+ };
80
+ }
64
81
  //# sourceMappingURL=screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/commands/screen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/commands/screen.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 VerifyOutput } from "../core/verify.js";
5
+ import { type View } from "../output.js";
4
6
  export interface VerifyFlags {
5
7
  evidence?: string[];
6
8
  evidenceJson?: string;
@@ -14,5 +16,7 @@ export declare function collectEvidence(flags: VerifyFlags): {
14
16
  }[];
15
17
  export declare function collectClaims(positional: string[], flags: VerifyFlags): string[];
16
18
  export declare function verifyAction(positional: string[], flags: VerifyFlags, ctx: CommandContext): Promise<number>;
17
- export declare function renderVerify(out: VerifyOutput, ctx: CommandContext): string;
19
+ export declare function renderVerify(out: VerifyOutput, ctx: CommandContext): View;
18
20
  export declare function registerVerify(program: Command, run: (fn: (ctx: CommandContext) => Promise<number>, cmd: Command) => Promise<void>): void;
21
+ /** Batch: each row is one claim checked against the shared evidence. */
22
+ export declare function prepareVerifyBatch(flags: VerifyFlags, ctx: CommandContext): BatchItemRunner;