dominds 1.22.0 → 1.22.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 (125) hide show
  1. package/dist/dialog-instance-registry.js +3 -4
  2. package/dist/dialog.d.ts +2 -2
  3. package/dist/dialog.js +3 -3
  4. package/dist/docs/diligence-push.md +19 -12
  5. package/dist/docs/diligence-push.zh.md +11 -9
  6. package/dist/docs/dominds-terminology.md +3 -3
  7. package/dist/docs/llm-provider-isolation.md +1 -1
  8. package/dist/docs/llm-provider-isolation.zh.md +1 -1
  9. package/dist/docs/team_mgmt-toolset.md +1 -1
  10. package/dist/docs/team_mgmt-toolset.zh.md +1 -1
  11. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +11 -10
  12. package/dist/llm/api-quirks.d.ts +0 -2
  13. package/dist/llm/api-quirks.js +1 -3
  14. package/dist/llm/client.d.ts +1 -0
  15. package/dist/llm/defaults.yaml +2 -6
  16. package/dist/llm/gen/anthropic.d.ts +0 -6
  17. package/dist/llm/gen/anthropic.js +21 -468
  18. package/dist/llm/gen/openai-compatible.d.ts +11 -1
  19. package/dist/llm/gen/openai-compatible.js +188 -8
  20. package/dist/llm/gen.d.ts +4 -2
  21. package/dist/llm/kernel-driver/drive.js +164 -114
  22. package/dist/llm/kernel-driver/runtime.js +36 -11
  23. package/dist/llm/kernel-driver/tellask-special.js +12 -9
  24. package/dist/persistence.d.ts +2 -3
  25. package/dist/persistence.js +53 -76
  26. package/dist/problems.js +2 -1
  27. package/dist/server/websocket-handler.js +17 -3
  28. package/dist/tools/team_mgmt-manual.js +4 -4
  29. package/dist/tools/team_mgmt.js +13 -3
  30. package/package.json +3 -3
  31. package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js → _basePickBy-DUbW5G8a.js} +3 -3
  32. package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js.map → _basePickBy-DUbW5G8a.js.map} +1 -1
  33. package/webapp/dist/assets/{_baseUniq-CHLBB955.js → _baseUniq-vou1IeXB.js} +2 -2
  34. package/webapp/dist/assets/{_baseUniq-CHLBB955.js.map → _baseUniq-vou1IeXB.js.map} +1 -1
  35. package/webapp/dist/assets/{arc-DQXtgZdO.js → arc-D_O9oO0B.js} +2 -2
  36. package/webapp/dist/assets/{arc-DQXtgZdO.js.map → arc-D_O9oO0B.js.map} +1 -1
  37. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js → architectureDiagram-2XIMDMQ5-B7k9SWSL.js} +7 -7
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js.map → architectureDiagram-2XIMDMQ5-B7k9SWSL.js.map} +1 -1
  39. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js → blockDiagram-WCTKOSBZ-e3xTmffi.js} +7 -7
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js.map → blockDiagram-WCTKOSBZ-e3xTmffi.js.map} +1 -1
  41. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js → c4Diagram-IC4MRINW-DVvi-N2o.js} +3 -3
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js.map → c4Diagram-IC4MRINW-DVvi-N2o.js.map} +1 -1
  43. package/webapp/dist/assets/{channel-Bvke0iMP.js → channel-CH387UD2.js} +2 -2
  44. package/webapp/dist/assets/{channel-Bvke0iMP.js.map → channel-CH387UD2.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js → chunk-4BX2VUAB-BOo0Xj3m.js} +2 -2
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js.map → chunk-4BX2VUAB-BOo0Xj3m.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js → chunk-55IACEB6-CI4uRAx_.js} +2 -2
  48. package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js.map → chunk-55IACEB6-CI4uRAx_.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js → chunk-FMBD7UC4-C4N1ovxD.js} +2 -2
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js.map → chunk-FMBD7UC4-C4N1ovxD.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js → chunk-JSJVCQXG-5U4Hu7pC.js} +2 -2
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js.map → chunk-JSJVCQXG-5U4Hu7pC.js.map} +1 -1
  53. package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js → chunk-KX2RTZJC-BXPDNuct.js} +2 -2
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js.map → chunk-KX2RTZJC-BXPDNuct.js.map} +1 -1
  55. package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js → chunk-NQ4KR5QH-oVsExnnn.js} +4 -4
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js.map → chunk-NQ4KR5QH-oVsExnnn.js.map} +1 -1
  57. package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js → chunk-QZHKN3VN-C6FzEv2C.js} +2 -2
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js.map → chunk-QZHKN3VN-C6FzEv2C.js.map} +1 -1
  59. package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js → chunk-WL4C6EOR-Ir7e_B7t.js} +6 -6
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js.map → chunk-WL4C6EOR-Ir7e_B7t.js.map} +1 -1
  61. package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js → classDiagram-VBA2DB6C-CPYs_LAr.js} +7 -7
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js.map → classDiagram-VBA2DB6C-CPYs_LAr.js.map} +1 -1
  63. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js → classDiagram-v2-RAHNMMFH-CPYs_LAr.js} +7 -7
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js.map → classDiagram-v2-RAHNMMFH-CPYs_LAr.js.map} +1 -1
  65. package/webapp/dist/assets/{clone-DPC4Vt09.js → clone-CToca8rS.js} +2 -2
  66. package/webapp/dist/assets/{clone-DPC4Vt09.js.map → clone-CToca8rS.js.map} +1 -1
  67. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js → cose-bilkent-S5V4N54A-DLNtqY7a.js} +2 -2
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js.map → cose-bilkent-S5V4N54A-DLNtqY7a.js.map} +1 -1
  69. package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js → dagre-KLK3FWXG-Bkt-O9uW.js} +7 -7
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js.map → dagre-KLK3FWXG-Bkt-O9uW.js.map} +1 -1
  71. package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js → diagram-E7M64L7V-B4JR_u4V.js} +8 -8
  72. package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js.map → diagram-E7M64L7V-B4JR_u4V.js.map} +1 -1
  73. package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js → diagram-IFDJBPK2-D9zRh8b7.js} +7 -7
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js.map → diagram-IFDJBPK2-D9zRh8b7.js.map} +1 -1
  75. package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js → diagram-P4PSJMXO-CAaXVWnX.js} +7 -7
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js.map → diagram-P4PSJMXO-CAaXVWnX.js.map} +1 -1
  77. package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js → erDiagram-INFDFZHY-DDeoaSkJ.js} +5 -5
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js.map → erDiagram-INFDFZHY-DDeoaSkJ.js.map} +1 -1
  79. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js → flowDiagram-PKNHOUZH-DEYqzSEJ.js} +7 -7
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js.map → flowDiagram-PKNHOUZH-DEYqzSEJ.js.map} +1 -1
  81. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js → ganttDiagram-A5KZAMGK-BuLOSh0d.js} +3 -3
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js.map → ganttDiagram-A5KZAMGK-BuLOSh0d.js.map} +1 -1
  83. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js → gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js} +8 -8
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js.map → gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js.map} +1 -1
  85. package/webapp/dist/assets/{graph-D4Uth-MK.js → graph-fX6cvjwR.js} +3 -3
  86. package/webapp/dist/assets/{graph-D4Uth-MK.js.map → graph-fX6cvjwR.js.map} +1 -1
  87. package/webapp/dist/assets/{index-YBIJr7jH.js → index-B3WzTLcD.js} +67 -40
  88. package/webapp/dist/assets/{index-YBIJr7jH.js.map → index-B3WzTLcD.js.map} +1 -1
  89. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js → infoDiagram-LFFYTUFH-Ci3XYvve.js} +6 -6
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js.map → infoDiagram-LFFYTUFH-Ci3XYvve.js.map} +1 -1
  91. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js → ishikawaDiagram-PHBUUO56-DOH5ua9R.js} +2 -2
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js.map → ishikawaDiagram-PHBUUO56-DOH5ua9R.js.map} +1 -1
  93. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js → journeyDiagram-4ABVD52K-DM_fiZlj.js} +5 -5
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js.map → journeyDiagram-4ABVD52K-DM_fiZlj.js.map} +1 -1
  95. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js → kanban-definition-K7BYSVSG-CSh2hqc2.js} +3 -3
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js.map → kanban-definition-K7BYSVSG-CSh2hqc2.js.map} +1 -1
  97. package/webapp/dist/assets/{layout-BuLicmwh.js → layout-yZEK1LgL.js} +5 -5
  98. package/webapp/dist/assets/{layout-BuLicmwh.js.map → layout-yZEK1LgL.js.map} +1 -1
  99. package/webapp/dist/assets/{linear-DIPh96mp.js → linear-m76SmdtZ.js} +2 -2
  100. package/webapp/dist/assets/{linear-DIPh96mp.js.map → linear-m76SmdtZ.js.map} +1 -1
  101. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js → mindmap-definition-YRQLILUH-NiwP-SLH.js} +4 -4
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js.map → mindmap-definition-YRQLILUH-NiwP-SLH.js.map} +1 -1
  103. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js → pieDiagram-SKSYHLDU-CSCapDSD.js} +8 -8
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js.map → pieDiagram-SKSYHLDU-CSCapDSD.js.map} +1 -1
  105. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js → quadrantDiagram-337W2JSQ-CbDGQH91.js} +3 -3
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js.map → quadrantDiagram-337W2JSQ-CbDGQH91.js.map} +1 -1
  107. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js → requirementDiagram-Z7DCOOCP-CeG2yodp.js} +4 -4
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js.map → requirementDiagram-Z7DCOOCP-CeG2yodp.js.map} +1 -1
  109. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js → sankeyDiagram-WA2Y5GQK-B_l8tKqa.js} +2 -2
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js.map → sankeyDiagram-WA2Y5GQK-B_l8tKqa.js.map} +1 -1
  111. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js → sequenceDiagram-2WXFIKYE-Dc5gBIi5.js} +4 -4
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js.map → sequenceDiagram-2WXFIKYE-Dc5gBIi5.js.map} +1 -1
  113. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js → stateDiagram-RAJIS63D-DMYeNS1r.js} +9 -9
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js.map → stateDiagram-RAJIS63D-DMYeNS1r.js.map} +1 -1
  115. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js → stateDiagram-v2-FVOUBMTO-MfUJuUEe.js} +5 -5
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js.map → stateDiagram-v2-FVOUBMTO-MfUJuUEe.js.map} +1 -1
  117. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js → timeline-definition-YZTLITO2-Ci2CZEky.js} +3 -3
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js.map → timeline-definition-YZTLITO2-Ci2CZEky.js.map} +1 -1
  119. package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js → treemap-KZPCXAKY-CNgzp4sT.js} +5 -5
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js.map → treemap-KZPCXAKY-CNgzp4sT.js.map} +1 -1
  121. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js → vennDiagram-LZ73GAT5-BYxtNx2s.js} +2 -2
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js.map → vennDiagram-LZ73GAT5-BYxtNx2s.js.map} +1 -1
  123. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js → xychartDiagram-JWTSCODW-BUS3bn9p.js} +3 -3
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js.map → xychartDiagram-JWTSCODW-BUS3bn9p.js.map} +1 -1
  125. package/webapp/dist/index.html +1 -1
