@zephyrdeng/pi-review 0.15.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/README.zh-CN.md +17 -2
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +22 -0
- package/dist/args.js.map +1 -1
- package/dist/classify.d.ts +36 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +171 -0
- package/dist/classify.js.map +1 -0
- package/dist/classify.test.d.ts +2 -0
- package/dist/classify.test.d.ts.map +1 -0
- package/dist/classify.test.js +76 -0
- package/dist/classify.test.js.map +1 -0
- package/dist/cli.js +34 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/jev.d.ts +100 -0
- package/dist/jev.d.ts.map +1 -0
- package/dist/jev.js +250 -0
- package/dist/jev.js.map +1 -0
- package/dist/jev.test.d.ts +2 -0
- package/dist/jev.test.d.ts.map +1 -0
- package/dist/jev.test.js +154 -0
- package/dist/jev.test.js.map +1 -0
- package/dist/loop.d.ts +18 -1
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +39 -0
- package/dist/loop.js.map +1 -1
- package/dist/loop.test.js +36 -0
- package/dist/loop.test.js.map +1 -1
- package/dist/matcher.d.ts +16 -3
- package/dist/matcher.d.ts.map +1 -1
- package/dist/matcher.js +31 -12
- package/dist/matcher.js.map +1 -1
- package/dist/matcher.test.js +30 -6
- package/dist/matcher.test.js.map +1 -1
- package/dist/meta-footer.d.ts.map +1 -1
- package/dist/meta-footer.js +6 -2
- package/dist/meta-footer.js.map +1 -1
- package/dist/panel-cli.test.js +145 -3
- package/dist/panel-cli.test.js.map +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +41 -4
- package/dist/panel.js.map +1 -1
- package/dist/pi-config.d.ts +7 -0
- package/dist/pi-config.d.ts.map +1 -1
- package/dist/pi-config.js +8 -0
- package/dist/pi-config.js.map +1 -1
- package/dist/round-compare.d.ts +23 -0
- package/dist/round-compare.d.ts.map +1 -0
- package/dist/round-compare.js +45 -0
- package/dist/round-compare.js.map +1 -0
- package/dist/round-compare.test.d.ts +2 -0
- package/dist/round-compare.test.d.ts.map +1 -0
- package/dist/round-compare.test.js +63 -0
- package/dist/round-compare.test.js.map +1 -0
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/extensions/rv-config.ts +16 -0
- package/package.json +1 -1
- package/resources/providers/orcarouter.toml +11 -0
- package/skills/pi-review/SKILL.md +14 -1
- package/dist/extensions/review.d.ts +0 -2
- package/dist/extensions/review.js +0 -22
- package/dist/extensions/rv-prompts.d.ts +0 -19
- package/dist/extensions/rv-prompts.js +0 -132
package/dist/index.d.ts
CHANGED
|
@@ -12,11 +12,17 @@ export { createReviewEventEmitter, redactReviewEventPayload, redactReviewEventTe
|
|
|
12
12
|
export type { ReviewEvent, ReviewEventListener, ReviewerIdentity } from "./review-events.js";
|
|
13
13
|
export { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
14
14
|
export type { LoopReviewResult, LoopRoundSummary, LoopRoundPanelSummary, LoopStopReason, LoopUntilGoal, RunOneReview, RunReviewLoopOptions } from "./loop.js";
|
|
15
|
+
export { compareRoundFindings } from "./round-compare.js";
|
|
16
|
+
export type { RoundComparison, RoundFindingRef } from "./round-compare.js";
|
|
15
17
|
export { LOOP_CLEAN_GOAL } from "./loop.js";
|
|
16
18
|
export { aggregatePanel, effectiveThreshold } from "./panel-aggregate.js";
|
|
17
19
|
export type { PanelAggregationInput } from "./panel-aggregate.js";
|
|
18
20
|
export { DeterministicMatcher, SemanticMatcher } from "./matcher.js";
|
|
19
21
|
export type { FindingMatcher, MatchResult, SemanticAdjudicator, AdjudicationRequest, AdjudicationResponse, AdjudicationMerge, AdjudicationCandidate } from "./matcher.js";
|
|
22
|
+
export { createJevAdjudicator, hasJevApiKey, resolveJev, resolveJevConnection, withAdjudicationFallback, evaluateNouls, evaluateChoices } from "./jev.js";
|
|
23
|
+
export type { JevConnection, JevDecision } from "./jev.js";
|
|
24
|
+
export { classifyFindings, formatClassifyAscii, parseMetaFindings, resolveBaseline, SCOPE_CLASSES, CLASSIFY_CONFIDENCE_FLOOR } from "./classify.js";
|
|
25
|
+
export type { ClassifiedFinding, ClassifyResult, ScopeClass } from "./classify.js";
|
|
20
26
|
export { resolvePanelConfig } from "./panel-config.js";
|
|
21
27
|
export type { ResolvedPanelConfig } from "./panel-config.js";
|
|
22
28
|
export { makeRunSessionDir, newestJsonl } from "./session.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,9 +8,12 @@ export { spawnStreamingChild } from "./child-process.js";
|
|
|
8
8
|
export { createPanelViewState, reducePanelEvent } from "./panel-view.js";
|
|
9
9
|
export { createReviewEventEmitter, redactReviewEventPayload, redactReviewEventText, REVIEW_EVENT_VERSION, REVIEW_EVENT_TEXT_LIMIT } from "./review-events.js";
|
|
10
10
|
export { formatLoopSummary, runReviewLoop } from "./loop.js";
|
|
11
|
+
export { compareRoundFindings } from "./round-compare.js";
|
|
11
12
|
export { LOOP_CLEAN_GOAL } from "./loop.js";
|
|
12
13
|
export { aggregatePanel, effectiveThreshold } from "./panel-aggregate.js";
|
|
13
14
|
export { DeterministicMatcher, SemanticMatcher } from "./matcher.js";
|
|
15
|
+
export { createJevAdjudicator, hasJevApiKey, resolveJev, resolveJevConnection, withAdjudicationFallback, evaluateNouls, evaluateChoices } from "./jev.js";
|
|
16
|
+
export { classifyFindings, formatClassifyAscii, parseMetaFindings, resolveBaseline, SCOPE_CLASSES, CLASSIFY_CONFIDENCE_FLOOR } from "./classify.js";
|
|
14
17
|
export { resolvePanelConfig } from "./panel-config.js";
|
|
15
18
|
export { makeRunSessionDir, newestJsonl } from "./session.js";
|
|
16
19
|
export { REVIEW_STATUSES, VERDICTS, CONSENSUS_POLICIES, MAX_REVIEWERS, PANEL_READ_ONLY_TOOLS, DEFAULT_PANEL_MIN_AGREE, REVIEW_META_VERSION, } from "./types.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACzI,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,SAAS,EACT,SAAS,EACT,aAAa,EACb,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,+BAA+B,EAC/B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE9J,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA2B9D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/L,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,6BAA6B,EAC7B,gCAAgC,EAChC,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/jev.d.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { SemanticAdjudicator } from "./matcher.js";
|
|
2
|
+
import type { ConfigSource, PiReviewConfig } from "./pi-config.js";
|
|
3
|
+
export declare const DEFAULT_JEV_BASE_URL = "https://api.typesafe.ai";
|
|
4
|
+
export declare const DEFAULT_JEV_MODEL = "jev-latest";
|
|
5
|
+
export declare const JEV_TIMEOUT_MS = 15000;
|
|
6
|
+
/** Effective on/off decision for the Jev enhancement layer. */
|
|
7
|
+
export interface JevDecision {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
source: ConfigSource;
|
|
10
|
+
}
|
|
11
|
+
/** True when a TypeSafe API key is available in the environment. */
|
|
12
|
+
export declare function hasJevApiKey(env?: NodeJS.ProcessEnv): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Enhancement mode resolution, mirroring resolveChildExtensions:
|
|
15
|
+
* PI_REVIEW_JEV (1/true/on enable, any other set value disables) overrides the
|
|
16
|
+
* config file `jev` key, which overrides the default of "on when
|
|
17
|
+
* TYPESAFE_API_KEY is present".
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveJev(env: NodeJS.ProcessEnv, cfg: PiReviewConfig): JevDecision;
|
|
20
|
+
/** Connection parameters for the TypeSafe System One API. */
|
|
21
|
+
export interface JevConnection {
|
|
22
|
+
apiKey: string;
|
|
23
|
+
baseUrl: string;
|
|
24
|
+
model: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve connection parameters, or undefined when no key is configured.
|
|
28
|
+
* The key comes from TYPESAFE_API_KEY only; it is never logged or persisted.
|
|
29
|
+
* TYPESAFE_BASE_URL allows pointing at a compatible endpoint (e.g. an
|
|
30
|
+
* openjev-style local server), PI_REVIEW_JEV_MODEL pins the model id.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveJevConnection(env?: NodeJS.ProcessEnv): JevConnection | undefined;
|
|
33
|
+
export declare class JevError extends Error {
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
export interface JevUsage {
|
|
37
|
+
inputTokens: number;
|
|
38
|
+
outputTokens: number;
|
|
39
|
+
}
|
|
40
|
+
export interface JevNoulResult {
|
|
41
|
+
/** Per-question probability that the answer is "yes"; ids with a missing or malformed answer are absent. */
|
|
42
|
+
probabilities: Record<string, number>;
|
|
43
|
+
/** Question ids the API omitted or returned in an unexpected shape. */
|
|
44
|
+
missing: string[];
|
|
45
|
+
usage?: JevUsage;
|
|
46
|
+
model?: string;
|
|
47
|
+
}
|
|
48
|
+
export type JevFetch = typeof fetch;
|
|
49
|
+
/**
|
|
50
|
+
* One System One call fanning out every Noul question in parallel. Throws
|
|
51
|
+
* JevError on transport, HTTP, or envelope-level failures; individual missing
|
|
52
|
+
* answers are reported in `missing` instead (treated as "no" by callers).
|
|
53
|
+
*/
|
|
54
|
+
export declare function evaluateNouls(connection: JevConnection, state: unknown, questions: Record<string, string>, fetchImpl?: JevFetch): Promise<JevNoulResult>;
|
|
55
|
+
/** One Choice answer: the selected option plus its probability distribution peak. */
|
|
56
|
+
export interface JevChoiceAnswer {
|
|
57
|
+
choice: string;
|
|
58
|
+
confidence: number;
|
|
59
|
+
}
|
|
60
|
+
export interface JevChoiceResult {
|
|
61
|
+
/** Per-question selected option; ids with a missing or malformed answer are absent. */
|
|
62
|
+
answers: Record<string, JevChoiceAnswer>;
|
|
63
|
+
/** Question ids the API omitted or returned in an unexpected shape. */
|
|
64
|
+
missing: string[];
|
|
65
|
+
usage?: JevUsage;
|
|
66
|
+
model?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* One System One call fanning out Choice questions. `criteria` maps each
|
|
70
|
+
* option id to its plain-language description; an explicit escape option
|
|
71
|
+
* (e.g. "other") belongs in the caller's criteria, per the Jev docs' advice.
|
|
72
|
+
*/
|
|
73
|
+
export declare function evaluateChoices(connection: JevConnection, state: unknown, questions: Record<string, {
|
|
74
|
+
instructions: string;
|
|
75
|
+
criteria: Record<string, string>;
|
|
76
|
+
}>, fetchImpl?: JevFetch): Promise<JevChoiceResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Jev-backed SemanticAdjudicator. Every unordered finding pair inside a
|
|
79
|
+
* candidate group becomes one Noul question; all pairs across all groups go
|
|
80
|
+
* out in a single System One call. Each pair above the no-merge floor becomes
|
|
81
|
+
* a proposed merge whose confidence is the pair probability — the matcher's
|
|
82
|
+
* union-find and SEMANTIC_MATCH_CONFIDENCE_THRESHOLD stay the single policy
|
|
83
|
+
* point, and its provenance validation re-checks every id we emit.
|
|
84
|
+
*/
|
|
85
|
+
export declare function createJevAdjudicator(connection: JevConnection, options?: {
|
|
86
|
+
fetchImpl?: JevFetch;
|
|
87
|
+
}): SemanticAdjudicator;
|
|
88
|
+
/** Adjudicator wrapper with its runtime-resolved engine and fallback note. */
|
|
89
|
+
export interface AdjudicatorWithEngine {
|
|
90
|
+
adjudicator: SemanticAdjudicator;
|
|
91
|
+
engine(): "jev" | "pi";
|
|
92
|
+
note(): string | undefined;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Enhancement wrapper: try the Jev adjudicator first; on any failure degrade
|
|
96
|
+
* to the Pi adjudicator so a Jev outage can never make a panel worse than the
|
|
97
|
+
* pre-Jev behavior. The engine/note getters settle after adjudication ran.
|
|
98
|
+
*/
|
|
99
|
+
export declare function withAdjudicationFallback(primary: SemanticAdjudicator, fallback: SemanticAdjudicator, onFallback?: (message: string) => void): AdjudicatorWithEngine;
|
|
100
|
+
//# sourceMappingURL=jev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../src/jev.ts"],"names":[],"mappings":"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"}
|
package/dist/jev.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
// Jev (TypeSafe System One) typed-decision backend — enhancement mode.
|
|
2
|
+
//
|
|
3
|
+
// pi-review keeps generation with the big models: reviewers produce findings,
|
|
4
|
+
// evidence, and prose. The typed micro-decisions that used to require a whole
|
|
5
|
+
// review-only Pi child session route to Jev instead. Today that is panel
|
|
6
|
+
// consensus adjudication: deciding which same-path findings describe the same
|
|
7
|
+
// underlying issue. Jev never sees the repository — only the structured
|
|
8
|
+
// candidate findings the deterministic matcher could not separate — and its
|
|
9
|
+
// probabilities flow through the same confidence threshold the LLM
|
|
10
|
+
// adjudicator's merges used (SemanticMatcher re-validates every merge).
|
|
11
|
+
export const DEFAULT_JEV_BASE_URL = "https://api.typesafe.ai";
|
|
12
|
+
export const DEFAULT_JEV_MODEL = "jev-latest";
|
|
13
|
+
export const JEV_TIMEOUT_MS = 15_000;
|
|
14
|
+
/** True when a TypeSafe API key is available in the environment. */
|
|
15
|
+
export function hasJevApiKey(env = process.env) {
|
|
16
|
+
return Boolean(env.TYPESAFE_API_KEY?.trim());
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Enhancement mode resolution, mirroring resolveChildExtensions:
|
|
20
|
+
* PI_REVIEW_JEV (1/true/on enable, any other set value disables) overrides the
|
|
21
|
+
* config file `jev` key, which overrides the default of "on when
|
|
22
|
+
* TYPESAFE_API_KEY is present".
|
|
23
|
+
*/
|
|
24
|
+
export function resolveJev(env, cfg) {
|
|
25
|
+
const raw = env.PI_REVIEW_JEV?.trim().toLowerCase();
|
|
26
|
+
if (raw === "1" || raw === "true" || raw === "on")
|
|
27
|
+
return { enabled: true, source: "env" };
|
|
28
|
+
if (raw !== undefined && raw !== "")
|
|
29
|
+
return { enabled: false, source: "env" };
|
|
30
|
+
if (cfg.jev !== undefined)
|
|
31
|
+
return { enabled: cfg.jev, source: "config" };
|
|
32
|
+
return { enabled: hasJevApiKey(env), source: "default" };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve connection parameters, or undefined when no key is configured.
|
|
36
|
+
* The key comes from TYPESAFE_API_KEY only; it is never logged or persisted.
|
|
37
|
+
* TYPESAFE_BASE_URL allows pointing at a compatible endpoint (e.g. an
|
|
38
|
+
* openjev-style local server), PI_REVIEW_JEV_MODEL pins the model id.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveJevConnection(env = process.env) {
|
|
41
|
+
const apiKey = env.TYPESAFE_API_KEY?.trim();
|
|
42
|
+
if (!apiKey)
|
|
43
|
+
return undefined;
|
|
44
|
+
return {
|
|
45
|
+
apiKey,
|
|
46
|
+
baseUrl: env.TYPESAFE_BASE_URL?.trim() || DEFAULT_JEV_BASE_URL,
|
|
47
|
+
model: env.PI_REVIEW_JEV_MODEL?.trim() || DEFAULT_JEV_MODEL,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export class JevError extends Error {
|
|
51
|
+
constructor(message) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = "JevError";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const NOUL_CRITERIA = {
|
|
57
|
+
true: "Both findings describe the same underlying issue (same root cause), even if worded differently.",
|
|
58
|
+
false: "The findings are distinct issues, or merely share a file or symptom category.",
|
|
59
|
+
};
|
|
60
|
+
/** Shared transport: one POST to /v1/systemone with the given typed questions. */
|
|
61
|
+
async function callSystemOne(connection, state, questionBody, fetchImpl) {
|
|
62
|
+
let response;
|
|
63
|
+
try {
|
|
64
|
+
response = await fetchImpl(`${connection.baseUrl}/v1/systemone`, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
headers: {
|
|
67
|
+
authorization: `Bearer ${connection.apiKey}`,
|
|
68
|
+
"content-type": "application/json",
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({ model: connection.model, state, questions: questionBody }),
|
|
71
|
+
signal: AbortSignal.timeout(JEV_TIMEOUT_MS),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
throw new JevError(`typesafe api request failed: ${error.message}`);
|
|
76
|
+
}
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
throw new JevError(`typesafe api http ${response.status}`);
|
|
79
|
+
}
|
|
80
|
+
let body;
|
|
81
|
+
try {
|
|
82
|
+
body = await response.json();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new JevError("typesafe api returned non-JSON body");
|
|
86
|
+
}
|
|
87
|
+
const record = body;
|
|
88
|
+
const answers = record.answers;
|
|
89
|
+
if (!answers || typeof answers !== "object" || Array.isArray(answers)) {
|
|
90
|
+
throw new JevError("typesafe api response is missing the answers object");
|
|
91
|
+
}
|
|
92
|
+
const usageRaw = record.usage;
|
|
93
|
+
const usage = usageRaw && typeof usageRaw.input_tokens === "number"
|
|
94
|
+
? { inputTokens: usageRaw.input_tokens, outputTokens: typeof usageRaw.output_tokens === "number" ? usageRaw.output_tokens : 0 }
|
|
95
|
+
: undefined;
|
|
96
|
+
return {
|
|
97
|
+
answers: answers,
|
|
98
|
+
...(usage ? { usage } : {}),
|
|
99
|
+
...(typeof record.model === "string" ? { model: record.model } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* One System One call fanning out every Noul question in parallel. Throws
|
|
104
|
+
* JevError on transport, HTTP, or envelope-level failures; individual missing
|
|
105
|
+
* answers are reported in `missing` instead (treated as "no" by callers).
|
|
106
|
+
*/
|
|
107
|
+
export async function evaluateNouls(connection, state, questions, fetchImpl = fetch) {
|
|
108
|
+
const questionBody = Object.fromEntries(Object.entries(questions).map(([id, instructions]) => [
|
|
109
|
+
id,
|
|
110
|
+
{ type: "noul", instructions, criteria: { ...NOUL_CRITERIA } },
|
|
111
|
+
]));
|
|
112
|
+
const envelope = await callSystemOne(connection, state, questionBody, fetchImpl);
|
|
113
|
+
const probabilities = {};
|
|
114
|
+
const missing = [];
|
|
115
|
+
for (const id of Object.keys(questions)) {
|
|
116
|
+
const answer = envelope.answers[id];
|
|
117
|
+
const noul = answer?.noul;
|
|
118
|
+
if (answer?.type === "noul" && typeof noul === "number" && Number.isFinite(noul) && noul >= 0 && noul <= 1) {
|
|
119
|
+
probabilities[id] = noul;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
missing.push(id);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
probabilities,
|
|
127
|
+
missing,
|
|
128
|
+
...(envelope.usage ? { usage: envelope.usage } : {}),
|
|
129
|
+
...(envelope.model ? { model: envelope.model } : {}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* One System One call fanning out Choice questions. `criteria` maps each
|
|
134
|
+
* option id to its plain-language description; an explicit escape option
|
|
135
|
+
* (e.g. "other") belongs in the caller's criteria, per the Jev docs' advice.
|
|
136
|
+
*/
|
|
137
|
+
export async function evaluateChoices(connection, state, questions, fetchImpl = fetch) {
|
|
138
|
+
const questionBody = Object.fromEntries(Object.entries(questions).map(([id, question]) => [
|
|
139
|
+
id,
|
|
140
|
+
{ type: "choice", instructions: question.instructions, criteria: question.criteria },
|
|
141
|
+
]));
|
|
142
|
+
const envelope = await callSystemOne(connection, state, questionBody, fetchImpl);
|
|
143
|
+
const answers = {};
|
|
144
|
+
const missing = [];
|
|
145
|
+
for (const id of Object.keys(questions)) {
|
|
146
|
+
const answer = envelope.answers[id];
|
|
147
|
+
const choice = answer?.choice;
|
|
148
|
+
const confidence = answer?.confidence;
|
|
149
|
+
if (answer?.type === "choice" &&
|
|
150
|
+
typeof choice === "string" &&
|
|
151
|
+
choice in questions[id].criteria &&
|
|
152
|
+
typeof confidence === "number" &&
|
|
153
|
+
Number.isFinite(confidence) &&
|
|
154
|
+
confidence >= 0 &&
|
|
155
|
+
confidence <= 1) {
|
|
156
|
+
answers[id] = { choice, confidence };
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
missing.push(id);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
answers,
|
|
164
|
+
missing,
|
|
165
|
+
...(envelope.usage ? { usage: envelope.usage } : {}),
|
|
166
|
+
...(envelope.model ? { model: envelope.model } : {}),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Jev-backed SemanticAdjudicator. Every unordered finding pair inside a
|
|
171
|
+
* candidate group becomes one Noul question; all pairs across all groups go
|
|
172
|
+
* out in a single System One call. Each pair above the no-merge floor becomes
|
|
173
|
+
* a proposed merge whose confidence is the pair probability — the matcher's
|
|
174
|
+
* union-find and SEMANTIC_MATCH_CONFIDENCE_THRESHOLD stay the single policy
|
|
175
|
+
* point, and its provenance validation re-checks every id we emit.
|
|
176
|
+
*/
|
|
177
|
+
export function createJevAdjudicator(connection, options = {}) {
|
|
178
|
+
return {
|
|
179
|
+
async adjudicate(request) {
|
|
180
|
+
const questions = {};
|
|
181
|
+
// question id -> [aId, bId]; pairs never span candidate groups, so no
|
|
182
|
+
// merge can cross a path anchor by construction.
|
|
183
|
+
const pairs = new Map();
|
|
184
|
+
request.candidates.forEach((candidate, groupIndex) => {
|
|
185
|
+
const findings = candidate.findings;
|
|
186
|
+
for (let i = 0; i < findings.length; i += 1) {
|
|
187
|
+
for (let j = i + 1; j < findings.length; j += 1) {
|
|
188
|
+
const a = findings[i];
|
|
189
|
+
const b = findings[j];
|
|
190
|
+
const id = `g${groupIndex}p${i}_${j}`;
|
|
191
|
+
questions[id] =
|
|
192
|
+
`Do findings ${a.id} and ${b.id} describe the same underlying issue? ` +
|
|
193
|
+
"Merge only when they share a root cause, not when they merely mention the same file or symptom category.";
|
|
194
|
+
pairs.set(id, [a.id, b.id]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
if (pairs.size === 0)
|
|
199
|
+
return { merges: [] };
|
|
200
|
+
const state = {
|
|
201
|
+
candidates: request.candidates.map((candidate) => ({
|
|
202
|
+
anchorPath: candidate.anchorPath,
|
|
203
|
+
findings: candidate.findings.map((sf) => ({
|
|
204
|
+
id: sf.id,
|
|
205
|
+
reviewer: sf.reviewerId,
|
|
206
|
+
path: sf.finding.path ?? null,
|
|
207
|
+
summary: sf.finding.summary,
|
|
208
|
+
actionable: sf.finding.actionable,
|
|
209
|
+
})),
|
|
210
|
+
})),
|
|
211
|
+
};
|
|
212
|
+
const result = await evaluateNouls(connection, state, questions, options.fetchImpl);
|
|
213
|
+
const merges = [];
|
|
214
|
+
for (const [questionId, [aId, bId]] of pairs) {
|
|
215
|
+
const probability = result.probabilities[questionId];
|
|
216
|
+
if (probability === undefined)
|
|
217
|
+
continue; // missing answer: conservative no-merge
|
|
218
|
+
merges.push({ sourceFindingIds: [aId, bId], confidence: probability });
|
|
219
|
+
}
|
|
220
|
+
return { merges };
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Enhancement wrapper: try the Jev adjudicator first; on any failure degrade
|
|
226
|
+
* to the Pi adjudicator so a Jev outage can never make a panel worse than the
|
|
227
|
+
* pre-Jev behavior. The engine/note getters settle after adjudication ran.
|
|
228
|
+
*/
|
|
229
|
+
export function withAdjudicationFallback(primary, fallback, onFallback) {
|
|
230
|
+
let engine = "jev";
|
|
231
|
+
let note;
|
|
232
|
+
return {
|
|
233
|
+
engine: () => engine,
|
|
234
|
+
note: () => note,
|
|
235
|
+
adjudicator: {
|
|
236
|
+
async adjudicate(request) {
|
|
237
|
+
try {
|
|
238
|
+
return await primary.adjudicate(request);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
engine = "pi";
|
|
242
|
+
note = `jev adjudication failed (${error.message}); fell back to the Pi adjudicator`;
|
|
243
|
+
onFallback?.(note);
|
|
244
|
+
return fallback.adjudicate(request);
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=jev.js.map
|
package/dist/jev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.js","sourceRoot":"","sources":["../src/jev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.test.d.ts","sourceRoot":"","sources":["../src/jev.test.ts"],"names":[],"mappings":""}
|
package/dist/jev.test.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "vitest";
|
|
3
|
+
import { createJevAdjudicator, evaluateNouls, hasJevApiKey, resolveJev, resolveJevConnection, withAdjudicationFallback, JevError, } from "./jev.js";
|
|
4
|
+
const CONN = { apiKey: "test-key", baseUrl: "https://example.test", model: "jev-test" };
|
|
5
|
+
function env(overrides) {
|
|
6
|
+
return { ...overrides };
|
|
7
|
+
}
|
|
8
|
+
test("hasJevApiKey requires a non-blank TYPESAFE_API_KEY", () => {
|
|
9
|
+
assert.equal(hasJevApiKey(env({})), false);
|
|
10
|
+
assert.equal(hasJevApiKey(env({ TYPESAFE_API_KEY: " " })), false);
|
|
11
|
+
assert.equal(hasJevApiKey(env({ TYPESAFE_API_KEY: "sk-x" })), true);
|
|
12
|
+
});
|
|
13
|
+
test("resolveJev: env truthy overrides config and default", () => {
|
|
14
|
+
assert.deepEqual(resolveJev(env({ PI_REVIEW_JEV: "1" }), {}), { enabled: true, source: "env" });
|
|
15
|
+
assert.deepEqual(resolveJev(env({ PI_REVIEW_JEV: "true" }), { jev: false }), { enabled: true, source: "env" });
|
|
16
|
+
assert.deepEqual(resolveJev(env({ PI_REVIEW_JEV: "on" }), {}), { enabled: true, source: "env" });
|
|
17
|
+
});
|
|
18
|
+
test("resolveJev: any other set env value disables", () => {
|
|
19
|
+
assert.deepEqual(resolveJev(env({ PI_REVIEW_JEV: "0", TYPESAFE_API_KEY: "sk-x" }), {}), { enabled: false, source: "env" });
|
|
20
|
+
assert.deepEqual(resolveJev(env({ PI_REVIEW_JEV: "off" }), { jev: true }), { enabled: false, source: "env" });
|
|
21
|
+
});
|
|
22
|
+
test("resolveJev: config beats the key-presence default", () => {
|
|
23
|
+
assert.deepEqual(resolveJev(env({ TYPESAFE_API_KEY: "sk-x" }), { jev: false }), { enabled: false, source: "config" });
|
|
24
|
+
assert.deepEqual(resolveJev(env({}), { jev: true }), { enabled: true, source: "config" });
|
|
25
|
+
});
|
|
26
|
+
test("resolveJev: default follows key presence (enhancement mode)", () => {
|
|
27
|
+
assert.deepEqual(resolveJev(env({ TYPESAFE_API_KEY: "sk-x" }), {}), { enabled: true, source: "default" });
|
|
28
|
+
assert.deepEqual(resolveJev(env({}), {}), { enabled: false, source: "default" });
|
|
29
|
+
});
|
|
30
|
+
test("resolveJevConnection honors overrides and never logs the key", () => {
|
|
31
|
+
assert.equal(resolveJevConnection(env({})), undefined);
|
|
32
|
+
const conn = resolveJevConnection(env({ TYPESAFE_API_KEY: "sk-secret" }));
|
|
33
|
+
assert.equal(conn.baseUrl, "https://api.typesafe.ai");
|
|
34
|
+
assert.equal(conn.model, "jev-latest");
|
|
35
|
+
const custom = resolveJevConnection(env({ TYPESAFE_API_KEY: "sk", TYPESAFE_BASE_URL: "http://127.0.0.1:8787", PI_REVIEW_JEV_MODEL: "jev-1.13.0" }));
|
|
36
|
+
assert.equal(custom.baseUrl, "http://127.0.0.1:8787");
|
|
37
|
+
assert.equal(custom.model, "jev-1.13.0");
|
|
38
|
+
});
|
|
39
|
+
function mockFetch(status, body) {
|
|
40
|
+
return (async () => ({
|
|
41
|
+
ok: status >= 200 && status < 300,
|
|
42
|
+
status,
|
|
43
|
+
json: async () => body,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
test("evaluateNouls sends one fan-out call and maps answers to probabilities", async () => {
|
|
47
|
+
let sentBody;
|
|
48
|
+
let sentAuth = "";
|
|
49
|
+
const fetchImpl = (async (_url, init) => {
|
|
50
|
+
sentBody = JSON.parse(init.body);
|
|
51
|
+
sentAuth = init.headers.authorization;
|
|
52
|
+
return {
|
|
53
|
+
ok: true,
|
|
54
|
+
status: 200,
|
|
55
|
+
json: async () => ({
|
|
56
|
+
model: "jev-1.13.0",
|
|
57
|
+
answers: { q1: { type: "noul", noul: 0.91 }, q2: { type: "noul", noul: 0.12 } },
|
|
58
|
+
usage: { input_tokens: 100, output_tokens: 8 },
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
const result = await evaluateNouls(CONN, { x: 1 }, { q1: "same?", q2: "same?" }, fetchImpl);
|
|
63
|
+
assert.equal(sentAuth, "Bearer test-key");
|
|
64
|
+
assert.equal(sentBody.model, "jev-test");
|
|
65
|
+
const questions = sentBody.questions;
|
|
66
|
+
assert.equal(questions.q1.type, "noul");
|
|
67
|
+
assert.equal(questions.q2.type, "noul");
|
|
68
|
+
assert.deepEqual(result.probabilities, { q1: 0.91, q2: 0.12 });
|
|
69
|
+
assert.deepEqual(result.missing, []);
|
|
70
|
+
assert.deepEqual(result.usage, { inputTokens: 100, outputTokens: 8 });
|
|
71
|
+
assert.equal(result.model, "jev-1.13.0");
|
|
72
|
+
});
|
|
73
|
+
test("evaluateNouls reports missing/malformed answers without failing the call", async () => {
|
|
74
|
+
const fetchImpl = mockFetch(200, { answers: { q1: { type: "noul", noul: 2 }, q3: { type: "noul", noul: 0.5 } } });
|
|
75
|
+
const result = await evaluateNouls(CONN, {}, { q1: "a", q2: "b", q3: "c" }, fetchImpl);
|
|
76
|
+
assert.deepEqual(result.probabilities, { q3: 0.5 });
|
|
77
|
+
assert.deepEqual(result.missing.sort(), ["q1", "q2"]);
|
|
78
|
+
});
|
|
79
|
+
test("evaluateNouls throws JevError on http failure and missing answers object", async () => {
|
|
80
|
+
await assert.rejects(evaluateNouls(CONN, {}, { q: "x" }, mockFetch(429, {})), JevError);
|
|
81
|
+
await assert.rejects(evaluateNouls(CONN, {}, { q: "x" }, mockFetch(200, { nope: 1 })), JevError);
|
|
82
|
+
const boom = (async () => { throw new Error("socket hangup"); });
|
|
83
|
+
await assert.rejects(evaluateNouls(CONN, {}, { q: "x" }, boom), /socket hangup/);
|
|
84
|
+
});
|
|
85
|
+
function candidate(anchorPath, ids) {
|
|
86
|
+
return {
|
|
87
|
+
anchorPath,
|
|
88
|
+
findings: ids.map((id) => ({
|
|
89
|
+
id,
|
|
90
|
+
reviewerId: id.split("#")[0],
|
|
91
|
+
finding: { summary: `summary for ${id}`, actionable: true, path: anchorPath },
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
test("createJevAdjudicator turns pair probabilities into per-pair merges", async () => {
|
|
96
|
+
const fetchImpl = (async (_url, init) => {
|
|
97
|
+
const body = JSON.parse(init.body);
|
|
98
|
+
const answers = {};
|
|
99
|
+
for (const id of Object.keys(body.questions))
|
|
100
|
+
answers[id] = { type: "noul", noul: 0.9 };
|
|
101
|
+
return { ok: true, status: 200, json: async () => ({ answers }) };
|
|
102
|
+
});
|
|
103
|
+
const adjudicator = createJevAdjudicator(CONN, { fetchImpl });
|
|
104
|
+
const response = await adjudicator.adjudicate({
|
|
105
|
+
candidates: [candidate("src/a.ts", ["r1#F1", "r2#F1", "r2#F2"])],
|
|
106
|
+
});
|
|
107
|
+
// 3 findings in one group => 3 pair questions, all merged with confidence = probability.
|
|
108
|
+
assert.equal(response.merges.length, 3);
|
|
109
|
+
assert.ok(response.merges.every((m) => m.confidence === 0.9));
|
|
110
|
+
assert.deepEqual(response.errors ?? [], []);
|
|
111
|
+
});
|
|
112
|
+
test("createJevAdjudicator: empty candidates short-circuit without a fetch", async () => {
|
|
113
|
+
let called = false;
|
|
114
|
+
const fetchImpl = (async () => { called = true; throw new Error("should not be called"); });
|
|
115
|
+
const adjudicator = createJevAdjudicator(CONN, { fetchImpl });
|
|
116
|
+
const response = await adjudicator.adjudicate({ candidates: [] });
|
|
117
|
+
assert.deepEqual(response, { merges: [] });
|
|
118
|
+
assert.equal(called, false);
|
|
119
|
+
});
|
|
120
|
+
test("createJevAdjudicator omits pairs whose answers are missing (conservative no-merge)", async () => {
|
|
121
|
+
const fetchImpl = mockFetch(200, { answers: { g0p0_1: { type: "noul", noul: 0.8 } } });
|
|
122
|
+
const adjudicator = createJevAdjudicator(CONN, { fetchImpl });
|
|
123
|
+
const response = await adjudicator.adjudicate({ candidates: [candidate("src/a.ts", ["r1#F1", "r2#F1"])] });
|
|
124
|
+
assert.equal(response.merges.length, 1);
|
|
125
|
+
assert.deepEqual(response.merges[0], { sourceFindingIds: ["r1#F1", "r2#F1"], confidence: 0.8 });
|
|
126
|
+
});
|
|
127
|
+
test("withAdjudicationFallback delegates and reports the engine switch", async () => {
|
|
128
|
+
const calls = [];
|
|
129
|
+
const primary = {
|
|
130
|
+
async adjudicate() { throw new JevError("http 500"); },
|
|
131
|
+
};
|
|
132
|
+
const fallback = {
|
|
133
|
+
async adjudicate() { calls.push("fallback"); return { merges: [] }; },
|
|
134
|
+
};
|
|
135
|
+
const notes = [];
|
|
136
|
+
const wrapped = withAdjudicationFallback(primary, fallback, (m) => notes.push(m));
|
|
137
|
+
assert.equal(wrapped.engine(), "jev");
|
|
138
|
+
const response = await wrapped.adjudicator.adjudicate({ candidates: [] });
|
|
139
|
+
assert.deepEqual(response, { merges: [] });
|
|
140
|
+
assert.deepEqual(calls, ["fallback"]);
|
|
141
|
+
assert.equal(wrapped.engine(), "pi");
|
|
142
|
+
assert.match(wrapped.note(), /jev adjudication failed/);
|
|
143
|
+
assert.equal(notes.length, 1);
|
|
144
|
+
});
|
|
145
|
+
test("withAdjudicationFallback keeps jev engine when the primary succeeds", async () => {
|
|
146
|
+
const primary = { async adjudicate() { return { merges: [{ sourceFindingIds: ["a", "b"], confidence: 0.9 }] }; } };
|
|
147
|
+
const fallback = { async adjudicate() { throw new Error("must not run"); } };
|
|
148
|
+
const wrapped = withAdjudicationFallback(primary, fallback);
|
|
149
|
+
const response = await wrapped.adjudicator.adjudicate({ candidates: [] });
|
|
150
|
+
assert.equal(response.merges.length, 1);
|
|
151
|
+
assert.equal(wrapped.engine(), "jev");
|
|
152
|
+
assert.equal(wrapped.note(), undefined);
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=jev.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.test.js","sourceRoot":"","sources":["../src/jev.test.ts"],"names":[],"mappings":"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"}
|