@open-multi-agent/core 1.4.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/README.md +135 -79
  2. package/dist/agent/agent.d.ts.map +1 -1
  3. package/dist/agent/agent.js +5 -0
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/runner.d.ts +12 -0
  6. package/dist/agent/runner.d.ts.map +1 -1
  7. package/dist/agent/runner.js +48 -12
  8. package/dist/agent/runner.js.map +1 -1
  9. package/dist/cli/oma.d.ts +10 -2
  10. package/dist/cli/oma.d.ts.map +1 -1
  11. package/dist/cli/oma.js +12 -5
  12. package/dist/cli/oma.js.map +1 -1
  13. package/dist/dashboard/render-team-run-dashboard.d.ts.map +1 -1
  14. package/dist/dashboard/render-team-run-dashboard.js +177 -84
  15. package/dist/dashboard/render-team-run-dashboard.js.map +1 -1
  16. package/dist/errors.d.ts +10 -0
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/errors.js +13 -0
  19. package/dist/errors.js.map +1 -1
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/llm/adapter.d.ts +5 -1
  25. package/dist/llm/adapter.d.ts.map +1 -1
  26. package/dist/llm/adapter.js +16 -0
  27. package/dist/llm/adapter.js.map +1 -1
  28. package/dist/llm/ai-sdk.d.ts +2 -1
  29. package/dist/llm/ai-sdk.d.ts.map +1 -1
  30. package/dist/llm/ai-sdk.js +48 -13
  31. package/dist/llm/ai-sdk.js.map +1 -1
  32. package/dist/llm/anthropic.d.ts.map +1 -1
  33. package/dist/llm/anthropic.js +27 -13
  34. package/dist/llm/anthropic.js.map +1 -1
  35. package/dist/llm/azure-openai.d.ts.map +1 -1
  36. package/dist/llm/azure-openai.js +5 -2
  37. package/dist/llm/azure-openai.js.map +1 -1
  38. package/dist/llm/bedrock.d.ts.map +1 -1
  39. package/dist/llm/bedrock.js +32 -19
  40. package/dist/llm/bedrock.js.map +1 -1
  41. package/dist/llm/copilot.d.ts.map +1 -1
  42. package/dist/llm/copilot.js +5 -2
  43. package/dist/llm/copilot.js.map +1 -1
  44. package/dist/llm/deepseek.d.ts +9 -2
  45. package/dist/llm/deepseek.d.ts.map +1 -1
  46. package/dist/llm/deepseek.js +21 -2
  47. package/dist/llm/deepseek.js.map +1 -1
  48. package/dist/llm/doubao.d.ts +21 -0
  49. package/dist/llm/doubao.d.ts.map +1 -0
  50. package/dist/llm/doubao.js +24 -0
  51. package/dist/llm/doubao.js.map +1 -0
  52. package/dist/llm/gemini.d.ts.map +1 -1
  53. package/dist/llm/gemini.js +35 -18
  54. package/dist/llm/gemini.js.map +1 -1
  55. package/dist/llm/hunyuan.d.ts +40 -0
  56. package/dist/llm/hunyuan.d.ts.map +1 -0
  57. package/dist/llm/hunyuan.js +59 -0
  58. package/dist/llm/hunyuan.js.map +1 -0
  59. package/dist/llm/mimo.d.ts +24 -0
  60. package/dist/llm/mimo.d.ts.map +1 -0
  61. package/dist/llm/mimo.js +30 -0
  62. package/dist/llm/mimo.js.map +1 -0
  63. package/dist/llm/openai-common.d.ts +10 -17
  64. package/dist/llm/openai-common.d.ts.map +1 -1
  65. package/dist/llm/openai-common.js +92 -43
  66. package/dist/llm/openai-common.js.map +1 -1
  67. package/dist/llm/openai.d.ts +22 -1
  68. package/dist/llm/openai.d.ts.map +1 -1
  69. package/dist/llm/openai.js +51 -7
  70. package/dist/llm/openai.js.map +1 -1
  71. package/dist/llm/reasoning-fallback.d.ts +80 -15
  72. package/dist/llm/reasoning-fallback.d.ts.map +1 -1
  73. package/dist/llm/reasoning-fallback.js +45 -12
  74. package/dist/llm/reasoning-fallback.js.map +1 -1
  75. package/dist/llm/validate.d.ts +26 -0
  76. package/dist/llm/validate.d.ts.map +1 -0
  77. package/dist/llm/validate.js +55 -0
  78. package/dist/llm/validate.js.map +1 -0
  79. package/dist/memory/shared.d.ts +14 -7
  80. package/dist/memory/shared.d.ts.map +1 -1
  81. package/dist/memory/shared.js +97 -14
  82. package/dist/memory/shared.js.map +1 -1
  83. package/dist/orchestrator/orchestrator.d.ts +22 -1
  84. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  85. package/dist/orchestrator/orchestrator.js +155 -32
  86. package/dist/orchestrator/orchestrator.js.map +1 -1
  87. package/dist/tool/built-in/bash.d.ts +1 -1
  88. package/dist/tool/built-in/bash.d.ts.map +1 -1
  89. package/dist/tool/built-in/bash.js +60 -7
  90. package/dist/tool/built-in/bash.js.map +1 -1
  91. package/dist/tool/built-in/file-edit.d.ts.map +1 -1
  92. package/dist/tool/built-in/file-edit.js +13 -8
  93. package/dist/tool/built-in/file-edit.js.map +1 -1
  94. package/dist/tool/built-in/file-read.d.ts.map +1 -1
  95. package/dist/tool/built-in/file-read.js +9 -4
  96. package/dist/tool/built-in/file-read.js.map +1 -1
  97. package/dist/tool/built-in/file-write.d.ts.map +1 -1
  98. package/dist/tool/built-in/file-write.js +11 -6
  99. package/dist/tool/built-in/file-write.js.map +1 -1
  100. package/dist/tool/built-in/fs-walk.d.ts.map +1 -1
  101. package/dist/tool/built-in/fs-walk.js +6 -3
  102. package/dist/tool/built-in/fs-walk.js.map +1 -1
  103. package/dist/tool/built-in/glob.d.ts.map +1 -1
  104. package/dist/tool/built-in/glob.js +10 -4
  105. package/dist/tool/built-in/glob.js.map +1 -1
  106. package/dist/tool/built-in/grep.d.ts.map +1 -1
  107. package/dist/tool/built-in/grep.js +15 -6
  108. package/dist/tool/built-in/grep.js.map +1 -1
  109. package/dist/tool/built-in/path-safety.d.ts +30 -0
  110. package/dist/tool/built-in/path-safety.d.ts.map +1 -0
  111. package/dist/tool/built-in/path-safety.js +106 -0
  112. package/dist/tool/built-in/path-safety.js.map +1 -0
  113. package/dist/tool/mcp.d.ts.map +1 -1
  114. package/dist/tool/mcp.js +58 -33
  115. package/dist/tool/mcp.js.map +1 -1
  116. package/dist/types.d.ts +151 -5
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/utils/redaction.d.ts +4 -0
  119. package/dist/utils/redaction.d.ts.map +1 -0
  120. package/dist/utils/redaction.js +78 -0
  121. package/dist/utils/redaction.js.map +1 -0
  122. package/package.json +7 -4
  123. package/docs/DECISIONS.md +0 -49
  124. package/docs/cli.md +0 -265
  125. package/docs/context-management.md +0 -64
  126. package/docs/featured-partner.md +0 -28
  127. package/docs/observability.md +0 -56
  128. package/docs/providers/minimax.md +0 -75
  129. package/docs/providers.md +0 -80
  130. package/docs/shared-memory.md +0 -27
  131. package/docs/tool-configuration.md +0 -152
