poly-weaver 0.4.3 → 0.5.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/dist/agents/implementors/handler.d.ts.map +1 -1
- package/dist/agents/implementors/handler.js +7 -2
- package/dist/agents/implementors/handler.js.map +1 -1
- package/dist/agents/planners/adapter.d.ts.map +1 -1
- package/dist/agents/planners/adapter.js +1 -0
- package/dist/agents/planners/adapter.js.map +1 -1
- package/dist/agents/planners/handler.d.ts.map +1 -1
- package/dist/agents/planners/handler.js +7 -2
- package/dist/agents/planners/handler.js.map +1 -1
- package/dist/agents/planners/types.d.ts +1 -0
- package/dist/agents/planners/types.d.ts.map +1 -1
- package/dist/agents/reviewers/adapter.d.ts +3 -2
- package/dist/agents/reviewers/adapter.d.ts.map +1 -1
- package/dist/agents/reviewers/adapter.js +14 -2
- package/dist/agents/reviewers/adapter.js.map +1 -1
- package/dist/agents/reviewers/dsl.d.ts +11 -1
- package/dist/agents/reviewers/dsl.d.ts.map +1 -1
- package/dist/agents/reviewers/dsl.js.map +1 -1
- package/dist/agents/reviewers/handler.d.ts.map +1 -1
- package/dist/agents/reviewers/handler.js +51 -2
- package/dist/agents/reviewers/handler.js.map +1 -1
- package/dist/agents/reviewers/index.d.ts +3 -3
- package/dist/agents/reviewers/index.d.ts.map +1 -1
- package/dist/agents/reviewers/index.js +9 -5
- package/dist/agents/reviewers/index.js.map +1 -1
- package/dist/agents/reviewers/prompts.d.ts +14 -2
- package/dist/agents/reviewers/prompts.d.ts.map +1 -1
- package/dist/agents/reviewers/prompts.js +106 -2
- package/dist/agents/reviewers/prompts.js.map +1 -1
- package/dist/agents/reviewers/types.d.ts +19 -1
- package/dist/agents/reviewers/types.d.ts.map +1 -1
- package/dist/agents/reviewers/types.js.map +1 -1
- package/dist/agents/runner.d.ts +9 -0
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +2 -1
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/simplifiers/adapter.d.ts.map +1 -1
- package/dist/agents/simplifiers/adapter.js +1 -0
- package/dist/agents/simplifiers/adapter.js.map +1 -1
- package/dist/agents/simplifiers/handler.d.ts.map +1 -1
- package/dist/agents/simplifiers/handler.js +7 -2
- package/dist/agents/simplifiers/handler.js.map +1 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/flow/built-in/default.d.ts +1 -0
- package/dist/flow/built-in/default.d.ts.map +1 -1
- package/dist/flow/built-in/default.js +37 -0
- package/dist/flow/built-in/default.js.map +1 -1
- package/dist/flow/built-in/default.ts +43 -0
- package/dist/flow/built-in/why-so-serious.d.ts +1 -0
- package/dist/flow/built-in/why-so-serious.d.ts.map +1 -1
- package/dist/flow/built-in/why-so-serious.js +37 -0
- package/dist/flow/built-in/why-so-serious.js.map +1 -1
- package/dist/flow/diagram.d.ts.map +1 -1
- package/dist/flow/diagram.js +26 -11
- package/dist/flow/diagram.js.map +1 -1
- package/dist/flow/dsl.d.ts +7 -0
- package/dist/flow/dsl.d.ts.map +1 -1
- package/dist/flow/dsl.js +35 -0
- package/dist/flow/dsl.js.map +1 -1
- package/dist/flow/executor.d.ts.map +1 -1
- package/dist/flow/executor.js +17 -0
- package/dist/flow/executor.js.map +1 -1
- package/dist/flow/types.d.ts +17 -0
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/flow/types.js.map +1 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +14 -0
- package/dist/orchestrator.js.map +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +8 -1
- package/dist/prompts.js.map +1 -1
- package/dist/providers/claude/completion-plan-mode.d.ts +30 -0
- package/dist/providers/claude/completion-plan-mode.d.ts.map +1 -0
- package/dist/providers/claude/completion-plan-mode.js +151 -0
- package/dist/providers/claude/completion-plan-mode.js.map +1 -0
- package/dist/providers/claude/completion.d.ts +9 -48
- package/dist/providers/claude/completion.d.ts.map +1 -1
- package/dist/providers/claude/completion.js +21 -274
- package/dist/providers/claude/completion.js.map +1 -1
- package/dist/providers/claude/session.d.ts +24 -4
- package/dist/providers/claude/session.d.ts.map +1 -1
- package/dist/providers/claude/session.js +90 -15
- package/dist/providers/claude/session.js.map +1 -1
- package/dist/providers/claude/strategy.d.ts +4 -3
- package/dist/providers/claude/strategy.d.ts.map +1 -1
- package/dist/providers/claude/strategy.js +8 -7
- package/dist/providers/claude/strategy.js.map +1 -1
- package/dist/providers/claude/tool-tracking.d.ts +28 -0
- package/dist/providers/claude/tool-tracking.d.ts.map +1 -0
- package/dist/providers/claude/tool-tracking.js +149 -0
- package/dist/providers/claude/tool-tracking.js.map +1 -0
- package/dist/providers/codex/strategy.d.ts +3 -1
- package/dist/providers/codex/strategy.d.ts.map +1 -1
- package/dist/providers/codex/strategy.js +1 -1
- package/dist/providers/codex/strategy.js.map +1 -1
- package/dist/providers/copilot/strategy.d.ts +3 -1
- package/dist/providers/copilot/strategy.d.ts.map +1 -1
- package/dist/providers/copilot/strategy.js +1 -1
- package/dist/providers/copilot/strategy.js.map +1 -1
- package/dist/providers/invoke.js +1 -1
- package/dist/providers/invoke.js.map +1 -1
- package/dist/providers/types.d.ts +3 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/user/curate-handler.d.ts +32 -0
- package/dist/user/curate-handler.d.ts.map +1 -0
- package/dist/user/curate-handler.js +156 -0
- package/dist/user/curate-handler.js.map +1 -0
- package/dist/user/curate-prompt.d.ts +41 -0
- package/dist/user/curate-prompt.d.ts.map +1 -0
- package/dist/user/curate-prompt.js +473 -0
- package/dist/user/curate-prompt.js.map +1 -0
- package/dist/user/dsl.d.ts +1 -0
- package/dist/user/dsl.d.ts.map +1 -1
- package/dist/user/dsl.js +1 -0
- package/dist/user/dsl.js.map +1 -1
- package/dist/user/index.d.ts +3 -0
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user/index.js +2 -0
- package/dist/user/index.js.map +1 -1
- package/dist/user/prompt.d.ts +11 -0
- package/dist/user/prompt.d.ts.map +1 -1
- package/dist/user/prompt.js +40 -7
- package/dist/user/prompt.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,299 +1,46 @@
|
|
|
1
|
-
import { CLAUDE_PLAN_FILE_PATH_REGEX, extractClaudeResponse } from "./session.js";
|
|
2
1
|
import { AbstractCompletionDetector } from "../base-completion.js";
|
|
2
|
+
import { extractClaudeResponse } from "./session.js";
|
|
3
|
+
import { trackPendingToolUses } from "./tool-tracking.js";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
* (Agent fork/subagent, Bash with run_in_background, Monitor, etc.).
|
|
6
|
-
* The launch-ack `tool_result` for these arrives with
|
|
7
|
-
* `toolUseResult.isAsync === true` and is intentionally not treated as
|
|
8
|
-
* resolution; the actual completion lands later as a `type: "user"` line
|
|
9
|
-
* whose string `content` matches this regex. Capture group 1 is the
|
|
10
|
-
* original `tool_use_id`.
|
|
11
|
-
*/
|
|
12
|
-
const TASK_NOTIFICATION_REGEX = /^<task-notification>[\s\S]*?<tool-use-id>([^<]+)<\/tool-use-id>/;
|
|
13
|
-
/**
|
|
14
|
-
* Claude completion detection using the two-signal rule:
|
|
15
|
-
*
|
|
16
|
-
* 1. **Tool-use tracking (primary)**: Track tool_use IDs in assistant messages,
|
|
17
|
-
* mark resolved when matching tool_result appears. Complete when pending set
|
|
18
|
-
* is empty AND at least one text output was emitted.
|
|
19
|
-
*
|
|
20
|
-
* 2. **Quiet debounce (secondary)**: No new JSONL lines for `quietMs` after
|
|
21
|
-
* the primary signal fires.
|
|
5
|
+
* Claude completion detection for normal turns using the two-signal rule:
|
|
22
6
|
*
|
|
23
|
-
*
|
|
7
|
+
* 1. Track tool_use IDs in assistant messages and mark them resolved when a
|
|
8
|
+
* matching tool_result or async <task-notification> appears.
|
|
9
|
+
* 2. Complete only after pending tools are empty, assistant text exists after
|
|
10
|
+
* the latest tool activity, and the quiet debounce elapses.
|
|
24
11
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* `run_in_background: true`, `Monitor`, etc.), the immediate `tool_result`
|
|
28
|
-
* is a launch acknowledgement carrying outer field
|
|
29
|
-
* `toolUseResult.isAsync === true` — *not* a real result. We deliberately
|
|
30
|
-
* do not remove the `tool_use_id` from `pendingToolUses` for these acks.
|
|
31
|
-
* The real resolution arrives later as a `type: "user"` line whose
|
|
32
|
-
* string `message.content` begins with `<task-notification>` and embeds
|
|
33
|
-
* the original `<tool-use-id>`. That message clears the pending set and
|
|
34
|
-
* bumps `lastToolActivityIdx`, forcing the detector to wait for a fresh
|
|
35
|
-
* assistant turn (narrative text or `ExitPlanMode`) before firing.
|
|
36
|
-
*
|
|
37
|
-
* **Plan-exit prefetch fallback (Claude Code ≥ 2.1.74 deferred-tools era)**:
|
|
38
|
-
* Since 2.1.114, `ExitPlanMode` ships as a deferred tool — Claude must call
|
|
39
|
-
* `ToolSearch({query:"select:ExitPlanMode"})` to load its schema before it can
|
|
40
|
-
* call `ExitPlanMode`. Sometimes the PTY stalls after the ToolSearch returns
|
|
41
|
-
* and the real `ExitPlanMode` call never lands. When we observe the full
|
|
42
|
-
* pre-exit pattern (plan-file `Write`/`Edit` resolved **and** the
|
|
43
|
-
* `ExitPlanMode` ToolSearch resolved), we arm a narrow staleness fallback via
|
|
44
|
-
* `isStaleFallbackReady`: the plan artifact is already on disk, so resolving
|
|
45
|
-
* off it is safe. The arm is deliberately narrow to avoid the
|
|
46
|
-
* extended-thinking false-positives that forced removal of the broad
|
|
47
|
-
* staleness fallback (commit `9ccbd83`).
|
|
48
|
-
*
|
|
49
|
-
* The ToolSearch prefetch is a **session-scoped** fact: once Claude has
|
|
50
|
-
* resolved `ToolSearch(select:ExitPlanMode)` anywhere in the session, the
|
|
51
|
-
* schema stays loaded for every subsequent turn. So the prefetch check
|
|
52
|
-
* inspects both the current turn (`currentLines`) and the pre-resume
|
|
53
|
-
* prefix (`priorLines`). The plan-file Write/Edit half remains
|
|
54
|
-
* **turn-scoped** — iteration N must do its own edit before the fallback
|
|
55
|
-
* arms, so a stale plan from iteration 1 cannot resolve iteration 2
|
|
56
|
-
* before any work happens.
|
|
12
|
+
* This detector deliberately contains no plan-mode behavior. Native plan-mode
|
|
13
|
+
* planner and simplifier turns use ClaudePlanModeDetector instead.
|
|
57
14
|
*/
|
|
58
|
-
export class
|
|
59
|
-
exitToolName;
|
|
60
|
-
// Two-signal state
|
|
15
|
+
export class ClaudePrimaryDetector extends AbstractCompletionDetector {
|
|
61
16
|
pendingToolUses = new Set();
|
|
62
17
|
hasTextOutput = false;
|
|
63
18
|
primaryFired = false;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
constructor(pollMs = 500, quietMs = 500, exitToolName, staleFallbackMs = Infinity) {
|
|
67
|
-
super(pollMs, quietMs, staleFallbackMs);
|
|
68
|
-
this.exitToolName = exitToolName;
|
|
19
|
+
constructor(pollMs = 500, quietMs = 500) {
|
|
20
|
+
super(pollMs, quietMs, Infinity);
|
|
69
21
|
}
|
|
70
22
|
analyzeLines(currentLines) {
|
|
71
|
-
|
|
72
|
-
this.
|
|
73
|
-
this.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
let lastAssistantTextIdx = -1;
|
|
78
|
-
let lastAssistantStopReason;
|
|
79
|
-
// Collect all tool_result IDs so we can reconcile out-of-order lines.
|
|
80
|
-
// Claude Code's JSONL writer can append tool_result before the
|
|
81
|
-
// corresponding tool_use when parallel tool calls are dispatched.
|
|
82
|
-
const resolvedIds = new Set();
|
|
83
|
-
// Track per-message-id whether stop_reason was "tool_use" and whether a
|
|
84
|
-
// tool_use block has actually been observed for that id. Claude Code's
|
|
85
|
-
// session writer splits multi-block messages across separate JSONL
|
|
86
|
-
// lines (one per content block) and the gap between a text block and
|
|
87
|
-
// the corresponding tool_use block can exceed the quiet-debounce
|
|
88
|
-
// window — observed at 12 s in dump 2026-04-30T09-40-25-745Z.
|
|
89
|
-
const stopReasonToolUseMessages = new Set();
|
|
90
|
-
const messagesWithToolUseBlock = new Set();
|
|
91
|
-
// Track the tool_use IDs that participate in the deferred-ExitPlanMode
|
|
92
|
-
// dance, so we can flip `planExitPrefetchComplete` once both have their
|
|
93
|
-
// matching tool_result.
|
|
94
|
-
const planFileWriteIds = new Set();
|
|
95
|
-
const exitPlanModePrefetchIds = new Set();
|
|
96
|
-
for (let idx = 0; idx < currentLines.length; idx++) {
|
|
97
|
-
const line = currentLines[idx];
|
|
98
|
-
if (line.type === "assistant") {
|
|
99
|
-
const message = line.message;
|
|
100
|
-
if (!message?.content)
|
|
101
|
-
continue;
|
|
102
|
-
lastAssistantStopReason = message.stop_reason;
|
|
103
|
-
const messageId = message.id;
|
|
104
|
-
if (messageId && message.stop_reason === "tool_use") {
|
|
105
|
-
stopReasonToolUseMessages.add(messageId);
|
|
106
|
-
}
|
|
107
|
-
for (const block of message.content) {
|
|
108
|
-
if (block.type === "tool_use" && block.id) {
|
|
109
|
-
if (messageId)
|
|
110
|
-
messagesWithToolUseBlock.add(messageId);
|
|
111
|
-
// If this is the plan-exit tool, mark it and skip tracking
|
|
112
|
-
if (this.exitToolName && block.name === this.exitToolName) {
|
|
113
|
-
this.exitToolCalled = true;
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
this.pendingToolUses.add(block.id);
|
|
117
|
-
hasAnyToolUse = true;
|
|
118
|
-
lastToolActivityIdx = idx;
|
|
119
|
-
// Plan-file Write/Edit — artifact-on-disk half of the dance.
|
|
120
|
-
if ((block.name === "Write" || block.name === "Edit") &&
|
|
121
|
-
typeof block.input?.file_path === "string" &&
|
|
122
|
-
CLAUDE_PLAN_FILE_PATH_REGEX.test(block.input.file_path)) {
|
|
123
|
-
planFileWriteIds.add(block.id);
|
|
124
|
-
}
|
|
125
|
-
// ToolSearch pre-loading the ExitPlanMode schema — the other half.
|
|
126
|
-
if (block.name === "ToolSearch" &&
|
|
127
|
-
typeof block.input?.query === "string" &&
|
|
128
|
-
block.input.query.includes("ExitPlanMode")) {
|
|
129
|
-
exitPlanModePrefetchIds.add(block.id);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (block.type === "text" && block.text) {
|
|
133
|
-
this.hasTextOutput = true;
|
|
134
|
-
lastAssistantTextIdx = idx;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
else if (line.type === "user") {
|
|
139
|
-
const message = line.message;
|
|
140
|
-
if (!message?.content)
|
|
141
|
-
continue;
|
|
142
|
-
// String content is rare in tool-result lines but is exactly how
|
|
143
|
-
// Claude Code delivers async-tool completion notifications.
|
|
144
|
-
if (typeof message.content === "string") {
|
|
145
|
-
const m = TASK_NOTIFICATION_REGEX.exec(message.content);
|
|
146
|
-
if (m) {
|
|
147
|
-
const id = m[1];
|
|
148
|
-
this.pendingToolUses.delete(id);
|
|
149
|
-
resolvedIds.add(id);
|
|
150
|
-
lastToolActivityIdx = idx;
|
|
151
|
-
}
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
// Async-launch ack: the outer line carries
|
|
155
|
-
// `toolUseResult.isAsync === true`. Treat as activity but do not
|
|
156
|
-
// resolve — the matching `<task-notification>` will arrive later.
|
|
157
|
-
const tur = line
|
|
158
|
-
.toolUseResult;
|
|
159
|
-
const isAsyncLaunch = !!tur && tur.isAsync === true;
|
|
160
|
-
for (const block of message.content) {
|
|
161
|
-
if (block.type === "tool_result" && block.tool_use_id) {
|
|
162
|
-
if (isAsyncLaunch) {
|
|
163
|
-
lastToolActivityIdx = idx;
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
this.pendingToolUses.delete(block.tool_use_id);
|
|
167
|
-
resolvedIds.add(block.tool_use_id);
|
|
168
|
-
lastToolActivityIdx = idx;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// Reconcile out-of-order lines: remove tool_use IDs whose tool_result
|
|
174
|
-
// appeared earlier in the file (before the tool_use line).
|
|
175
|
-
for (const id of resolvedIds)
|
|
176
|
-
this.pendingToolUses.delete(id);
|
|
177
|
-
// Prefetch is "complete" when both halves of the dance have their
|
|
178
|
-
// matching tool_result — order-independent, so this works whether the
|
|
179
|
-
// ToolSearch came before or after the plan-file Write.
|
|
180
|
-
let sawResolvedPlanFileWrite = false;
|
|
181
|
-
for (const id of planFileWriteIds) {
|
|
182
|
-
if (resolvedIds.has(id)) {
|
|
183
|
-
sawResolvedPlanFileWrite = true;
|
|
184
|
-
break;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
let sawResolvedExitPlanModePrefetch = false;
|
|
188
|
-
for (const id of exitPlanModePrefetchIds) {
|
|
189
|
-
if (resolvedIds.has(id)) {
|
|
190
|
-
sawResolvedExitPlanModePrefetch = true;
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
// Prefetch is session-scoped: a resolved ToolSearch(ExitPlanMode) in any
|
|
195
|
-
// prior turn keeps the schema loaded for the current turn too. Only
|
|
196
|
-
// scan `priorLines` if the current slice did not already observe one,
|
|
197
|
-
// since the in-slice scan is strictly more authoritative (same data).
|
|
198
|
-
if (!sawResolvedExitPlanModePrefetch && this.priorLines.length > 0) {
|
|
199
|
-
sawResolvedExitPlanModePrefetch = didResolveExitPlanModePrefetch(this.priorLines);
|
|
200
|
-
}
|
|
201
|
-
this.planExitPrefetchComplete =
|
|
202
|
-
sawResolvedPlanFileWrite && sawResolvedExitPlanModePrefetch;
|
|
203
|
-
// A message whose stop_reason is "tool_use" is guaranteed to contain at
|
|
204
|
-
// least one tool_use block. If we have not yet observed any tool_use
|
|
205
|
-
// block from such a message, the message is still being written to
|
|
206
|
-
// JSONL and the response is not done.
|
|
207
|
-
let awaitingPromisedToolUse = false;
|
|
208
|
-
for (const id of stopReasonToolUseMessages) {
|
|
209
|
-
if (!messagesWithToolUseBlock.has(id)) {
|
|
210
|
-
awaitingPromisedToolUse = true;
|
|
211
|
-
break;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Guard: suppress the primary signal while the response is provably
|
|
215
|
-
// not done.
|
|
216
|
-
// - stop_reason === null → API response still streaming blocks.
|
|
217
|
-
// - stop_reason === "stop_sequence" → synthetic resume responses.
|
|
218
|
-
// - awaitingPromisedToolUse → a message with stop_reason "tool_use"
|
|
219
|
-
// has emitted text but its tool_use block has not yet been written
|
|
220
|
-
// to JSONL (Claude Code splits multi-block messages across lines and
|
|
221
|
-
// the gap can exceed the quiet-debounce window — observed at 12 s
|
|
222
|
-
// in dump 2026-04-30T09-40-25-745Z).
|
|
223
|
-
// undefined (missing field, e.g. in test data) falls through.
|
|
224
|
-
const responseIncomplete = lastAssistantStopReason === null ||
|
|
225
|
-
lastAssistantStopReason === "stop_sequence" ||
|
|
226
|
-
awaitingPromisedToolUse;
|
|
227
|
-
// Primary signal:
|
|
228
|
-
// - the last assistant response is not mid-stream
|
|
229
|
-
// - no pending tool uses
|
|
230
|
-
// - at least one assistant text output
|
|
231
|
-
// - if tools were used, we require assistant text to appear after the
|
|
232
|
-
// most recent tool activity (prevents resolving between tool_result and
|
|
233
|
-
// the final narrative/verdict message).
|
|
23
|
+
const tracking = trackPendingToolUses(currentLines);
|
|
24
|
+
this.pendingToolUses = tracking.pendingToolUses;
|
|
25
|
+
this.hasTextOutput = tracking.hasTextOutput;
|
|
26
|
+
const responseIncomplete = tracking.lastAssistantStopReason === null ||
|
|
27
|
+
tracking.lastAssistantStopReason === "stop_sequence" ||
|
|
28
|
+
tracking.awaitingPromisedToolUse;
|
|
234
29
|
this.primaryFired =
|
|
235
30
|
!responseIncomplete &&
|
|
236
31
|
this.pendingToolUses.size === 0 &&
|
|
237
32
|
this.hasTextOutput &&
|
|
238
|
-
(
|
|
33
|
+
(tracking.perToolUseInfo.size === 0 ||
|
|
34
|
+
tracking.lastAssistantTextIdx > tracking.lastToolActivityIdx);
|
|
239
35
|
}
|
|
240
36
|
isPrimarySignalFired() {
|
|
241
37
|
return this.primaryFired;
|
|
242
38
|
}
|
|
243
|
-
shouldShortCircuit(_lines) {
|
|
244
|
-
return this.exitToolCalled && this.pendingToolUses.size === 0;
|
|
245
|
-
}
|
|
246
|
-
isStaleFallbackReady() {
|
|
247
|
-
return this.planExitPrefetchComplete && this.pendingToolUses.size === 0;
|
|
248
|
-
}
|
|
249
39
|
shouldSuppressPtyTimerReset() {
|
|
250
|
-
return
|
|
251
|
-
(this.exitToolCalled && this.pendingToolUses.size === 0) ||
|
|
252
|
-
(this.planExitPrefetchComplete && this.pendingToolUses.size === 0));
|
|
40
|
+
return this.primaryFired;
|
|
253
41
|
}
|
|
254
42
|
extractResponse(lines) {
|
|
255
43
|
return extractClaudeResponse(lines);
|
|
256
44
|
}
|
|
257
45
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Scan a slice of session lines for a resolved
|
|
260
|
-
* `ToolSearch({query: includes("ExitPlanMode")})` invocation. Used to detect
|
|
261
|
-
* whether the deferred-tool schema was loaded in any prior turn of a resumed
|
|
262
|
-
* Claude session.
|
|
263
|
-
*/
|
|
264
|
-
function didResolveExitPlanModePrefetch(lines) {
|
|
265
|
-
const prefetchIds = new Set();
|
|
266
|
-
const resolvedIds = new Set();
|
|
267
|
-
for (const line of lines) {
|
|
268
|
-
if (line.type === "assistant") {
|
|
269
|
-
const message = line.message;
|
|
270
|
-
if (!message?.content)
|
|
271
|
-
continue;
|
|
272
|
-
for (const block of message.content) {
|
|
273
|
-
if (block.type === "tool_use" &&
|
|
274
|
-
block.id &&
|
|
275
|
-
block.name === "ToolSearch" &&
|
|
276
|
-
typeof block.input?.query === "string" &&
|
|
277
|
-
block.input.query.includes("ExitPlanMode")) {
|
|
278
|
-
prefetchIds.add(block.id);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
else if (line.type === "user") {
|
|
283
|
-
const message = line.message;
|
|
284
|
-
if (!message?.content || typeof message.content === "string")
|
|
285
|
-
continue;
|
|
286
|
-
for (const block of message.content) {
|
|
287
|
-
if (block.type === "tool_result" && block.tool_use_id) {
|
|
288
|
-
resolvedIds.add(block.tool_use_id);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
for (const id of prefetchIds) {
|
|
294
|
-
if (resolvedIds.has(id))
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
46
|
//# sourceMappingURL=completion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/providers/claude/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAsB,SAAQ,0BAA0B;IAC3D,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,aAAa,GAAG,KAAK,CAAC;IACtB,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;QACrC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAES,YAAY,CAAC,YAA2B;QAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAEpD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QAE5C,MAAM,kBAAkB,GACtB,QAAQ,CAAC,uBAAuB,KAAK,IAAI;YACzC,QAAQ,CAAC,uBAAuB,KAAK,eAAe;YACpD,QAAQ,CAAC,uBAAuB,CAAC;QAEnC,IAAI,CAAC,YAAY;YACf,CAAC,kBAAkB;gBACnB,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC;gBAC/B,IAAI,CAAC,aAAa;gBAClB,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;oBACjC,QAAQ,CAAC,oBAAoB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACpE,CAAC;IAES,oBAAoB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEkB,2BAA2B;QAC5C,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAES,eAAe,CAAC,KAAoB;QAC5C,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -22,7 +22,7 @@ export declare function extractClaudeResponse(lines: SessionLine[]): string;
|
|
|
22
22
|
/**
|
|
23
23
|
* Path pattern for Claude's native plan-file location under
|
|
24
24
|
* `~/.claude/plans/`. Shared by `extractClaudePlanFilePath` (artifact
|
|
25
|
-
* extraction) and
|
|
25
|
+
* extraction) and the Claude completion detectors so the
|
|
26
26
|
* two stay in lockstep.
|
|
27
27
|
*/
|
|
28
28
|
export declare const CLAUDE_PLAN_FILE_PATH_REGEX: RegExp;
|
|
@@ -34,12 +34,32 @@ export declare const CLAUDE_PLAN_FILE_PATH_REGEX: RegExp;
|
|
|
34
34
|
* (always re-scanned on each run to avoid staleness).
|
|
35
35
|
*/
|
|
36
36
|
export declare function extractClaudePlanFilePath(lines: SessionLine[]): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Thrown when an `AskUserQuestion` tool result has a missing or malformed
|
|
39
|
+
* `toolUseResult` field. Carries `noRetry = true` so
|
|
40
|
+
* `runPhaseWithRetries` skips re-parsing the same broken JSONL and the
|
|
41
|
+
* orchestrator's executor-level hook triggers a session dump before the
|
|
42
|
+
* error propagates and the CLI exits.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ClaudeQACaptureError extends Error {
|
|
45
|
+
readonly noRetry = true;
|
|
46
|
+
constructor(message: string);
|
|
47
|
+
}
|
|
37
48
|
/**
|
|
38
49
|
* Extract AskUserQuestion Q&A pairs from Claude session lines.
|
|
39
50
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
51
|
+
* Reads the structured `toolUseResult` field on the user line (top-level,
|
|
52
|
+
* alongside `message`) — `{ questions, answers, annotations }` — and emits
|
|
53
|
+
* one `UserClarification` per sub-question, with `preview` populated from
|
|
54
|
+
* `annotations[q].preview` when present.
|
|
55
|
+
*
|
|
56
|
+
* Strict-throw contract: when a tracked `AskUserQuestion` round has a
|
|
57
|
+
* missing or malformed `toolUseResult`, throws `ClaudeQACaptureError`
|
|
58
|
+
* (with `noRetry: true`) instead of fabricating a fallback entry. The
|
|
59
|
+
* orchestrator's executor-level hook triggers a session dump before the
|
|
60
|
+
* error propagates so the broken JSONL is preserved alongside the failed
|
|
61
|
+
* step's artifacts. `tool_result` lines whose `tool_use_id` was not from
|
|
62
|
+
* `AskUserQuestion` are ignored (no throw).
|
|
43
63
|
*/
|
|
44
64
|
export declare function extractClaudeClarifications(lines: SessionLine[]): UserClarification[];
|
|
45
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CA0BlE;AAED;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,QAAiC,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CA4BlF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CA0BlE;AAED;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,QAAiC,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,CA4BlF;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,QAAQ;gBACZ,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAmDrF;AAiED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;gBAEjC,aAAa,CAAC,EAAE,MAAM,MAAM;IAIxC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAKxD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOnD,eAAe,CACnB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAOZ,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,qBAAqB,CACzB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIzB,mBAAmB,CACvB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAIhB,YAAY;CAI3B"}
|
|
@@ -49,7 +49,7 @@ export function extractClaudeResponse(lines) {
|
|
|
49
49
|
/**
|
|
50
50
|
* Path pattern for Claude's native plan-file location under
|
|
51
51
|
* `~/.claude/plans/`. Shared by `extractClaudePlanFilePath` (artifact
|
|
52
|
-
* extraction) and
|
|
52
|
+
* extraction) and the Claude completion detectors so the
|
|
53
53
|
* two stay in lockstep.
|
|
54
54
|
*/
|
|
55
55
|
export const CLAUDE_PLAN_FILE_PATH_REGEX = /[/\\]\.claude[/\\]plans[/\\]/;
|
|
@@ -84,16 +84,42 @@ export function extractClaudePlanFilePath(lines) {
|
|
|
84
84
|
}
|
|
85
85
|
return undefined;
|
|
86
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Thrown when an `AskUserQuestion` tool result has a missing or malformed
|
|
89
|
+
* `toolUseResult` field. Carries `noRetry = true` so
|
|
90
|
+
* `runPhaseWithRetries` skips re-parsing the same broken JSONL and the
|
|
91
|
+
* orchestrator's executor-level hook triggers a session dump before the
|
|
92
|
+
* error propagates and the CLI exits.
|
|
93
|
+
*/
|
|
94
|
+
export class ClaudeQACaptureError extends Error {
|
|
95
|
+
noRetry = true;
|
|
96
|
+
constructor(message) {
|
|
97
|
+
super(message);
|
|
98
|
+
this.name = "ClaudeQACaptureError";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
87
101
|
/**
|
|
88
102
|
* Extract AskUserQuestion Q&A pairs from Claude session lines.
|
|
89
103
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
104
|
+
* Reads the structured `toolUseResult` field on the user line (top-level,
|
|
105
|
+
* alongside `message`) — `{ questions, answers, annotations }` — and emits
|
|
106
|
+
* one `UserClarification` per sub-question, with `preview` populated from
|
|
107
|
+
* `annotations[q].preview` when present.
|
|
108
|
+
*
|
|
109
|
+
* Strict-throw contract: when a tracked `AskUserQuestion` round has a
|
|
110
|
+
* missing or malformed `toolUseResult`, throws `ClaudeQACaptureError`
|
|
111
|
+
* (with `noRetry: true`) instead of fabricating a fallback entry. The
|
|
112
|
+
* orchestrator's executor-level hook triggers a session dump before the
|
|
113
|
+
* error propagates so the broken JSONL is preserved alongside the failed
|
|
114
|
+
* step's artifacts. `tool_result` lines whose `tool_use_id` was not from
|
|
115
|
+
* `AskUserQuestion` are ignored (no throw).
|
|
93
116
|
*/
|
|
94
117
|
export function extractClaudeClarifications(lines) {
|
|
95
118
|
const clarifications = [];
|
|
96
|
-
|
|
119
|
+
// tool_use_id → joined-"; " question text. Used to (a) filter unrelated
|
|
120
|
+
// tool_result lines so strictness only kicks in on AskUserQuestion
|
|
121
|
+
// rounds, and (b) supply joined-question context to error messages.
|
|
122
|
+
const questionMap = new Map();
|
|
97
123
|
for (const line of lines) {
|
|
98
124
|
if (line.type === "assistant") {
|
|
99
125
|
const message = line.message;
|
|
@@ -119,21 +145,70 @@ export function extractClaudeClarifications(lines) {
|
|
|
119
145
|
if (!message?.content)
|
|
120
146
|
continue;
|
|
121
147
|
for (const block of message.content) {
|
|
122
|
-
if (block.type
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
questionMap.delete(block.tool_use_id);
|
|
131
|
-
}
|
|
148
|
+
if (block.type !== "tool_result" || !block.tool_use_id)
|
|
149
|
+
continue;
|
|
150
|
+
const question = questionMap.get(block.tool_use_id);
|
|
151
|
+
if (!question)
|
|
152
|
+
continue;
|
|
153
|
+
const structured = extractStructuredClarifications(line.toolUseResult, block.tool_use_id, question);
|
|
154
|
+
clarifications.push(...structured);
|
|
155
|
+
questionMap.delete(block.tool_use_id);
|
|
132
156
|
}
|
|
133
157
|
}
|
|
134
158
|
}
|
|
135
159
|
return clarifications;
|
|
136
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Parse a Claude `toolUseResult` payload into per-sub-question
|
|
163
|
+
* `UserClarification` entries. Throws `ClaudeQACaptureError` with a
|
|
164
|
+
* specific reason when the payload is missing or malformed.
|
|
165
|
+
*/
|
|
166
|
+
function extractStructuredClarifications(toolUseResult, toolUseId, joinedQuestion) {
|
|
167
|
+
const ctx = `tool_use_id=${toolUseId} question="${joinedQuestion}"`;
|
|
168
|
+
if (toolUseResult === undefined || toolUseResult === null) {
|
|
169
|
+
throw new ClaudeQACaptureError(`toolUseResult missing (${ctx})`);
|
|
170
|
+
}
|
|
171
|
+
if (typeof toolUseResult !== "object") {
|
|
172
|
+
throw new ClaudeQACaptureError(`toolUseResult is not an object (${ctx})`);
|
|
173
|
+
}
|
|
174
|
+
const tur = toolUseResult;
|
|
175
|
+
if (!Array.isArray(tur.questions) || tur.questions.length === 0) {
|
|
176
|
+
throw new ClaudeQACaptureError(`questions field is not a non-empty array (${ctx})`);
|
|
177
|
+
}
|
|
178
|
+
if (!tur.answers || typeof tur.answers !== "object" || Array.isArray(tur.answers)) {
|
|
179
|
+
throw new ClaudeQACaptureError(`answers field is not a non-array object (${ctx})`);
|
|
180
|
+
}
|
|
181
|
+
const answers = tur.answers;
|
|
182
|
+
const annotations = (tur.annotations && typeof tur.annotations === "object" && !Array.isArray(tur.annotations))
|
|
183
|
+
? tur.annotations
|
|
184
|
+
: undefined;
|
|
185
|
+
const questions = tur.questions;
|
|
186
|
+
const out = [];
|
|
187
|
+
for (let i = 0; i < questions.length; i++) {
|
|
188
|
+
const q = questions[i];
|
|
189
|
+
if (!q || typeof q !== "object") {
|
|
190
|
+
throw new ClaudeQACaptureError(`questions[${i}] is not an object (${ctx})`);
|
|
191
|
+
}
|
|
192
|
+
const questionText = q.question;
|
|
193
|
+
if (typeof questionText !== "string") {
|
|
194
|
+
throw new ClaudeQACaptureError(`questions[${i}].question is not a string (${ctx})`);
|
|
195
|
+
}
|
|
196
|
+
const answer = answers[questionText];
|
|
197
|
+
if (typeof answer !== "string") {
|
|
198
|
+
throw new ClaudeQACaptureError(`answers["${questionText}"] is not a string (${ctx})`);
|
|
199
|
+
}
|
|
200
|
+
const entry = { question: questionText, answer };
|
|
201
|
+
const annotation = annotations?.[questionText];
|
|
202
|
+
if (annotation && typeof annotation === "object") {
|
|
203
|
+
const preview = annotation.preview;
|
|
204
|
+
if (typeof preview === "string" && preview.length > 0) {
|
|
205
|
+
entry.preview = preview;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
out.push(entry);
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
137
212
|
/**
|
|
138
213
|
* Claude session handler.
|
|
139
214
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/providers/claude/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { PlanModeConfig, ProviderStrategy, SessionHandler, BuildArgsOpts } from "../types.js";
|
|
2
|
-
import { ClaudeCompletionStrategy } from "./completion.js";
|
|
1
|
+
import type { PlanModeConfig, ProviderStrategy, SessionHandler, BuildArgsOpts, CompletionDetector } from "../types.js";
|
|
3
2
|
export declare class ClaudeStrategy implements ProviderStrategy {
|
|
4
3
|
readonly name = "claude";
|
|
5
4
|
readonly displayName = "Claude Code";
|
|
@@ -9,6 +8,8 @@ export declare class ClaudeStrategy implements ProviderStrategy {
|
|
|
9
8
|
version: string | undefined;
|
|
10
9
|
get planMode(): PlanModeConfig;
|
|
11
10
|
buildArgs(prompt: string, opts: BuildArgsOpts): Promise<string[]>;
|
|
12
|
-
createDetector(
|
|
11
|
+
createDetector(opts?: {
|
|
12
|
+
planMode?: boolean;
|
|
13
|
+
}): CompletionDetector;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=strategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOvH,qBAAa,cAAe,YAAW,gBAAgB;IACrD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,OAAO,YAAY;IAC5B,QAAQ,CAAC,UAAU,aAAa;IAChC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAA8B;IAC9D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IAExC,IAAI,QAAQ,IAAI,cAAc,CAO7B;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAcvE,cAAc,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,kBAAkB;CAalE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { flagIf } from "../types.js";
|
|
2
2
|
import { versionGte } from "../version.js";
|
|
3
|
-
import {
|
|
3
|
+
import { ClaudePrimaryDetector } from "./completion.js";
|
|
4
|
+
import { ClaudePlanModeDetector } from "./completion-plan-mode.js";
|
|
4
5
|
import { ClaudeSessionHandler } from "./session.js";
|
|
5
6
|
export class ClaudeStrategy {
|
|
6
7
|
name = "claude";
|
|
@@ -31,12 +32,12 @@ export class ClaudeStrategy {
|
|
|
31
32
|
args.push(prompt);
|
|
32
33
|
return args;
|
|
33
34
|
}
|
|
34
|
-
createDetector() {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return new
|
|
35
|
+
createDetector(opts) {
|
|
36
|
+
const useNativePlanMode = opts?.planMode === true && this.planMode.nativePlanFile === true;
|
|
37
|
+
if (useNativePlanMode) {
|
|
38
|
+
return new ClaudePlanModeDetector(200, 500, this.planMode.exitToolName, 30_000);
|
|
39
|
+
}
|
|
40
|
+
return new ClaudePrimaryDetector(200, 500);
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
//# sourceMappingURL=strategy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../../src/providers/claude/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,aAAa,CAAC;IAC5B,OAAO,GAAG,QAAQ,CAAC;IACnB,UAAU,GAAG,SAAS,CAAC;IACvB,OAAO,GAAmB,IAAI,oBAAoB,EAAE,CAAC;IAC9D,OAAO,GAAuB,SAAS,CAAC;IAExC,IAAI,QAAQ;QACV,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB;YAC3D,YAAY,EAAE,cAAc;YAC5B,cAAc,EAAE,MAAM;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAmB;QACjD,MAAM,IAAI,GAAa;YACrB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,gCAAgC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;SAChC,CAAC;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,IAA6B;QAC1C,MAAM,iBAAiB,GACrB,IAAI,EAAE,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,KAAK,IAAI,CAAC;QACnE,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,IAAI,sBAAsB,CAC/B,GAAG,EACH,GAAG,EACH,IAAI,CAAC,QAAQ,CAAC,YAAY,EAC1B,MAAM,CACP,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF"}
|