@@ -9,7 +9,6 @@ exports.consumeAnthropicStream = consumeAnthropicStream;
9
9
  exports.reconstructAnthropicContextWrapper = reconstructAnthropicContextWrapper;
10
10
  exports.reconstructAnthropicContextWrapperAsync = reconstructAnthropicContextWrapperAsync;
11
11
  const sdk_1 = require("@anthropic-ai/sdk");
12
- const crypto_1 = require("crypto");
13
12
  const events_1 = require("events");
14
13
  const fs_1 = require("fs");
15
14
  const promises_1 = __importDefault(require("fs/promises"));
@@ -17,7 +16,6 @@ const path_1 = __importDefault(require("path"));
17
16
  const log_1 = require("../../log");
18
17
  const i18n_text_1 = require("../../runtime/i18n-text");
19
18
  const work_language_1 = require("../../runtime/work-language");
20
- const api_quirks_1 = require("../api-quirks");
21
19
  const artifacts_1 = require("./artifacts");
22
20
  const failure_classifier_1 = require("./failure-classifier");
23
21
  const tool_call_context_1 = require("./tool-call-context");
@@ -28,13 +26,6 @@ const ANTHROPIC_JSON_RESPONSE_TOOL_NAME = 'dominds_json_response';
28
26
  const ANTHROPIC_JSON_RESPONSE_TOOL_DESCRIPTION = 'Return the final answer as a JSON object. Do not include any non-JSON text.';