@@ -6,7 +6,7 @@
6
6
  * duplicated across adapters.
7
7
  */
8
8
  import { extractToolCallsFromText } from '../tool/text-tool-extractor.js';
9
- const DEFAULT_REASONING_REPLAY_MAX_CHARS = 1200;
9
+ import { reasoningBlockToInlineText, resolveReasoningOutboundMaxChars } from './reasoning-fallback.js';
10
10
  // ---------------------------------------------------------------------------
11
11
  // Framework → OpenAI
12
12
  // ---------------------------------------------------------------------------
@@ -51,36 +51,6 @@ export function getOpenAIReasoningText(source) {
51
51
  return '';
52
52
  return extractReasoningText(source['reasoning_content']);
53
53
  }
54
- function resolveReasoningReplayMaxChars(value) {
55
- if (value === undefined)
56
- return DEFAULT_REASONING_REPLAY_MAX_CHARS;
57
- if (!Number.isFinite(value))
58
- return 1;
59
- const floored = Math.floor(value);
60
- if (floored < 1)
61
- return 1;
62
- return floored;
63
- }
64
- function truncateReasoningForReplay(text, maxChars) {
65
- if (text.length <= maxChars)
66
- return text;
67
- const marker = '...[truncated]...';
68
- if (marker.length >= maxChars)
69
- return text.slice(0, maxChars);
70
- const budget = maxChars - marker.length;
71
- const head = Math.ceil(budget * 0.7);
72
- const tail = budget - head;
73
- return `${text.slice(0, head)}${marker}${text.slice(text.length - tail)}`;
74
- }
75
- function reasoningBlockToThinkingText(block, maxChars) {
76
- if (typeof block.redactedData === 'string' && block.redactedData.length > 0) {
77
- return '<thinking>[redacted]</thinking>';
78
- }
79
- if (block.text.length === 0)
80
- return '';
81
- const bounded = truncateReasoningForReplay(block.text, maxChars);
82
- return `<thinking>${bounded}</thinking>`;
83
- }
84
54
  /**
85
55
  * Determine whether a framework message contains any `tool_result` content
86
56
  * blocks, which must be serialised as separate OpenAI `tool`-role messages.
@@ -106,11 +76,21 @@ function hasToolResults(msg) {
106
76
  * runner's loop-detection warning injection (see {@link AgentRunner}, which
107
77
  * appends a text warning to a tool_result message when a loop is detected).
108
78
  */
