poly-weaver 0.4.4 → 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 -68
- package/dist/providers/claude/completion.d.ts.map +1 -1
- package/dist/providers/claude/completion.js +21 -322
- 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 -10
- 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,347 +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.
|
|
57
|
-
*
|
|
58
|
-
* **AskUserQuestion suppressor (session-wide)**: `AskUserQuestion` is
|
|
59
|
-
* also a deferred tool, and Claude often pre-loads it alongside
|
|
60
|
-
* `ExitPlanMode` in a single bundled query (e.g.
|
|
61
|
-
* `select:ExitPlanMode,AskUserQuestion`). When a question end-state is
|
|
62
|
-
* loaded, the fallback's premise — "the only valid next call after a plan
|
|
63
|
-
* Write is `ExitPlanMode`, so 15 s of silence must be the PTY bug" —
|
|
64
|
-
* stops holding: Claude can legitimately spend >15 s thinking before
|
|
65
|
-
* emitting `AskUserQuestion`. So we track resolved
|
|
66
|
-
* `ToolSearch(query.includes("AskUserQuestion"))` invocations the same
|
|
67
|
-
* session-scoped way and refuse to arm the fallback when one has been
|
|
68
|
-
* seen. The schema, once loaded, persists for the rest of the session, so
|
|
69
|
-
* this suppressor is **session-wide**: any resolved AskUserQuestion
|
|
70
|
-
* prefetch (current turn or any prior turn) disables the fallback for
|
|
71
|
-
* every subsequent turn of that Claude session, including resumed
|
|
72
|
-
* planner iterations. That is an accepted trade — see dump
|
|
73
|
-
* `2026-05-02T17-53-03-277Z` for the bug this fixes, and KNOWN-ISSUES.md
|
|
74
|
-
* §"Deferred ExitPlanMode Stall" for the regression on dump
|
|
75
|
-
* `2026-05-01T16-10-11-526Z` we explicitly accept (recoverable Ctrl+C
|
|
76
|
-
* hang vs. silently dropped clarification round).
|
|
12
|
+
* This detector deliberately contains no plan-mode behavior. Native plan-mode
|
|
13
|
+
* planner and simplifier turns use ClaudePlanModeDetector instead.
|
|
77
14
|
*/
|
|
78
|
-
export class
|
|
79
|
-
exitToolName;
|
|
80
|
-
// Two-signal state
|
|
15
|
+
export class ClaudePrimaryDetector extends AbstractCompletionDetector {
|
|
81
16
|
pendingToolUses = new Set();
|
|
82
17
|
hasTextOutput = false;
|
|
83
18
|
primaryFired = false;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
constructor(pollMs = 500, quietMs = 500, exitToolName, staleFallbackMs = Infinity) {
|
|
87
|
-
super(pollMs, quietMs, staleFallbackMs);
|
|
88
|
-
this.exitToolName = exitToolName;
|
|
19
|
+
constructor(pollMs = 500, quietMs = 500) {
|
|
20
|
+
super(pollMs, quietMs, Infinity);
|
|
89
21
|
}
|
|
90
22
|
analyzeLines(currentLines) {
|
|
91
|
-
|
|
92
|
-
this.
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
let lastAssistantTextIdx = -1;
|
|
98
|
-
let lastAssistantStopReason;
|
|
99
|
-
// Collect all tool_result IDs so we can reconcile out-of-order lines.
|
|
100
|
-
// Claude Code's JSONL writer can append tool_result before the
|
|
101
|
-
// corresponding tool_use when parallel tool calls are dispatched.
|
|
102
|
-
const resolvedIds = new Set();
|
|
103
|
-
// Track per-message-id whether stop_reason was "tool_use" and whether a
|
|
104
|
-
// tool_use block has actually been observed for that id. Claude Code's
|
|
105
|
-
// session writer splits multi-block messages across separate JSONL
|
|
106
|
-
// lines (one per content block) and the gap between a text block and
|
|
107
|
-
// the corresponding tool_use block can exceed the quiet-debounce
|
|
108
|
-
// window — observed at 12 s in dump 2026-04-30T09-40-25-745Z.
|
|
109
|
-
const stopReasonToolUseMessages = new Set();
|
|
110
|
-
const messagesWithToolUseBlock = new Set();
|
|
111
|
-
// Track the tool_use IDs that participate in the deferred-ExitPlanMode
|
|
112
|
-
// dance, so we can flip `planExitPrefetchComplete` once both have their
|
|
113
|
-
// matching tool_result. AskUserQuestion prefetches are tracked
|
|
114
|
-
// separately as a session-wide suppressor.
|
|
115
|
-
const planFileWriteIds = new Set();
|
|
116
|
-
const exitPlanModePrefetchIds = new Set();
|
|
117
|
-
const askUserQuestionPrefetchIds = new Set();
|
|
118
|
-
for (let idx = 0; idx < currentLines.length; idx++) {
|
|
119
|
-
const line = currentLines[idx];
|
|
120
|
-
if (line.type === "assistant") {
|
|
121
|
-
const message = line.message;
|
|
122
|
-
if (!message?.content)
|
|
123
|
-
continue;
|
|
124
|
-
lastAssistantStopReason = message.stop_reason;
|
|
125
|
-
const messageId = message.id;
|
|
126
|
-
if (messageId && message.stop_reason === "tool_use") {
|
|
127
|
-
stopReasonToolUseMessages.add(messageId);
|
|
128
|
-
}
|
|
129
|
-
for (const block of message.content) {
|
|
130
|
-
if (block.type === "tool_use" && block.id) {
|
|
131
|
-
if (messageId)
|
|
132
|
-
messagesWithToolUseBlock.add(messageId);
|
|
133
|
-
// If this is the plan-exit tool, mark it and skip tracking
|
|
134
|
-
if (this.exitToolName && block.name === this.exitToolName) {
|
|
135
|
-
this.exitToolCalled = true;
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
this.pendingToolUses.add(block.id);
|
|
139
|
-
hasAnyToolUse = true;
|
|
140
|
-
lastToolActivityIdx = idx;
|
|
141
|
-
// Plan-file Write/Edit — artifact-on-disk half of the dance.
|
|
142
|
-
if ((block.name === "Write" || block.name === "Edit") &&
|
|
143
|
-
typeof block.input?.file_path === "string" &&
|
|
144
|
-
CLAUDE_PLAN_FILE_PATH_REGEX.test(block.input.file_path)) {
|
|
145
|
-
planFileWriteIds.add(block.id);
|
|
146
|
-
}
|
|
147
|
-
// ToolSearch pre-loading the ExitPlanMode schema — the other
|
|
148
|
-
// half. A bundled query like `select:ExitPlanMode,AskUserQuestion`
|
|
149
|
-
// hits both branches: it both arms the ExitPlanMode half and
|
|
150
|
-
// disqualifies the fallback below via the AskUserQuestion
|
|
151
|
-
// suppressor.
|
|
152
|
-
if (block.name === "ToolSearch" &&
|
|
153
|
-
typeof block.input?.query === "string") {
|
|
154
|
-
if (block.input.query.includes("ExitPlanMode")) {
|
|
155
|
-
exitPlanModePrefetchIds.add(block.id);
|
|
156
|
-
}
|
|
157
|
-
if (block.input.query.includes("AskUserQuestion")) {
|
|
158
|
-
askUserQuestionPrefetchIds.add(block.id);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
if (block.type === "text" && block.text) {
|
|
163
|
-
this.hasTextOutput = true;
|
|
164
|
-
lastAssistantTextIdx = idx;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else if (line.type === "user") {
|
|
169
|
-
const message = line.message;
|
|
170
|
-
if (!message?.content)
|
|
171
|
-
continue;
|
|
172
|
-
// String content is rare in tool-result lines but is exactly how
|
|
173
|
-
// Claude Code delivers async-tool completion notifications.
|
|
174
|
-
if (typeof message.content === "string") {
|
|
175
|
-
const m = TASK_NOTIFICATION_REGEX.exec(message.content);
|
|
176
|
-
if (m) {
|
|
177
|
-
const id = m[1];
|
|
178
|
-
this.pendingToolUses.delete(id);
|
|
179
|
-
resolvedIds.add(id);
|
|
180
|
-
lastToolActivityIdx = idx;
|
|
181
|
-
}
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
// Async-launch ack: the outer line carries
|
|
185
|
-
// `toolUseResult.isAsync === true`. Treat as activity but do not
|
|
186
|
-
// resolve — the matching `<task-notification>` will arrive later.
|
|
187
|
-
const tur = line
|
|
188
|
-
.toolUseResult;
|
|
189
|
-
const isAsyncLaunch = !!tur && tur.isAsync === true;
|
|
190
|
-
for (const block of message.content) {
|
|
191
|
-
if (block.type === "tool_result" && block.tool_use_id) {
|
|
192
|
-
if (isAsyncLaunch) {
|
|
193
|
-
lastToolActivityIdx = idx;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
this.pendingToolUses.delete(block.tool_use_id);
|
|
197
|
-
resolvedIds.add(block.tool_use_id);
|
|
198
|
-
lastToolActivityIdx = idx;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// Reconcile out-of-order lines: remove tool_use IDs whose tool_result
|
|
204
|
-
// appeared earlier in the file (before the tool_use line).
|
|
205
|
-
for (const id of resolvedIds)
|
|
206
|
-
this.pendingToolUses.delete(id);
|
|
207
|
-
// Prefetch is "complete" when both halves of the dance have their
|
|
208
|
-
// matching tool_result — order-independent, so this works whether the
|
|
209
|
-
// ToolSearch came before or after the plan-file Write.
|
|
210
|
-
let sawResolvedPlanFileWrite = false;
|
|
211
|
-
for (const id of planFileWriteIds) {
|
|
212
|
-
if (resolvedIds.has(id)) {
|
|
213
|
-
sawResolvedPlanFileWrite = true;
|
|
214
|
-
break;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
let sawResolvedExitPlanModePrefetch = false;
|
|
218
|
-
for (const id of exitPlanModePrefetchIds) {
|
|
219
|
-
if (resolvedIds.has(id)) {
|
|
220
|
-
sawResolvedExitPlanModePrefetch = true;
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
let sawResolvedAskUserQuestionPrefetch = false;
|
|
225
|
-
for (const id of askUserQuestionPrefetchIds) {
|
|
226
|
-
if (resolvedIds.has(id)) {
|
|
227
|
-
sawResolvedAskUserQuestionPrefetch = true;
|
|
228
|
-
break;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// Prefetch is session-scoped: a resolved ToolSearch(ExitPlanMode) in any
|
|
232
|
-
// prior turn keeps the schema loaded for the current turn too. Only
|
|
233
|
-
// scan `priorLines` if the current slice did not already observe one,
|
|
234
|
-
// since the in-slice scan is strictly more authoritative (same data).
|
|
235
|
-
// The same session-scoped reasoning applies to the AskUserQuestion
|
|
236
|
-
// suppressor: a resolved AskUserQuestion prefetch from any prior turn
|
|
237
|
-
// disables the fallback for every later turn of the session.
|
|
238
|
-
if (this.priorLines.length > 0) {
|
|
239
|
-
if (!sawResolvedExitPlanModePrefetch) {
|
|
240
|
-
sawResolvedExitPlanModePrefetch = didResolvePrefetchFor(this.priorLines, "ExitPlanMode");
|
|
241
|
-
}
|
|
242
|
-
if (!sawResolvedAskUserQuestionPrefetch) {
|
|
243
|
-
sawResolvedAskUserQuestionPrefetch = didResolvePrefetchFor(this.priorLines, "AskUserQuestion");
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
this.planExitPrefetchComplete =
|
|
247
|
-
sawResolvedPlanFileWrite &&
|
|
248
|
-
sawResolvedExitPlanModePrefetch &&
|
|
249
|
-
!sawResolvedAskUserQuestionPrefetch;
|
|
250
|
-
// A message whose stop_reason is "tool_use" is guaranteed to contain at
|
|
251
|
-
// least one tool_use block. If we have not yet observed any tool_use
|
|
252
|
-
// block from such a message, the message is still being written to
|
|
253
|
-
// JSONL and the response is not done.
|
|
254
|
-
let awaitingPromisedToolUse = false;
|
|
255
|
-
for (const id of stopReasonToolUseMessages) {
|
|
256
|
-
if (!messagesWithToolUseBlock.has(id)) {
|
|
257
|
-
awaitingPromisedToolUse = true;
|
|
258
|
-
break;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Guard: suppress the primary signal while the response is provably
|
|
262
|
-
// not done.
|
|
263
|
-
// - stop_reason === null → API response still streaming blocks.
|
|
264
|
-
// - stop_reason === "stop_sequence" → synthetic resume responses.
|
|
265
|
-
// - awaitingPromisedToolUse → a message with stop_reason "tool_use"
|
|
266
|
-
// has emitted text but its tool_use block has not yet been written
|
|
267
|
-
// to JSONL (Claude Code splits multi-block messages across lines and
|
|
268
|
-
// the gap can exceed the quiet-debounce window — observed at 12 s
|
|
269
|
-
// in dump 2026-04-30T09-40-25-745Z).
|
|
270
|
-
// undefined (missing field, e.g. in test data) falls through.
|
|
271
|
-
const responseIncomplete = lastAssistantStopReason === null ||
|
|
272
|
-
lastAssistantStopReason === "stop_sequence" ||
|
|
273
|
-
awaitingPromisedToolUse;
|
|
274
|
-
// Primary signal:
|
|
275
|
-
// - the last assistant response is not mid-stream
|
|
276
|
-
// - no pending tool uses
|
|
277
|
-
// - at least one assistant text output
|
|
278
|
-
// - if tools were used, we require assistant text to appear after the
|
|
279
|
-
// most recent tool activity (prevents resolving between tool_result and
|
|
280
|
-
// 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;
|
|
281
29
|
this.primaryFired =
|
|
282
30
|
!responseIncomplete &&
|
|
283
31
|
this.pendingToolUses.size === 0 &&
|
|
284
32
|
this.hasTextOutput &&
|
|
285
|
-
(
|
|
33
|
+
(tracking.perToolUseInfo.size === 0 ||
|
|
34
|
+
tracking.lastAssistantTextIdx > tracking.lastToolActivityIdx);
|
|
286
35
|
}
|
|
287
36
|
isPrimarySignalFired() {
|
|
288
37
|
return this.primaryFired;
|
|
289
38
|
}
|
|
290
|
-
shouldShortCircuit(_lines) {
|
|
291
|
-
return this.exitToolCalled && this.pendingToolUses.size === 0;
|
|
292
|
-
}
|
|
293
|
-
isStaleFallbackReady() {
|
|
294
|
-
return this.planExitPrefetchComplete && this.pendingToolUses.size === 0;
|
|
295
|
-
}
|
|
296
39
|
shouldSuppressPtyTimerReset() {
|
|
297
|
-
return
|
|
298
|
-
(this.exitToolCalled && this.pendingToolUses.size === 0) ||
|
|
299
|
-
(this.planExitPrefetchComplete && this.pendingToolUses.size === 0));
|
|
40
|
+
return this.primaryFired;
|
|
300
41
|
}
|
|
301
42
|
extractResponse(lines) {
|
|
302
43
|
return extractClaudeResponse(lines);
|
|
303
44
|
}
|
|
304
45
|
}
|
|
305
|
-
/**
|
|
306
|
-
* Scan a slice of session lines for a resolved
|
|
307
|
-
* `ToolSearch({query: includes(needle)})` invocation. Used to detect whether
|
|
308
|
-
* a deferred-tool schema was loaded in any prior turn of a resumed Claude
|
|
309
|
-
* session — both for the `ExitPlanMode` arming half of the prefetch fallback
|
|
310
|
-
* and for the `AskUserQuestion` session-wide suppressor.
|
|
311
|
-
*/
|
|
312
|
-
function didResolvePrefetchFor(lines, needle) {
|
|
313
|
-
const prefetchIds = new Set();
|
|
314
|
-
const resolvedIds = new Set();
|
|
315
|
-
for (const line of lines) {
|
|
316
|
-
if (line.type === "assistant") {
|
|
317
|
-
const message = line.message;
|
|
318
|
-
if (!message?.content)
|
|
319
|
-
continue;
|
|
320
|
-
for (const block of message.content) {
|
|
321
|
-
if (block.type === "tool_use" &&
|
|
322
|
-
block.id &&
|
|
323
|
-
block.name === "ToolSearch" &&
|
|
324
|
-
typeof block.input?.query === "string" &&
|
|
325
|
-
block.input.query.includes(needle)) {
|
|
326
|
-
prefetchIds.add(block.id);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
else if (line.type === "user") {
|
|
331
|
-
const message = line.message;
|
|
332
|
-
if (!message?.content || typeof message.content === "string")
|
|
333
|
-
continue;
|
|
334
|
-
for (const block of message.content) {
|
|
335
|
-
if (block.type === "tool_result" && block.tool_use_id) {
|
|
336
|
-
resolvedIds.add(block.tool_use_id);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
for (const id of prefetchIds) {
|
|
342
|
-
if (resolvedIds.has(id))
|
|
343
|
-
return true;
|
|
344
|
-
}
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,eAAe,EAAoB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAGlC;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACxD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,+DAA+D;IAC/D,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,OAER,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,SAAS;QAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,mFAAmF;QACnF,8EAA8E;QAC9E,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACzD,MAAM;IACR,CAAC;IAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,8BAA8B,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAoB;IAC5D,mEAAmE;IACnE,wEAAwE;IACxE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,OAER,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,SAAS;QAEhC,mEAAmE;QACnE,wEAAwE;QACxE,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,IACE,KAAK,CAAC,IAAI,KAAK,UAAU;gBACzB,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;gBACjD,OAAO,KAAK,CAAC,KAAK,EAAE,SAAS,KAAK,QAAQ;gBAC1C,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EACvD,CAAC;gBACD,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,OAAO,GAAG,IAAI,CAAC;IACxB,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC9D,MAAM,cAAc,GAAwB,EAAE,CAAC;IAC/C,wEAAwE;IACxE,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAER,CAAC;YACd,IAAI,CAAC,OAAO,EAAE,OAAO;gBAAE,SAAS;YAChC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;oBAC9E,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;oBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7B,MAAM,YAAY,GAAG,SAAS;6BAC3B,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;6BACvF,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,IAAI,YAAY,EAAE,CAAC;4BACjB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;wBAC1C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAER,CAAC;YACd,IAAI,CAAC,OAAO,EAAE,OAAO;gBAAE,SAAS;YAChC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,KAAK,CAAC,WAAW;oBAAE,SAAS;gBACjE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACpD,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBAExB,MAAM,UAAU,GAAG,+BAA+B,CAChD,IAAI,CAAC,aAAa,EAClB,KAAK,CAAC,WAAW,EACjB,QAAQ,CACT,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;gBACnC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,SAAS,+BAA+B,CACtC,aAAsB,EACtB,SAAiB,EACjB,cAAsB;IAEtB,MAAM,GAAG,GAAG,eAAe,SAAS,cAAc,cAAc,GAAG,CAAC;IACpE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,oBAAoB,CAAC,0BAA0B,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,CAAC,mCAAmC,GAAG,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,aAIX,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,oBAAoB,CAAC,6CAA6C,GAAG,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,oBAAoB,CAAC,4CAA4C,GAAG,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,OAAkC,CAAC;IACvD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7G,CAAC,CAAE,GAAG,CAAC,WAAuC;QAC9C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,SAAS,GAAG,GAAG,CAAC,SAAsB,CAAC;IAC7C,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,uBAAuB,GAAG,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,YAAY,GAAI,CAA4B,CAAC,QAAQ,CAAC;QAC5D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,+BAA+B,GAAG,GAAG,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACrC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,oBAAoB,CAAC,YAAY,YAAY,uBAAuB,GAAG,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,MAAM,KAAK,GAAsB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,OAAO,GAAI,UAAoC,CAAC,OAAO,CAAC;YAC9D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACd,aAAa,CAAe;IAE7C,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,mBAAmB,CAAC;IAC5D,CAAC;IAED,kBAAkB,CAAC,OAAe,EAAE,SAAiB;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAyB,EACzB,QAAgB;QAEhB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,qBAAqB,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,eAAuB;QAC5C,OAAO,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,eAAuB,EACvB,UAAkB;QAElB,OAAO,2BAA2B,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,eAAuB,EACvB,UAAkB;QAElB,OAAO,yBAAyB,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,eAAuB,EAAE,UAAkB;QACpE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -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"}
|