29
27
  const ANTHROPIC_COMPAT_CAPTURE_SSE_ENV = 'DOMINDS_ANTHROPIC_COMPAT_CAPTURE_SSE';
30
28
  const ANTHROPIC_COMPAT_CAPTURE_DIR_ENV = 'DOMINDS_ANTHROPIC_COMPAT_CAPTURE_DIR';
31
- const VOLCANO_TEXT_TOOL_USE_PATTERN = new RegExp(String.raw `(?:Function call emitted by the assistant\.\r?\n|^|\r?\n)` +
32
- String.raw `Tool name:\s*([A-Za-z_][A-Za-z0-9_.:-]*)\r?\n` +
33
- String.raw `Call ID:\s*(call_[A-Za-z0-9_-]+)\r?\n` +
34
- String.raw `Raw arguments, verbatim:\r?\n` +
35
- String.raw `<raw_arguments>(?:\r?\n)?([\s\S]*?)(?:\r?\n)?</raw_arguments>`, 'g');
36
- const VOLCANO_SEED_TOOL_CALL_PATTERN = /<seed:tool_call>\s*<function\s+name="([A-Za-z_][A-Za-z0-9_.:-]*)">\s*([\s\S]*?)<\/function>\s*<\/seed:tool_call>/g;
37
- const VOLCANO_SEED_TOOL_PARAMETER_PATTERN = /<parameter\s+name="([^"]+)"\s+string="(true|false)">([\s\S]*?)<\/parameter>/g;
38
29
  const ANTHROPIC_JSON_RESPONSE_TOOL_INPUT_SCHEMA = {
39
30
  type: 'object',
40
31
  additionalProperties: true,
@@ -463,13 +454,6 @@ function createAnthropicClient(args) {
463
454
  }
464
455
  return new sdk_1.Anthropic(options);
465
456
  }
