planpong 0.5.2 → 0.5.4
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/dist/src/config/defaults.js +1 -0
- package/dist/src/config/defaults.js.map +1 -1
- package/dist/src/config/loader.d.ts +1 -0
- package/dist/src/config/loader.js +3 -0
- package/dist/src/config/loader.js.map +1 -1
- package/dist/src/core/convergence.d.ts +2 -2
- package/dist/src/core/convergence.js +55 -17
- package/dist/src/core/convergence.js.map +1 -1
- package/dist/src/core/operations.d.ts +48 -0
- package/dist/src/core/operations.js +83 -21
- package/dist/src/core/operations.js.map +1 -1
- package/dist/src/core/session.d.ts +1 -1
- package/dist/src/core/session.js +11 -2
- package/dist/src/core/session.js.map +1 -1
- package/dist/src/core/verify-evidence.d.ts +64 -0
- package/dist/src/core/verify-evidence.js +110 -0
- package/dist/src/core/verify-evidence.js.map +1 -0
- package/dist/src/mcp/server.js +6 -2
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/get-feedback.js +9 -0
- package/dist/src/mcp/tools/get-feedback.js.map +1 -1
- package/dist/src/mcp/tools/record-revision.d.ts +20 -0
- package/dist/src/mcp/tools/record-revision.js +158 -0
- package/dist/src/mcp/tools/record-revision.js.map +1 -0
- package/dist/src/mcp/tools/revise.js +22 -0
- package/dist/src/mcp/tools/revise.js.map +1 -1
- package/dist/src/mcp/tools/start-review.js +7 -0
- package/dist/src/mcp/tools/start-review.js.map +1 -1
- package/dist/src/prompts/planner.js +27 -3
- package/dist/src/prompts/planner.js.map +1 -1
- package/dist/src/prompts/reviewer.d.ts +15 -7
- package/dist/src/prompts/reviewer.js +77 -16
- package/dist/src/prompts/reviewer.js.map +1 -1
- package/dist/src/schemas/config.d.ts +3 -0
- package/dist/src/schemas/config.js +8 -0
- package/dist/src/schemas/config.js.map +1 -1
- package/dist/src/schemas/feedback.d.ts +68 -27
- package/dist/src/schemas/feedback.js +34 -12
- package/dist/src/schemas/feedback.js.map +1 -1
- package/dist/src/schemas/json-schema.js +6 -0
- package/dist/src/schemas/json-schema.js.map +1 -1
- package/dist/src/schemas/metrics.d.ts +3 -0
- package/dist/src/schemas/metrics.js +6 -0
- package/dist/src/schemas/metrics.js.map +1 -1
- package/dist/src/schemas/session.d.ts +3 -0
- package/dist/src/schemas/session.js +12 -0
- package/dist/src/schemas/session.js.map +1 -1
- package/package.json +1 -1
package/dist/src/core/session.js
CHANGED
|
@@ -6,7 +6,7 @@ const SESSIONS_DIR = ".planpong/sessions";
|
|
|
6
6
|
function getSessionDir(repoRoot, sessionId) {
|
|
7
7
|
return join(repoRoot, SESSIONS_DIR, sessionId);
|
|
8
8
|
}
|
|
9
|
-
export function createSession(repoRoot, planPath, planner, reviewer, planHash) {
|
|
9
|
+
export function createSession(repoRoot, planPath, planner, reviewer, planHash, plannerMode = "external") {
|
|
10
10
|
const id = randomBytes(6).toString("hex");
|
|
11
11
|
// Pre-generate a UUID for reviewer-session continuity. Used directly by
|
|
12
12
|
// claude (which accepts external UUIDs); for codex this is a placeholder
|
|
@@ -25,6 +25,7 @@ export function createSession(repoRoot, planPath, planner, reviewer, planHash) {
|
|
|
25
25
|
startedAt: new Date().toISOString(),
|
|
26
26
|
planHash,
|
|
27
27
|
reviewerSessionId,
|
|
28
|
+
plannerMode,
|
|
28
29
|
};
|
|
29
30
|
const dir = getSessionDir(repoRoot, id);
|
|
30
31
|
mkdirSync(dir, { recursive: true });
|
|
@@ -39,7 +40,15 @@ export function readSessionState(repoRoot, sessionId) {
|
|
|
39
40
|
const path = join(getSessionDir(repoRoot, sessionId), "session.json");
|
|
40
41
|
if (!existsSync(path))
|
|
41
42
|
return null;
|
|
42
|
-
|
|
43
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
44
|
+
// Backward-compat normalization for sessions written before plannerMode
|
|
45
|
+
// existed. The Zod schema's .default() only fires under SessionSchema.parse(),
|
|
46
|
+
// which we deliberately skip here for performance. Old sessions that
|
|
47
|
+
// omit this field are treated as external — preserves prior behavior.
|
|
48
|
+
if (parsed.plannerMode === undefined) {
|
|
49
|
+
parsed.plannerMode = "external";
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
43
52
|
}
|
|
44
53
|
export function writeRoundFeedback(repoRoot, sessionId, round, feedback) {
|
|
45
54
|
const dir = getSessionDir(repoRoot, sessionId);
|
|
@@ -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,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,EACL,kBAAkB,GAEnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,SAAS,aAAa,CAAC,QAAgB,EAAE,SAAiB;IACxD,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,QAAgB,EAChB,OAAuB,EACvB,QAAwB,EACxB,QAAgB;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence verification: anchor each reviewer issue to a verbatim quote
|
|
3
|
+
* from the plan.
|
|
4
|
+
*
|
|
5
|
+
* The verifier is pure (no I/O), fail-safe (exceptions never propagate),
|
|
6
|
+
* and the sole authority for the `verified` flag — model-supplied values
|
|
7
|
+
* are stripped upstream in `convergence.ts`.
|
|
8
|
+
*
|
|
9
|
+
* Verification rule: collapse runs of whitespace (including newlines) in
|
|
10
|
+
* both the quote and the plan to a single space; case-sensitive; trim
|
|
11
|
+
* leading/trailing whitespace. If the normalized quote appears in the
|
|
12
|
+
* normalized plan, the issue is `verified: true`.
|
|
13
|
+
*
|
|
14
|
+
* Length and distinctiveness enforcement happens here rather than in
|
|
15
|
+
* Zod because `ZodValidationError` is terminal (no retry/downgrade), so
|
|
16
|
+
* a too-long or too-short quote would kill the entire round. Marking
|
|
17
|
+
* such quotes `verified: false` is fail-safe — the issue still surfaces
|
|
18
|
+
* to the planner, just deprioritized.
|
|
19
|
+
*/
|
|
20
|
+
import type { FeedbackIssue, PhaseFeedback } from "../schemas/feedback.js";
|
|
21
|
+
/** Quotes shorter than this are not distinctive enough to anchor on. */
|
|
22
|
+
export declare const MIN_QUOTE_LENGTH = 10;
|
|
23
|
+
/** Quotes longer than this are quote-stuffing — discourage. */
|
|
24
|
+
export declare const MAX_QUOTE_LENGTH = 200;
|
|
25
|
+
/** When >50% of issues lack `quoted_text`, flag compliance warning. */
|
|
26
|
+
export declare const COMPLIANCE_WARNING_THRESHOLD = 0.5;
|
|
27
|
+
export interface VerificationResult {
|
|
28
|
+
feedback: PhaseFeedback;
|
|
29
|
+
/** Number of verifier exceptions caught (issues marked unverified by error). */
|
|
30
|
+
exceptionCount: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Verify a single issue's `quoted_text` against the plan.
|
|
34
|
+
*
|
|
35
|
+
* Returns `{ verified: false }` for any of:
|
|
36
|
+
* - Missing or empty `quoted_text`
|
|
37
|
+
* - Quote shorter than `MIN_QUOTE_LENGTH` chars (after trimming)
|
|
38
|
+
* - Quote longer than `MAX_QUOTE_LENGTH` chars (after trimming)
|
|
39
|
+
* - Quote not found in the plan after whitespace normalization
|
|
40
|
+
* - Any unexpected exception during normalization (caller can detect via
|
|
41
|
+
* the verifier-level exception counter)
|
|
42
|
+
*/
|
|
43
|
+
export declare function verifyIssue(issue: FeedbackIssue, planText: string): {
|
|
44
|
+
verified: boolean;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Verify all issues on a feedback object, populating `verified` per issue
|
|
48
|
+
* and `quote_compliance_warning` + `unverified_count` at the top level.
|
|
49
|
+
*
|
|
50
|
+
* Returns a NEW feedback object — does not mutate the input. The exception
|
|
51
|
+
* count is for telemetry (see Risks & Mitigations R3 in the plan).
|
|
52
|
+
*
|
|
53
|
+
* Note: callers must strip any model-supplied `verified` from issues BEFORE
|
|
54
|
+
* calling this function. This verifier is the sole authority on that field.
|
|
55
|
+
*/
|
|
56
|
+
export declare function verifyFeedback(feedback: PhaseFeedback, planText: string): VerificationResult;
|
|
57
|
+
/**
|
|
58
|
+
* Strip model-supplied `verified` from every issue. Called before
|
|
59
|
+
* `verifyFeedback` so the model cannot self-assert verification status.
|
|
60
|
+
*
|
|
61
|
+
* Mutates and returns the same array element-wise (cheap; the caller has
|
|
62
|
+
* just constructed these objects from a parse step).
|
|
63
|
+
*/
|
|
64
|
+
export declare function stripModelVerified(issues: FeedbackIssue[]): FeedbackIssue[];
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/** Quotes shorter than this are not distinctive enough to anchor on. */
|
|
2
|
+
export const MIN_QUOTE_LENGTH = 10;
|
|
3
|
+
/** Quotes longer than this are quote-stuffing — discourage. */
|
|
4
|
+
export const MAX_QUOTE_LENGTH = 200;
|
|
5
|
+
/** When >50% of issues lack `quoted_text`, flag compliance warning. */
|
|
6
|
+
export const COMPLIANCE_WARNING_THRESHOLD = 0.5;
|
|
7
|
+
/** Collapse runs of whitespace (including newlines) to a single space. */
|
|
8
|
+
function normalize(text) {
|
|
9
|
+
return text.replace(/\s+/g, " ").trim();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Verify a single issue's `quoted_text` against the plan.
|
|
13
|
+
*
|
|
14
|
+
* Returns `{ verified: false }` for any of:
|
|
15
|
+
* - Missing or empty `quoted_text`
|
|
16
|
+
* - Quote shorter than `MIN_QUOTE_LENGTH` chars (after trimming)
|
|
17
|
+
* - Quote longer than `MAX_QUOTE_LENGTH` chars (after trimming)
|
|
18
|
+
* - Quote not found in the plan after whitespace normalization
|
|
19
|
+
* - Any unexpected exception during normalization (caller can detect via
|
|
20
|
+
* the verifier-level exception counter)
|
|
21
|
+
*/
|
|
22
|
+
export function verifyIssue(issue, planText) {
|
|
23
|
+
const quote = issue.quoted_text;
|
|
24
|
+
if (!quote)
|
|
25
|
+
return { verified: false };
|
|
26
|
+
const trimmed = quote.trim();
|
|
27
|
+
if (trimmed.length === 0)
|
|
28
|
+
return { verified: false };
|
|
29
|
+
if (trimmed.length < MIN_QUOTE_LENGTH) {
|
|
30
|
+
process.stderr.write(`[planpong] warn: issue ${issue.id} quoted_text below distinctiveness floor (${trimmed.length} < ${MIN_QUOTE_LENGTH}) — marked unverified\n`);
|
|
31
|
+
return { verified: false };
|
|
32
|
+
}
|
|
33
|
+
if (trimmed.length > MAX_QUOTE_LENGTH) {
|
|
34
|
+
process.stderr.write(`[planpong] warn: issue ${issue.id} quoted_text exceeds length cap (${trimmed.length} > ${MAX_QUOTE_LENGTH}) — marked unverified\n`);
|
|
35
|
+
return { verified: false };
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const normalizedQuote = normalize(quote);
|
|
39
|
+
const normalizedPlan = normalize(planText);
|
|
40
|
+
return { verified: normalizedPlan.includes(normalizedQuote) };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Re-thrown by the caller path so the exception counter fires; the
|
|
44
|
+
// top-level verifyFeedback wraps this in another try/catch and only
|
|
45
|
+
// ever returns `verified: false`.
|
|
46
|
+
throw new Error(`normalize failed on issue ${issue.id}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Verify all issues on a feedback object, populating `verified` per issue
|
|
51
|
+
* and `quote_compliance_warning` + `unverified_count` at the top level.
|
|
52
|
+
*
|
|
53
|
+
* Returns a NEW feedback object — does not mutate the input. The exception
|
|
54
|
+
* count is for telemetry (see Risks & Mitigations R3 in the plan).
|
|
55
|
+
*
|
|
56
|
+
* Note: callers must strip any model-supplied `verified` from issues BEFORE
|
|
57
|
+
* calling this function. This verifier is the sole authority on that field.
|
|
58
|
+
*/
|
|
59
|
+
export function verifyFeedback(feedback, planText) {
|
|
60
|
+
let exceptionCount = 0;
|
|
61
|
+
let missingQuoteCount = 0;
|
|
62
|
+
const verifiedIssues = feedback.issues.map((issue) => {
|
|
63
|
+
if (!issue.quoted_text)
|
|
64
|
+
missingQuoteCount += 1;
|
|
65
|
+
let verified = false;
|
|
66
|
+
try {
|
|
67
|
+
verified = verifyIssue(issue, planText).verified;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
exceptionCount += 1;
|
|
71
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
72
|
+
process.stderr.write(`[planpong] warn: verifier exception on issue ${issue.id}: ${msg}\n`);
|
|
73
|
+
verified = false;
|
|
74
|
+
}
|
|
75
|
+
return { ...issue, verified };
|
|
76
|
+
});
|
|
77
|
+
const total = verifiedIssues.length;
|
|
78
|
+
const unverifiedCount = verifiedIssues.filter((i) => i.verified === false).length;
|
|
79
|
+
const complianceRatio = total === 0 ? 0 : missingQuoteCount / total;
|
|
80
|
+
const complianceWarning = complianceRatio > COMPLIANCE_WARNING_THRESHOLD;
|
|
81
|
+
if (missingQuoteCount > 0) {
|
|
82
|
+
process.stderr.write(`[planpong] warn: ${missingQuoteCount}/${total} issues missing quoted_text — marked unverified\n`);
|
|
83
|
+
}
|
|
84
|
+
// Spread preserves the discriminating phase-specific fields (confidence /
|
|
85
|
+
// risk_level / etc.) from the original feedback object — without
|
|
86
|
+
// narrowing the union, TypeScript would reject reassignment.
|
|
87
|
+
const annotated = {
|
|
88
|
+
...feedback,
|
|
89
|
+
issues: verifiedIssues,
|
|
90
|
+
unverified_count: unverifiedCount,
|
|
91
|
+
quote_compliance_warning: complianceWarning,
|
|
92
|
+
};
|
|
93
|
+
return { feedback: annotated, exceptionCount };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Strip model-supplied `verified` from every issue. Called before
|
|
97
|
+
* `verifyFeedback` so the model cannot self-assert verification status.
|
|
98
|
+
*
|
|
99
|
+
* Mutates and returns the same array element-wise (cheap; the caller has
|
|
100
|
+
* just constructed these objects from a parse step).
|
|
101
|
+
*/
|
|
102
|
+
export function stripModelVerified(issues) {
|
|
103
|
+
for (const issue of issues) {
|
|
104
|
+
if ("verified" in issue) {
|
|
105
|
+
delete issue.verified;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return issues;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=verify-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-evidence.js","sourceRoot":"","sources":["../../../src/core/verify-evidence.ts"],"names":[],"mappings":"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"}
|
package/dist/src/mcp/server.js
CHANGED
|
@@ -3,6 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { registerStartReview } from "./tools/start-review.js";
|
|
4
4
|
import { registerGetFeedback } from "./tools/get-feedback.js";
|
|
5
5
|
import { registerRevise } from "./tools/revise.js";
|
|
6
|
+
import { registerRecordRevision } from "./tools/record-revision.js";
|
|
6
7
|
import { registerStatus } from "./tools/status.js";
|
|
7
8
|
import { registerListSessions } from "./tools/list-sessions.js";
|
|
8
9
|
import { registerGetReport } from "./tools/get-report.js";
|
|
@@ -21,10 +22,12 @@ Planpong uses a three-phase review process:
|
|
|
21
22
|
The "phase" field in tool responses tells you which phase is active. Mention the phase to the user so they understand why feedback character changes between rounds.
|
|
22
23
|
|
|
23
24
|
When the user asks you to review a plan:
|
|
24
|
-
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).
|
|
25
|
+
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: "inline" to act as the planner yourself; default is "external" (planner provider invoked).
|
|
25
26
|
2. Call planpong_get_feedback to get reviewer critique
|
|
26
27
|
3. Show the user the feedback summary and issues (note: round 1 is directional review)
|
|
27
|
-
4. If is_converged is false,
|
|
28
|
+
4. If is_converged is false, advance the round depending on planner_mode:
|
|
29
|
+
- **external mode (default):** call planpong_revise. The planner provider produces the revision and applies it to disk.
|
|
30
|
+
- **inline mode:** YOU are the planner. Summarize the issues to the user, 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.
|
|
28
31
|
5. Show the user the revision summary (accepted/rejected/deferred)
|
|
29
32
|
6. Repeat steps 2-5 until converged or max rounds reached
|
|
30
33
|
|
|
@@ -45,6 +48,7 @@ Phase-specific feedback:
|
|
|
45
48
|
registerStartReview(server);
|
|
46
49
|
registerGetFeedback(server);
|
|
47
50
|
registerRevise(server);
|
|
51
|
+
registerRecordRevision(server);
|
|
48
52
|
registerStatus(server);
|
|
49
53
|
registerListSessions(server);
|
|
50
54
|
registerGetReport(server);
|
|
@@ -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,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,6 +89,15 @@ export async function getFeedbackHandler(input) {
|
|
|
89
89
|
if (result.timing) {
|
|
90
90
|
response.timing = result.timing;
|
|
91
91
|
}
|
|
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
|
+
if (result.feedback.unverified_count !== undefined) {
|
|
96
|
+
response.unverified_count = result.feedback.unverified_count;
|
|
97
|
+
}
|
|
98
|
+
if (result.feedback.quote_compliance_warning) {
|
|
99
|
+
response.quote_compliance_warning = true;
|
|
100
|
+
}
|
|
92
101
|
// Phase-specific lean fields for status line consumption
|
|
93
102
|
if (result.phaseExtras.is_blocked) {
|
|
94
103
|
response.is_blocked = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-feedback.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type IssueResponse } from "../../schemas/revision.js";
|
|
3
|
+
export declare function recordRevisionHandler(input: {
|
|
4
|
+
session_id: string;
|
|
5
|
+
expected_round: number;
|
|
6
|
+
responses: IssueResponse[];
|
|
7
|
+
cwd?: string;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
content: {
|
|
10
|
+
type: "text";
|
|
11
|
+
text: string;
|
|
12
|
+
}[];
|
|
13
|
+
isError: boolean;
|
|
14
|
+
} | {
|
|
15
|
+
content: {
|
|
16
|
+
type: "text";
|
|
17
|
+
text: string;
|
|
18
|
+
}[];
|
|
19
|
+
}>;
|
|
20
|
+
export declare function registerRecordRevision(server: McpServer): void;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { readSessionState, readRoundFeedback, writeRoundMetrics, } from "../../core/session.js";
|
|
5
|
+
import { finalizeRevision, writeStatusLineToPlan, } from "../../core/operations.js";
|
|
6
|
+
import { loadConfig } from "../../config/loader.js";
|
|
7
|
+
import { getReviewPhase } from "../../prompts/reviewer.js";
|
|
8
|
+
import { IssueResponseSchema, } from "../../schemas/revision.js";
|
|
9
|
+
/**
|
|
10
|
+
* Inline-mode counterpart to `planpong_revise`. The agent that invoked
|
|
11
|
+
* /pong-review acts as the planner: it edited the plan with its own
|
|
12
|
+
* Edit/Write tools, then calls this tool to log the per-issue responses
|
|
13
|
+
* and advance the session bookkeeping.
|
|
14
|
+
*
|
|
15
|
+
* No planner provider is invoked. The shared `finalizeRevision` helper
|
|
16
|
+
* persists the response file, updates the plan hash, and writes session
|
|
17
|
+
* state — same path the external mode takes after `runRevisionRound`.
|
|
18
|
+
*/
|
|
19
|
+
const inputSchema = {
|
|
20
|
+
session_id: z.string().describe("Session ID from planpong_start_review"),
|
|
21
|
+
expected_round: z
|
|
22
|
+
.number()
|
|
23
|
+
.int()
|
|
24
|
+
.nonnegative()
|
|
25
|
+
.describe("The round this revision responds to. Must equal session.currentRound. Catches double-submission and stale tool calls."),
|
|
26
|
+
responses: z
|
|
27
|
+
.array(IssueResponseSchema)
|
|
28
|
+
.describe("One response per issue from the round's feedback. Every issue.id MUST appear here."),
|
|
29
|
+
cwd: z
|
|
30
|
+
.string()
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Working directory (defaults to process.cwd())"),
|
|
33
|
+
};
|
|
34
|
+
export async function recordRevisionHandler(input) {
|
|
35
|
+
const cwd = input.cwd ?? process.cwd();
|
|
36
|
+
const session = readSessionState(cwd, input.session_id);
|
|
37
|
+
if (!session) {
|
|
38
|
+
return errorResponse(`Session not found: ${input.session_id}`);
|
|
39
|
+
}
|
|
40
|
+
if (session.status !== "in_review") {
|
|
41
|
+
return errorResponse(`Session status is '${session.status}', expected 'in_review'`);
|
|
42
|
+
}
|
|
43
|
+
if (session.plannerMode !== "inline") {
|
|
44
|
+
return errorResponse(`session is in ${session.plannerMode} planner mode — use planpong_revise instead`, { planner_mode: session.plannerMode });
|
|
45
|
+
}
|
|
46
|
+
if (input.expected_round !== session.currentRound) {
|
|
47
|
+
return errorResponse(`round ${input.expected_round} already finalized (current round is ${session.currentRound})`, {
|
|
48
|
+
expected_round: input.expected_round,
|
|
49
|
+
current_round: session.currentRound,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const feedback = readRoundFeedback(cwd, session.id, session.currentRound);
|
|
53
|
+
if (!feedback) {
|
|
54
|
+
return errorResponse(`No feedback found for session ${session.id} round ${session.currentRound}. Call planpong_get_feedback first.`);
|
|
55
|
+
}
|
|
56
|
+
// Validate every issue has a response. Mirrors the planner prompt's
|
|
57
|
+
// "every issue MUST have an entry in responses" constraint so inline
|
|
58
|
+
// mode produces the same shape downstream tools expect.
|
|
59
|
+
const responseIds = new Set(input.responses.map((r) => r.issue_id));
|
|
60
|
+
const missing = feedback.issues
|
|
61
|
+
.map((i) => i.id)
|
|
62
|
+
.filter((id) => !responseIds.has(id));
|
|
63
|
+
if (missing.length > 0) {
|
|
64
|
+
return errorResponse(`responses missing for issue(s): ${missing.join(", ")}. Provide one response per feedback issue.`, { missing_issue_ids: missing });
|
|
65
|
+
}
|
|
66
|
+
const round = session.currentRound;
|
|
67
|
+
const phase = getReviewPhase(round);
|
|
68
|
+
const planPath = resolve(cwd, session.planPath);
|
|
69
|
+
// Hash before finalize so we can detect "agent forgot to edit".
|
|
70
|
+
const planHashBefore = session.planHash;
|
|
71
|
+
// Construct PlannerRevision-shape payload. Direction phase keeps the
|
|
72
|
+
// full-plan shape; risk/detail keep the edits shape (with empty edits[]
|
|
73
|
+
// — the agent applied changes via its own Edit tool rather than
|
|
74
|
+
// declaring them here, so the array is informational-only).
|
|
75
|
+
const planContent = readFileSync(planPath, "utf-8");
|
|
76
|
+
const revision = phase === "direction"
|
|
77
|
+
? { responses: input.responses, updated_plan: planContent }
|
|
78
|
+
: { responses: input.responses, edits: [] };
|
|
79
|
+
const tally = finalizeRevision({
|
|
80
|
+
session,
|
|
81
|
+
cwd,
|
|
82
|
+
round,
|
|
83
|
+
revision,
|
|
84
|
+
planPath,
|
|
85
|
+
});
|
|
86
|
+
// Plan-hash warn: any accepted issue should correspond to a plan edit.
|
|
87
|
+
// Surface the no-op case but don't gate — sometimes all issues are
|
|
88
|
+
// legitimately rejected and the plan correctly stays unchanged.
|
|
89
|
+
const planUnchanged = session.planHash === planHashBefore;
|
|
90
|
+
const anyAccepted = input.responses.some((r) => r.action === "accepted");
|
|
91
|
+
if (planUnchanged && anyAccepted) {
|
|
92
|
+
process.stderr.write(`[planpong] warn: round ${round} has accepted issues but plan hash is unchanged — did the agent forget to edit?\n`);
|
|
93
|
+
}
|
|
94
|
+
// Write fully valid RoundMetrics so bench/run.ts:226 doesn't drop this
|
|
95
|
+
// round from analysis. Inline revisions have no provider duration —
|
|
96
|
+
// started_at and completed_at are the same instant.
|
|
97
|
+
const ts = new Date().toISOString();
|
|
98
|
+
const metrics = {
|
|
99
|
+
schema_version: 1,
|
|
100
|
+
session_id: session.id,
|
|
101
|
+
round,
|
|
102
|
+
phase,
|
|
103
|
+
role: "revision",
|
|
104
|
+
started_at: ts,
|
|
105
|
+
completed_at: ts,
|
|
106
|
+
total_duration_ms: 0,
|
|
107
|
+
attempts: [],
|
|
108
|
+
planner_mode: "inline",
|
|
109
|
+
};
|
|
110
|
+
writeRoundMetrics(cwd, session.id, round, "revision", metrics);
|
|
111
|
+
// Update plan status line. Use loadConfig for provider labels (the
|
|
112
|
+
// status-line writer needs them). In inline mode the planner provider
|
|
113
|
+
// is informational, not invoked.
|
|
114
|
+
const config = loadConfig({ cwd });
|
|
115
|
+
const sessionConfig = {
|
|
116
|
+
...config,
|
|
117
|
+
planner: session.planner,
|
|
118
|
+
reviewer: session.reviewer,
|
|
119
|
+
};
|
|
120
|
+
const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision recorded");
|
|
121
|
+
// Match planpong_revise's unverified_rejected counter so the slash
|
|
122
|
+
// command can consume either tool's output uniformly.
|
|
123
|
+
const unverifiedRejected = input.responses.filter((r) => r.action === "rejected" &&
|
|
124
|
+
/unverified\s+evidence/i.test(r.rationale ?? "")).length;
|
|
125
|
+
const payload = {
|
|
126
|
+
round,
|
|
127
|
+
responses: input.responses,
|
|
128
|
+
accepted: tally.accepted,
|
|
129
|
+
rejected: tally.rejected,
|
|
130
|
+
deferred: tally.deferred,
|
|
131
|
+
unverified_rejected: unverifiedRejected,
|
|
132
|
+
plan_updated: !planUnchanged,
|
|
133
|
+
status_line: statusLine,
|
|
134
|
+
planner_mode: "inline",
|
|
135
|
+
idempotent_replay: !tally.fresh,
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
content: [
|
|
139
|
+
{ type: "text", text: statusLine },
|
|
140
|
+
{ type: "text", text: JSON.stringify(payload) },
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function errorResponse(error, extra = {}) {
|
|
145
|
+
return {
|
|
146
|
+
content: [
|
|
147
|
+
{
|
|
148
|
+
type: "text",
|
|
149
|
+
text: JSON.stringify({ error, ...extra }),
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
export function registerRecordRevision(server) {
|
|
156
|
+
server.tool("planpong_record_revision", "Inline-mode revision: log the agent's per-issue responses and advance session bookkeeping. The agent must have already edited the plan with its own Edit/Write tools. Use only when planpong_start_review was called with planner_mode: 'inline'. Otherwise call planpong_revise.", inputSchema, recordRevisionHandler);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=record-revision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-revision.js","sourceRoot":"","sources":["../../../../src/mcp/tools/record-revision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAEtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,mBAAmB,GAGpB,MAAM,2BAA2B,CAAC;AAGnC;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG;IAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACxE,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,EAAE;SACL,WAAW,EAAE;SACb,QAAQ,CACP,uHAAuH,CACxH;IACH,SAAS,EAAE,CAAC;SACT,KAAK,CAAC,mBAAmB,CAAC;SAC1B,QAAQ,CACP,oFAAoF,CACrF;IACH,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;CAC7D,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAK3C;IACC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,sBAAsB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,aAAa,CAClB,sBAAsB,OAAO,CAAC,MAAM,yBAAyB,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,aAAa,CAClB,iBAAiB,OAAO,CAAC,WAAW,6CAA6C,EACjF,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CACtC,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;QAClD,OAAO,aAAa,CAClB,SAAS,KAAK,CAAC,cAAc,wCAAwC,OAAO,CAAC,YAAY,GAAG,EAC5F;YACE,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,aAAa,EAAE,OAAO,CAAC,YAAY;SACpC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,aAAa,CAClB,iCAAiC,OAAO,CAAC,EAAE,UAAU,OAAO,CAAC,YAAY,qCAAqC,CAC/G,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,qEAAqE;IACrE,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM;SAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,aAAa,CAClB,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,4CAA4C,EACjG,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IACnC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEhD,gEAAgE;IAChE,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IAExC,qEAAqE;IACrE,wEAAwE;IACxE,gEAAgE;IAChE,4DAA4D;IAC5D,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,QAAQ,GACZ,KAAK,KAAK,WAAW;QACnB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE;QAC3D,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAEhD,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,OAAO;QACP,GAAG;QACH,KAAK;QACL,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;IAEH,uEAAuE;IACvE,mEAAmE;IACnE,gEAAgE;IAChE,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,KAAK,cAAc,CAAC;IAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IACzE,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0BAA0B,KAAK,mFAAmF,CACnH,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,oEAAoE;IACpE,oDAAoD;IACpD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,OAAO,GAAiB;QAC5B,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,KAAK;QACL,KAAK;QACL,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,EAAE;QAChB,iBAAiB,EAAE,CAAC;QACpB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,QAAQ;KACvB,CAAC;IACF,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAE/D,mEAAmE;IACnE,sEAAsE;IACtE,iCAAiC;IACjC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,MAAM,aAAa,GAAG;QACpB,GAAG,MAAM;QACT,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;IACF,MAAM,UAAU,GAAG,qBAAqB,CACtC,OAAO,EACP,GAAG,EACH,aAAa,EACb,mBAAmB,CACpB,CAAC;IAEF,mEAAmE;IACnE,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,KAAK,UAAU;QACvB,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CACnD,CAAC,MAAM,CAAC;IAET,MAAM,OAAO,GAAG;QACd,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,mBAAmB,EAAE,kBAAkB;QACvC,YAAY,EAAE,CAAC,aAAa;QAC5B,WAAW,EAAE,UAAU;QACvB,YAAY,EAAE,QAAiB;QAC/B,iBAAiB,EAAE,CAAC,KAAK,CAAC,KAAK;KAChC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,EAAE;YAC3C,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;SACzD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,QAAiC,EAAE;IACvE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;aAC1C;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,mRAAmR,EACnR,WAAW,EACX,qBAAqB,CACtB,CAAC;AACJ,CAAC"}
|
|
@@ -39,6 +39,20 @@ export async function reviseHandler(input) {
|
|
|
39
39
|
isError: true,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
42
|
+
if (session.plannerMode === "inline") {
|
|
43
|
+
return {
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
46
|
+
type: "text",
|
|
47
|
+
text: JSON.stringify({
|
|
48
|
+
error: "session is in inline planner mode — use planpong_record_revision instead",
|
|
49
|
+
planner_mode: "inline",
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
42
56
|
const config = loadConfig({ cwd });
|
|
43
57
|
const plannerProvider = getProvider(session.planner.provider);
|
|
44
58
|
if (!plannerProvider) {
|
|
@@ -62,12 +76,20 @@ export async function reviseHandler(input) {
|
|
|
62
76
|
const result = await runRevisionRound(session, cwd, sessionConfig, plannerProvider);
|
|
63
77
|
// Update status line in plan file (planner may have mangled it)
|
|
64
78
|
const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision submitted");
|
|
79
|
+
// Count rejections whose rationale matches "unverified evidence".
|
|
80
|
+
// Free-text matching is intentionally lenient; the planner prompt
|
|
81
|
+
// suggests the exact phrase but accepts variants (the plan flags
|
|
82
|
+
// this in Limitations & Future Work — a structured enum is a
|
|
83
|
+
// follow-up).
|
|
84
|
+
const unverifiedRejected = result.revision.responses.filter((r) => r.action === "rejected" &&
|
|
85
|
+
/unverified\s+evidence/i.test(r.rationale ?? "")).length;
|
|
65
86
|
const payload = {
|
|
66
87
|
round: result.round,
|
|
67
88
|
responses: result.revision.responses,
|
|
68
89
|
accepted: result.accepted,
|
|
69
90
|
rejected: result.rejected,
|
|
70
91
|
deferred: result.deferred,
|
|
92
|
+
unverified_rejected: unverifiedRejected,
|
|
71
93
|
plan_updated: result.planUpdated,
|
|
72
94
|
status_line: statusLine,
|
|
73
95
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,10 @@ const inputSchema = {
|
|
|
38
38
|
.boolean()
|
|
39
39
|
.optional()
|
|
40
40
|
.describe("If true, pause after each round for user confirmation. Default: false (autonomous)"),
|
|
41
|
+
planner_mode: z
|
|
42
|
+
.enum(["inline", "external"])
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("Planner mode for this session. 'external' (default) routes revisions through planpong_revise + a planner provider. 'inline' routes through planpong_record_revision so the agent that invoked /pong-review acts as the planner. Sticky for the session lifetime."),
|
|
41
45
|
};
|
|
42
46
|
export function registerStartReview(server) {
|
|
43
47
|
server.tool("planpong_start_review", "Create a review session for an existing plan file. Validates the file, loads config, checks provider availability, and creates a session. Does NOT invoke any models.", inputSchema, async (input) => {
|
|
@@ -54,6 +58,7 @@ export function registerStartReview(server) {
|
|
|
54
58
|
reviewerEffort: input.reviewer?.effort,
|
|
55
59
|
maxRounds: input.max_rounds,
|
|
56
60
|
autonomous: true,
|
|
61
|
+
plannerMode: input.planner_mode,
|
|
57
62
|
},
|
|
58
63
|
});
|
|
59
64
|
// Check provider availability and auto-fallback
|
|
@@ -124,10 +129,12 @@ export function registerStartReview(server) {
|
|
|
124
129
|
plan_path: planPath,
|
|
125
130
|
plan_summary: planSummary,
|
|
126
131
|
interactive: input.interactive ?? false,
|
|
132
|
+
planner_mode: session.plannerMode,
|
|
127
133
|
config: {
|
|
128
134
|
planner: config.planner,
|
|
129
135
|
reviewer: config.reviewer,
|
|
130
136
|
max_rounds: config.max_rounds,
|
|
137
|
+
planner_mode: config.planner_mode,
|
|
131
138
|
},
|
|
132
139
|
}),
|
|
133
140
|
},
|