planpong 0.5.7 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -10
- package/dist/bin/planpong.js +3 -0
- package/dist/bin/planpong.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/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 +45 -32
- 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 +7 -1
- 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
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
export declare function reviseHandler(input: {
|
|
3
3
|
session_id: string;
|
|
4
|
+
expected_round: number;
|
|
4
5
|
cwd?: string;
|
|
5
6
|
}): Promise<{
|
|
6
7
|
content: {
|
|
7
8
|
type: "text";
|
|
8
9
|
text: string;
|
|
9
10
|
}[];
|
|
10
|
-
isError: boolean;
|
|
11
|
-
} | {
|
|
12
|
-
content: {
|
|
13
|
-
type: "text";
|
|
14
|
-
text: string;
|
|
15
|
-
}[];
|
|
16
|
-
isError?: undefined;
|
|
17
11
|
}>;
|
|
18
12
|
export declare function registerRevise(server: McpServer): void;
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { loadConfig } from "../../config/loader.js";
|
|
3
3
|
import { getProvider } from "../../providers/registry.js";
|
|
4
|
-
import { readSessionState } from "../../core/session.js";
|
|
4
|
+
import { readRoundFeedback, readRoundResponse, readSessionState, withSessionLock, } from "../../core/session.js";
|
|
5
5
|
import { runRevisionRound, writeStatusLineToPlan, } from "../../core/operations.js";
|
|
6
|
+
import { formatDecisionDisplay } from "../../core/presentation.js";
|
|
6
7
|
const inputSchema = {
|
|
7
8
|
session_id: z.string().describe("Session ID from planpong_start_review"),
|
|
9
|
+
expected_round: z
|
|
10
|
+
.number()
|
|
11
|
+
.int()
|
|
12
|
+
.positive()
|
|
13
|
+
.describe("The feedback round this revision responds to. Must equal session.currentRound."),
|
|
8
14
|
cwd: z
|
|
9
15
|
.string()
|
|
10
16
|
.optional()
|
|
@@ -12,111 +18,141 @@ const inputSchema = {
|
|
|
12
18
|
};
|
|
13
19
|
export async function reviseHandler(input) {
|
|
14
20
|
const cwd = input.cwd ?? process.cwd();
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
17
|
-
return {
|
|
18
|
-
content: [
|
|
19
|
-
{
|
|
20
|
-
type: "text",
|
|
21
|
-
text: JSON.stringify({
|
|
22
|
-
error: `Session not found: ${input.session_id}`,
|
|
23
|
-
}),
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
isError: true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
if (session.status !== "in_review") {
|
|
30
|
-
return {
|
|
31
|
-
content: [
|
|
32
|
-
{
|
|
33
|
-
type: "text",
|
|
34
|
-
text: JSON.stringify({
|
|
35
|
-
error: `Session status is '${session.status}', expected 'in_review'`,
|
|
36
|
-
}),
|
|
37
|
-
},
|
|
38
|
-
],
|
|
39
|
-
isError: true,
|
|
40
|
-
};
|
|
21
|
+
const existing = readSessionState(cwd, input.session_id);
|
|
22
|
+
if (!existing) {
|
|
23
|
+
return errorResponse(`Session not found: ${input.session_id}`);
|
|
41
24
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
25
|
+
return withSessionLock(cwd, input.session_id, async () => {
|
|
26
|
+
const session = readSessionState(cwd, input.session_id);
|
|
27
|
+
if (!session) {
|
|
28
|
+
return errorResponse(`Session not found: ${input.session_id}`);
|
|
29
|
+
}
|
|
30
|
+
if (input.expected_round < session.currentRound) {
|
|
31
|
+
return errorResponse(`stale revision call for round ${input.expected_round}; current round is ${session.currentRound}`, {
|
|
32
|
+
expected_round: input.expected_round,
|
|
33
|
+
current_round: session.currentRound,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (input.expected_round > session.currentRound) {
|
|
37
|
+
return errorResponse(`out-of-order revision call for round ${input.expected_round}; call planpong_get_feedback first`, {
|
|
38
|
+
expected_round: input.expected_round,
|
|
39
|
+
current_round: session.currentRound,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (session.status !== "in_review") {
|
|
43
|
+
return errorResponse(`Session status is '${session.status}', expected 'in_review'`);
|
|
44
|
+
}
|
|
45
|
+
if (session.plannerMode === "inline") {
|
|
46
|
+
return errorResponse("session is in inline planner mode — use planpong_record_revision instead", { planner_mode: "inline" });
|
|
47
|
+
}
|
|
48
|
+
const config = loadConfig({ cwd });
|
|
49
|
+
const sessionConfig = {
|
|
50
|
+
...config,
|
|
51
|
+
planner: session.planner,
|
|
52
|
+
reviewer: session.reviewer,
|
|
69
53
|
};
|
|
54
|
+
const feedback = readRoundFeedback(cwd, session.id, input.expected_round);
|
|
55
|
+
if (!feedback) {
|
|
56
|
+
return errorResponse(`No feedback found for session ${session.id} round ${input.expected_round}. Call planpong_get_feedback first.`);
|
|
57
|
+
}
|
|
58
|
+
const existingResponse = readRoundResponse(cwd, session.id, input.expected_round);
|
|
59
|
+
if (existingResponse) {
|
|
60
|
+
const tally = tallyResponses(existingResponse.responses);
|
|
61
|
+
const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision submitted");
|
|
62
|
+
return buildRevisionResponse({
|
|
63
|
+
round: input.expected_round,
|
|
64
|
+
revision: existingResponse,
|
|
65
|
+
accepted: tally.accepted,
|
|
66
|
+
rejected: tally.rejected,
|
|
67
|
+
deferred: tally.deferred,
|
|
68
|
+
planUpdated: false,
|
|
69
|
+
statusLine,
|
|
70
|
+
feedback,
|
|
71
|
+
idempotentReplay: true,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const plannerProvider = getProvider(session.planner.provider);
|
|
75
|
+
if (!plannerProvider) {
|
|
76
|
+
return errorResponse(`Planner provider not found: ${session.planner.provider}`);
|
|
77
|
+
}
|
|
78
|
+
const result = await runRevisionRound(session, cwd, sessionConfig, plannerProvider);
|
|
79
|
+
// Update status line in plan file (planner may have mangled it)
|
|
80
|
+
const statusLine = writeStatusLineToPlan(session, cwd, sessionConfig, "Revision submitted");
|
|
81
|
+
return buildRevisionResponse({
|
|
82
|
+
...result,
|
|
83
|
+
statusLine,
|
|
84
|
+
feedback,
|
|
85
|
+
idempotentReplay: false,
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function tallyResponses(responses) {
|
|
90
|
+
let accepted = 0;
|
|
91
|
+
let rejected = 0;
|
|
92
|
+
let deferred = 0;
|
|
93
|
+
for (const response of responses) {
|
|
94
|
+
if (response.action === "accepted")
|
|
95
|
+
accepted++;
|
|
96
|
+
else if (response.action === "rejected")
|
|
97
|
+
rejected++;
|
|
98
|
+
else if (response.action === "deferred")
|
|
99
|
+
deferred++;
|
|
70
100
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
};
|
|
76
|
-
const result = await runRevisionRound(session, cwd, sessionConfig, plannerProvider);
|
|
77
|
-
// Update status line in plan file (planner may have mangled it)
|
|
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" &&
|
|
101
|
+
return { accepted, rejected, deferred };
|
|
102
|
+
}
|
|
103
|
+
function buildRevisionResponse(args) {
|
|
104
|
+
const unverifiedRejected = args.revision.responses.filter((r) => r.action === "rejected" &&
|
|
85
105
|
/unverified\s+evidence/i.test(r.rationale ?? "")).length;
|
|
106
|
+
const display = formatDecisionDisplay({
|
|
107
|
+
round: args.round,
|
|
108
|
+
feedback: args.feedback,
|
|
109
|
+
revision: args.revision,
|
|
110
|
+
});
|
|
86
111
|
const payload = {
|
|
87
|
-
round:
|
|
88
|
-
responses:
|
|
89
|
-
accepted:
|
|
90
|
-
rejected:
|
|
91
|
-
deferred:
|
|
112
|
+
round: args.round,
|
|
113
|
+
responses: args.revision.responses,
|
|
114
|
+
accepted: args.accepted,
|
|
115
|
+
rejected: args.rejected,
|
|
116
|
+
deferred: args.deferred,
|
|
92
117
|
unverified_rejected: unverifiedRejected,
|
|
93
|
-
plan_updated:
|
|
94
|
-
status_line: statusLine,
|
|
118
|
+
plan_updated: args.planUpdated,
|
|
119
|
+
status_line: args.statusLine,
|
|
120
|
+
idempotent_replay: args.idempotentReplay,
|
|
121
|
+
decision_rows: display.rows,
|
|
122
|
+
display_markdown: display.markdown,
|
|
95
123
|
};
|
|
96
|
-
if (
|
|
97
|
-
payload.
|
|
124
|
+
if (display.warnings.length > 0) {
|
|
125
|
+
payload.display_warnings = display.warnings;
|
|
98
126
|
}
|
|
99
|
-
if (
|
|
100
|
-
payload.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
payload.
|
|
106
|
-
payload.
|
|
127
|
+
if (args.timing) {
|
|
128
|
+
payload.timing = args.timing;
|
|
129
|
+
}
|
|
130
|
+
if (args.edits) {
|
|
131
|
+
payload.revision_mode = args.edits.revision_mode;
|
|
132
|
+
if (args.edits.revision_mode === "edits") {
|
|
133
|
+
payload.edits_attempted = args.edits.edits_attempted;
|
|
134
|
+
payload.edits_applied = args.edits.edits_applied;
|
|
135
|
+
payload.edits_failed = args.edits.edits_failed;
|
|
136
|
+
payload.edits_recovered = args.edits.edits_recovered;
|
|
137
|
+
payload.retry_invoked = args.edits.retry_invoked;
|
|
107
138
|
}
|
|
108
139
|
}
|
|
140
|
+
return {
|
|
141
|
+
content: [
|
|
142
|
+
{ type: "text", text: args.statusLine },
|
|
143
|
+
{ type: "text", text: JSON.stringify(payload) },
|
|
144
|
+
],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function errorResponse(error, extra = {}) {
|
|
109
148
|
return {
|
|
110
149
|
content: [
|
|
111
150
|
{
|
|
112
151
|
type: "text",
|
|
113
|
-
text:
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
type: "text",
|
|
117
|
-
text: JSON.stringify(payload),
|
|
152
|
+
text: JSON.stringify({ error, ...extra }),
|
|
118
153
|
},
|
|
119
154
|
],
|
|
155
|
+
isError: true,
|
|
120
156
|
};
|
|
121
157
|
}
|
|
122
158
|
export function registerRevise(server) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"revise.js","sourceRoot":"","sources":["../../../../src/mcp/tools/revise.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { readSessionState, readRoundFeedback, readRoundResponse, readRoundMetrics, } from "../../core/session.js";
|
|
3
3
|
import { formatTrajectory, severityFromFeedback, } from "../../core/operations.js";
|
|
4
|
+
import { getRoundState } from "../../core/round-state.js";
|
|
4
5
|
const inputSchema = {
|
|
5
6
|
session_id: z.string().describe("Session ID to check"),
|
|
6
7
|
cwd: z
|
|
@@ -30,7 +31,11 @@ export function registerStatus(server) {
|
|
|
30
31
|
for (let r = 1; r <= session.currentRound; r++) {
|
|
31
32
|
const fb = readRoundFeedback(cwd, session.id, r);
|
|
32
33
|
const resp = readRoundResponse(cwd, session.id, r);
|
|
33
|
-
const roundInfo = {
|
|
34
|
+
const roundInfo = {
|
|
35
|
+
round: r,
|
|
36
|
+
feedback_written: fb !== null,
|
|
37
|
+
response_written: resp !== null,
|
|
38
|
+
};
|
|
34
39
|
if (fb) {
|
|
35
40
|
roundInfo.feedback_summary = fb.summary;
|
|
36
41
|
roundInfo.verdict = fb.verdict;
|
|
@@ -69,6 +74,15 @@ export function registerStatus(server) {
|
|
|
69
74
|
}
|
|
70
75
|
rounds.push(roundInfo);
|
|
71
76
|
}
|
|
77
|
+
const roundState = getRoundState(cwd, session);
|
|
78
|
+
if (session.currentRound > 0 && rounds.length > 0) {
|
|
79
|
+
const current = rounds.find((r) => r.round === session.currentRound);
|
|
80
|
+
if (current) {
|
|
81
|
+
current.next_action = roundState.nextAction;
|
|
82
|
+
current.incomplete_transition = roundState.incompleteTransition;
|
|
83
|
+
current.inconsistent_artifacts = roundState.inconsistentArtifacts;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
72
86
|
const trajectory = severities.length > 0
|
|
73
87
|
? formatTrajectory(severities)
|
|
74
88
|
: "No rounds completed";
|
|
@@ -85,6 +99,9 @@ export function registerStatus(server) {
|
|
|
85
99
|
started_at: session.startedAt,
|
|
86
100
|
planner: session.planner,
|
|
87
101
|
reviewer: session.reviewer,
|
|
102
|
+
next_action: roundState.nextAction,
|
|
103
|
+
incomplete_transition: roundState.incompleteTransition,
|
|
104
|
+
inconsistent_artifacts: roundState.inconsistentArtifacts,
|
|
88
105
|
},
|
|
89
106
|
rounds,
|
|
90
107
|
trajectory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/mcp/tools/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,25 @@
|
|
|
1
|
-
import type { Provider, InvokeOptions, ProviderResponse } from "./types.js";
|
|
1
|
+
import type { Provider, InvokeOptions, ProviderResponse, ProviderError } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Parse claude's `--output-format json` envelope and extract the
|
|
4
|
+
* `structured_output` field as a JSON string ready for downstream parsing.
|
|
5
|
+
* Returns null if the envelope is malformed or the field is missing.
|
|
6
|
+
*
|
|
7
|
+
* Envelope shape (subset):
|
|
8
|
+
* {
|
|
9
|
+
* "type": "result",
|
|
10
|
+
* "is_error": false,
|
|
11
|
+
* "result": "",
|
|
12
|
+
* "structured_output": { ...model's constrained JSON... },
|
|
13
|
+
* ...
|
|
14
|
+
* }
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractStructuredOutput(stdout: string): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Classify a CLI invocation failure as `capability` (downgrade-eligible) or
|
|
19
|
+
* `fatal` (terminal). Capability errors indicate the CLI doesn't support the
|
|
20
|
+
* requested structured output flag; fatal errors are everything else.
|
|
21
|
+
*/
|
|
22
|
+
export declare function classifyError(stderr: string, exitCode: number): ProviderError;
|
|
2
23
|
export declare class ClaudeProvider implements Provider {
|
|
3
24
|
name: string;
|
|
4
25
|
private capabilityCache;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execa } from "execa";
|
|
2
|
+
import { assertMutuallyExclusiveSessions, logClassificationFailure, } from "./shared.js";
|
|
2
3
|
const MODELS = ["opus", "sonnet", "haiku"];
|
|
3
4
|
/**
|
|
4
5
|
* Build a clean env object with CLAUDECODE removed.
|
|
@@ -27,7 +28,7 @@ function cleanEnv() {
|
|
|
27
28
|
* ...
|
|
28
29
|
* }
|
|
29
30
|
*/
|
|
30
|
-
function extractStructuredOutput(stdout) {
|
|
31
|
+
export function extractStructuredOutput(stdout) {
|
|
31
32
|
try {
|
|
32
33
|
const envelope = JSON.parse(stdout);
|
|
33
34
|
if (envelope &&
|
|
@@ -48,7 +49,7 @@ function extractStructuredOutput(stdout) {
|
|
|
48
49
|
* `fatal` (terminal). Capability errors indicate the CLI doesn't support the
|
|
49
50
|
* requested structured output flag; fatal errors are everything else.
|
|
50
51
|
*/
|
|
51
|
-
function classifyError(stderr, exitCode) {
|
|
52
|
+
export function classifyError(stderr, exitCode) {
|
|
52
53
|
const lower = stderr.toLowerCase();
|
|
53
54
|
const capabilityIndicators = [
|
|
54
55
|
"unknown flag",
|
|
@@ -71,6 +72,7 @@ export class ClaudeProvider {
|
|
|
71
72
|
name = "claude";
|
|
72
73
|
capabilityCache = null;
|
|
73
74
|
async invoke(prompt, options) {
|
|
75
|
+
assertMutuallyExclusiveSessions(this.name, options);
|
|
74
76
|
// claude -p reads prompt from stdin when no positional arg is given.
|
|
75
77
|
// --bare skips hooks/MCP/auto-memory/CLAUDE.md/plugin-sync for faster
|
|
76
78
|
// subprocess startup, but it bypasses OAuth/keychain — only safe to use
|
|
@@ -93,12 +95,10 @@ export class ClaudeProvider {
|
|
|
93
95
|
args.push("--model", options.model);
|
|
94
96
|
}
|
|
95
97
|
// Persistent conversation. `--session-id` creates a new session with the
|
|
96
|
-
// given UUID; `--resume` continues an existing one.
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
throw new Error("claude provider: newSessionId and resumeSessionId are mutually exclusive");
|
|
101
|
-
}
|
|
98
|
+
// given UUID; `--resume` continues an existing one. Mutual exclusion is
|
|
99
|
+
// enforced at the top of invoke() via assertMutuallyExclusiveSessions.
|
|
100
|
+
// Lets us drop heavy "current plan + prior decisions" stuffing on round
|
|
101
|
+
// 2+ since the model retains context.
|
|
102
102
|
if (options.newSessionId) {
|
|
103
103
|
args.push("--session-id", options.newSessionId);
|
|
104
104
|
}
|
|
@@ -144,7 +144,7 @@ export class ClaudeProvider {
|
|
|
144
144
|
return { ok: true, output: result.stdout, duration, sessionId };
|
|
145
145
|
}
|
|
146
146
|
// No usable output — classify the failure
|
|
147
|
-
|
|
147
|
+
logClassificationFailure(this.name, exitCode, result.stderr);
|
|
148
148
|
return {
|
|
149
149
|
ok: false,
|
|
150
150
|
error: classifyError(result.stderr ?? "", exitCode),
|
|
@@ -192,7 +192,7 @@ export class ClaudeProvider {
|
|
|
192
192
|
const supported = helpText.includes("--json-schema");
|
|
193
193
|
this.capabilityCache = supported;
|
|
194
194
|
if (!supported) {
|
|
195
|
-
process.stderr.write(`[planpong] Structured output not supported by claude — using
|
|
195
|
+
process.stderr.write(`[planpong] Structured output not supported by claude — using prompted parsing\n`);
|
|
196
196
|
}
|
|
197
197
|
return supported;
|
|
198
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/providers/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/providers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import type { Provider, InvokeOptions, ProviderResponse } from "./types.js";
|
|
1
|
+
import type { Provider, InvokeOptions, ProviderResponse, ProviderError } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Classify a CLI invocation failure as `capability` (downgrade-eligible) or
|
|
4
|
+
* `fatal` (terminal). Capability errors indicate the CLI doesn't support the
|
|
5
|
+
* requested structured output flag; fatal errors are everything else.
|
|
6
|
+
*
|
|
7
|
+
* Patterns must be narrow — codex's normal session header includes flag
|
|
8
|
+
* names like "output-schema:" in its info output, so substring matches on
|
|
9
|
+
* the flag name alone produce false positives.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractCodexThreadId(stdout: string | undefined): string | undefined;
|
|
12
|
+
export declare function classifyError(stderr: string, exitCode: number): ProviderError;
|
|
2
13
|
export declare class CodexProvider implements Provider {
|
|
3
14
|
name: string;
|
|
4
15
|
private capabilityCache;
|
|
@@ -3,6 +3,7 @@ import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { execa } from "execa";
|
|
6
|
+
import { assertMutuallyExclusiveSessions, logClassificationFailure, } from "./shared.js";
|
|
6
7
|
const MODELS = ["gpt-5.3-codex", "o3-pro", "o3", "o4-mini"];
|
|
7
8
|
const EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
|
|
8
9
|
/**
|
|
@@ -14,7 +15,7 @@ const EFFORT_LEVELS = ["low", "medium", "high", "xhigh"];
|
|
|
14
15
|
* names like "output-schema:" in its info output, so substring matches on
|
|
15
16
|
* the flag name alone produce false positives.
|
|
16
17
|
*/
|
|
17
|
-
function extractCodexThreadId(stdout) {
|
|
18
|
+
export function extractCodexThreadId(stdout) {
|
|
18
19
|
if (!stdout)
|
|
19
20
|
return undefined;
|
|
20
21
|
// The first non-empty line of `codex exec --json` stdout is a
|
|
@@ -39,7 +40,7 @@ function extractCodexThreadId(stdout) {
|
|
|
39
40
|
}
|
|
40
41
|
return undefined;
|
|
41
42
|
}
|
|
42
|
-
function classifyError(stderr, exitCode) {
|
|
43
|
+
export function classifyError(stderr, exitCode) {
|
|
43
44
|
const lower = stderr.toLowerCase();
|
|
44
45
|
const capabilityPatterns = [
|
|
45
46
|
/\bunknown (?:flag|option|argument)\b/,
|
|
@@ -62,6 +63,7 @@ export class CodexProvider {
|
|
|
62
63
|
name = "codex";
|
|
63
64
|
capabilityCache = null;
|
|
64
65
|
async invoke(prompt, options) {
|
|
66
|
+
assertMutuallyExclusiveSessions(this.name, options);
|
|
65
67
|
// codex doesn't accept an externally-generated session UUID. The first
|
|
66
68
|
// call always creates a fresh thread; we capture `thread_id` from the
|
|
67
69
|
// `--json` event stream on stdout and the caller persists it. Resume
|
|
@@ -145,6 +147,7 @@ export class CodexProvider {
|
|
|
145
147
|
const sessionId = extractCodexThreadId(result.stdout);
|
|
146
148
|
return { ok: true, output: content, duration, sessionId };
|
|
147
149
|
}
|
|
150
|
+
logClassificationFailure(this.name, exitCode, result.stderr);
|
|
148
151
|
return {
|
|
149
152
|
ok: false,
|
|
150
153
|
error: classifyError(result.stderr ?? "", exitCode),
|
|
@@ -197,7 +200,7 @@ export class CodexProvider {
|
|
|
197
200
|
const supported = helpText.includes("--output-schema");
|
|
198
201
|
this.capabilityCache = supported;
|
|
199
202
|
if (!supported) {
|
|
200
|
-
process.stderr.write(`[planpong] Structured output not supported by codex — using
|
|
203
|
+
process.stderr.write(`[planpong] Structured output not supported by codex — using prompted parsing\n`);
|
|
201
204
|
}
|
|
202
205
|
return supported;
|
|
203
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"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"}
|