466
- function resolveAnthropicStreamConsumeQuirks(providerConfig) {
467
- const apiQuirks = (0, api_quirks_1.normalizeProviderApiQuirks)(providerConfig);
468
- return {
469
- normalizeLoneClosingBraceEmptyToolInputDelta: apiQuirks.has(api_quirks_1.GLM_VIA_VOLCANO_API_QUIRK),
470
- convertVolcanoTextToolUseBlocks: apiQuirks.has(api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK),
471
- };
472
- }
473
457
  function buildAnthropicCompatibleMessagesUrl(providerConfig) {
474
458
  if (!providerConfig.baseUrl) {
475
459
  throw new Error(`Provider '${providerConfig.name}' is missing baseUrl.`);
@@ -1295,24 +1279,11 @@ function stringifyToolUseInitialInput(input) {
1295
1279
  const stringified = JSON.stringify(input);
1296
1280
  return typeof stringified === 'string' && stringified.length > 0 ? stringified : '{}';
1297
1281
  }
1298
- function isEmptyJsonObject(value) {
1299
- return isNonArrayRecord(value) && Object.keys(value).length === 0;
1300
- }
1301
- function resolveToolUseArgumentsJson(state, quirks) {
1282
+ function resolveToolUseArgumentsJson(state) {
1302
1283
  const trimmed = state.inputJson.trim();
1303
1284
  if (trimmed.length === 0) {
1304
1285
  return stringifyToolUseInitialInput(state.initialInput);
1305
1286
  }
1306
- if (quirks.normalizeLoneClosingBraceEmptyToolInputDelta &&
1307
- trimmed === '}' &&
1308
- isEmptyJsonObject(state.initialInput)) {
1309
- log.warn('ANTH quirk normalized lone closing-brace tool input delta to empty object', undefined, {
1310
- quirk: api_quirks_1.GLM_VIA_VOLCANO_API_QUIRK,
1311
- callId: state.id,
1312
- toolName: state.name,
1313
- });
1314
- return '{}';
1315
- }
1316
1287
  try {
1317
1288
  JSON.parse(trimmed);
1318
1289
  return state.inputJson;
@@ -1328,60 +1299,6 @@ function resolveToolUseArgumentsJson(state, quirks) {
1328
1299
  return state.inputJson;
1329
1300
  }
1330
1301
  }
1331
- function createVolcanoToolCallIdRegistry(knownFunctionCallIds) {
1332
- return {
1333
- used: new Set(knownFunctionCallIds ?? []),
1334
- nextSuffixByCallId: new Map(),
1335
- };
1336
- }
1337
- function decodeVolcanoSeedXmlText(text) {
1338
- return text
1339
- .replace(/&quot;/g, '"')
1340
- .replace(/&apos;/g, "'")
1341
- .replace(/&lt;/g, '<')
1342
- .replace(/&gt;/g, '>')
1343
- .replace(/&amp;/g, '&');
1344
- }
1345
- function createVolcanoSeedToolCallId(args) {
1346
- const hash = (0, crypto_1.createHash)('sha256')
1347
- .update(args.name)
1348
- .update('\0')
1349
- .update(args.rawParametersText)
1350
- .update('\0')
1351
- .update(String(args.textIndex))
1352
- .update('\0')
1353
- .update(args.blockIndex === undefined ? '' : String(args.blockIndex))
1354
- .digest('hex')
1355
- .slice(0, 24);
1356
- if (args.genseq !== undefined) {
1357
- return `call_volcano_seed_g${String(args.genseq)}_${hash}`;
1358
- }
1359
- return `call_volcano_seed_${hash}`;
1360
- }
1361
- function uniquifyVolcanoTextToolCallId(args) {
1362
- const trimmed = args.callId.trim();
1363
- if (trimmed.length === 0 || args.idRegistry === undefined)
1364
- return args.callId;
1365
- if (!args.idRegistry.used.has(trimmed)) {
1366
- args.idRegistry.used.add(trimmed);
1367
- return trimmed;
1368
- }
1369
- for (;;) {
1370
- const nextSuffix = (args.idRegistry.nextSuffixByCallId.get(trimmed) ?? 0) + 1;
1371
- args.idRegistry.nextSuffixByCallId.set(trimmed, nextSuffix);
1372
- const candidate = `${trimmed}_v${String(nextSuffix)}`;
1373
- if (args.idRegistry.used.has(candidate))
1374
- continue;
1375
- args.idRegistry.used.add(candidate);
1376
- log.warn('ANTH volcano-tool-use quirk rewrote duplicate function call id', undefined, {
1377
- quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
1378
- originalCallId: trimmed,
1379
- callId: candidate,
1380
- toolName: args.toolName,
1381
- });
1382
- return candidate;
1383
- }
1384
- }
1385
1302
  function assertValidAnthropicStreamGenseq(genseq) {
1386
1303
  if (genseq === undefined)
1387
1304
  return;
@@ -1389,259 +1306,6 @@ function assertValidAnthropicStreamGenseq(genseq) {
1389
1306
  throw new Error(`Invalid Anthropic stream genseq for tool-call correlation: ${String(genseq)}`);
1390
1307
  }
1391
1308
  }
1392
- function parseVolcanoSeedParameterValue(args) {
1393
- const decoded = decodeVolcanoSeedXmlText(args.rawValueText);
1394
- if (args.stringFlag === 'true')
1395
- return decoded;
1396
- try {
1397
- return JSON.parse(decoded);
1398
- }
1399
- catch (error) {
1400
- const message = error instanceof Error ? error.message : String(error);
1401
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameter JSON for ${args.name}: ${message}`);
1402
- }
1403
- }
1404
- function parseVolcanoSeedToolArgumentsJson(rawParametersText) {
1405
- const parameters = {};
1406
- let cursor = 0;
1407
- VOLCANO_SEED_TOOL_PARAMETER_PATTERN.lastIndex = 0;
1408
- for (;;) {
1409
- const match = VOLCANO_SEED_TOOL_PARAMETER_PATTERN.exec(rawParametersText);
1410
- if (!match)
1411
- break;
1412
- if (rawParametersText.slice(cursor, match.index).trim().length > 0) {
1413
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: unexpected text between parameters`);
1414
- }
1415
- const rawName = match[1];
1416
- const stringFlag = match[2];
1417
- const rawValueText = match[3];
1418
- if (rawName === undefined || stringFlag === undefined || rawValueText === undefined) {
1419
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameter`);
1420
- }
1421
- if (stringFlag !== 'true' && stringFlag !== 'false') {
1422
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call string flag`);
1423
- }
1424
- const name = decodeVolcanoSeedXmlText(rawName);
1425
- if (Object.prototype.hasOwnProperty.call(parameters, name)) {
1426
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: duplicate parameter ${name}`);
1427
- }
1428
- parameters[name] = parseVolcanoSeedParameterValue({
1429
- name,
1430
- stringFlag,
1431
- rawValueText,
1432
- });
1433
- cursor = VOLCANO_SEED_TOOL_PARAMETER_PATTERN.lastIndex;
1434
- }
1435
- if (cursor === 0 && rawParametersText.trim().length > 0) {
1436
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call parameters`);
1437
- }
1438
- if (rawParametersText.slice(cursor).trim().length > 0) {
1439
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} seed tool_call: unexpected trailing parameter text`);
1440
- }
1441
- return JSON.stringify(parameters);
1442
- }
1443
- function splitVolcanoTextToolUseParts(args) {
1444
- const parts = [];
1445
- const matches = [];
1446
- VOLCANO_TEXT_TOOL_USE_PATTERN.lastIndex = 0;
1447
- for (;;) {
1448
- const match = VOLCANO_TEXT_TOOL_USE_PATTERN.exec(args.text);
1449
- if (!match)
1450
- break;
1451
- const name = match[1];
1452
- const id = match[2];
1453
- const rawArguments = match[3];
1454
- if (name === undefined || id === undefined || rawArguments === undefined) {
1455
- continue;
1456
- }
1457
- matches.push({
1458
- index: match.index,
1459
- endIndex: VOLCANO_TEXT_TOOL_USE_PATTERN.lastIndex,
1460
- id,
1461
- name,
1462
- rawArgumentsText: rawArguments,
1463
- });
1464
- }
1465
- VOLCANO_SEED_TOOL_CALL_PATTERN.lastIndex = 0;
1466
- for (;;) {
1467
- const match = VOLCANO_SEED_TOOL_CALL_PATTERN.exec(args.text);
1468
- if (!match)
1469
- break;
1470
- const name = match[1];
1471
- const rawParametersText = match[2];
1472
- if (name === undefined || rawParametersText === undefined) {
1473
- continue;
1474
- }
1475
- matches.push({
1476
- index: match.index,
1477
- endIndex: VOLCANO_SEED_TOOL_CALL_PATTERN.lastIndex,
1478
- id: createVolcanoSeedToolCallId({
1479
- name,
1480
- rawParametersText,
1481
- textIndex: match.index,
1482
- blockIndex: args.blockIndex,
1483
- genseq: args.genseq,
1484
- }),
1485
- name,
1486
- rawArgumentsText: parseVolcanoSeedToolArgumentsJson(rawParametersText),
1487
- });
1488
- }
1489
- matches.sort((a, b) => a.index - b.index);
1490
- let cursor = 0;
1491
- for (const match of matches) {
1492
- if (match.index < cursor) {
1493
- throw new Error(`Malformed ${api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK} text tool_call: overlapping blocks`);
1494
- }
1495
- if (match.index > cursor) {
1496
- parts.push({ kind: 'text', text: args.text.slice(cursor, match.index) });
1497
- }
1498
- parts.push({
1499
- kind: 'tool_use',
1500
- id: uniquifyVolcanoTextToolCallId({
1501
- callId: match.id,
1502
- toolName: match.name,
1503
- idRegistry: args.idRegistry,
1504
- }),
1505
- name: match.name,
1506
- rawArgumentsText: match.rawArgumentsText,
1507
- });
1508
- cursor = match.endIndex;
1509
- }
1510
- if (cursor === 0)
1511
- return [{ kind: 'text', text: args.text }];
1512
- if (cursor < args.text.length) {
1513
- parts.push({ kind: 'text', text: args.text.slice(cursor) });
1514
- }
1515
- return parts;
1516
- }
1517
- async function emitTextWithVolcanoToolUseQuirk(args) {
1518
- let sayingStarted = args.sayingStarted;
1519
- let thinkingStarted = args.thinkingStarted;
1520
- const parts = args.quirks.convertVolcanoTextToolUseBlocks
1521
- ? splitVolcanoTextToolUseParts({
1522
- text: args.text,
1523
- genseq: args.genseq,
1524
- blockIndex: args.blockIndex,
1525
- idRegistry: args.idRegistry,
1526
- })
1527
- : [{ kind: 'text', text: args.text }];
1528
- for (const part of parts) {
1529
- if (part.kind === 'text') {
1530
- if (part.text.length === 0)
1531
- continue;
1532
- if (thinkingStarted) {
1533
- log.error('ANTH stream ordering violation: received text_delta while thinking stream still active', new Error('anthropic_stream_order_violation'));
1534
- await args.receiver.thinkingFinish();
1535
- thinkingStarted = false;
1536
- }
1537
- if (!sayingStarted) {
1538
- sayingStarted = true;
1539
- await args.receiver.sayingStart();
1540
- }
1541
- await args.receiver.sayingChunk(part.text);
1542
- continue;
1543
- }
1544
- if (sayingStarted) {
1545
- await args.receiver.sayingFinish();
1546
- sayingStarted = false;
1547
- }
1548
- log.warn('ANTH quirk converted text-rendered tool use to function call', undefined, {
1549
- quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
1550
- callId: part.id,
1551
- toolName: part.name,
1552
- });
1553
- await args.receiver.funcCall(part.id, part.name, part.rawArgumentsText);
1554
- }
1555
- return { sayingStarted, thinkingStarted };
1556
- }
1557
- async function emitThinkingWithVolcanoToolUseQuirk(args) {
1558
- let sayingStarted = args.sayingStarted;
1559
- let thinkingStarted = args.thinkingStarted;
1560
- const parts = args.quirks.convertVolcanoTextToolUseBlocks
1561
- ? splitVolcanoTextToolUseParts({
1562
- text: args.text,
1563
- genseq: args.genseq,
1564
- blockIndex: args.blockIndex,
1565
- idRegistry: args.idRegistry,
1566
- })
1567
- : [{ kind: 'text', text: args.text }];
1568
- for (const part of parts) {
1569
- if (part.kind === 'text') {
1570
- if (part.text.length === 0)
1571
- continue;
1572
- if (sayingStarted) {
1573
- log.error('ANTH stream ordering violation: received thinking_delta while saying stream still active', new Error('anthropic_stream_order_violation'));
1574
- await args.receiver.sayingFinish();
1575
- sayingStarted = false;
1576
- }
1577
- if (!thinkingStarted) {
1578
- thinkingStarted = true;
1579
- await args.receiver.thinkingStart();
1580
- }
1581
- await args.receiver.thinkingChunk(part.text);
1582
- continue;
1583
- }
1584
- if (thinkingStarted) {
1585
- await args.receiver.thinkingFinish();
1586
- thinkingStarted = false;
1587
- }
1588
- log.warn('ANTH quirk converted thinking-rendered tool use to function call', undefined, {
1589
- quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
1590
- callId: part.id,
1591
- toolName: part.name,
1592
- });
1593
- await args.receiver.funcCall(part.id, part.name, part.rawArgumentsText);
1594
- }
1595
- return { sayingStarted, thinkingStarted };
1596
- }
1597
- async function flushPendingVolcanoToolUseBlocks(args) {
1598
- let sayingStarted = args.sayingStarted;
1599
- let thinkingStarted = args.thinkingStarted;
1600
- const blockIndexes = new Set([...args.textBlocks.keys(), ...args.thinkingBlocks.keys()]);
1601
- for (const blockIndex of [...blockIndexes].sort((a, b) => a - b)) {
1602
- const pendingText = args.textBlocks.get(blockIndex);
1603
- const pendingThinking = args.thinkingBlocks.get(blockIndex);
1604
- if (pendingText !== undefined && pendingThinking !== undefined) {
1605
- throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has both pending text and thinking`);
1606
- }
1607
- if (pendingText === undefined && pendingThinking === undefined) {
1608
- throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has no pending text or thinking`);
1609
- }
1610
- let updated;
1611
- if (pendingText !== undefined) {
1612
- updated = await emitTextWithVolcanoToolUseQuirk({
1613
- text: pendingText,
1614
- receiver: args.receiver,
1615
- quirks: args.quirks,
1616
- sayingStarted,
1617
- thinkingStarted,
1618
- genseq: args.genseq,
1619
- blockIndex,
1620
- idRegistry: args.idRegistry,
1621
- });
1622
- }
1623
- else {
1624
- if (pendingThinking === undefined) {
1625
- throw new Error(`ANTH invariant violation: block ${String(blockIndex)} has no pending thinking`);
1626
- }
1627
- updated = await emitThinkingWithVolcanoToolUseQuirk({
1628
- text: pendingThinking,
1629
- receiver: args.receiver,
1630
- quirks: args.quirks,
1631
- sayingStarted,
1632
- thinkingStarted,
1633
- genseq: args.genseq,
1634
- blockIndex,
1635
- idRegistry: args.idRegistry,
1636
- });
1637
- }
1638
- sayingStarted = updated.sayingStarted;
1639
- thinkingStarted = updated.thinkingStarted;
1640
- }
1641
- args.textBlocks.clear();
1642
- args.thinkingBlocks.clear();
1643
- return { sayingStarted, thinkingStarted };
1644
- }
1645
1309
  /**
1646
1310
  * Convert a single ChatMessage to content blocks for Anthropic SDK.
1647
1311
  * Returns array of content blocks (may contain multiple for complex messages).
@@ -1706,7 +1370,7 @@ function chatMessageToAnthropic(chatMsg) {
1706
1370
  content: contentBlocks.length === 1 ? contentBlocks : contentBlocks,
1707
1371
  };
1708
1372
  }
1709
- function anthropicToChatMessages(message, genseq, forcedJsonToolName, quirks, knownFunctionCallIds) {
1373
+ function anthropicToChatMessages(message, genseq, forcedJsonToolName) {
1710
1374
  const results = [];
1711
1375
  if (!isRecord(message)) {
1712
1376
  throw new Error('Invalid Anthropic message: expected object');
@@ -1750,37 +1414,9 @@ function anthropicToChatMessages(message, genseq, forcedJsonToolName, quirks, kn
1750
1414
  });
1751
1415
  };
1752
1416
  if (role === 'assistant') {
1753
- const volcanoToolCallIdRegistry = quirks?.convertVolcanoTextToolUseBlocks === true
1754
- ? createVolcanoToolCallIdRegistry(knownFunctionCallIds)
1755
- : undefined;
1756
1417
  for (const block of blocks) {
1757
1418
  if (isRecord(block) && block.type === 'text' && typeof block.text === 'string') {
1758
- const parts = quirks?.convertVolcanoTextToolUseBlocks === true
1759
- ? splitVolcanoTextToolUseParts({
1760
- text: block.text,
1761
- genseq,
1762
- idRegistry: volcanoToolCallIdRegistry,
1763
- })
1764
- : [{ kind: 'text', text: block.text }];
1765
- for (const part of parts) {
1766
- if (part.kind === 'text') {
1767
- pushAssistantSaying(part.text);
1768
- continue;
1769
- }
1770
- log.warn('ANTH quirk converted batch text-rendered tool use to function call', undefined, {
1771
- quirk: api_quirks_1.VOLCANO_TOOL_USE_API_QUIRK,
1772
- callId: part.id,
1773
- toolName: part.name,
1774
- });
1775
- results.push({
1776
- type: 'func_call_msg',
1777
- id: part.id,
1778
- name: part.name,
1779
- arguments: part.rawArgumentsText,
1780
- role: 'assistant',
1781
- genseq,
1782
- });
1783
- }
1419
+ pushAssistantSaying(block.text);
1784
1420
  continue;
1785
1421
  }
1786
1422
  if (isToolUseBlock(block)) {
@@ -1885,20 +1521,11 @@ function validateReconstructedContext(messages) {
1885
1521
  }
1886
1522
  }
1887
1523
  async function consumeAnthropicStream(stream, receiver, options = {}) {
1888
- const quirks = options.quirks ?? {
1889
- normalizeLoneClosingBraceEmptyToolInputDelta: false,
1890
- convertVolcanoTextToolUseBlocks: false,
1891
- };
1892
1524
  const { abortSignal, forcedJsonToolName, genseq } = options;
1893
1525
  assertValidAnthropicStreamGenseq(genseq);
1894
- const volcanoToolCallIdRegistry = quirks.convertVolcanoTextToolUseBlocks
1895
- ? createVolcanoToolCallIdRegistry(options.knownFunctionCallIds)
1896
- : undefined;
1897
1526
  // Stream lifecycle management using SDK start/stop events
1898
1527
  const activeContentBlocks = new Map();
1899
1528
  const activeToolUses = new Map();
1900
- const pendingVolcanoTextToolUseBlocks = new Map();
1901
- const pendingVolcanoThinkingToolUseBlocks = new Map();
1902
1529
  let sayingStarted = false;
1903
1530
  let thinkingStarted = false;
1904
1531
  let messageStarted = false;
@@ -1921,8 +1548,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
1921
1548
  nextType: contentBlock.type,
1922
1549
  });
1923
1550
  activeToolUses.delete(blockIndex);
1924
- pendingVolcanoTextToolUseBlocks.delete(blockIndex);
1925
- pendingVolcanoThinkingToolUseBlocks.delete(blockIndex);
1926
1551
  }
1927
1552
  activeContentBlocks.set(blockIndex, contentBlock);
1928
1553
  // Track tool use so we can emit function calls once JSON is complete
@@ -1934,12 +1559,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
1934
1559
  initialInput: contentBlock.input,
1935
1560
  });
1936
1561
  }
1937
- else if (contentBlock.type === 'text' && quirks.convertVolcanoTextToolUseBlocks) {
1938
- pendingVolcanoTextToolUseBlocks.set(blockIndex, contentBlock.text ?? '');
1939
- }
1940
- else if (contentBlock.type === 'thinking' && quirks.convertVolcanoTextToolUseBlocks) {
1941
- pendingVolcanoThinkingToolUseBlocks.set(blockIndex, contentBlock.thinking ?? '');
1942
- }
1943
1562
  break;
1944
1563
  }
1945
1564
  case 'content_block_delta': {
@@ -1958,47 +1577,31 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
1958
1577
  if (delta.type === 'text_delta') {
1959
1578
  const textDelta = delta.text ?? '';
1960
1579
  if (textDelta) {
1961
- const pendingText = pendingVolcanoTextToolUseBlocks.get(blockIndex);
1962
- if (pendingText !== undefined) {
1963
- pendingVolcanoTextToolUseBlocks.set(blockIndex, `${pendingText}${textDelta}`);
1580
+ if (thinkingStarted) {
1581
+ log.error('ANTH stream ordering violation: received text_delta while thinking stream still active', new Error('anthropic_stream_order_violation'));
1582
+ await receiver.thinkingFinish();
1583
+ thinkingStarted = false;
1964
1584
  }
1965
- else {
1966
- const updated = await emitTextWithVolcanoToolUseQuirk({
1967
- text: textDelta,
1968
- receiver,
1969
- quirks,
1970
- sayingStarted,
1971
- thinkingStarted,
1972
- genseq,
1973
- blockIndex,
1974
- idRegistry: volcanoToolCallIdRegistry,
1975
- });
1976
- sayingStarted = updated.sayingStarted;
1977
- thinkingStarted = updated.thinkingStarted;
1585
+ if (!sayingStarted) {
1586
+ sayingStarted = true;
1587
+ await receiver.sayingStart();
1978
1588
  }
1589
+ await receiver.sayingChunk(textDelta);
1979
1590
  }
1980
1591
  }
1981
1592
  else if (delta.type === 'thinking_delta') {
1982
1593
  const thinkingDelta = delta.thinking ?? '';
1983
1594
  if (thinkingDelta) {
1984
- const pendingThinking = pendingVolcanoThinkingToolUseBlocks.get(blockIndex);
1985
- if (pendingThinking !== undefined) {
1986
- pendingVolcanoThinkingToolUseBlocks.set(blockIndex, `${pendingThinking}${thinkingDelta}`);
1595
+ if (sayingStarted) {
1596
+ log.error('ANTH stream ordering violation: received thinking_delta while saying stream still active', new Error('anthropic_stream_order_violation'));
1597
+ await receiver.sayingFinish();
1598
+ sayingStarted = false;
1987
1599
  }
1988
- else {
1989
- const updated = await emitThinkingWithVolcanoToolUseQuirk({
1990
- text: thinkingDelta,
1991
- receiver,
1992
- quirks,
1993
- sayingStarted,
1994
- thinkingStarted,
1995
- genseq,
1996
- blockIndex,
1997
- idRegistry: volcanoToolCallIdRegistry,
1998
- });
1999
- sayingStarted = updated.sayingStarted;
2000
- thinkingStarted = updated.thinkingStarted;
1600
+ if (!thinkingStarted) {
1601
+ thinkingStarted = true;
1602
+ await receiver.thinkingStart();
2001
1603
  }
1604
+ await receiver.thinkingChunk(thinkingDelta);
2002
1605
  }
2003
1606
  }
2004
1607
  else if (delta.type === 'citations_delta') {
@@ -2052,47 +1655,13 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
2052
1655
  sayingStarted = false;
2053
1656
  }
2054
1657
  else {
2055
- const argsJson = resolveToolUseArgumentsJson(activeToolUse, quirks);
1658
+ const argsJson = resolveToolUseArgumentsJson(activeToolUse);
2056
1659
  await receiver.funcCall(activeToolUse.id, activeToolUse.name, argsJson);
2057
1660
  }
2058
1661
  }
2059
1662
  activeToolUses.delete(blockIndex);
2060
1663
  }
2061
- else if (activeContentBlock.type === 'text') {
2062
- const pendingText = pendingVolcanoTextToolUseBlocks.get(blockIndex);
2063
- if (pendingText !== undefined) {
2064
- const updated = await emitTextWithVolcanoToolUseQuirk({
2065
- text: pendingText,
2066
- receiver,
2067
- quirks,
2068
- sayingStarted,
2069
- thinkingStarted,
2070
- genseq,
2071
- blockIndex,
2072
- idRegistry: volcanoToolCallIdRegistry,
2073
- });
2074
- sayingStarted = updated.sayingStarted;
2075
- thinkingStarted = updated.thinkingStarted;
2076
- pendingVolcanoTextToolUseBlocks.delete(blockIndex);
2077
- }
2078
- }
2079
1664
  else if (activeContentBlock.type === 'thinking') {
2080
- const pendingThinking = pendingVolcanoThinkingToolUseBlocks.get(blockIndex);
2081
- if (pendingThinking !== undefined) {
2082
- const updated = await emitThinkingWithVolcanoToolUseQuirk({
2083
- text: pendingThinking,
2084
- receiver,
2085
- quirks,
2086
- sayingStarted,
2087
- thinkingStarted,
2088
- genseq,
2089
- blockIndex,
2090
- idRegistry: volcanoToolCallIdRegistry,
2091
- });
2092
- sayingStarted = updated.sayingStarted;
2093
- thinkingStarted = updated.thinkingStarted;
2094
- pendingVolcanoThinkingToolUseBlocks.delete(blockIndex);
2095
- }
2096
1665
  if (thinkingStarted) {
2097
1666
  await receiver.thinkingFinish();
2098
1667
  thinkingStarted = false;
@@ -2157,18 +1726,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
2157
1726
  }
2158
1727
  case 'message_stop': {
2159
1728
  messageStopped = true;
2160
- const updated = await flushPendingVolcanoToolUseBlocks({
2161
- textBlocks: pendingVolcanoTextToolUseBlocks,
2162
- thinkingBlocks: pendingVolcanoThinkingToolUseBlocks,
2163
- receiver,
2164
- quirks,
2165
- sayingStarted,
2166
- thinkingStarted,
2167
- genseq,
2168
- idRegistry: volcanoToolCallIdRegistry,
2169
- });
2170
- sayingStarted = updated.sayingStarted;
2171
- thinkingStarted = updated.thinkingStarted;
2172
1729
  activeContentBlocks.clear();
2173
1730
  activeToolUses.clear();
2174
1731
  if (thinkingStarted) {
@@ -2196,8 +1753,6 @@ async function consumeAnthropicStream(stream, receiver, options = {}) {
2196
1753
  if ((messageStarted && !messageStopped) ||
2197
1754
  activeContentBlocks.size > 0 ||
2198
1755
  activeToolUses.size > 0 ||
2199
- pendingVolcanoTextToolUseBlocks.size > 0 ||
2200
- pendingVolcanoThinkingToolUseBlocks.size > 0 ||
2201
1756
  thinkingStarted ||
2202
1757
  sayingStarted) {
2203
1758
  const detail = 'ANTH incomplete stream: provider event stream ended before a complete message lifecycle ' +
@@ -2325,9 +1880,7 @@ class AnthropicGen {
2325
1880
  return consumeAnthropicStream(stream, receiver, {
2326
1881
  abortSignal,
2327
1882
  forcedJsonToolName: forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined,
2328
- quirks: resolveAnthropicStreamConsumeQuirks(providerConfig),
2329
1883
  genseq,
2330
- knownFunctionCallIds: requestContext.knownFunctionCallIds,
2331
1884
  });
2332
1885
  }
2333
1886
  async genMoreMessages(providerConfig, agent, systemPrompt, funcTools, requestContext, context, genseq, abortSignal) {
@@ -2403,7 +1956,7 @@ class AnthropicGen {
2403
1956
  totalTokens: promptTokens + completionTokens,
2404
1957
  };
2405
1958
  return {
2406
- messages: anthropicToChatMessages(response, genseq, forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined, resolveAnthropicStreamConsumeQuirks(providerConfig), requestContext.knownFunctionCallIds),
1959
+ messages: anthropicToChatMessages(response, genseq, forceJsonResponse ? ANTHROPIC_JSON_RESPONSE_TOOL_NAME : undefined),
2407
1960
  ...(outputs.length > 0 ? { outputs } : {}),
2408
1961
  usage,
2409
1962
  llmGenModel: returnedModel,
@@ -13,16 +13,26 @@
13
13
  import type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources/chat/completions';
14
14
  import type { Team } from '../../team';
15
15
  import type { FuncTool } from '../../tool';
16
- import type { ChatMessage, ProviderConfig } from '../client';
16
+ import type { ChatMessage, ModelInfo, ProviderConfig } from '../client';
17
17
  import { type LlmBatchResult, type LlmFailureDisposition, type LlmGenerator, type LlmRequestContext, type LlmStreamReceiver, type LlmStreamResult } from '../gen';
18
18
  type OpenAiCompatibleChatExtraParams = {
19
19
  thinking?: boolean | Record<string, unknown>;
20
20
  reasoning_effort?: NonNullable<Team.ModelParams['openai-compatible']>['reasoning_effort'];
21
21
  };
22
+ export declare function resolveOpenAiCompatibleToolChoice(funcTools: readonly FuncTool[], requestContext: LlmRequestContext, modelInfo?: ModelInfo): 'none' | 'auto' | 'required' | undefined;
22
23
  export declare function buildOpenAiCompatibleExtraParamsForTest(args: {
23
24
  agent: Team.Member;
24
25
  openAiParams: NonNullable<Team.ModelParams['openai-compatible']>;
25
26
  }): OpenAiCompatibleChatExtraParams;
27
+ export declare function wrapOpenAiCompatibleRejectedRequestErrorForTest(args: {
28
+ error: unknown;
29
+ providerConfig: ProviderConfig;
30
+ agent: Team.Member;
31
+ requestContext: LlmRequestContext;
32
+ genseq: number;
33
+ requestKind: 'stream' | 'batch';
34
+ payload: unknown;
35
+ }): Promise<unknown>;
26
36
  export declare function buildOpenAiCompatibleRequestMessagesWrapper(systemPrompt: string, context: ChatMessage[], requestContextOrOptions?: LlmRequestContext | {
27
37
  providerConfig?: ProviderConfig;
28
38
  }, optionsMaybe?: {