planpong 0.5.7 → 0.6.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 +53 -14
- package/dist/bin/planpong.js +4 -0
- package/dist/bin/planpong.js.map +1 -1
- package/dist/src/cli/commands/config.d.ts +10 -0
- package/dist/src/cli/commands/config.js +65 -0
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts +53 -0
- package/dist/src/cli/commands/init.js +221 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/plan.js +7 -7
- package/dist/src/cli/commands/plan.js.map +1 -1
- package/dist/src/cli/commands/review.js +7 -7
- package/dist/src/cli/commands/review.js.map +1 -1
- package/dist/src/cli/ui.js +11 -19
- package/dist/src/cli/ui.js.map +1 -1
- package/dist/src/config/loader.d.ts +5 -0
- package/dist/src/config/loader.js +21 -1
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/config/mutate.d.ts +26 -0
- package/dist/src/config/mutate.js +51 -38
- package/dist/src/config/mutate.js.map +1 -1
- package/dist/src/core/convergence.js +1 -1
- package/dist/src/core/convergence.js.map +1 -1
- package/dist/src/core/operations.d.ts +44 -1
- package/dist/src/core/operations.js +110 -37
- package/dist/src/core/operations.js.map +1 -1
- package/dist/src/core/presentation.d.ts +39 -0
- package/dist/src/core/presentation.js +132 -0
- package/dist/src/core/presentation.js.map +1 -0
- package/dist/src/core/round-state.d.ts +15 -0
- package/dist/src/core/round-state.js +49 -0
- package/dist/src/core/round-state.js.map +1 -0
- package/dist/src/core/session.d.ts +1 -0
- package/dist/src/core/session.js +60 -1
- package/dist/src/core/session.js.map +1 -1
- package/dist/src/mcp/server.js +6 -6
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/get-feedback.d.ts +1 -2
- package/dist/src/mcp/tools/get-feedback.js +154 -56
- package/dist/src/mcp/tools/get-feedback.js.map +1 -1
- package/dist/src/mcp/tools/record-revision.d.ts +0 -6
- package/dist/src/mcp/tools/record-revision.js +170 -95
- package/dist/src/mcp/tools/record-revision.js.map +1 -1
- package/dist/src/mcp/tools/revise.d.ts +1 -7
- package/dist/src/mcp/tools/revise.js +126 -90
- package/dist/src/mcp/tools/revise.js.map +1 -1
- package/dist/src/mcp/tools/status.js +18 -1
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/providers/claude.d.ts +22 -1
- package/dist/src/providers/claude.js +10 -10
- package/dist/src/providers/claude.js.map +1 -1
- package/dist/src/providers/codex.d.ts +12 -1
- package/dist/src/providers/codex.js +6 -3
- package/dist/src/providers/codex.js.map +1 -1
- package/dist/src/providers/gemini.d.ts +58 -0
- package/dist/src/providers/gemini.js +169 -0
- package/dist/src/providers/gemini.js.map +1 -0
- package/dist/src/providers/registry.js +8 -2
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/shared.d.ts +16 -0
- package/dist/src/providers/shared.js +22 -0
- package/dist/src/providers/shared.js.map +1 -0
- package/dist/src/providers/types.d.ts +1 -1
- package/dist/src/schemas/metrics.d.ts +14 -14
- package/dist/src/schemas/metrics.js +13 -2
- package/dist/src/schemas/metrics.js.map +1 -1
- package/dist/src/schemas/session.d.ts +2 -2
- package/package.json +3 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readRoundFeedback, readRoundResponse } from "./session.js";
|
|
2
|
+
export function getRoundState(cwd, session, maxRounds) {
|
|
3
|
+
const currentRound = session.currentRound;
|
|
4
|
+
if (currentRound <= 0) {
|
|
5
|
+
return {
|
|
6
|
+
currentRound,
|
|
7
|
+
hasFeedback: false,
|
|
8
|
+
hasResponse: false,
|
|
9
|
+
latestFeedback: null,
|
|
10
|
+
latestResponse: null,
|
|
11
|
+
nextAction: "get_feedback",
|
|
12
|
+
incompleteTransition: false,
|
|
13
|
+
inconsistentArtifacts: false,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const latestFeedback = readRoundFeedback(cwd, session.id, currentRound);
|
|
17
|
+
const latestResponse = readRoundResponse(cwd, session.id, currentRound);
|
|
18
|
+
const hasFeedback = latestFeedback !== null;
|
|
19
|
+
const hasResponse = latestResponse !== null;
|
|
20
|
+
const inconsistentArtifacts = hasResponse && !hasFeedback;
|
|
21
|
+
const incompleteTransition = !hasFeedback && !hasResponse;
|
|
22
|
+
let nextAction;
|
|
23
|
+
if (inconsistentArtifacts) {
|
|
24
|
+
nextAction = "terminal";
|
|
25
|
+
}
|
|
26
|
+
else if (!hasFeedback) {
|
|
27
|
+
nextAction = "get_feedback";
|
|
28
|
+
}
|
|
29
|
+
else if (!hasResponse) {
|
|
30
|
+
nextAction = "revise";
|
|
31
|
+
}
|
|
32
|
+
else if (maxRounds !== undefined && currentRound >= maxRounds) {
|
|
33
|
+
nextAction = "terminal";
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
nextAction = "next_round";
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
currentRound,
|
|
40
|
+
hasFeedback,
|
|
41
|
+
hasResponse,
|
|
42
|
+
latestFeedback,
|
|
43
|
+
latestResponse,
|
|
44
|
+
nextAction,
|
|
45
|
+
incompleteTransition,
|
|
46
|
+
inconsistentArtifacts,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=round-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"round-state.js","sourceRoot":"","sources":["../../../src/core/round-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAmBpE,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,OAAgB,EAChB,SAAkB;IAElB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,YAAY;YACZ,WAAW,EAAE,KAAK;YAClB,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,cAAc;YAC1B,oBAAoB,EAAE,KAAK;YAC3B,qBAAqB,EAAE,KAAK;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,cAAc,KAAK,IAAI,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,KAAK,IAAI,CAAC;IAC5C,MAAM,qBAAqB,GAAG,WAAW,IAAI,CAAC,WAAW,CAAC;IAC1D,MAAM,oBAAoB,GAAG,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC;IAE1D,IAAI,UAA2B,CAAC;IAChC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,UAAU,GAAG,UAAU,CAAC;IAC1B,CAAC;SAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,UAAU,GAAG,cAAc,CAAC;IAC9B,CAAC;SAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,UAAU,GAAG,QAAQ,CAAC;IACxB,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;QAChE,UAAU,GAAG,UAAU,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,YAAY,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,YAAY;QACZ,WAAW;QACX,WAAW;QACX,cAAc;QACd,cAAc;QACd,UAAU;QACV,oBAAoB;QACpB,qBAAqB;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -5,6 +5,7 @@ import type { ProviderConfig } from "../schemas/config.js";
|
|
|
5
5
|
import { type RoundMetrics } from "../schemas/metrics.js";
|
|
6
6
|
export declare function createSession(repoRoot: string, planPath: string, planner: ProviderConfig, reviewer: ProviderConfig, planHash: string, plannerMode?: "inline" | "external"): Session;
|
|
7
7
|
export declare function writeSessionState(repoRoot: string, session: Session): void;
|
|
8
|
+
export declare function withSessionLock<T>(repoRoot: string, sessionId: string, fn: () => Promise<T>): Promise<T>;
|
|
8
9
|
export declare function readSessionState(repoRoot: string, sessionId: string): Session | null;
|
|
9
10
|
export declare function writeRoundFeedback(repoRoot: string, sessionId: string, round: number, feedback: PhaseFeedback): void;
|
|
10
11
|
export declare function writeRoundResponse(repoRoot: string, sessionId: string, round: number, response: PlannerRevision): void;
|
package/dist/src/core/session.js
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { RoundMetricsSchema, } from "../schemas/metrics.js";
|
|
5
5
|
const SESSIONS_DIR = ".planpong/sessions";
|
|
6
|
+
const SESSION_LOCK_TIMEOUT_MS = 10 * 60 * 1000;
|
|
7
|
+
const SESSION_LOCK_RETRY_MS = 25;
|
|
6
8
|
function getSessionDir(repoRoot, sessionId) {
|
|
7
9
|
return join(repoRoot, SESSIONS_DIR, sessionId);
|
|
8
10
|
}
|
|
11
|
+
function sleep(ms) {
|
|
12
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
13
|
+
}
|
|
9
14
|
export function createSession(repoRoot, planPath, planner, reviewer, planHash, plannerMode = "inline") {
|
|
10
15
|
const id = randomBytes(6).toString("hex");
|
|
11
16
|
// Pre-generate a UUID for reviewer-session continuity. Used directly by
|
|
@@ -36,6 +41,60 @@ export function writeSessionState(repoRoot, session) {
|
|
|
36
41
|
const dir = getSessionDir(repoRoot, session.id);
|
|
37
42
|
writeFileSync(join(dir, "session.json"), JSON.stringify(session, null, 2));
|
|
38
43
|
}
|
|
44
|
+
export async function withSessionLock(repoRoot, sessionId, fn) {
|
|
45
|
+
const dir = getSessionDir(repoRoot, sessionId);
|
|
46
|
+
mkdirSync(dir, { recursive: true });
|
|
47
|
+
const lockPath = join(dir, "lock");
|
|
48
|
+
const started = Date.now();
|
|
49
|
+
let fd = null;
|
|
50
|
+
while (fd === null) {
|
|
51
|
+
try {
|
|
52
|
+
fd = openSync(lockPath, "wx");
|
|
53
|
+
writeFileSync(fd, JSON.stringify({
|
|
54
|
+
pid: process.pid,
|
|
55
|
+
acquired_at: new Date().toISOString(),
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const code = error && typeof error === "object" && "code" in error
|
|
60
|
+
? error.code
|
|
61
|
+
: undefined;
|
|
62
|
+
if (code !== "EEXIST")
|
|
63
|
+
throw error;
|
|
64
|
+
try {
|
|
65
|
+
const age = Date.now() - statSync(lockPath).mtimeMs;
|
|
66
|
+
if (age > SESSION_LOCK_TIMEOUT_MS) {
|
|
67
|
+
unlinkSync(lockPath);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (Date.now() - started > SESSION_LOCK_TIMEOUT_MS) {
|
|
75
|
+
throw new Error(`Timed out waiting for session lock: ${sessionId}`);
|
|
76
|
+
}
|
|
77
|
+
await sleep(SESSION_LOCK_RETRY_MS);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
return await fn();
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
try {
|
|
85
|
+
closeSync(fd);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// ignore close failures; unlock still attempted below
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
unlinkSync(lockPath);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// stale/missing lock cleanup is best-effort
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
39
98
|
export function readSessionState(repoRoot, sessionId) {
|
|
40
99
|
const path = join(getSessionDir(repoRoot, sessionId), "session.json");
|
|
41
100
|
if (!existsSync(path))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -26,11 +26,11 @@ The "phase" field in tool responses tells you which phase is active. Mention the
|
|
|
26
26
|
When the user asks you to review a plan:
|
|
27
27
|
1. Call planpong_start_review with the plan path. Pass interactive: true if the user asks to review interactively, step by step, or wants to approve each round. Default is false (autonomous). Optionally pass planner_mode: "external" to route revisions through the planner provider; default is "inline" (you act as the planner).
|
|
28
28
|
2. Call planpong_get_feedback to get reviewer critique
|
|
29
|
-
3. Show the user the
|
|
29
|
+
3. Show the user the status_line and the display_markdown table from the tool response exactly. Do not replace the issue table with a prose-only summary. The table is the canonical per-issue feedback view (note: round 1 is directional review).
|
|
30
30
|
4. If is_converged is false, advance the round depending on planner_mode:
|
|
31
|
-
- **inline mode (default):** YOU are the planner.
|
|
32
|
-
- **external mode:** call planpong_revise. The planner provider produces the revision and applies it to disk.
|
|
33
|
-
5. Show the user the revision
|
|
31
|
+
- **inline mode (default):** YOU are the planner. After showing the pending issue table, edit the plan with your own Edit/Write tools, then call planpong_record_revision with one response per issue (issue_id, action: "accepted" | "rejected" | "deferred", rationale). Pass expected_round equal to the round number from the feedback. The tool logs your responses, updates the plan hash, and advances the bookkeeping — no provider invocation.
|
|
32
|
+
- **external mode:** call planpong_revise with expected_round equal to the round number from the feedback. The planner provider produces the revision and applies it to disk.
|
|
33
|
+
5. Show the user the revision status_line and display_markdown decision table from planpong_record_revision or planpong_revise. Do not replace the decision table with a prose-only accepted/rejected/deferred summary.
|
|
34
34
|
6. Repeat steps 2-5 until converged or max rounds reached
|
|
35
35
|
|
|
36
36
|
Execution mode (check the "interactive" field in planpong_start_review response):
|
|
@@ -71,7 +71,7 @@ Phase-specific feedback:
|
|
|
71
71
|
role: "user",
|
|
72
72
|
content: {
|
|
73
73
|
type: "text",
|
|
74
|
-
text: `Review the plan at ${args.plan_path} using planpong. Run the full review loop autonomously (start_review → get_feedback → revise → repeat until converged).
|
|
74
|
+
text: `Review the plan at ${args.plan_path} using planpong. Run the full review loop autonomously (start_review → get_feedback → revise/record_revision → repeat until converged). After every feedback and revision tool call, show the returned display_markdown table. When done, display the final status line and a summary table of what changed.`,
|
|
75
75
|
},
|
|
76
76
|
},
|
|
77
77
|
],
|
|
@@ -90,7 +90,7 @@ Phase-specific feedback:
|
|
|
90
90
|
role: "user",
|
|
91
91
|
content: {
|
|
92
92
|
type: "text",
|
|
93
|
-
text: `Review the plan at ${args.plan_path} using planpong in interactive mode. Start the review with interactive: true
|
|
93
|
+
text: `Review the plan at ${args.plan_path} using planpong in interactive mode. Start the review with interactive: true. After every feedback and revision tool call, show the returned display_markdown table, then ask me before continuing.`,
|
|
94
94
|
},
|
|
95
95
|
},
|
|
96
96
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oJA+BgI;KAC/I,CACF,CAAC;IAEF,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,qDAAqD;IACrD,MAAM,CAAC,cAAc,CACnB,QAAQ,EACR;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,0FAA0F;QAC5F,UAAU,EAAE;YACV,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,uDAAuD,CAAC;SACrE;KACF,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,sBAAsB,IAAI,CAAC,SAAS
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,11 @@ export declare function getFeedbackHandler(input: {
|
|
|
7
7
|
type: "text";
|
|
8
8
|
text: string;
|
|
9
9
|
}[];
|
|
10
|
-
isError: boolean;
|
|
11
10
|
} | {
|
|
12
11
|
content: {
|
|
13
12
|
type: "text";
|
|
14
13
|
text: string;
|
|
15
14
|
}[];
|
|
16
|
-
isError
|
|
15
|
+
isError: boolean;
|
|
17
16
|
}>;
|
|
18
17
|
export declare function registerGetFeedback(server: McpServer): void;
|
|
@@ -3,9 +3,11 @@ import { readFileSync, writeFileSync } from "node:fs";
|
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { loadConfig } from "../../config/loader.js";
|
|
5
5
|
import { getProvider } from "../../providers/registry.js";
|
|
6
|
-
import { readSessionState, writeSessionState, readInitialPlan, } from "../../core/session.js";
|
|
7
|
-
import { runReviewRound, writeStatusLineToPlan, } from "../../core/operations.js";
|
|
6
|
+
import { readSessionState, writeSessionState, readInitialPlan, withSessionLock, } from "../../core/session.js";
|
|
7
|
+
import { runReviewRound, severityFromFeedback, writeStatusLineToPlan, formatPhaseExtras, phaseExtrasFromFeedback, } from "../../core/operations.js";
|
|
8
8
|
import { getReviewPhase } from "../../prompts/reviewer.js";
|
|
9
|
+
import { formatFeedbackDisplay } from "../../core/presentation.js";
|
|
10
|
+
import { getRoundState } from "../../core/round-state.js";
|
|
9
11
|
const inputSchema = {
|
|
10
12
|
session_id: z.string().describe("Session ID from planpong_start_review"),
|
|
11
13
|
cwd: z
|
|
@@ -15,8 +17,8 @@ const inputSchema = {
|
|
|
15
17
|
};
|
|
16
18
|
export async function getFeedbackHandler(input) {
|
|
17
19
|
const cwd = input.cwd ?? process.cwd();
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
20
|
+
const existing = readSessionState(cwd, input.session_id);
|
|
21
|
+
if (!existing) {
|
|
20
22
|
return {
|
|
21
23
|
content: [
|
|
22
24
|
{
|
|
@@ -29,76 +31,179 @@ export async function getFeedbackHandler(input) {
|
|
|
29
31
|
isError: true,
|
|
30
32
|
};
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
content: [
|
|
54
|
-
{
|
|
55
|
-
type: "text",
|
|
56
|
-
text: JSON.stringify({
|
|
57
|
-
error: `Reviewer provider not found: ${session.reviewer.provider}`,
|
|
58
|
-
}),
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
isError: true,
|
|
34
|
+
return withSessionLock(cwd, input.session_id, async () => {
|
|
35
|
+
const session = readSessionState(cwd, input.session_id);
|
|
36
|
+
if (!session) {
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: "text",
|
|
41
|
+
text: JSON.stringify({
|
|
42
|
+
error: `Session not found: ${input.session_id}`,
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
isError: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const config = loadConfig({ cwd });
|
|
50
|
+
const sessionConfig = {
|
|
51
|
+
...config,
|
|
52
|
+
reviewer: session.reviewer,
|
|
53
|
+
planner: session.planner,
|
|
62
54
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
55
|
+
const roundState = getRoundState(cwd, session, sessionConfig.max_rounds);
|
|
56
|
+
if (session.status !== "in_review") {
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: "text",
|
|
61
|
+
text: JSON.stringify({
|
|
62
|
+
error: `Session status is '${session.status}', expected 'in_review'`,
|
|
63
|
+
}),
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
isError: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (roundState.inconsistentArtifacts) {
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: "text",
|
|
74
|
+
text: JSON.stringify({
|
|
75
|
+
error: `Session ${session.id} has round ${session.currentRound} response without feedback`,
|
|
76
|
+
current_round: session.currentRound,
|
|
77
|
+
}),
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (roundState.currentRound > 0 &&
|
|
84
|
+
roundState.latestFeedback &&
|
|
85
|
+
!roundState.latestResponse) {
|
|
86
|
+
return buildFeedbackResponse({
|
|
87
|
+
session,
|
|
88
|
+
cwd,
|
|
89
|
+
config: sessionConfig,
|
|
90
|
+
result: reviewResultFromFeedback(roundState.currentRound, roundState.latestFeedback),
|
|
91
|
+
idempotentReplay: true,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (roundState.currentRound > 0 &&
|
|
95
|
+
roundState.latestFeedback &&
|
|
96
|
+
roundState.latestResponse) {
|
|
97
|
+
if (roundState.currentRound >= sessionConfig.max_rounds) {
|
|
98
|
+
const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Max rounds reached");
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{ type: "text", text: statusLine },
|
|
102
|
+
{
|
|
103
|
+
type: "text",
|
|
104
|
+
text: JSON.stringify({
|
|
105
|
+
status: "max_rounds",
|
|
106
|
+
round: roundState.currentRound,
|
|
107
|
+
is_converged: false,
|
|
108
|
+
status_line: statusLine,
|
|
109
|
+
idempotent_replay: false,
|
|
110
|
+
}),
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
session.currentRound++;
|
|
116
|
+
writeSessionState(cwd, session);
|
|
117
|
+
}
|
|
118
|
+
else if (roundState.currentRound === 0) {
|
|
119
|
+
session.currentRound = 1;
|
|
120
|
+
writeSessionState(cwd, session);
|
|
121
|
+
}
|
|
122
|
+
// If currentRound > 0 and feedback is missing, this is an incomplete
|
|
123
|
+
// transition from a prior attempt. Retry the same round without
|
|
124
|
+
// incrementing.
|
|
125
|
+
// Use session-stored provider config
|
|
126
|
+
const reviewerProvider = getProvider(session.reviewer.provider);
|
|
127
|
+
if (!reviewerProvider) {
|
|
128
|
+
return {
|
|
129
|
+
content: [
|
|
130
|
+
{
|
|
131
|
+
type: "text",
|
|
132
|
+
text: JSON.stringify({
|
|
133
|
+
error: `Reviewer provider not found: ${session.reviewer.provider}`,
|
|
134
|
+
}),
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
isError: true,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const result = await runReviewRound(session, cwd, sessionConfig, reviewerProvider);
|
|
141
|
+
return buildFeedbackResponse({
|
|
142
|
+
session,
|
|
143
|
+
cwd,
|
|
144
|
+
config: sessionConfig,
|
|
145
|
+
result,
|
|
146
|
+
idempotentReplay: false,
|
|
147
|
+
resumedIncompleteRound: roundState.incompleteTransition,
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function reviewResultFromFeedback(round, feedback) {
|
|
152
|
+
const phase = getReviewPhase(round);
|
|
153
|
+
const severity = severityFromFeedback(feedback);
|
|
154
|
+
const phaseExtras = phaseExtrasFromFeedback(phase, feedback);
|
|
155
|
+
return {
|
|
156
|
+
round,
|
|
157
|
+
feedback,
|
|
158
|
+
severity,
|
|
159
|
+
converged: feedback.verdict !== "needs_revision",
|
|
160
|
+
phaseExtras,
|
|
69
161
|
};
|
|
70
|
-
|
|
71
|
-
|
|
162
|
+
}
|
|
163
|
+
function buildFeedbackResponse(args) {
|
|
164
|
+
const { session, cwd, config, result } = args;
|
|
72
165
|
const suffix = result.converged
|
|
73
166
|
? result.feedback.verdict === "blocked"
|
|
74
167
|
? `BLOCKED in ${getReviewPhase(result.round)} phase`
|
|
75
168
|
: `Approved after ${result.round} rounds`
|
|
76
169
|
: `Reviewed — ${result.feedback.issues.length} issues`;
|
|
77
|
-
const statusLine = writeStatusLineToPlan(session, cwd,
|
|
170
|
+
const statusLine = writeStatusLineToPlan(session, cwd, config, suffix, result.phaseExtras);
|
|
78
171
|
const phase = getReviewPhase(result.round);
|
|
172
|
+
const phaseSignal = formatPhaseExtras(phase, result.phaseExtras);
|
|
173
|
+
const display = formatFeedbackDisplay({
|
|
174
|
+
round: result.round,
|
|
175
|
+
phase,
|
|
176
|
+
verdict: result.feedback.verdict,
|
|
177
|
+
severity: result.severity,
|
|
178
|
+
feedback: result.feedback,
|
|
179
|
+
phaseSignal,
|
|
180
|
+
});
|
|
79
181
|
const response = {
|
|
80
182
|
round: result.round,
|
|
81
183
|
phase,
|
|
184
|
+
phase_label: phase,
|
|
82
185
|
verdict: result.feedback.verdict,
|
|
83
186
|
summary: result.feedback.summary,
|
|
84
187
|
issues: result.feedback.issues,
|
|
188
|
+
issue_rows: display.rows,
|
|
85
189
|
severity_counts: result.severity,
|
|
86
190
|
is_converged: result.converged,
|
|
87
191
|
status_line: statusLine,
|
|
192
|
+
display_markdown: display.markdown,
|
|
193
|
+
idempotent_replay: args.idempotentReplay,
|
|
88
194
|
};
|
|
195
|
+
if (args.resumedIncompleteRound) {
|
|
196
|
+
response.resumed_incomplete_round = true;
|
|
197
|
+
}
|
|
89
198
|
if (result.timing) {
|
|
90
199
|
response.timing = result.timing;
|
|
91
200
|
}
|
|
92
|
-
// Evidence-verification telemetry: surface the post-parse verifier's
|
|
93
|
-
// counts so consumers can spot reviewer hallucinations and sustained
|
|
94
|
-
// quote-compliance noncompliance without inspecting individual issues.
|
|
95
201
|
if (result.feedback.unverified_count !== undefined) {
|
|
96
202
|
response.unverified_count = result.feedback.unverified_count;
|
|
97
203
|
}
|
|
98
204
|
if (result.feedback.quote_compliance_warning) {
|
|
99
205
|
response.quote_compliance_warning = true;
|
|
100
206
|
}
|
|
101
|
-
// Phase-specific lean fields for status line consumption
|
|
102
207
|
if (result.phaseExtras.is_blocked) {
|
|
103
208
|
response.is_blocked = true;
|
|
104
209
|
}
|
|
@@ -128,7 +233,6 @@ export async function getFeedbackHandler(input) {
|
|
|
128
233
|
writeFileSync(planPath, planContent);
|
|
129
234
|
}
|
|
130
235
|
writeSessionState(cwd, session);
|
|
131
|
-
// Include initial plan for change summary
|
|
132
236
|
const initialPlan = readInitialPlan(cwd, session.id);
|
|
133
237
|
if (initialPlan) {
|
|
134
238
|
response.initial_plan = initialPlan;
|
|
@@ -138,14 +242,8 @@ export async function getFeedbackHandler(input) {
|
|
|
138
242
|
}
|
|
139
243
|
return {
|
|
140
244
|
content: [
|
|
141
|
-
{
|
|
142
|
-
|
|
143
|
-
text: statusLine,
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
type: "text",
|
|
147
|
-
text: JSON.stringify(response),
|
|
148
|
-
},
|
|
245
|
+
{ type: "text", text: statusLine },
|
|
246
|
+
{ type: "text", text: JSON.stringify(response) },
|
|
149
247
|
],
|
|
150
248
|
};
|
|
151
249
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,5 @@ export declare function recordRevisionHandler(input: {
|
|
|
10
10
|
type: "text";
|
|
11
11
|
text: string;
|
|
12
12
|
}[];
|
|
13
|
-
isError: boolean;
|
|
14
|
-
} | {
|
|
15
|
-
content: {
|
|
16
|
-
type: "text";
|
|
17
|
-
text: string;
|
|
18
|
-
}[];
|
|
19
13
|
}>;
|
|
20
14
|
export declare function registerRecordRevision(server: McpServer): void;
|