gsd-pi 2.46.1-dev.79664f2 → 2.46.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  2. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +2 -2
  3. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  4. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  5. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  6. package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -2
  7. package/dist/resources/extensions/gsd/workflow-events.js +1 -1
  8. package/dist/web/standalone/.next/BUILD_ID +1 -1
  9. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  10. package/dist/web/standalone/.next/build-manifest.json +3 -3
  11. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  12. package/dist/web/standalone/.next/required-server-files.json +3 -3
  13. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  14. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  16. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  17. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  24. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  34. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  36. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  37. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  38. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  39. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  40. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  41. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  42. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  43. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  44. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  45. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  46. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  47. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  48. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  49. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  50. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  57. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  69. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
  78. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  84. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  89. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  98. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  99. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  100. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  102. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  104. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  105. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/index.html +1 -1
  114. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  115. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  116. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  117. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  119. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/page.js +2 -2
  121. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  123. package/dist/web/standalone/.next/server/chunks/229.js +1 -1
  124. package/dist/web/standalone/.next/server/chunks/471.js +3 -3
  125. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/middleware.js +2 -2
  127. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  129. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  130. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  131. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  132. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  133. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  134. package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
  135. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  136. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  137. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  138. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  139. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  140. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  141. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  142. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  143. package/dist/web/standalone/server.js +1 -1
  144. package/package.json +1 -2
  145. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  146. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +2 -2
  147. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
  148. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  149. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  150. package/src/resources/extensions/gsd/prompts/run-uat.md +2 -2
  151. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -40
  152. package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -25
  153. package/src/resources/extensions/gsd/workflow-events.ts +1 -1
  154. package/dist/resources/extensions/claude-code-cli/index.js +0 -25
  155. package/dist/resources/extensions/claude-code-cli/models.js +0 -40
  156. package/dist/resources/extensions/claude-code-cli/package.json +0 -11
  157. package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -223
  158. package/dist/resources/extensions/claude-code-cli/readiness.js +0 -26
  159. package/dist/resources/extensions/claude-code-cli/sdk-types.js +0 -8
  160. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +0 -293
  161. package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +0 -1
  162. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  163. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  164. package/src/resources/extensions/claude-code-cli/index.ts +0 -28
  165. package/src/resources/extensions/claude-code-cli/models.ts +0 -42
  166. package/src/resources/extensions/claude-code-cli/package.json +0 -11
  167. package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -258
  168. package/src/resources/extensions/claude-code-cli/readiness.ts +0 -30
  169. package/src/resources/extensions/claude-code-cli/sdk-types.ts +0 -149
  170. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +0 -355
  171. /package/dist/web/standalone/.next/static/{vP6aj-TThZymVNx5Pi2AN → P4nF4UcdATjrbNMBH_Ulh}/_buildManifest.js +0 -0
  172. /package/dist/web/standalone/.next/static/{vP6aj-TThZymVNx5Pi2AN → P4nF4UcdATjrbNMBH_Ulh}/_ssgManifest.js +0 -0