109
- export function toOpenAIMessages(messages, replayOptions) {
79
+ export function toOpenAIMessages(messages, outboundOptions) {
110
80
  const result = [];
81
+ // Per DeepSeek V4 thinking-mode spec, when a conversation involves any
82
+ // tool call, ALL intermediate assistant messages must echo
83
+ // `reasoning_content` — not just the one that emitted the tool_use.
84
+ // Omitting reasoning on the final synthesis turn (tool_calls=None) 400s
85
+ // on the next user message. We approximate "tool-calling conversation"
86
+ // as "any tool_use anywhere in history"; non-tool conversations skip
87
+ // the echo entirely (per spec, reasoning would be ignored but still
88
+ // bloat context). See:
89
+ // https://api-docs.deepseek.com/zh-cn/guides/thinking_mode
90
+ const conversationHasToolUse = messages.some((m) => m.content.some((b) => b.type === 'tool_use'));
111
91
  for (const msg of messages) {
112
92
  if (msg.role === 'assistant') {
113
- const assistantMsg = toOpenAIAssistantMessage(msg, replayOptions);
93
+ const assistantMsg = toOpenAIAssistantMessage(msg, outboundOptions, conversationHasToolUse);
114
94
  if (assistantMsg !== null) {
115
95
  result.push(assistantMsg);
116
96
  }
@@ -170,12 +150,19 @@ function toOpenAIUserMessage(msg) {
170
150
  * Convert an `assistant`-role framework message into an OpenAI assistant message.
171
151
  * `tool_use` blocks become `tool_calls`; `text` blocks become message content.
172
152
  */
173
- function toOpenAIAssistantMessage(msg, replayOptions) {
153
+ function toOpenAIAssistantMessage(msg, outboundOptions, conversationHasToolUse = false) {
174
154
  const toolCalls = [];
175
155
  const textParts = [];
176
156
  const pendingThinkingParts = [];
177
- const enableReasoningReplay = replayOptions?.enableReasoningTextReplay === true;
178
- const maxReasoningChars = resolveReasoningReplayMaxChars(replayOptions?.maxReasoningReplayChars);
157
+ const echoProvider = outboundOptions?.nativeReasoningEchoProvider;
158
+ const enableReasoningReplay = outboundOptions?.preserveReasoningAsText === true;
159
+ const resolvedMaxChars = resolveReasoningOutboundMaxChars(outboundOptions);
160
+ // Collected only when an `echoProvider` is configured. Emitted as a
161
+ // `reasoning_content` field on the assistant payload below, gated by
162
+ // `conversationHasToolUse` (DeepSeek V4 rule: applies to every assistant
163
+ // message in a tool-calling conversation, including the final synthesis
164
+ // message that has no tool_calls of its own).
165
+ const echoEligibleReasoning = [];
179
166
  for (const block of msg.content) {
180
167
  if (block.type === 'tool_use') {
181
168
  toolCalls.push({
@@ -187,10 +174,33 @@ function toOpenAIAssistantMessage(msg, replayOptions) {
187
174
  },
188
175
  });
189
176
  }
190
- else if (block.type === 'reasoning' && enableReasoningReplay) {
191
- const serialized = reasoningBlockToThinkingText(block, maxReasoningChars);
192
- if (serialized.length > 0) {
193
- pendingThinkingParts.push(serialized);
177
+ else if (block.type === 'reasoning') {
178
+ // Path A: native echo (adapter wired with nativeReasoningEchoProvider
179
+ // and the block's provenance matches). The block is queued for
180
+ // attachment as `reasoning_content`; gating by tool_use happens after
181
+ // the loop so we don't emit it on non-tool turns.
182
+ if (echoProvider !== undefined && block.provenance === echoProvider) {
183
+ const isRedacted = typeof block.redactedData === 'string' && block.redactedData.length > 0;
184
+ if (!isRedacted && block.text.length > 0) {
185
+ echoEligibleReasoning.push(block.text);
186
+ }
187
+ // Either way, don't double-emit via the text-replay path below.
188
+ continue;
189
+ }
190
+ // Path B: `<thinking>` text fallback for foreign-provenance blocks
191
+ // (or any block when this adapter doesn't support native echo) when
192
+ // `preserveReasoningAsText` is on. OpenAI-family adapters are
193
+ // capability `'never'` by default, so every reasoning block hits this
194
+ // branch in plain OpenAI use; DeepSeek (`'tool-use-only'`) hits this
195
+ // only for foreign-provenance blocks since its own-provenance ones
196
+ // are claimed by Path A above.
197
+ if (enableReasoningReplay) {
198
+ const serialized = resolvedMaxChars === undefined
199
+ ? reasoningBlockToInlineText(block)
200
+ : reasoningBlockToInlineText(block, { maxChars: resolvedMaxChars });
201
+ if (serialized.length > 0) {
202
+ pendingThinkingParts.push(serialized);
203
+ }
194
204
  }
195
205
  }
196
206
  else if (block.type === 'text') {
@@ -216,11 +226,48 @@ function toOpenAIAssistantMessage(msg, replayOptions) {
216
226
  if (toolCalls.length > 0) {
217
227
  assistantMsg.tool_calls = toolCalls;
218
228
  }
229
+ // DeepSeek V4 (thinking mode) returns 400 on follow-up requests if any
230
+ // intermediate assistant message in a tool-calling conversation drops
231
+ // `reasoning_content` — including the final synthesis message that has
232
+ // no tool_calls of its own. The gate is on the whole conversation, not
233
+ // this single message. Non-tool conversations skip the attachment (per
234
+ // spec, reasoning is ignored there but would still bloat context).
235
+ //
236
+ // The field is not declared on the upstream SDK type, so we attach it
237
+ // via an indexed cast; the SDK serialises arbitrary own properties.
238
+ if (conversationHasToolUse && echoEligibleReasoning.length > 0) {
239
+ const reasoningContent = echoEligibleReasoning.join('');
240
+ assistantMsg
241
+ .reasoning_content = reasoningContent;
242
+ }
219
243
  return assistantMsg;
220
244
  }
221
245
  // ---------------------------------------------------------------------------
222
246
  // OpenAI → Framework
223
247
  // ---------------------------------------------------------------------------
248
+ /**
249
+ * Repair malformed single-string tool-call arguments after `JSON.parse` fails.
250
+ * Local models frequently break single-parameter tools with unescaped quotes or
251
+ * Python-style triple quotes (`"""`/`'''`). Returns the repaired argument object,
252
+ * or null when the input doesn't match the single-parameter `{"name": value}` shape.
253
+ */
254
+ export function repairToolArgs(raw) {
255
+ const args = raw.trim();
256
+ const match = args.match(/\{\s*"([^"]+)"\s*:\s*([\s\S]*?)\s*\}$/);
257
+ if (match) {
258
+ const paramName = match[1];
259
+ let val = match[2].trim();
260
+ if (val.startsWith('"""') && val.endsWith('"""'))
261
+ val = val.slice(3, -3);
262
+ else if (val.startsWith("'''") && val.endsWith("'''"))
263
+ val = val.slice(3, -3);
264
+ else if (val.startsWith('"') && val.endsWith('"')) {
265
+ val = val.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
266
+ }
267
+ return { [paramName]: val };
268
+ }
269
+ return null;
270
+ }
224
271
  /**
225
272
  * Convert an OpenAI {@link ChatCompletion} into a framework {@link LLMResponse}.
226
273
  *
@@ -267,7 +314,9 @@ export function fromOpenAICompletion(completion, knownToolNames, provenance) {
267
314
  }
268
315
  }
269
316
  catch {
270
- // Malformed arguments from the model — surface as empty object.
317
+ const repaired = repairToolArgs(toolCall.function.arguments);
318
+ if (repaired)
319
+ parsedInput = repaired;
271
320
  }
272
321
  const toolUseBlock = {
273
322
  type: 'tool_use',
@@ -338,12 +387,12 @@ export function normalizeFinishReason(reason) {
338
387
  * Prepend a system message when `systemPrompt` is provided, then append the
339
388
  * converted conversation messages.
340
389
  */
341
- export function buildOpenAIMessageList(messages, systemPrompt, replayOptions) {
390
+ export function buildOpenAIMessageList(messages, systemPrompt, outboundOptions) {
342
391
  const result = [];
343
392
  if (systemPrompt !== undefined && systemPrompt.length > 0) {
344
393
  result.push({ role: 'system', content: systemPrompt });
345
394
  }
346
- result.push(...toOpenAIMessages(messages, replayOptions));
395
+ result.push(...toOpenAIMessages(messages, outboundOptions));
347
396
  return result;
348
397
  }
349
398
  //# sourceMappingURL=openai-common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai-common.js","sourceRoot":"","sources":["../../src/llm/openai-common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai-common.js","sourceRoot":"","sources":["../../src/llm/openai-common.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@
30
30
  * ```
31
31
  */
32
32
  import type { ContentBlock, LLMAdapter, LLMChatOptions, LLMMessage, LLMResponse, LLMStreamOptions, LLMToolDef, StreamEvent } from '../types.js';
33
+ import type { ReasoningOutboundOptions } from './reasoning-fallback.js';
33
34
  /**
34
35
  * LLM adapter backed by the OpenAI Chat Completions API.
35
36
  *
@@ -39,9 +40,29 @@ export declare class OpenAIAdapter implements LLMAdapter {
39
40
  #private;
40
41
  readonly name: string;
41
42
  readonly capabilities: {
42
- echoesReasoning: "never";
43
+ readonly echoesReasoning: 'never' | 'own-issued' | 'tool-use-only';
43
44
  };
44
45
  constructor(apiKey?: string, baseURL?: string);
46
+ /**
47
+ * Build the per-call options forwarded to {@link buildOpenAIMessageList}.
48
+ *
49
+ * Composes two orthogonal mechanisms:
50
+ * 1. **`nativeReasoningEchoProvider`** — set when this adapter's
51
+ * capability is `'tool-use-only'` (DeepSeek). Triggers native
52
+ * `reasoning_content` echo on assistant messages whose reasoning
53
+ * blocks carry matching provenance AND the conversation contains
54
+ * `tool_use`. See PR #251 / DeepSeek V4 thinking-mode spec.
55
+ * 2. **`preserveReasoningAsText` / `compressReasoningText`** — opt-in
56
+ * `<thinking>` text fallback from the user's `AgentConfig`. Applies
57
+ * to foreign-provenance reasoning AND to all reasoning on `'never'`
58
+ * adapters. See #223 Phase 2.
59
+ *
60
+ * The two paths are mutually exclusive per block: native echo claims
61
+ * own-provenance blocks first; text fallback claims everything else.
62
+ * Subclasses inherit `chat()` / `stream()` and so automatically pick up
63
+ * both behaviours; no subclass override needed.
64
+ */
65
+ protected buildMessageOptions(options: LLMChatOptions): ReasoningOutboundOptions | undefined;
45
66
  /**
46
67
  * Send a synchronous (non-streaming) chat request and return the complete
47
68
  * {@link LLMResponse}.
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EAGZ,MAAM,aAAa,CAAA;AAepB;;;;GAIG;AACH,qBAAa,aAAc,YAAW,UAAU;;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAW;IAEhC,QAAQ,CAAC,YAAY;;MAKpB;gBAIW,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAW7C;;;;;;OAMG;IACG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAuCjF;;;;;;;;;OASG;IACI,MAAM,CACX,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,EAAE,gBAAgB,GACxB,aAAa,CAAC,WAAW,CAAC;CA6K9B;AAGD,YAAY,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,GACZ,CAAA"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AASH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,EAGZ,MAAM,aAAa,CAAA;AAWpB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAOvE;;;;GAIG;AACH,qBAAa,aAAc,YAAW,UAAU;;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAW;IAchC,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,OAAO,GAAG,YAAY,GAAG,eAAe,CAAA;KAAE,CAE5F;gBAIW,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAO7C;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,wBAAwB,GAAG,SAAS;IAe5F;;;;;;OAMG;IACG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAwCjF;;;;;;;;;OASG;IACI,MAAM,CACX,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,EAAE,gBAAgB,GACxB,aAAa,CAAC,WAAW,CAAC;CA+K9B;AAGD,YAAY,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,WAAW,GACZ,CAAA"}
@@ -30,7 +30,8 @@
30
30
  * ```
31
31
  */
32
32
  import OpenAI from 'openai';
33
- import { toOpenAITool, fromOpenAICompletion, normalizeFinishReason, buildOpenAIMessageList, getOpenAIReasoningText, } from './openai-common.js';
33
+ import { toOpenAITool, fromOpenAICompletion, normalizeFinishReason, buildOpenAIMessageList, getOpenAIReasoningText, repairToolArgs, } from './openai-common.js';
34
+ import { assertValidMessages } from './validate.js';
34
35
  import { extractToolCallsFromText } from '../tool/text-tool-extractor.js';
35
36
  // ---------------------------------------------------------------------------
36
37
  // Adapter implementation
@@ -42,10 +43,19 @@ import { extractToolCallsFromText } from '../tool/text-tool-extractor.js';
42
43
  */
43
44
  export class OpenAIAdapter {
44
45
  name = 'openai';
46
+ // The field type is intentionally widened to the full union (rather than
47
+ // narrowed to `'never'` via `as const`) so subclasses can override with a
48
+ // different value — DeepSeek currently uses `'tool-use-only'` for native
49
+ // `reasoning_content` echo on tool-use turns (per PR #251).
50
+ //
51
+ // OpenAI itself stays `'never'`: Chat Completions does not accept
52
+ // `reasoning_content` on input under any circumstance. When the user sets
53
+ // `AgentConfig.preserveReasoningAsText` (PR #260 / #223 Phase 2), the
54
+ // outbound conversion in `toOpenAIMessages` downgrades each reasoning
55
+ // block to inline `<thinking>` text via the shared helper in
56
+ // `reasoning-fallback.ts`. Without the opt-in, reasoning blocks are
57
+ // dropped silently on outbound.
45
58
  capabilities = {
46
- // OpenAI Chat Completions does not accept `reasoning_content` on input;
47
- // any reasoning replay must go through the `<thinking>` text fallback
48
- // already shipped in #234 (see openai-common.ts replay options).
49
59
  echoesReasoning: 'never',
50
60
  };
51
61
  #client;
@@ -55,6 +65,36 @@ export class OpenAIAdapter {
55
65
  baseURL,
56
66
  });
57
67
  }
68
+ /**
69
+ * Build the per-call options forwarded to {@link buildOpenAIMessageList}.
70
+ *
71
+ * Composes two orthogonal mechanisms:
72
+ * 1. **`nativeReasoningEchoProvider`** — set when this adapter's
73
+ * capability is `'tool-use-only'` (DeepSeek). Triggers native
74
+ * `reasoning_content` echo on assistant messages whose reasoning
75
+ * blocks carry matching provenance AND the conversation contains
76
+ * `tool_use`. See PR #251 / DeepSeek V4 thinking-mode spec.
77
+ * 2. **`preserveReasoningAsText` / `compressReasoningText`** — opt-in
78
+ * `<thinking>` text fallback from the user's `AgentConfig`. Applies
79
+ * to foreign-provenance reasoning AND to all reasoning on `'never'`
80
+ * adapters. See #223 Phase 2.
81
+ *
82
+ * The two paths are mutually exclusive per block: native echo claims
83
+ * own-provenance blocks first; text fallback claims everything else.
84
+ * Subclasses inherit `chat()` / `stream()` and so automatically pick up
85
+ * both behaviours; no subclass override needed.
86
+ */
87
+ buildMessageOptions(options) {
88
+ const wantsNativeEcho = this.capabilities.echoesReasoning === 'tool-use-only';
89
+ const wantsTextFallback = options.preserveReasoningAsText === true;
90
+ if (!wantsNativeEcho && !wantsTextFallback)
91
+ return undefined;
92
+ return {
93
+ preserveReasoningAsText: options.preserveReasoningAsText,
94
+ compressReasoningText: options.compressReasoningText,
95
+ nativeReasoningEchoProvider: wantsNativeEcho ? this.name : undefined,
96
+ };
97
+ }
58
98
  // -------------------------------------------------------------------------
59
99
  // chat()
60
100
  // -------------------------------------------------------------------------
@@ -66,7 +106,8 @@ export class OpenAIAdapter {
66
106
  * handle these (e.g. rate limits, context length exceeded).
67
107
  */
68
108
  async chat(messages, options) {
69
- const openAIMessages = buildOpenAIMessageList(messages, options.systemPrompt);
109
+ assertValidMessages(messages);
110
+ const openAIMessages = buildOpenAIMessageList(messages, options.systemPrompt, this.buildMessageOptions(options));
70
111
  const completion = await this.#client.chat.completions.create({
71
112
  // Sampling params first so extraBody can override them. Structural
72
113
  // fields (model/messages/tools/stream) come after extraBody so users
@@ -108,7 +149,8 @@ export class OpenAIAdapter {
108
149
  * - Exactly one terminal event: `done` or `error`
109
150
  */
110
151
  async *stream(messages, options) {
111
- const openAIMessages = buildOpenAIMessageList(messages, options.systemPrompt);
152
+ assertValidMessages(messages);
153
+ const openAIMessages = buildOpenAIMessageList(messages, options.systemPrompt, this.buildMessageOptions(options));
112
154
  // We request usage in the final chunk so we can include it in the `done` event.
113
155
  const streamResponse = await this.#client.chat.completions.create({
114
156
  // See chat() above for the rationale behind this field ordering.
@@ -204,7 +246,9 @@ export class OpenAIAdapter {
204
246
  }
205
247
  }
206
248
  catch {
207
- // Malformed JSON — surface as empty object.
249
+ const repaired = repairToolArgs(buf.argsJson);
250
+ if (repaired)
251
+ parsedInput = repaired;
208
252
  }
209
253
  const toolUseBlock = {
210
254
  type: 'tool_use',
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
@@ -19,34 +19,99 @@
19
19
  * produced from native API extraction (and always stamped with
20
20
  * `provenance`), never from text parsing.
21
21
  *
22
- * PHASE 1 STATUS:
23
- * This helper is exported but not yet wired into any adapter outbound
24
- * path. It is introduced ahead of behaviour wiring so the IR additions
25
- * (`ReasoningBlock.provenance`, `LLMAdapter.capabilities`) can land
26
- * independently and be reviewed in isolation. Phase 2 (#223) will:
27
- * - Add `AgentConfig.preserveReasoningAcrossProviders` opt-in.
28
- * - Wire each `echoesReasoning: 'never'` and `'own-issued'` adapter's
29
- * outbound path to call this helper when appropriate.
30
- * - Fold the OpenAI-family private helper added in #234 into this one
31
- * so there is a single source of truth.
22
+ * Wiring (post #223 Phase 2): every adapter outbound path consults
23
+ * {@link ReasoningOutboundOptions} resolved from
24
+ * {@link AgentConfig.preserveReasoningAsText} +
25
+ * {@link AgentConfig.compressReasoningText}. When opt-in is off, reasoning
26
+ * blocks that can't be native-echoed are dropped silently (preserving
27
+ * pre-Phase-2 behaviour). When opt-in is on, they pass through
28
+ * {@link reasoningBlockToInlineText} and become inline `<thinking>` text.
32
29
  */
33
30
  import type { ReasoningBlock } from '../types.js';
34
31
  /**
35
32
  * Default maximum character budget per `<thinking>` block after truncation.
36
33
  * Aligned with the value used by the OpenAI-family private replay helper
37
- * shipped in #234 (`openai-common.ts:31`) so Phase 2 consolidation is
38
- * behaviour-preserving.
34
+ * shipped in #234 so the Phase 2 consolidation is behaviour-preserving.
39
35
  */
40
36
  export declare const DEFAULT_REASONING_FALLBACK_MAX_CHARS = 1200;
37
+ /**
38
+ * Sentinel value the resolver returns when the caller explicitly disables
39
+ * truncation (`compressReasoningText: false`). Exported so the special-case
40
+ * branch in {@link resolveMaxChars} stays searchable — removing the branch
41
+ * would silently re-introduce truncation for users who opted out.
42
+ *
43
+ * Equal to `Number.POSITIVE_INFINITY`; the resolver maps it to
44
+ * `Number.MAX_SAFE_INTEGER` so `text.length <= maxChars` is always true.
45
+ */
46
+ export declare const NO_TRUNCATION: number;
41
47
  export interface ReasoningFallbackOptions {
42
48
  /**
43
49
  * Hard upper bound on the inner text length (the `<thinking>` wrapper
44
- * itself is not counted). Values below 1 are clamped to 1; non-finite
45
- * values are treated as 1. When omitted, defaults to
46
- * {@link DEFAULT_REASONING_FALLBACK_MAX_CHARS}.
50
+ * itself is not counted). Special values:
51
+ * - `undefined` defaults to {@link DEFAULT_REASONING_FALLBACK_MAX_CHARS}.
52
+ * - {@link NO_TRUNCATION} (`Number.POSITIVE_INFINITY`) → no truncation;
53
+ * the entire reasoning text passes through unchanged. This is the
54
+ * sentinel returned by {@link resolveReasoningOutboundMaxChars} when
55
+ * the caller sets `compressReasoningText: false`.
56
+ * - Any other non-finite value (`NaN`, `-Infinity`) → clamped to 1
57
+ * (defensive — these values are invalid input).
58
+ * - Finite values below 1 → clamped to 1.
59
+ * - Finite values ≥ 1 → used as-is (floored).
47
60
  */
48
61
  readonly maxChars?: number;
49
62
  }
63
+ /**
64
+ * Outbound-conversion options derived from {@link AgentConfig}'s reasoning
65
+ * fields. Threaded through every adapter's outbound IR-to-native conversion
66
+ * so each can opt the user into the cross-provider `<thinking>` text
67
+ * fallback (see #223). Internal to the LLM layer — adapters pick the values
68
+ * out of {@link LLMChatOptions} themselves.
69
+ */
70
+ export interface ReasoningOutboundOptions {
71
+ /** Mirrors {@link LLMChatOptions.preserveReasoningAsText}. */
72
+ readonly preserveReasoningAsText?: boolean;
73
+ /** Mirrors {@link LLMChatOptions.compressReasoningText}. */
74
+ readonly compressReasoningText?: boolean | {
75
+ readonly minChars?: number;
76
+ };
77
+ /**
78
+ * Adapter name to use for native `reasoning_content` echo on outbound
79
+ * assistant messages inside a tool-calling conversation. Wired by adapters
80
+ * whose {@link LLMAdapter.capabilities.echoesReasoning} is `'tool-use-only'`
81
+ * (currently DeepSeek V4 thinking-mode — see PR #251 / DeepSeek API spec).
82
+ *
83
+ * When set, each assistant message is scanned for {@link ReasoningBlock}s
84
+ * whose {@link ReasoningBlock.provenance} matches this value. The collected
85
+ * reasoning is attached as a `reasoning_content` field on the outbound
86
+ * payload (a non-standard OpenAI-compat field) IF AND ONLY IF the overall
87
+ * conversation contains at least one `tool_use` block somewhere in its
88
+ * history. Non-tool conversations skip the attachment entirely.
89
+ *
90
+ * Foreign-provenance blocks fall through to the {@link preserveReasoningAsText}
91
+ * `<thinking>` text path when that flag is on, so the two mechanisms
92
+ * compose: native echo for own-provenance + tool-use; text fallback for
93
+ * everything else.
94
+ *
95
+ * Adapters that don't need this leave it unset (default `'never'` and
96
+ * `'own-issued'` capability paths).
97
+ */
98
+ readonly nativeReasoningEchoProvider?: string;
99
+ }
100
+ /**
101
+ * Resolve {@link ReasoningOutboundOptions} to the `maxChars` value accepted
102
+ * by {@link reasoningBlockToInlineText}. Encodes the
103
+ * default-on-when-preserve-on semantics documented in #223:
104
+ *
105
+ * - `preserve=false` → returns `undefined` (fallback never runs;
106
+ * callers must check `preserve` themselves)
107
+ * - `compress=undefined`/`true`→ returns `undefined` so the helper applies
108
+ * its own default head+tail budget
109
+ * - `compress=false` → returns {@link NO_TRUNCATION}; the helper
110
+ * treats this as a no-op cap (full text)
111
+ * - `compress={minChars: N}` → `N` (the threshold value also serves as
112
+ * the truncation cap)
113
+ */
114
+ export declare function resolveReasoningOutboundMaxChars(options: ReasoningOutboundOptions | undefined): number | undefined;
50
115
  /**
51
116
  * Convert a {@link ReasoningBlock} into its `<thinking>...</thinking>` text
52
117
  * representation for outbound replay through adapters that cannot natively
@@ -1 +1 @@
1
- {"version":3,"file":"reasoning-fallback.d.ts","sourceRoot":"","sources":["../../src/llm/reasoning-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,OAAO,CAAA;AAQxD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,wBAAwB,GACjC,MAAM,CAOR"}
1
+ {"version":3,"file":"reasoning-fallback.d.ts","sourceRoot":"","sources":["../../src/llm/reasoning-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,OAAO,CAAA;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAA2B,CAAA;AAQrD,MAAM,WAAW,wBAAwB;IACvC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAA;CAC9C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,wBAAwB,GAAG,SAAS,GAC5C,MAAM,GAAG,SAAS,CAQpB;AA0BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,OAAO,CAAC,EAAE,wBAAwB,GACjC,MAAM,CAOR"}
@@ -19,31 +19,64 @@
19
19
  * produced from native API extraction (and always stamped with
20
20
  * `provenance`), never from text parsing.
21
21
  *
22
- * PHASE 1 STATUS:
23
- * This helper is exported but not yet wired into any adapter outbound
24
- * path. It is introduced ahead of behaviour wiring so the IR additions
25
- * (`ReasoningBlock.provenance`, `LLMAdapter.capabilities`) can land
26
- * independently and be reviewed in isolation. Phase 2 (#223) will:
27
- * - Add `AgentConfig.preserveReasoningAcrossProviders` opt-in.
28
- * - Wire each `echoesReasoning: 'never'` and `'own-issued'` adapter's
29
- * outbound path to call this helper when appropriate.
30
- * - Fold the OpenAI-family private helper added in #234 into this one
31
- * so there is a single source of truth.
22
+ * Wiring (post #223 Phase 2): every adapter outbound path consults
23
+ * {@link ReasoningOutboundOptions} resolved from
24
+ * {@link AgentConfig.preserveReasoningAsText} +
25
+ * {@link AgentConfig.compressReasoningText}. When opt-in is off, reasoning
26
+ * blocks that can't be native-echoed are dropped silently (preserving
27
+ * pre-Phase-2 behaviour). When opt-in is on, they pass through
28
+ * {@link reasoningBlockToInlineText} and become inline `<thinking>` text.
32
29
  */
33
30
  /**
34
31
  * Default maximum character budget per `<thinking>` block after truncation.
35
32
  * Aligned with the value used by the OpenAI-family private replay helper
36
- * shipped in #234 (`openai-common.ts:31`) so Phase 2 consolidation is
37
- * behaviour-preserving.
33
+ * shipped in #234 so the Phase 2 consolidation is behaviour-preserving.
38
34
  */
39
35
  export const DEFAULT_REASONING_FALLBACK_MAX_CHARS = 1200;
36
+ /**
37
+ * Sentinel value the resolver returns when the caller explicitly disables
38
+ * truncation (`compressReasoningText: false`). Exported so the special-case
39
+ * branch in {@link resolveMaxChars} stays searchable — removing the branch
40
+ * would silently re-introduce truncation for users who opted out.
41
+ *
42
+ * Equal to `Number.POSITIVE_INFINITY`; the resolver maps it to
43
+ * `Number.MAX_SAFE_INTEGER` so `text.length <= maxChars` is always true.
44
+ */
45
+ export const NO_TRUNCATION = Number.POSITIVE_INFINITY;
40
46
  /** Marker inserted between head and tail when reasoning text is truncated. */
41
47
  const TRUNCATION_MARKER = '...[truncated]...';
42
48
  /** Placeholder emitted in place of opaque encrypted (redacted) reasoning. */
43
49
  const REDACTED_PLACEHOLDER = '<thinking>[redacted]</thinking>';
50
+ /**
51
+ * Resolve {@link ReasoningOutboundOptions} to the `maxChars` value accepted
52
+ * by {@link reasoningBlockToInlineText}. Encodes the
53
+ * default-on-when-preserve-on semantics documented in #223:
54
+ *
55
+ * - `preserve=false` → returns `undefined` (fallback never runs;
56
+ * callers must check `preserve` themselves)
57
+ * - `compress=undefined`/`true`→ returns `undefined` so the helper applies
58
+ * its own default head+tail budget
59
+ * - `compress=false` → returns {@link NO_TRUNCATION}; the helper
60
+ * treats this as a no-op cap (full text)
61
+ * - `compress={minChars: N}` → `N` (the threshold value also serves as
62
+ * the truncation cap)
63
+ */
64
+ export function resolveReasoningOutboundMaxChars(options) {
65
+ if (options?.preserveReasoningAsText !== true)
66
+ return undefined;
67
+ const compress = options.compressReasoningText;
68
+ if (compress === false)
69
+ return NO_TRUNCATION;
70
+ if (compress === undefined || compress === true) {
71
+ return undefined; // helper applies its own default when maxChars omitted
72
+ }
73
+ return compress.minChars; // undefined → helper default, number → that cap
74
+ }
44
75
  function resolveMaxChars(value) {
45
76
  if (value === undefined)
46
77
  return DEFAULT_REASONING_FALLBACK_MAX_CHARS;
78
+ if (value === NO_TRUNCATION)
79
+ return Number.MAX_SAFE_INTEGER;
47
80
  if (!Number.isFinite(value))
48
81
  return 1;
49
82
  const floored = Math.floor(value);