@witqq/agent-sdk 0.6.0 → 0.7.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.
Files changed (122) hide show
  1. package/README.md +433 -6
  2. package/dist/auth/index.cjs +188 -1
  3. package/dist/auth/index.cjs.map +1 -1
  4. package/dist/auth/index.d.cts +154 -138
  5. package/dist/auth/index.d.ts +154 -138
  6. package/dist/auth/index.js +188 -2
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/backends/claude.cjs +341 -22
  9. package/dist/backends/claude.cjs.map +1 -1
  10. package/dist/backends/claude.d.cts +2 -1
  11. package/dist/backends/claude.d.ts +2 -1
  12. package/dist/backends/claude.js +341 -22
  13. package/dist/backends/claude.js.map +1 -1
  14. package/dist/backends/copilot.cjs +133 -25
  15. package/dist/backends/copilot.cjs.map +1 -1
  16. package/dist/backends/copilot.d.cts +2 -1
  17. package/dist/backends/copilot.d.ts +2 -1
  18. package/dist/backends/copilot.js +133 -25
  19. package/dist/backends/copilot.js.map +1 -1
  20. package/dist/backends/vercel-ai.cjs +66 -19
  21. package/dist/backends/vercel-ai.cjs.map +1 -1
  22. package/dist/backends/vercel-ai.d.cts +1 -1
  23. package/dist/backends/vercel-ai.d.ts +1 -1
  24. package/dist/backends/vercel-ai.js +66 -19
  25. package/dist/backends/vercel-ai.js.map +1 -1
  26. package/dist/chat/accumulator.cjs +147 -0
  27. package/dist/chat/accumulator.cjs.map +1 -0
  28. package/dist/chat/accumulator.d.cts +61 -0
  29. package/dist/chat/accumulator.d.ts +61 -0
  30. package/dist/chat/accumulator.js +145 -0
  31. package/dist/chat/accumulator.js.map +1 -0
  32. package/dist/chat/backends.cjs +3534 -0
  33. package/dist/chat/backends.cjs.map +1 -0
  34. package/dist/chat/backends.d.cts +62 -0
  35. package/dist/chat/backends.d.ts +62 -0
  36. package/dist/chat/backends.js +3501 -0
  37. package/dist/chat/backends.js.map +1 -0
  38. package/dist/chat/context.cjs +230 -0
  39. package/dist/chat/context.cjs.map +1 -0
  40. package/dist/chat/context.d.cts +167 -0
  41. package/dist/chat/context.d.ts +167 -0
  42. package/dist/chat/context.js +227 -0
  43. package/dist/chat/context.js.map +1 -0
  44. package/dist/chat/core.cjs +282 -0
  45. package/dist/chat/core.cjs.map +1 -0
  46. package/dist/chat/core.d.cts +435 -0
  47. package/dist/chat/core.d.ts +435 -0
  48. package/dist/chat/core.js +261 -0
  49. package/dist/chat/core.js.map +1 -0
  50. package/dist/chat/errors.cjs +251 -0
  51. package/dist/chat/errors.cjs.map +1 -0
  52. package/dist/chat/errors.d.cts +122 -0
  53. package/dist/chat/errors.d.ts +122 -0
  54. package/dist/chat/errors.js +243 -0
  55. package/dist/chat/errors.js.map +1 -0
  56. package/dist/chat/events.cjs +203 -0
  57. package/dist/chat/events.cjs.map +1 -0
  58. package/dist/chat/events.d.cts +241 -0
  59. package/dist/chat/events.d.ts +241 -0
  60. package/dist/chat/events.js +196 -0
  61. package/dist/chat/events.js.map +1 -0
  62. package/dist/chat/index.cjs +5359 -0
  63. package/dist/chat/index.cjs.map +1 -0
  64. package/dist/chat/index.d.cts +52 -0
  65. package/dist/chat/index.d.ts +52 -0
  66. package/dist/chat/index.js +5296 -0
  67. package/dist/chat/index.js.map +1 -0
  68. package/dist/chat/react.cjs +2739 -0
  69. package/dist/chat/react.cjs.map +1 -0
  70. package/dist/chat/react.d.cts +619 -0
  71. package/dist/chat/react.d.ts +619 -0
  72. package/dist/chat/react.js +2714 -0
  73. package/dist/chat/react.js.map +1 -0
  74. package/dist/chat/runtime.cjs +1030 -0
  75. package/dist/chat/runtime.cjs.map +1 -0
  76. package/dist/chat/runtime.d.cts +118 -0
  77. package/dist/chat/runtime.d.ts +118 -0
  78. package/dist/chat/runtime.js +1028 -0
  79. package/dist/chat/runtime.js.map +1 -0
  80. package/dist/chat/server.cjs +643 -0
  81. package/dist/chat/server.cjs.map +1 -0
  82. package/dist/chat/server.d.cts +287 -0
  83. package/dist/chat/server.d.ts +287 -0
  84. package/dist/chat/server.js +617 -0
  85. package/dist/chat/server.js.map +1 -0
  86. package/dist/chat/sessions.cjs +398 -0
  87. package/dist/chat/sessions.cjs.map +1 -0
  88. package/dist/chat/sessions.d.cts +239 -0
  89. package/dist/chat/sessions.d.ts +239 -0
  90. package/dist/chat/sessions.js +394 -0
  91. package/dist/chat/sessions.js.map +1 -0
  92. package/dist/chat/state.cjs +177 -0
  93. package/dist/chat/state.cjs.map +1 -0
  94. package/dist/chat/state.d.cts +92 -0
  95. package/dist/chat/state.d.ts +92 -0
  96. package/dist/chat/state.js +167 -0
  97. package/dist/chat/state.js.map +1 -0
  98. package/dist/chat/storage.cjs +240 -0
  99. package/dist/chat/storage.cjs.map +1 -0
  100. package/dist/chat/storage.d.cts +191 -0
  101. package/dist/chat/storage.d.ts +191 -0
  102. package/dist/chat/storage.js +236 -0
  103. package/dist/chat/storage.js.map +1 -0
  104. package/dist/errors-BDLbNu9w.d.cts +13 -0
  105. package/dist/errors-BDLbNu9w.d.ts +13 -0
  106. package/dist/in-process-transport-C2oPTYs6.d.ts +223 -0
  107. package/dist/in-process-transport-DG-w5G6k.d.cts +223 -0
  108. package/dist/index.cjs +25 -13
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +32 -4
  111. package/dist/index.d.ts +32 -4
  112. package/dist/index.js +25 -13
  113. package/dist/index.js.map +1 -1
  114. package/dist/transport-D1OaUgRk.d.ts +67 -0
  115. package/dist/transport-DX1Nhm4N.d.cts +67 -0
  116. package/dist/types-Bh5AhqD-.d.ts +141 -0
  117. package/dist/types-CGF7AEX1.d.cts +141 -0
  118. package/dist/{types-BvwNzZCj.d.cts → types-CqvUAYxt.d.cts} +21 -3
  119. package/dist/{types-BvwNzZCj.d.ts → types-CqvUAYxt.d.ts} +21 -3
  120. package/dist/types-DLZzlJxt.d.ts +39 -0
  121. package/dist/types-tE0CXwBl.d.cts +39 -0
  122. package/package.json +149 -2