@@ -1,355 +0,0 @@
1
- /**
2
- * Stream adapter: bridges the Claude Agent SDK into GSD's streamSimple contract.
3
- *
4
- * The SDK runs the full agentic loop (multi-turn, tool execution, compaction)
5
- * in one call. This adapter translates the SDK's streaming output into
6
- * AssistantMessageEvents for TUI rendering, then strips tool-call blocks from
7
- * the final AssistantMessage so GSD's agent loop doesn't try to dispatch them.
8
- */
9
-
10
- import type {
11
- AssistantMessage,
12
- AssistantMessageEvent,
13
- AssistantMessageEventStream,
14
- Context,
15
- Model,
16
- SimpleStreamOptions,
17
- } from "@gsd/pi-ai";
18
- import { EventStream } from "@gsd/pi-ai";
19
- import { execSync } from "node:child_process";
20
- import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
21
- import type {
22
- SDKAssistantMessage,
23
- SDKMessage,
24
- SDKPartialAssistantMessage,
25
- SDKResultMessage,
26
- SDKSystemMessage,
27
- SDKStatusMessage,
28
- SDKUserMessage,
29
- } from "./sdk-types.js";
30
-
31
- // ---------------------------------------------------------------------------
32
- // Stream factory
33
- // ---------------------------------------------------------------------------
34
-
35
- /**
36
- * Construct an AssistantMessageEventStream using EventStream directly.
37
- * (The class itself is only re-exported as a type from the @gsd/pi-ai barrel.)
38
- */
39
- function createAssistantStream(): AssistantMessageEventStream {
40
- return new EventStream<AssistantMessageEvent, AssistantMessage>(
41
- (event) => event.type === "done" || event.type === "error",
42
- (event) => {
43
- if (event.type === "done") return event.message;
44
- if (event.type === "error") return event.error;
45
- throw new Error("Unexpected event type for final result");
46
- },
47
- ) as AssistantMessageEventStream;
48
- }
49
-
50
- // ---------------------------------------------------------------------------
51
- // Claude binary resolution
52
- // ---------------------------------------------------------------------------
53
-
54
- let cachedClaudePath: string | null = null;
55
-
56
- /**
57
- * Resolve the path to the system-installed `claude` binary.
58
- * The SDK defaults to a bundled cli.js which doesn't exist when
59
- * installed as a library — we need to point it at the real CLI.
60
- */
61
- function getClaudePath(): string {
62
- if (cachedClaudePath) return cachedClaudePath;
63
- try {
64
- cachedClaudePath = execSync("which claude", { timeout: 5_000, stdio: "pipe" })
65
- .toString()
66
- .trim();
67
- } catch {
68
- cachedClaudePath = "claude"; // fall back to PATH resolution
69
- }
70
- return cachedClaudePath;
71
- }
72
-
73
- // ---------------------------------------------------------------------------
74
- // Prompt extraction
75
- // ---------------------------------------------------------------------------
76
-
77
- /**
78
- * Extract the last user prompt text from GSD's context messages.
79
- * The SDK manages its own conversation history — we only send
80
- * the latest user message as the prompt.
81
- */
82
- function extractLastUserPrompt(context: Context): string {
83
- for (let i = context.messages.length - 1; i >= 0; i--) {
84
- const msg = context.messages[i];
85
- if (msg.role === "user") {
86
- if (typeof msg.content === "string") return msg.content;
87
- if (Array.isArray(msg.content)) {
88
- const textParts = msg.content
89
- .filter((part: any) => part.type === "text")
90
- .map((part: any) => part.text);
91
- if (textParts.length > 0) return textParts.join("\n");
92
- }
93
- }
94
- }
95
- return "";
96
- }
97
-
98
- // ---------------------------------------------------------------------------
99
- // Error helper
100
- // ---------------------------------------------------------------------------
101
-
102
- function makeErrorMessage(model: string, errorMsg: string): AssistantMessage {
103
- return {
104
- role: "assistant",
105
- content: [{ type: "text", text: `Claude Code error: ${errorMsg}` }],
106
- api: "anthropic-messages",
107
- provider: "claude-code",
108
- model,
109
- usage: { ...ZERO_USAGE },
110
- stopReason: "error",
111
- errorMessage: errorMsg,
112
- timestamp: Date.now(),
113
- };
114
- }
115
-
116
- // ---------------------------------------------------------------------------
117
- // streamSimple implementation
118
- // ---------------------------------------------------------------------------
119
-
120
- /**
121
- * GSD streamSimple function that delegates to the Claude Agent SDK.
122
- *
123
- * Emits AssistantMessageEvent deltas for real-time TUI rendering
124
- * (thinking, text, tool calls). The final AssistantMessage has tool-call
125
- * blocks stripped so the agent loop ends the turn without local dispatch.
126
- */
127
- export function streamViaClaudeCode(
128
- model: Model<any>,
129
- context: Context,
130
- options?: SimpleStreamOptions,
131
- ): AssistantMessageEventStream {
132
- const stream = createAssistantStream();
133
-
134
- void pumpSdkMessages(model, context, options, stream);
135
-
136
- return stream;
137
- }
138
-
139
- async function pumpSdkMessages(
140
- model: Model<any>,
141
- context: Context,
142
- options: SimpleStreamOptions | undefined,
143
- stream: AssistantMessageEventStream,
144
- ): Promise<void> {
145
- const modelId = model.id;
146
- let builder: PartialMessageBuilder | null = null;
147
- /** Track the last text content seen across all assistant turns for the final message. */
148
- let lastTextContent = "";
149
- let lastThinkingContent = "";
150
-
151
- try {
152
- // Dynamic import — the SDK is an optional dependency.
153
- const sdkModule = "@anthropic-ai/claude-agent-sdk";
154
- const sdk = (await import(/* webpackIgnore: true */ sdkModule)) as {
155
- query: (args: {
156
- prompt: string | AsyncIterable<unknown>;
157
- options?: Record<string, unknown>;
158
- }) => AsyncIterable<SDKMessage>;
159
- };
160
-
161
- // Bridge GSD's AbortSignal to SDK's AbortController
162
- const controller = new AbortController();
163
- if (options?.signal) {
164
- options.signal.addEventListener("abort", () => controller.abort(), { once: true });
165
- }
166
-
167
- const prompt = extractLastUserPrompt(context);
168
-
169
- const queryResult = sdk.query({
170
- prompt,
171
- options: {
172
- pathToClaudeCodeExecutable: getClaudePath(),
173
- model: modelId,
174
- includePartialMessages: true,
175
- persistSession: false,
176
- abortController: controller,
177
- cwd: process.cwd(),
178
- permissionMode: "bypassPermissions",
179
- allowDangerouslySkipPermissions: true,
180
- settingSources: ["project"],
181
- systemPrompt: { type: "preset", preset: "claude_code" },
182
- betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
183
- },
184
- });
185
-
186
- // Emit start with an empty partial
187
- const initialPartial: AssistantMessage = {
188
- role: "assistant",
189
- content: [],
190
- api: "anthropic-messages",
191
- provider: "claude-code",
192
- model: modelId,
193
- usage: { ...ZERO_USAGE },
194
- stopReason: "stop",
195
- timestamp: Date.now(),
196
- };
197
- stream.push({ type: "start", partial: initialPartial });
198
-
199
- for await (const msg of queryResult as AsyncIterable<SDKMessage>) {
200
- if (options?.signal?.aborted) break;
201
-
202
- switch (msg.type) {
203
- // -- Init --
204
- case "system": {
205
- // Nothing to emit — the stream is already started.
206
- break;
207
- }
208
-
209
- // -- Streaming partial messages --
210
- case "stream_event": {
211
- const partial = msg as SDKPartialAssistantMessage;
212
- if (partial.parent_tool_use_id !== null) break; // skip subagent
213
-
214
- const event = partial.event;
215
-
216
- // New assistant turn starts with message_start
217
- if (event.type === "message_start") {
218
- builder = new PartialMessageBuilder(
219
- (event as any).message?.model ?? modelId,
220
- );
221
- break;
222
- }
223
-
224
- if (!builder) break;
225
-
226
- const assistantEvent = builder.handleEvent(event);
227
- if (assistantEvent) {
228
- stream.push(assistantEvent);
229
- }
230
- break;
231
- }
232
-
233
- // -- Complete assistant message (non-streaming fallback) --
234
- case "assistant": {
235
- const sdkAssistant = msg as SDKAssistantMessage;
236
- if (sdkAssistant.parent_tool_use_id !== null) break;
237
-
238
- // Capture text content from complete messages
239
- for (const block of sdkAssistant.message.content) {
240
- if (block.type === "text") {
241
- lastTextContent = block.text;
242
- } else if (block.type === "thinking") {
243
- lastThinkingContent = block.thinking;
244
- }
245
- }
246
- break;
247
- }
248
-
249
- // -- User message (synthetic tool result — signals turn boundary) --
250
- case "user": {
251
- const userMsg = msg as SDKUserMessage;
252
- if (userMsg.parent_tool_use_id !== null) break;
253
-
254
- // Capture accumulated text from the builder before resetting
255
- if (builder) {
256
- for (const block of builder.message.content) {
257
- if (block.type === "text" && block.text) {
258
- lastTextContent = block.text;
259
- } else if (block.type === "thinking" && block.thinking) {
260
- lastThinkingContent = block.thinking;
261
- }
262
- }
263
- }
264
- builder = null;
265
- break;
266
- }
267
-
268
- // -- Result (terminal) --
269
- case "result": {
270
- const result = msg as SDKResultMessage;
271
-
272
- // Build final message with text/thinking only (strip tool calls)
273
- const finalContent: AssistantMessage["content"] = [];
274
-
275
- // Use builder's accumulated content if available, falling back to captured text
276
- if (builder) {
277
- for (const block of builder.message.content) {
278
- if (block.type === "text" && block.text) {
279
- lastTextContent = block.text;
280
- } else if (block.type === "thinking" && block.thinking) {
281
- lastThinkingContent = block.thinking;
282
- }
283
- }
284
- }
285
-
286
- if (lastThinkingContent) {
287
- finalContent.push({ type: "thinking", thinking: lastThinkingContent });
288
- }
289
- if (lastTextContent) {
290
- finalContent.push({ type: "text", text: lastTextContent });
291
- }
292
-
293
- // Fallback: use the SDK's result text if we have no content
294
- if (finalContent.length === 0 && result.subtype === "success" && result.result) {
295
- finalContent.push({ type: "text", text: result.result });
296
- }
297
-
298
- const finalMessage: AssistantMessage = {
299
- role: "assistant",
300
- content: finalContent,
301
- api: "anthropic-messages",
302
- provider: "claude-code",
303
- model: modelId,
304
- usage: mapUsage(result.usage, result.total_cost_usd),
305
- stopReason: result.is_error ? "error" : "stop",
306
- timestamp: Date.now(),
307
- };
308
-
309
- if (result.is_error) {
310
- const errText =
311
- "errors" in result
312
- ? (result as any).errors?.join("; ")
313
- : result.subtype;
314
- finalMessage.errorMessage = errText;
315
- stream.push({ type: "error", reason: "error", error: finalMessage });
316
- } else {
317
- stream.push({ type: "done", reason: "stop", message: finalMessage });
318
- }
319
- return;
320
- }
321
-
322
- default:
323
- break;
324
- }
325
- }
326
-
327
- // Generator exhausted without a result message (unexpected)
328
- const fallbackContent: AssistantMessage["content"] = [];
329
- if (lastTextContent) {
330
- fallbackContent.push({ type: "text", text: lastTextContent });
331
- }
332
- if (fallbackContent.length === 0) {
333
- fallbackContent.push({ type: "text", text: "(Claude Code session ended without a response)" });
334
- }
335
-
336
- const fallback: AssistantMessage = {
337
- role: "assistant",
338
- content: fallbackContent,
339
- api: "anthropic-messages",
340
- provider: "claude-code",
341
- model: modelId,
342
- usage: { ...ZERO_USAGE },
343
- stopReason: "stop",
344
- timestamp: Date.now(),
345
- };
346
- stream.push({ type: "done", reason: "stop", message: fallback });
347
- } catch (err) {
348
- const errorMsg = err instanceof Error ? err.message : String(err);
349
- stream.push({
350
- type: "error",
351
- reason: "error",
352
- error: makeErrorMessage(modelId, errorMsg),
353
- });
354
- }
355
- }