dominds 1.23.2 → 1.23.4

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 (138) hide show
  1. package/dist/dialog-display-state.js +112 -9
  2. package/dist/dialog.js +4 -0
  3. package/dist/docs/dialog-system.md +6 -2
  4. package/dist/docs/dialog-system.zh.md +5 -1
  5. package/dist/docs/diligence-push.md +27 -6
  6. package/dist/docs/diligence-push.zh.md +13 -6
  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/tellask-revive-context-refactor.zh.md +13 -1
  10. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +3 -2
  11. package/dist/llm/api-quirks.d.ts +1 -0
  12. package/dist/llm/api-quirks.js +35 -1
  13. package/dist/llm/defaults.yaml +6 -0
  14. package/dist/llm/gen/anthropic.js +6 -2
  15. package/dist/llm/gen/mock.js +44 -11
  16. package/dist/llm/gen/openai-compatible.d.ts +2 -1
  17. package/dist/llm/gen/openai-compatible.js +88 -20
  18. package/dist/llm/gen.d.ts +12 -0
  19. package/dist/llm/kernel-driver/context-health.d.ts +3 -4
  20. package/dist/llm/kernel-driver/context-health.js +5 -2
  21. package/dist/llm/kernel-driver/context.d.ts +4 -8
  22. package/dist/llm/kernel-driver/context.js +5 -25
  23. package/dist/llm/kernel-driver/drive.js +263 -59
  24. package/dist/llm/kernel-driver/engine.d.ts +1 -1
  25. package/dist/llm/kernel-driver/engine.js +5 -3
  26. package/dist/llm/kernel-driver/flow.js +162 -45
  27. package/dist/llm/kernel-driver/runtime.d.ts +12 -11
  28. package/dist/llm/kernel-driver/runtime.js +106 -18
  29. package/dist/llm/kernel-driver/sideDialog.d.ts +3 -0
  30. package/dist/llm/kernel-driver/sideDialog.js +4 -1
  31. package/dist/llm/kernel-driver/tellask-special.d.ts +1 -0
  32. package/dist/llm/kernel-driver/tellask-special.js +30 -30
  33. package/dist/llm/kernel-driver/types.d.ts +7 -3
  34. package/dist/log.js +35 -2
  35. package/dist/persistence.js +12 -1
  36. package/dist/recovery/reply-special.js +1 -1
  37. package/dist/runtime/driver-messages.d.ts +14 -1
  38. package/dist/runtime/driver-messages.js +116 -6
  39. package/dist/runtime/inter-dialog-format.d.ts +1 -0
  40. package/dist/runtime/inter-dialog-format.js +7 -3
  41. package/dist/server/websocket-handler.js +0 -1
  42. package/dist/tools/team_mgmt-manual.js +2 -2
  43. package/package.json +2 -2
  44. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js → _basePickBy-DMD1UhXs.js} +3 -3
  45. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js.map → _basePickBy-DMD1UhXs.js.map} +1 -1
  46. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js → _baseUniq-CsE8Qvwt.js} +2 -2
  47. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js.map → _baseUniq-CsE8Qvwt.js.map} +1 -1
  48. package/webapp/dist/assets/{arc-CASAlRvm.js → arc-0h8sV6e1.js} +2 -2
  49. package/webapp/dist/assets/{arc-CASAlRvm.js.map → arc-0h8sV6e1.js.map} +1 -1
  50. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js → architectureDiagram-2XIMDMQ5-BbMESECO.js} +7 -7
  51. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js.map → architectureDiagram-2XIMDMQ5-BbMESECO.js.map} +1 -1
  52. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js → blockDiagram-WCTKOSBZ-DwkN-9a4.js} +7 -7
  53. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js.map → blockDiagram-WCTKOSBZ-DwkN-9a4.js.map} +1 -1
  54. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js → c4Diagram-IC4MRINW-CGYONEh1.js} +3 -3
  55. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js.map → c4Diagram-IC4MRINW-CGYONEh1.js.map} +1 -1
  56. package/webapp/dist/assets/{channel-CZ_X09H1.js → channel-DbSJhm5-.js} +2 -2
  57. package/webapp/dist/assets/{channel-CZ_X09H1.js.map → channel-DbSJhm5-.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js → chunk-4BX2VUAB-D1inRfgf.js} +2 -2
  59. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js.map → chunk-4BX2VUAB-D1inRfgf.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js → chunk-55IACEB6-DL1IDg_h.js} +2 -2
  61. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js.map → chunk-55IACEB6-DL1IDg_h.js.map} +1 -1
  62. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js → chunk-FMBD7UC4-CugIlRDV.js} +2 -2
  63. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js.map → chunk-FMBD7UC4-CugIlRDV.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js → chunk-JSJVCQXG-DKHSdeu1.js} +2 -2
  65. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js.map → chunk-JSJVCQXG-DKHSdeu1.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js → chunk-KX2RTZJC-DCU9tkq6.js} +2 -2
  67. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js.map → chunk-KX2RTZJC-DCU9tkq6.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js → chunk-NQ4KR5QH-DN3O2s2M.js} +4 -4
  69. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js.map → chunk-NQ4KR5QH-DN3O2s2M.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js → chunk-QZHKN3VN-e3ztIJg0.js} +2 -2
  71. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js.map → chunk-QZHKN3VN-e3ztIJg0.js.map} +1 -1
  72. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js → chunk-WL4C6EOR-Dv907NPM.js} +6 -6
  73. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js.map → chunk-WL4C6EOR-Dv907NPM.js.map} +1 -1
  74. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js → classDiagram-VBA2DB6C-DOTXtxYZ.js} +7 -7
  75. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js.map → classDiagram-VBA2DB6C-DOTXtxYZ.js.map} +1 -1
  76. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js} +7 -7
  77. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js.map → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js.map} +1 -1
  78. package/webapp/dist/assets/{clone-BSCHnHfl.js → clone-6lYQMWpu.js} +2 -2
  79. package/webapp/dist/assets/{clone-BSCHnHfl.js.map → clone-6lYQMWpu.js.map} +1 -1
  80. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js → cose-bilkent-S5V4N54A-DoJeDXV0.js} +2 -2
  81. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js.map → cose-bilkent-S5V4N54A-DoJeDXV0.js.map} +1 -1
  82. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js → dagre-KLK3FWXG-F_n_vhV9.js} +7 -7
  83. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js.map → dagre-KLK3FWXG-F_n_vhV9.js.map} +1 -1
  84. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js → diagram-E7M64L7V-Crwhgyjv.js} +8 -8
  85. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js.map → diagram-E7M64L7V-Crwhgyjv.js.map} +1 -1
  86. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js → diagram-IFDJBPK2-CIt1nnn5.js} +7 -7
  87. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js.map → diagram-IFDJBPK2-CIt1nnn5.js.map} +1 -1
  88. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js → diagram-P4PSJMXO-qowipEfV.js} +7 -7
  89. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js.map → diagram-P4PSJMXO-qowipEfV.js.map} +1 -1
  90. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js → erDiagram-INFDFZHY-DV2BcYNa.js} +5 -5
  91. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js.map → erDiagram-INFDFZHY-DV2BcYNa.js.map} +1 -1
  92. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js → flowDiagram-PKNHOUZH-CAbWV161.js} +7 -7
  93. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js.map → flowDiagram-PKNHOUZH-CAbWV161.js.map} +1 -1
  94. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js → ganttDiagram-A5KZAMGK-CfdR7FRr.js} +3 -3
  95. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js.map → ganttDiagram-A5KZAMGK-CfdR7FRr.js.map} +1 -1
  96. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js} +8 -8
  97. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js.map → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js.map} +1 -1
  98. package/webapp/dist/assets/{graph-D5jmnb35.js → graph-cjRyzujT.js} +3 -3
  99. package/webapp/dist/assets/{graph-D5jmnb35.js.map → graph-cjRyzujT.js.map} +1 -1
  100. package/webapp/dist/assets/{index-CGbZlct2.js → index-DgfF56L4.js} +36 -36
  101. package/webapp/dist/assets/{index-CGbZlct2.js.map → index-DgfF56L4.js.map} +1 -1
  102. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js → infoDiagram-LFFYTUFH-3wx-7AdD.js} +6 -6
  103. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js.map → infoDiagram-LFFYTUFH-3wx-7AdD.js.map} +1 -1
  104. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js} +2 -2
  105. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js.map → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js.map} +1 -1
  106. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js → journeyDiagram-4ABVD52K-DdCcmOBO.js} +5 -5
  107. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js.map → journeyDiagram-4ABVD52K-DdCcmOBO.js.map} +1 -1
  108. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js → kanban-definition-K7BYSVSG-BFw2emGl.js} +3 -3
  109. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js.map → kanban-definition-K7BYSVSG-BFw2emGl.js.map} +1 -1
  110. package/webapp/dist/assets/{layout-CLmOfwnS.js → layout-Clazq06r.js} +5 -5
  111. package/webapp/dist/assets/{layout-CLmOfwnS.js.map → layout-Clazq06r.js.map} +1 -1
  112. package/webapp/dist/assets/{linear-DFAmViqi.js → linear-jdsBGgvD.js} +2 -2
  113. package/webapp/dist/assets/{linear-DFAmViqi.js.map → linear-jdsBGgvD.js.map} +1 -1
  114. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js → mindmap-definition-YRQLILUH-DLSZrW6l.js} +4 -4
  115. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js.map → mindmap-definition-YRQLILUH-DLSZrW6l.js.map} +1 -1
  116. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js → pieDiagram-SKSYHLDU-Uj-Zpci6.js} +8 -8
  117. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js.map → pieDiagram-SKSYHLDU-Uj-Zpci6.js.map} +1 -1
  118. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js → quadrantDiagram-337W2JSQ-DO7Sl1nV.js} +3 -3
  119. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js.map → quadrantDiagram-337W2JSQ-DO7Sl1nV.js.map} +1 -1
  120. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js → requirementDiagram-Z7DCOOCP-WrurrDKQ.js} +4 -4
  121. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js.map → requirementDiagram-Z7DCOOCP-WrurrDKQ.js.map} +1 -1
  122. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js} +2 -2
  123. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js.map → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js.map} +1 -1
  124. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js → sequenceDiagram-2WXFIKYE-B98U2Npa.js} +4 -4
  125. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js.map → sequenceDiagram-2WXFIKYE-B98U2Npa.js.map} +1 -1
  126. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js → stateDiagram-RAJIS63D-BUgfHMbd.js} +9 -9
  127. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js.map → stateDiagram-RAJIS63D-BUgfHMbd.js.map} +1 -1
  128. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js} +5 -5
  129. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js.map → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js.map} +1 -1
  130. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js → timeline-definition-YZTLITO2-DnVikX3B.js} +3 -3
  131. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js.map → timeline-definition-YZTLITO2-DnVikX3B.js.map} +1 -1
  132. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js → treemap-KZPCXAKY-BjhjT1IM.js} +5 -5
  133. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js.map → treemap-KZPCXAKY-BjhjT1IM.js.map} +1 -1
  134. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js → vennDiagram-LZ73GAT5-CXjPMxrl.js} +2 -2
  135. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js.map → vennDiagram-LZ73GAT5-CXjPMxrl.js.map} +1 -1
  136. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js → xychartDiagram-JWTSCODW-ByKmk3Cb.js} +3 -3
  137. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js.map → xychartDiagram-JWTSCODW-ByKmk3Cb.js.map} +1 -1
  138. package/webapp/dist/index.html +1 -1
@@ -379,10 +379,14 @@ responses:
379
379
  const matched = this.findMatchingResponse(db, content, role, context) ??
380
380
  this.buildReplyToolReminderAutoResponse(content, role, context);
381
381
  await delayWithAbort(matched?.delayMs ?? 0, abortSignal);
382
- await receiver.thinkingStart();
383
- await receiver.thinkingChunk(`[${modelName}] `);
384
- await receiver.thinkingChunk(content.substring(0, 50) || '(empty)');
385
- await receiver.thinkingFinish();
382
+ const thinkingText = matched?.omitDefaultThinking === true
383
+ ? (matched.thinkingResponse ?? '')
384
+ : (matched?.thinkingResponse ?? `[${modelName}] ${content.substring(0, 50) || '(empty)'}`);
385
+ if (thinkingText !== '') {
386
+ await receiver.thinkingStart();
387
+ await receiver.thinkingChunk(thinkingText);
388
+ await receiver.thinkingFinish();
389
+ }
386
390
  if (matched?.streamError) {
387
391
  if (matched.emitStreamErrorBeforeThrow && receiver.streamError) {
388
392
  await receiver.streamError(matched.streamError);
@@ -470,6 +474,10 @@ responses:
470
474
  : `mock_func_${String(i + 1)}_${call.name}`;
471
475
  await receiver.funcCall(callId, call.name, this.normalizeFuncCallArgs(call.arguments));
472
476
  }
477
+ const invalidFuncCalls = matched?.invalidFuncCalls ?? [];
478
+ for (const call of invalidFuncCalls) {
479
+ await receiver.invalidFuncCall?.(call);
480
+ }
473
481
  return { usage, llmGenModel: modelName };
474
482
  }
475
483
  async genMoreMessages(providerConfig, agent, systemPrompt, _funcTools, _requestContext, context, genseq, abortSignal) {
@@ -488,12 +496,17 @@ responses:
488
496
  this.buildReplyToolReminderAutoResponse(content, role, context);
489
497
  await delayWithAbort(matched?.delayMs ?? 0, abortSignal);
490
498
  const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
491
- const thinking = {
492
- type: 'thinking_msg',
493
- role: 'assistant',
494
- genseq,
495
- content: `[${modelName}] ${content.substring(0, 100)}`,
496
- };
499
+ const thinkingText = matched?.omitDefaultThinking === true
500
+ ? (matched.thinkingResponse ?? '')
501
+ : (matched?.thinkingResponse ?? `[${modelName}] ${content.substring(0, 100)}`);
502
+ const thinking = thinkingText === ''
503
+ ? undefined
504
+ : {
505
+ type: 'thinking_msg',
506
+ role: 'assistant',
507
+ genseq,
508
+ content: thinkingText,
509
+ };
497
510
  const saying = matched?.streamError || responseText !== ''
498
511
  ? {
499
512
  type: 'saying_msg',
@@ -566,8 +579,28 @@ responses:
566
579
  arguments: this.normalizeFuncCallArgs(call.arguments),
567
580
  };
568
581
  }) ?? [];
582
+ const invalidFuncCalls = matched?.invalidFuncCalls ?? [];
583
+ const invalidFuncCallOutputs = invalidFuncCalls.map((call) => ({
584
+ kind: 'invalid_func_call',
585
+ call,
586
+ }));
587
+ const messages = thinking !== undefined
588
+ ? saying
589
+ ? [thinking, saying, ...funcMsgs]
590
+ : [thinking, ...funcMsgs]
591
+ : saying
592
+ ? [saying, ...funcMsgs]
593
+ : [...funcMsgs];
569
594
  return {
570
- messages: saying ? [thinking, saying, ...funcMsgs] : [thinking, ...funcMsgs],
595
+ messages,
596
+ ...(invalidFuncCallOutputs.length > 0
597
+ ? {
598
+ outputs: [
599
+ ...messages.map((message) => ({ kind: 'message', message })),
600
+ ...invalidFuncCallOutputs,
601
+ ],
602
+ }
603
+ : {}),
571
604
  usage,
572
605
  llmGenModel: modelName,
573
606
  };
@@ -14,7 +14,7 @@ import type { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageParam }
14
14
  import type { Team } from '../../team';
15
15
  import type { FuncTool } from '../../tool';
16
16
  import type { ChatMessage, ModelInfo, ProviderConfig } from '../client';
17
- import { type LlmBatchResult, type LlmFailureDisposition, type LlmGenerator, type LlmRequestContext, type LlmStreamReceiver, type LlmStreamResult } from '../gen';
17
+ import { type LlmBatchOutput, 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'];
@@ -48,6 +48,7 @@ export declare function consumeOpenAiCompatibleChatCompletionStreamForTest(args:
48
48
  abortSignal?: AbortSignal;
49
49
  }): Promise<LlmStreamResult>;
50
50
  export declare function chatCompletionToChatMessagesForTest(response: ChatCompletion, genseq: number): ChatMessage[];
51
+ export declare function chatCompletionToBatchOutputsForTest(response: ChatCompletion, genseq: number): LlmBatchOutput[];
51
52
  export declare class OpenAiCompatibleGen implements LlmGenerator {
52
53
  get apiType(): string;
53
54
  classifyFailure(error: unknown): LlmFailureDisposition | undefined;
@@ -22,6 +22,7 @@ exports.wrapOpenAiCompatibleRejectedRequestErrorForTest = wrapOpenAiCompatibleRe
22
22
  exports.buildOpenAiCompatibleRequestMessagesWrapper = buildOpenAiCompatibleRequestMessagesWrapper;
23
23
  exports.consumeOpenAiCompatibleChatCompletionStreamForTest = consumeOpenAiCompatibleChatCompletionStreamForTest;
24
24
  exports.chatCompletionToChatMessagesForTest = chatCompletionToChatMessagesForTest;
25
+ exports.chatCompletionToBatchOutputsForTest = chatCompletionToBatchOutputsForTest;
25
26
  const events_1 = require("events");
26
27
  const fs_1 = require("fs");
27
28
  const promises_1 = __importDefault(require("fs/promises"));
@@ -48,7 +49,6 @@ const OPENAI_COMPATIBLE_REJECTED_REQUEST_ERROR_CODE = 'OPENAI_COMPATIBLE_REJECTE
48
49
  const KIMI_CODE_API_QUIRK = 'kimi-code';
49
50
  const KIMI_CODE_REASONING_EFFORTS = new Set(['low', 'medium', 'high']);
50
51
  const KIMI_CLI_CLOAK_API_QUIRK = 'kimi-cli-cloak';
51
- const KIMI_CLI_USER_AGENT = 'KimiCLI/1.41.0';
52
52
  const DISABLE_ASSISTANT_TOOL_CALL_REASONING_CONTENT_API_QUIRK = 'disable-assistant-tool-call-reasoning-content';
53
53
  const JSON_SCHEMA_COMBINATOR_KEYS = new Set([
54
54
  'anyOf',
@@ -578,7 +578,7 @@ function createOpenAiCompatibleClient(args) {
578
578
  };
579
579
  if (isKimiCliCloakProvider(args.providerConfig)) {
580
580
  options.defaultHeaders = {
581
- 'User-Agent': KIMI_CLI_USER_AGENT,
581
+ 'User-Agent': `KimiCLI/Dominds/${dominds_running_version_1.DOMINDS_RUNNING_VERSION}`,
582
582
  };
583
583
  }
584
584
  else if (isKimiCodeProvider(args.providerConfig)) {
@@ -1476,6 +1476,24 @@ function throwOpenAiCompatibleMalformedBatchToolCall(detail) {
1476
1476
  log.error(message, error);
1477
1477
  throw error;
1478
1478
  }
1479
+ function buildInvalidStreamedToolFunctionNameCall(state) {
1480
+ return {
1481
+ provider: 'openai-compatible',
1482
+ callId: state.callId,
1483
+ detail: `OPENAI-COMPATIBLE missing streamed tool function name for callId=${state.callId}`,
1484
+ toolCallIndex: state.index,
1485
+ rawArgumentsText: state.argsJson,
1486
+ };
1487
+ }
1488
+ function buildInvalidToolFunctionNameCall(args) {
1489
+ return {
1490
+ provider: 'openai-compatible',
1491
+ callId: args.callId,
1492
+ detail: `OPENAI-COMPATIBLE missing tool function name for callId=${args.callId}`,
1493
+ toolCallIndex: args.toolCallIndex,
1494
+ rawArgumentsText: args.rawArgumentsText,
1495
+ };
1496
+ }
1479
1497
  async function maybeEmitFuncCall(state, receiver, genseq) {
1480
1498
  if (state.emitted)
1481
1499
  return;
@@ -1483,17 +1501,32 @@ async function maybeEmitFuncCall(state, receiver, genseq) {
1483
1501
  state.callId = synthesizeCallId(genseq, state.index);
1484
1502
  }
1485
1503
  if (state.name.trim().length === 0) {
1486
- const detail = `OPENAI-COMPATIBLE missing streamed tool function name for callId=${state.callId}`;
1504
+ if (state.argsJson.trim().length === 0) {
1505
+ log.warn('OPENAI-COMPATIBLE ignored empty streamed tool call placeholder', undefined, {
1506
+ callId: state.callId,
1507
+ index: state.index,
1508
+ });
1509
+ state.emitted = true;
1510
+ return;
1511
+ }
1512
+ const invalidCall = buildInvalidStreamedToolFunctionNameCall(state);
1513
+ const detail = invalidCall.detail;
1487
1514
  log.error(detail, new Error('openai_compatible_missing_tool_call_name'), {
1488
1515
  callId: state.callId,
1516
+ index: state.index,
1489
1517
  });
1490
- if (receiver.streamError) {
1491
- await receiver.streamError(detail);
1518
+ if (!receiver.invalidFuncCall) {
1519
+ if (receiver.streamError) {
1520
+ await receiver.streamError(detail);
1521
+ }
1522
+ throw buildOpenAiCompatibleStreamError({
1523
+ detail,
1524
+ kind: 'invalid_tool_call',
1525
+ });
1492
1526
  }
1493
- throw buildOpenAiCompatibleStreamError({
1494
- detail,
1495
- kind: 'invalid_tool_call',
1496
- });
1527
+ state.emitted = true;
1528
+ await receiver.invalidFuncCall(invalidCall);
1529
+ return;
1497
1530
  }
1498
1531
  state.emitted = true;
1499
1532
  const args = state.argsJson.trim().length > 0 ? state.argsJson : '{}';
@@ -1695,25 +1728,27 @@ async function consumeOpenAiCompatibleChatCompletionStreamForTest(args) {
1695
1728
  abortSignal: args.abortSignal,
1696
1729
  });
1697
1730
  }
1698
- function chatCompletionToChatMessages(response, genseq) {
1699
- const out = [];
1731
+ function chatCompletionToBatchOutputs(response, genseq) {
1732
+ const outputs = [];
1700
1733
  const choice = response.choices && response.choices.length > 0 ? response.choices[0] : undefined;
1701
1734
  const msg = choice ? choice.message : undefined;
1702
1735
  if (!msg)
1703
- return out;
1736
+ return outputs;
1704
1737
  const reasoningContent = extractReasoningContentField(msg);
1705
1738
  if (reasoningContent && reasoningContent.length > 0) {
1706
- out.push({
1739
+ const message = {
1707
1740
  type: 'thinking_msg',
1708
1741
  role: 'assistant',
1709
1742
  genseq,
1710
1743
  content: reasoningContent,
1711
1744
  reasoning: buildReasoningPayloadFromText(reasoningContent),
1712
- });
1745
+ };
1746
+ outputs.push({ kind: 'message', message });
1713
1747
  }
1714
1748
  const content = typeof msg.content === 'string' ? msg.content : null;
1715
1749
  if (content && content.length > 0) {
1716
- out.push({ type: 'saying_msg', role: 'assistant', genseq, content });
1750
+ const message = { type: 'saying_msg', role: 'assistant', genseq, content };
1751
+ outputs.push({ kind: 'message', message });
1717
1752
  }
1718
1753
  const toolCalls = msg.tool_calls;
1719
1754
  if (Array.isArray(toolCalls)) {
@@ -1731,23 +1766,48 @@ function chatCompletionToChatMessages(response, genseq) {
1731
1766
  const name = typeof call.function?.name === 'string' ? call.function.name : '';
1732
1767
  const args = typeof call.function?.arguments === 'string' ? call.function.arguments : '';
1733
1768
  if (name.trim().length === 0) {
1734
- throwOpenAiCompatibleMalformedBatchToolCall(`missing tool function name for callId=${callId}`);
1769
+ const invalidCall = buildInvalidToolFunctionNameCall({
1770
+ callId,
1771
+ toolCallIndex: index,
1772
+ rawArgumentsText: args,
1773
+ });
1774
+ log.error(invalidCall.detail, new Error('openai_compatible_missing_tool_call_name'), {
1775
+ callId,
1776
+ index,
1777
+ });
1778
+ outputs.push({ kind: 'invalid_func_call', call: invalidCall });
1779
+ continue;
1735
1780
  }
1736
- out.push({
1781
+ const message = {
1737
1782
  type: 'func_call_msg',
1738
1783
  role: 'assistant',
1739
1784
  genseq,
1740
1785
  id: callId,
1741
1786
  name,
1742
1787
  arguments: args,
1743
- });
1788
+ };
1789
+ outputs.push({ kind: 'message', message });
1744
1790
  }
1745
1791
  }
1792
+ return outputs;
1793
+ }
1794
+ function batchOutputsToChatMessages(outputs) {
1795
+ return outputs
1796
+ .filter((output) => {
1797
+ return output.kind === 'message';
1798
+ })
1799
+ .map((output) => output.message);
1800
+ }
1801
+ function chatCompletionToChatMessages(response, genseq) {
1802
+ const out = batchOutputsToChatMessages(chatCompletionToBatchOutputs(response, genseq));
1746
1803
  return out;
1747
1804
  }
1748
1805
  function chatCompletionToChatMessagesForTest(response, genseq) {
1749
1806
  return chatCompletionToChatMessages(response, genseq);
1750
1807
  }
1808
+ function chatCompletionToBatchOutputsForTest(response, genseq) {
1809
+ return chatCompletionToBatchOutputs(response, genseq);
1810
+ }
1751
1811
  class OpenAiCompatibleGen {
1752
1812
  get apiType() {
1753
1813
  return 'openai-compatible';
@@ -1899,7 +1959,15 @@ class OpenAiCompatibleGen {
1899
1959
  const response = await client.chat.completions.create(payload, {
1900
1960
  ...(abortSignal ? { signal: abortSignal } : {}),
1901
1961
  });
1902
- const messagesOut = chatCompletionToChatMessages(response, genseq);
1962
+ const batchOutputs = chatCompletionToBatchOutputs(response, genseq);
1963
+ const messagesOut = batchOutputsToChatMessages(batchOutputs);
1964
+ const orderedOutputs = outputs.length > 0
1965
+ ? [
1966
+ ...outputs,
1967
+ ...messagesOut.map((message) => ({ kind: 'message', message })),
1968
+ ...batchOutputs.filter((output) => output.kind !== 'message'),
1969
+ ]
1970
+ : batchOutputs;
1903
1971
  const usage = response.usage
1904
1972
  ? tryExtractChatUsage(response.usage)
1905
1973
  : { kind: 'unavailable' };
@@ -1908,7 +1976,7 @@ class OpenAiCompatibleGen {
1908
1976
  : undefined;
1909
1977
  return {
1910
1978
  messages: messagesOut,
1911
- ...(outputs.length > 0 ? { outputs } : {}),
1979
+ ...(orderedOutputs.length > 0 ? { outputs: orderedOutputs } : {}),
1912
1980
  usage,
1913
1981
  ...(model ? { llmGenModel: model } : {}),
1914
1982
  };
package/dist/llm/gen.d.ts CHANGED
@@ -20,6 +20,9 @@ export declare class LlmStreamErrorEmittedError extends Error {
20
20
  export type LlmBatchOutput = {
21
21
  kind: 'message';
22
22
  message: ChatMessage;
23
+ } | {
24
+ kind: 'invalid_func_call';
25
+ call: LlmInvalidFuncCall;
23
26
  } | {
24
27
  kind: 'web_search_call';
25
28
  call: LlmWebSearchCall;
@@ -138,6 +141,14 @@ export type OpenAiResponsesCustomToolCall = {
138
141
  detail?: string;
139
142
  };
140
143
  export type OpenAiResponsesNativeToolCall = OpenAiResponsesNonCustomNativeToolCall | OpenAiResponsesCustomToolCall;
144
+ export type LlmInvalidFuncCall = Readonly<{
145
+ provider: string;
146
+ callId: string;
147
+ detail: string;
148
+ toolCallIndex?: number;
149
+ rawFunctionName?: string;
150
+ rawArgumentsText?: string;
151
+ }>;
141
152
  export interface LlmStreamReceiver {
142
153
  thinkingStart: () => Promise<void>;
143
154
  thinkingChunk: (chunk: string) => Promise<void>;
@@ -149,6 +160,7 @@ export interface LlmStreamReceiver {
149
160
  rawCallId?: string;
150
161
  effectiveCallId?: string;
151
162
  }) => Promise<void>;
163
+ invalidFuncCall?: (call: LlmInvalidFuncCall) => Promise<void>;
152
164
  webSearchCall?: (call: LlmWebSearchCall) => Promise<void>;
153
165
  nativeToolCall?: (call: OpenAiResponsesNativeToolCall) => Promise<void>;
154
166
  toolResultImageIngest?: (ingest: ToolResultImageIngest) => Promise<void>;
@@ -3,10 +3,7 @@ export type KernelDriverContextHealthDecision = Readonly<{
3
3
  kind: 'proceed';
4
4
  }> | Readonly<{
5
5
  kind: 'continue';
6
- reason: 'caution_soft_remediation' | 'critical_countdown_remediation' | 'critical_force_new_course';
7
- }> | Readonly<{
8
- kind: 'suspend';
9
- reason: 'critical_wait_human';
6
+ reason: 'caution_soft_remediation' | 'critical_countdown_remediation' | 'critical_user_prompt_remediation' | 'critical_force_new_course';
10
7
  }>;
11
8
  export declare const KERNEL_DRIVER_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS = 5;
12
9
  export declare const KERNEL_DRIVER_DEFAULT_CAUTION_REMEDIATION_CADENCE_GENERATIONS = 10;
@@ -18,6 +15,8 @@ export declare function decideKernelDriverContextHealth(args: {
18
15
  dialogKey: string;
19
16
  snapshot?: ContextHealthSnapshot;
20
17
  hadUserPromptThisGen: boolean;
18
+ hadUserPromptInImmediateToolChain?: boolean;
19
+ userPromptCriticalRemediationAlreadyApplied?: boolean;
21
20
  canInjectPromptThisGen: boolean;
22
21
  cautionRemediationCadenceGenerations: number;
23
22
  criticalCountdownRemaining: number;
@@ -111,8 +111,11 @@ function decideKernelDriverContextHealth(args) {
111
111
  if (args.criticalCountdownRemaining <= 0) {
112
112
  return { kind: 'continue', reason: 'critical_force_new_course' };
113
113
  }
114
- return args.hadUserPromptThisGen
115
- ? { kind: 'suspend', reason: 'critical_wait_human' }
114
+ if (args.userPromptCriticalRemediationAlreadyApplied === true) {
115
+ return { kind: 'proceed' };
116
+ }
117
+ return args.hadUserPromptThisGen || args.hadUserPromptInImmediateToolChain === true
118
+ ? { kind: 'continue', reason: 'critical_user_prompt_remediation' }
116
119
  : { kind: 'continue', reason: 'critical_countdown_remediation' };
117
120
  }
118
121
  const _exhaustive = snapshot.level;
@@ -4,19 +4,15 @@ export type DriveBaseContextParts = Readonly<{
4
4
  memories: readonly ChatMessage[];
5
5
  taskDocMsg?: ChatMessage;
6
6
  coursePrefixMsgs: readonly ChatMessage[];
7
- dialogMsgsForContext: readonly ChatMessage[];
8
- }>;
9
- export type DriveEphemeralContextParts = Readonly<{
10
- sideDialogResponseContextMsgs?: readonly ChatMessage[];
11
- runtimeGuideMsgs?: readonly ChatMessage[];
7
+ historicalDialogMsgsForContext: readonly ChatMessage[];
8
+ currentTurnDialogMsgsForContext: readonly ChatMessage[];
12
9
  }>;
13
10
  export type DriveTailContextParts = Readonly<{
14
11
  renderedReminders: readonly ChatMessage[];
12
+ activeReplyObligationContext: readonly ChatMessage[];
13
+ runtimeGuideMsgs: readonly ChatMessage[];
15
14
  }>;
16
- export declare function buildDriveBaseContextMessages(parts: DriveBaseContextParts): ChatMessage[];
17
- export declare function appendDriveEphemeralContext(base: readonly ChatMessage[], parts: DriveEphemeralContextParts): ChatMessage[];
18
15
  export declare function assembleDriveContextMessages(args: {
19
16
  base: DriveBaseContextParts;
20
- ephemeral: DriveEphemeralContextParts;
21
17
  tail: DriveTailContextParts;
22
18
  }): ChatMessage[];
@@ -1,36 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildDriveBaseContextMessages = buildDriveBaseContextMessages;
4
- exports.appendDriveEphemeralContext = appendDriveEphemeralContext;
5
3
  exports.assembleDriveContextMessages = assembleDriveContextMessages;
6
- function buildDriveBaseContextMessages(parts) {
7
- return [
8
- ...parts.prependedContextMessages,
9
- ...parts.memories,
10
- ...(parts.taskDocMsg ? [parts.taskDocMsg] : []),
11
- ...parts.coursePrefixMsgs,
12
- ...parts.dialogMsgsForContext,
13
- ];
14
- }
15
- function appendDriveEphemeralContext(base, parts) {
16
- const next = [...base];
17
- if (Array.isArray(parts.sideDialogResponseContextMsgs) &&
18
- parts.sideDialogResponseContextMsgs.length > 0) {
19
- next.push(...parts.sideDialogResponseContextMsgs);
20
- }
21
- if (Array.isArray(parts.runtimeGuideMsgs) && parts.runtimeGuideMsgs.length > 0) {
22
- next.push(...parts.runtimeGuideMsgs);
23
- }
24
- return next;
25
- }
26
4
  function assembleDriveContextMessages(args) {
27
- const baseMsgs = [
5
+ return [
28
6
  ...args.base.prependedContextMessages,
29
7
  ...args.base.memories,
30
8
  ...(args.base.taskDocMsg ? [args.base.taskDocMsg] : []),
31
9
  ...args.base.coursePrefixMsgs,
10
+ ...args.base.historicalDialogMsgsForContext,
32
11
  ...args.tail.renderedReminders,
33
- ...args.base.dialogMsgsForContext,
12
+ ...args.tail.activeReplyObligationContext,
13
+ ...args.tail.runtimeGuideMsgs,
14
+ ...args.base.currentTurnDialogMsgsForContext,
34
15
  ];
35
- return appendDriveEphemeralContext(baseMsgs, args.ephemeral);
36
16
  }