@@ -8,10 +8,16 @@ function getTextContent(content) {
8
8
 
9
9
  // src/errors.ts
10
10
  var AgentSDKError = class extends Error {
11
+ /** @internal Marker for cross-bundle identity checks */
12
+ _agentSDKError = true;
11
13
  constructor(message, options) {
12
14
  super(message, options);
13
15
  this.name = "AgentSDKError";
14
16
  }
17
+ /** Check if an error is an AgentSDKError (works across bundled copies) */
18
+ static is(error) {
19
+ return error instanceof Error && "_agentSDKError" in error && error._agentSDKError === true;
20
+ }
15
21
  };
16
22
  var ReentrancyError = class extends AgentSDKError {
17
23
  constructor() {
@@ -43,6 +49,7 @@ var BaseAgent = class {
43
49
  state = "idle";
44
50
  abortController = null;
45
51
  config;
52
+ _cleanupExternalSignal = null;
46
53
  /** CLI session ID for persistent mode. Override in backends that support it. */
47
54
  get sessionId() {
48
55
  return void 0;
@@ -62,8 +69,7 @@ var BaseAgent = class {
62
69
  this.enrichAndNotifyUsage(result);
63
70
  return result;
64
71
  } finally {
65
- this.state = "idle";
66
- this.abortController = null;
72
+ this.cleanupRun();
67
73
  }
68
74
  }
69
75
  async runWithContext(messages, options) {
@@ -76,8 +82,7 @@ var BaseAgent = class {
76
82
  this.enrichAndNotifyUsage(result);
77
83
  return result;
78
84
  } finally {
79
- this.state = "idle";
80
- this.abortController = null;
85
+ this.cleanupRun();
81
86
  }
82
87
  }
83
88
  async runStructured(prompt, schema, options) {
@@ -96,8 +101,7 @@ var BaseAgent = class {
96
101
  this.enrichAndNotifyUsage(result);
97
102
  return result;
98
103
  } finally {
99
- this.state = "idle";
100
- this.abortController = null;
104
+ this.cleanupRun();
101
105
  }
102
106
  }
103
107
  async *stream(prompt, options) {
@@ -110,8 +114,7 @@ var BaseAgent = class {
110
114
  const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
111
115
  yield* this.heartbeatStream(enriched);
112
116
  } finally {
113
- this.state = "idle";
114
- this.abortController = null;
117
+ this.cleanupRun();
115
118
  }
116
119
  }
117
120
  async *streamWithContext(messages, options) {
@@ -123,8 +126,7 @@ var BaseAgent = class {
123
126
  const enriched = this.enrichStream(this.executeStream(messages, options, ac.signal));
124
127
  yield* this.heartbeatStream(enriched);
125
128
  } finally {
126
- this.state = "idle";
127
- this.abortController = null;
129
+ this.cleanupRun();
128
130
  }
129
131
  }
130
132
  abort() {
@@ -144,6 +146,8 @@ var BaseAgent = class {
144
146
  }
145
147
  /** Mark agent as disposed. Override to add cleanup. */
146
148
  dispose() {
149
+ this._cleanupExternalSignal?.();
150
+ this._cleanupExternalSignal = null;
147
151
  this.abort();
148
152
  this.state = "disposed";
149
153
  }
@@ -254,16 +258,24 @@ var BaseAgent = class {
254
258
  }
255
259
  }
256
260
  // ─── Internal Helpers ─────────────────────────────────────────
261
+ /** Clean up after a run completes (success, error, or abort). */
262
+ cleanupRun() {
263
+ this._cleanupExternalSignal?.();
264
+ this._cleanupExternalSignal = null;
265
+ this.state = "idle";
266
+ this.abortController = null;
267
+ }
257
268
  createAbortController(externalSignal) {
258
269
  const ac = new AbortController();
259
270
  this.abortController = ac;
271
+ this._cleanupExternalSignal = null;
260
272
  if (externalSignal) {
261
273
  if (externalSignal.aborted) {
262
274
  ac.abort();
263
275
  } else {
264
- externalSignal.addEventListener("abort", () => ac.abort(), {
265
- once: true
266
- });
276
+ const listener = () => ac.abort();
277
+ externalSignal.addEventListener("abort", listener, { once: true });
278
+ this._cleanupExternalSignal = () => externalSignal.removeEventListener("abort", listener);
267
279
  }
268
280
  }
269
281
  return ac;
@@ -605,9 +617,12 @@ var ClaudeAgent = class extends BaseAgent {
605
617
  constructor(config, options) {
606
618
  super(config);
607
619
  this.options = options;
608
- this.tools = config.tools;
620
+ this.tools = config.tools ?? [];
609
621
  this.canUseTool = buildCanUseTool(config);
610
622
  this.isPersistent = config.sessionMode === "persistent";
623
+ if (options.resumeSessionId) {
624
+ this._sessionId = options.resumeSessionId;
625
+ }
611
626
  if (config.supervisor?.onAskUser) {
612
627
  console.warn(
613
628
  "[agent-sdk/claude] supervisor.onAskUser is not supported by the Claude CLI backend. User interaction requests from the model will not be forwarded."
@@ -666,7 +681,7 @@ var ClaudeAgent = class extends BaseAgent {
666
681
  opts.permissionMode = "default";
667
682
  }
668
683
  if (this.config.availableTools) {
669
- opts.allowedTools = [...this.config.availableTools];
684
+ opts.tools = [...this.config.availableTools];
670
685
  }
671
686
  return opts;
672
687
  }
@@ -740,8 +755,78 @@ var ClaudeAgent = class extends BaseAgent {
740
755
  }
741
756
  }
742
757
  } catch (e) {
743
- if (this.isPersistent) this.clearPersistentSession();
744
758
  if (signal.aborted) throw new AbortError();
759
+ if (isResuming && this.isPersistent) {
760
+ this.clearPersistentSession();
761
+ const retryPrompt = buildContextualPrompt(messages);
762
+ let retryOpts = this.buildQueryOptions(signal);
763
+ toolResultCapture.clear();
764
+ retryOpts = await this.buildMcpConfig(retryOpts, toolResultCapture);
765
+ const retryQ = sdk.query({ prompt: retryPrompt, options: retryOpts });
766
+ this.activeQuery = retryQ;
767
+ toolCalls.length = 0;
768
+ output = null;
769
+ try {
770
+ for await (const msg of retryQ) {
771
+ if (msg.type === "assistant") {
772
+ const betaMessage = msg.message;
773
+ if (betaMessage?.content) {
774
+ for (const block of betaMessage.content) {
775
+ if (block.type === "tool_use") {
776
+ const toolName = stripMcpPrefix(block.name ?? "unknown");
777
+ toolCalls.push({
778
+ toolName,
779
+ args: block.input ?? {},
780
+ result: toolResultCapture.get(toolName) ?? null,
781
+ approved: true
782
+ });
783
+ }
784
+ }
785
+ }
786
+ }
787
+ if (msg.type === "tool_use_summary" || msg.type === "result") {
788
+ for (const tc of toolCalls) {
789
+ if (tc.result === null) {
790
+ const captured = toolResultCapture.get(tc.toolName);
791
+ if (captured !== void 0) tc.result = captured;
792
+ }
793
+ }
794
+ }
795
+ if (msg.type === "result") {
796
+ if (msg.subtype === "success") {
797
+ const r = msg;
798
+ output = r.result;
799
+ usage = aggregateUsage(r.modelUsage);
800
+ if (this.isPersistent && r.session_id) {
801
+ this._sessionId = r.session_id;
802
+ }
803
+ } else if (msg.is_error) {
804
+ const r = msg;
805
+ throw new Error(
806
+ `Claude query failed: ${r.errors?.join("; ") ?? "unknown error"}`
807
+ );
808
+ }
809
+ }
810
+ }
811
+ } catch (retryError) {
812
+ if (this.isPersistent) this.clearPersistentSession();
813
+ if (signal.aborted) throw new AbortError();
814
+ throw retryError;
815
+ } finally {
816
+ this.activeQuery = null;
817
+ }
818
+ return {
819
+ output,
820
+ structuredOutput: void 0,
821
+ toolCalls,
822
+ messages: [
823
+ ...messages,
824
+ ...output !== null ? [{ role: "assistant", content: output }] : []
825
+ ],
826
+ usage
827
+ };
828
+ }
829
+ if (this.isPersistent) this.clearPersistentSession();
745
830
  throw e;
746
831
  } finally {
747
832
  this.activeQuery = null;
@@ -764,7 +849,8 @@ var ClaudeAgent = class extends BaseAgent {
764
849
  const isResuming = this.isPersistent && this._sessionId !== void 0;
765
850
  const prompt = isResuming ? extractLastUserPrompt(messages) : buildContextualPrompt(messages);
766
851
  let opts = this.buildQueryOptions(signal);
767
- opts = await this.buildMcpConfig(opts);
852
+ const toolResultCapture = /* @__PURE__ */ new Map();
853
+ opts = await this.buildMcpConfig(opts, toolResultCapture);
768
854
  const jsonSchema = zodToJsonSchema(schema.schema);
769
855
  opts.outputFormat = {
770
856
  type: "json_schema",
@@ -778,6 +864,30 @@ var ClaudeAgent = class extends BaseAgent {
778
864
  let usage;
779
865
  try {
780
866
  for await (const msg of q) {
867
+ if (msg.type === "assistant") {
868
+ const betaMessage = msg.message;
869
+ if (betaMessage?.content) {
870
+ for (const block of betaMessage.content) {
871
+ if (block.type === "tool_use") {
872
+ const toolName = stripMcpPrefix(block.name ?? "unknown");
873
+ toolCalls.push({
874
+ toolName,
875
+ args: block.input ?? {},
876
+ result: toolResultCapture.get(toolName) ?? null,
877
+ approved: true
878
+ });
879
+ }
880
+ }
881
+ }
882
+ }
883
+ if (msg.type === "tool_use_summary" || msg.type === "result") {
884
+ for (const tc of toolCalls) {
885
+ if (tc.result === null) {
886
+ const captured = toolResultCapture.get(tc.toolName);
887
+ if (captured !== void 0) tc.result = captured;
888
+ }
889
+ }
890
+ }
781
891
  if (msg.type === "result" && msg.subtype === "success") {
782
892
  const r = msg;
783
893
  output = r.result;
@@ -810,8 +920,98 @@ var ClaudeAgent = class extends BaseAgent {
810
920
  }
811
921
  }
812
922
  } catch (e) {
813
- if (this.isPersistent) this.clearPersistentSession();
814
923
  if (signal.aborted) throw new AbortError();
924
+ if (isResuming && this.isPersistent) {
925
+ this.clearPersistentSession();
926
+ const retryPrompt = buildContextualPrompt(messages);
927
+ let retryOpts = this.buildQueryOptions(signal);
928
+ toolResultCapture.clear();
929
+ retryOpts = await this.buildMcpConfig(retryOpts, toolResultCapture);
930
+ retryOpts.outputFormat = {
931
+ type: "json_schema",
932
+ schema: jsonSchema
933
+ };
934
+ const retryQ = sdk.query({ prompt: retryPrompt, options: retryOpts });
935
+ this.activeQuery = retryQ;
936
+ toolCalls.length = 0;
937
+ output = null;
938
+ structuredOutput = void 0;
939
+ try {
940
+ for await (const msg of retryQ) {
941
+ if (msg.type === "assistant") {
942
+ const betaMessage = msg.message;
943
+ if (betaMessage?.content) {
944
+ for (const block of betaMessage.content) {
945
+ if (block.type === "tool_use") {
946
+ const toolName = stripMcpPrefix(block.name ?? "unknown");
947
+ toolCalls.push({
948
+ toolName,
949
+ args: block.input ?? {},
950
+ result: toolResultCapture.get(toolName) ?? null,
951
+ approved: true
952
+ });
953
+ }
954
+ }
955
+ }
956
+ }
957
+ if (msg.type === "tool_use_summary" || msg.type === "result") {
958
+ for (const tc of toolCalls) {
959
+ if (tc.result === null) {
960
+ const captured = toolResultCapture.get(tc.toolName);
961
+ if (captured !== void 0) tc.result = captured;
962
+ }
963
+ }
964
+ }
965
+ if (msg.type === "result" && msg.subtype === "success") {
966
+ const r = msg;
967
+ output = r.result;
968
+ if (r.structured_output !== void 0) {
969
+ try {
970
+ structuredOutput = schema.schema.parse(r.structured_output);
971
+ } catch {
972
+ try {
973
+ structuredOutput = schema.schema.parse(JSON.parse(r.result));
974
+ } catch {
975
+ }
976
+ }
977
+ } else if (r.result) {
978
+ try {
979
+ const jsonMatch = r.result.match(/```(?:json)?\s*([\s\S]*?)```/);
980
+ const raw = jsonMatch ? jsonMatch[1].trim() : r.result.trim();
981
+ structuredOutput = schema.schema.parse(JSON.parse(raw));
982
+ } catch {
983
+ }
984
+ }
985
+ usage = aggregateUsage(r.modelUsage);
986
+ if (this.isPersistent && r.session_id) {
987
+ this._sessionId = r.session_id;
988
+ }
989
+ } else if (msg.type === "result" && msg.is_error) {
990
+ const r = msg;
991
+ throw new Error(
992
+ `Claude query failed: ${r.errors?.join("; ") ?? "unknown error"}`
993
+ );
994
+ }
995
+ }
996
+ } catch (retryError) {
997
+ if (this.isPersistent) this.clearPersistentSession();
998
+ if (signal.aborted) throw new AbortError();
999
+ throw retryError;
1000
+ } finally {
1001
+ this.activeQuery = null;
1002
+ }
1003
+ return {
1004
+ output,
1005
+ structuredOutput,
1006
+ toolCalls,
1007
+ messages: [
1008
+ ...messages,
1009
+ ...output !== null ? [{ role: "assistant", content: output }] : []
1010
+ ],
1011
+ usage
1012
+ };
1013
+ }
1014
+ if (this.isPersistent) this.clearPersistentSession();
815
1015
  throw e;
816
1016
  } finally {
817
1017
  this.activeQuery = null;
@@ -834,21 +1034,47 @@ var ClaudeAgent = class extends BaseAgent {
834
1034
  const isResuming = this.isPersistent && this._sessionId !== void 0;
835
1035
  const prompt = isResuming ? extractLastUserPrompt(messages) : buildContextualPrompt(messages);
836
1036
  let opts = this.buildQueryOptions(signal);
837
- opts = await this.buildMcpConfig(opts);
1037
+ const toolResultCapture = /* @__PURE__ */ new Map();
1038
+ opts = await this.buildMcpConfig(opts, toolResultCapture);
838
1039
  const q = sdk.query({ prompt, options: opts });
839
1040
  this.activeQuery = q;
840
1041
  const thinkingBlockIndices = /* @__PURE__ */ new Set();
841
1042
  const toolCallTracker = new ClaudeToolCallTracker();
1043
+ const pendingStreamToolCalls = /* @__PURE__ */ new Map();
842
1044
  try {
843
1045
  for await (const msg of q) {
844
1046
  if (signal.aborted) throw new AbortError();
845
1047
  const events = mapSDKMessage(msg, thinkingBlockIndices, toolCallTracker);
846
1048
  if (events) {
847
1049
  const mapped = Array.isArray(events) ? events : [events];
848
- for (const e of mapped) yield e;
1050
+ for (const e of mapped) {
1051
+ if (e.type === "tool_call_start") {
1052
+ pendingStreamToolCalls.set(e.toolCallId, e.toolName);
1053
+ }
1054
+ if (e.type === "tool_call_end" && toolResultCapture.has(e.toolName)) {
1055
+ e.result = toolResultCapture.get(e.toolName);
1056
+ toolResultCapture.delete(e.toolName);
1057
+ pendingStreamToolCalls.delete(e.toolCallId);
1058
+ } else if (e.type === "tool_call_end") {
1059
+ pendingStreamToolCalls.delete(e.toolCallId);
1060
+ }
1061
+ yield e;
1062
+ }
849
1063
  }
850
1064
  if (msg.type === "result" && msg.subtype === "success") {
851
1065
  const r = msg;
1066
+ for (const [toolCallId, toolName] of pendingStreamToolCalls) {
1067
+ if (toolResultCapture.has(toolName)) {
1068
+ yield {
1069
+ type: "tool_call_end",
1070
+ toolCallId,
1071
+ toolName,
1072
+ result: toolResultCapture.get(toolName)
1073
+ };
1074
+ toolResultCapture.delete(toolName);
1075
+ }
1076
+ }
1077
+ pendingStreamToolCalls.clear();
852
1078
  if (r.session_id) {
853
1079
  if (this.isPersistent) {
854
1080
  this._sessionId = r.session_id;
@@ -859,8 +1085,71 @@ var ClaudeAgent = class extends BaseAgent {
859
1085
  }
860
1086
  }
861
1087
  } catch (e) {
862
- if (this.isPersistent) this.clearPersistentSession();
863
1088
  if (signal.aborted) throw new AbortError();
1089
+ if (isResuming && this.isPersistent) {
1090
+ this.clearPersistentSession();
1091
+ const retryPrompt = buildContextualPrompt(messages);
1092
+ let retryOpts = this.buildQueryOptions(signal);
1093
+ toolResultCapture.clear();
1094
+ retryOpts = await this.buildMcpConfig(retryOpts, toolResultCapture);
1095
+ const retryQ = sdk.query({ prompt: retryPrompt, options: retryOpts });
1096
+ this.activeQuery = retryQ;
1097
+ const retryThinkingBlockIndices = /* @__PURE__ */ new Set();
1098
+ const retryToolCallTracker = new ClaudeToolCallTracker();
1099
+ const retryPendingToolCalls = /* @__PURE__ */ new Map();
1100
+ try {
1101
+ for await (const msg of retryQ) {
1102
+ if (signal.aborted) throw new AbortError();
1103
+ const retryEvents = mapSDKMessage(msg, retryThinkingBlockIndices, retryToolCallTracker);
1104
+ if (retryEvents) {
1105
+ const mapped = Array.isArray(retryEvents) ? retryEvents : [retryEvents];
1106
+ for (const ev of mapped) {
1107
+ if (ev.type === "tool_call_start") {
1108
+ retryPendingToolCalls.set(ev.toolCallId, ev.toolName);
1109
+ }
1110
+ if (ev.type === "tool_call_end" && toolResultCapture.has(ev.toolName)) {
1111
+ ev.result = toolResultCapture.get(ev.toolName);
1112
+ toolResultCapture.delete(ev.toolName);
1113
+ retryPendingToolCalls.delete(ev.toolCallId);
1114
+ } else if (ev.type === "tool_call_end") {
1115
+ retryPendingToolCalls.delete(ev.toolCallId);
1116
+ }
1117
+ yield ev;
1118
+ }
1119
+ }
1120
+ if (msg.type === "result" && msg.subtype === "success") {
1121
+ const r = msg;
1122
+ for (const [toolCallId, toolName] of retryPendingToolCalls) {
1123
+ if (toolResultCapture.has(toolName)) {
1124
+ yield {
1125
+ type: "tool_call_end",
1126
+ toolCallId,
1127
+ toolName,
1128
+ result: toolResultCapture.get(toolName)
1129
+ };
1130
+ toolResultCapture.delete(toolName);
1131
+ }
1132
+ }
1133
+ retryPendingToolCalls.clear();
1134
+ if (r.session_id) {
1135
+ if (this.isPersistent) {
1136
+ this._sessionId = r.session_id;
1137
+ }
1138
+ yield this.emitSessionInfo(r.session_id);
1139
+ }
1140
+ yield { type: "done", finalOutput: r.result };
1141
+ }
1142
+ }
1143
+ } catch (retryError) {
1144
+ if (this.isPersistent) this.clearPersistentSession();
1145
+ if (signal.aborted) throw new AbortError();
1146
+ throw retryError;
1147
+ } finally {
1148
+ this.activeQuery = null;
1149
+ }
1150
+ return;
1151
+ }
1152
+ if (this.isPersistent) this.clearPersistentSession();
864
1153
  throw e;
865
1154
  } finally {
866
1155
  this.activeQuery = null;
@@ -880,13 +1169,43 @@ function extractLastUserPrompt(messages) {
880
1169
  }
881
1170
  return "";
882
1171
  }
1172
+ function serializeToolCall(tc) {
1173
+ const args = typeof tc.args === "string" ? tc.args : JSON.stringify(tc.args);
1174
+ return ` Tool call: ${tc.name}(${args})`;
1175
+ }
1176
+ function serializeToolResult(tr) {
1177
+ const result = typeof tr.result === "string" ? tr.result : JSON.stringify(tr.result);
1178
+ const prefix = tr.isError ? "[ERROR] " : "";
1179
+ return ` ${tr.name} \u2192 ${prefix}${result}`;
1180
+ }
883
1181
  function buildContextualPrompt(messages) {
884
1182
  if (messages.length <= 1) {
885
1183
  return extractLastUserPrompt(messages);
886
1184
  }
887
1185
  const history = messages.slice(0, -1).map((msg) => {
1186
+ if (msg.role === "user") {
1187
+ return `User: ${msg.content ? getTextContent(msg.content) : ""}`;
1188
+ }
1189
+ if (msg.role === "tool" && msg.toolResults) {
1190
+ const results = msg.toolResults.map(serializeToolResult).join("\n");
1191
+ return `Tool results:
1192
+ ${results}`;
1193
+ }
1194
+ if (msg.role === "assistant") {
1195
+ const parts = [];
1196
+ const thinking = msg.thinking;
1197
+ if (thinking) {
1198
+ parts.push(`[reasoning: ${thinking}]`);
1199
+ }
1200
+ const text2 = msg.content ? getTextContent(msg.content) : "";
1201
+ if (text2) parts.push(text2);
1202
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
1203
+ parts.push(msg.toolCalls.map(serializeToolCall).join("\n"));
1204
+ }
1205
+ return `Assistant: ${parts.join("\n")}`;
1206
+ }
888
1207
  const text = msg.content ? getTextContent(msg.content) : "";
889
- return msg.role === "user" ? `User: ${text}` : `Assistant: ${text}`;
1208
+ return `${msg.role}: ${text}`;
890
1209
  }).join("\n");
891
1210
  const lastPrompt = extractLastUserPrompt(messages);
892
1211
  return `Conversation history: