minimal-agent 0.18.6 → 0.18.7

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 (61) hide show
  1. package/package.json +1 -1
  2. package/plugins/workflow-runner/src/runtime/context.js +5 -17
  3. package/plugins/workflow-runner/src/runtime/context.ts +4 -15
  4. package/plugins/workflow-runner/src/runtime/model.js +4 -2
  5. package/plugins/workflow-runner/src/runtime/model.ts +3 -2
  6. package/plugins/workflow-runner/test/api.test.ts +4 -2
  7. package/plugins/workflow-runner/test/embeddedExecution.test.ts +5 -6
  8. package/plugins/workflow-runner/test/modelOutcome.test.ts +36 -0
  9. package/skills/dynamic-ui/SKILL.md +38 -278
  10. package/skills/dynamic-ui/mermaid.md +32 -0
  11. package/skills/dynamic-ui/scenes/architecture-and-flow.md +4 -1
  12. package/skills/dynamic-ui/scenes/data-visualization.md +5 -2
  13. package/skills/dynamic-ui/svg-design.md +251 -0
  14. package/skills/dynamic-ui/templates/README.md +2 -1
  15. package/skills/dynamic-ui/tokens/visual-tokens.md +4 -5
  16. package/src/advisor/README.md +24 -0
  17. package/src/advisor/advisorCoordinator.js +101 -45
  18. package/src/advisor/advisorCoordinator.ts +90 -51
  19. package/src/advisor/deliveryReview.js +35 -0
  20. package/src/advisor/deliveryReview.ts +30 -0
  21. package/src/advisor/presentation.js +10 -0
  22. package/src/advisor/presentation.ts +12 -0
  23. package/src/advisor/reviewContext.js +60 -0
  24. package/src/advisor/reviewContext.ts +72 -0
  25. package/src/context/tokenCounter.js +3 -0
  26. package/src/context/tokenCounter.ts +2 -0
  27. package/src/llm/messageProvenance.js +1 -1
  28. package/src/llm/messageProvenance.ts +1 -1
  29. package/src/loop.js +203 -30
  30. package/src/loop.ts +183 -30
  31. package/src/prompts/policyRegistry.js +17 -9
  32. package/src/prompts/policyRegistry.ts +17 -9
  33. package/src/runtime/answerPreparation.js +9 -0
  34. package/src/runtime/answerPreparation.ts +11 -0
  35. package/src/runtime/eventSemantics.js +2 -0
  36. package/src/runtime/eventSemantics.ts +2 -0
  37. package/src/runtime/finalAnswer.js +7 -0
  38. package/src/runtime/finalAnswer.ts +9 -0
  39. package/src/runtime/lifecycleTrace.js +16 -0
  40. package/src/runtime/lifecycleTrace.ts +22 -0
  41. package/src/session/runTurn.js +15 -1
  42. package/src/session/runTurn.ts +13 -1
  43. package/src/tools/advisor/advisor.js +56 -40
  44. package/src/tools/advisor/advisor.ts +57 -39
  45. package/src/tools/advisor/advisorDecision.js +6 -3
  46. package/src/tools/advisor/advisorDecision.ts +6 -3
  47. package/src/tools/agent/agent.js +7 -1
  48. package/src/tools/agent/agent.ts +7 -1
  49. package/src/tools/bash/semantics.js +91 -26
  50. package/src/tools/bash/semantics.ts +63 -33
  51. package/src/tools/index.js +4 -1
  52. package/src/tools/index.ts +4 -1
  53. package/src/types.ts +15 -6
  54. package/src/ui/LiveArea.js +2 -1
  55. package/src/ui/LiveArea.tsx +2 -1
  56. package/src/ui/MessageList.js +18 -5
  57. package/src/ui/MessageList.tsx +25 -3
  58. package/src/ui/draftNotice.js +1 -8
  59. package/src/ui/draftNotice.ts +1 -10
  60. package/src/ui/hooks/useChat.js +25 -1
  61. package/src/ui/hooks/useChat.ts +22 -1
@@ -1055,6 +1055,13 @@ export function handleEvent(ev, setters) {
1055
1055
  // V2 工作流发结构化 `workflow_progress`;旧插件仍可发 `plugin_progress`。
1056
1056
  // 收口到 LoopEvent:未识别的 PluginEvent type 走 default no-op
1057
1057
  const e = ev;
1058
+ if (e.type === 'turn_done' || e.type === 'interrupted' || (e.type === 'error' && !isRecoverableLoopError(e))) {
1059
+ setters.cancelStreamingFlush();
1060
+ setters.setStreamingText(() => '');
1061
+ setters.cancelReasoningFlush();
1062
+ setters.setReasoningPreview(() => '');
1063
+ setters.setProgressStage('idle');
1064
+ }
1058
1065
  if (['assistant_message', 'tool_start', 'turn_done', 'interrupted', 'error'].includes(e.type))
1059
1066
  setters.setProgressNotice?.(null);
1060
1067
  switch (e.type) {
@@ -1067,6 +1074,8 @@ export function handleEvent(ev, setters) {
1067
1074
  setters.appendStreamingDelta(e.delta);
1068
1075
  break;
1069
1076
  case 'assistant_message':
1077
+ if (e.message.presentation === 'final')
1078
+ setters.setPluginProgress(null);
1070
1079
  // history 已被 runQuery 直接 push。先 flush 残留 streaming buffer
1071
1080
  // 把末段 text 落到 streamingText state(avoid 视觉跳跃),再清空
1072
1081
  // streamingText —— Static 已 commit 完整 assistant message 接管显示。
@@ -1085,13 +1094,26 @@ export function handleEvent(ev, setters) {
1085
1094
  setters.setTransientError?.(null);
1086
1095
  setters.bump();
1087
1096
  break;
1097
+ case 'injected_message':
1098
+ // Milestones preserve live previews; legacy drafts transfer them to history.
1099
+ if (e.message.role === 'system' && e.message._uiProgress) {
1100
+ if (e.message.draftPresentation) {
1101
+ setters.flushStreamingBuffer();
1102
+ setters.setStreamingText(() => '');
1103
+ setters.cancelReasoningFlush();
1104
+ setters.setReasoningPreview(() => '');
1105
+ }
1106
+ setters.bump();
1107
+ }
1108
+ break;
1088
1109
  case 'assistant_draft_discarded':
1089
1110
  setters.flushStreamingBuffer();
1090
1111
  setters.setStreamingText(() => '');
1091
1112
  setters.cancelReasoningFlush();
1092
1113
  setters.setReasoningPreview(() => '');
1093
1114
  setters.setProgressStage('thinking');
1094
- setters.emitProgressLine?.(draftNotice(e.reason));
1115
+ if (e.textLength > 0)
1116
+ setters.emitProgressLine?.(draftNotice(e.reason));
1095
1117
  setters.setProgressNotice?.(draftNotice(e.reason));
1096
1118
  break;
1097
1119
  case 'tool_start':
@@ -1177,6 +1199,8 @@ export function handleEvent(ev, setters) {
1177
1199
  // Diagnostics are intentionally local-safe and currently consumed by CLI/stream hosts.
1178
1200
  break;
1179
1201
  case 'turn_done':
1202
+ if (e.completionStatus === 'no_answer')
1203
+ setters.setError(e.warning ?? '本轮未生成最终答复,可以重试。');
1180
1204
  setters.setProgressStage('idle');
1181
1205
  setters.setTransientError?.(null);
1182
1206
  setters.bump();
@@ -1466,6 +1466,13 @@ export function handleEvent(
1466
1466
 
1467
1467
  // 收口到 LoopEvent:未识别的 PluginEvent type 走 default no-op
1468
1468
  const e = ev as LoopEvent;
1469
+ if (e.type === 'turn_done' || e.type === 'interrupted' || (e.type === 'error' && !isRecoverableLoopError(e))) {
1470
+ setters.cancelStreamingFlush();
1471
+ setters.setStreamingText(() => '');
1472
+ setters.cancelReasoningFlush();
1473
+ setters.setReasoningPreview(() => '');
1474
+ setters.setProgressStage('idle');
1475
+ }
1469
1476
  if (['assistant_message', 'tool_start', 'turn_done', 'interrupted', 'error'].includes(e.type)) setters.setProgressNotice?.(null);
1470
1477
  switch (e.type) {
1471
1478
  case 'user_message_committed':
@@ -1477,6 +1484,7 @@ export function handleEvent(
1477
1484
  setters.appendStreamingDelta(e.delta);
1478
1485
  break;
1479
1486
  case 'assistant_message':
1487
+ if (e.message.presentation === 'final') setters.setPluginProgress(null);
1480
1488
  // history 已被 runQuery 直接 push。先 flush 残留 streaming buffer
1481
1489
  // 把末段 text 落到 streamingText state(avoid 视觉跳跃),再清空
1482
1490
  // streamingText —— Static 已 commit 完整 assistant message 接管显示。
@@ -1495,13 +1503,25 @@ export function handleEvent(
1495
1503
  setters.setTransientError?.(null);
1496
1504
  setters.bump();
1497
1505
  break;
1506
+ case 'injected_message':
1507
+ // Milestones preserve live previews; legacy drafts transfer them to history.
1508
+ if (e.message.role === 'system' && e.message._uiProgress) {
1509
+ if (e.message.draftPresentation) {
1510
+ setters.flushStreamingBuffer();
1511
+ setters.setStreamingText(() => '');
1512
+ setters.cancelReasoningFlush();
1513
+ setters.setReasoningPreview(() => '');
1514
+ }
1515
+ setters.bump();
1516
+ }
1517
+ break;
1498
1518
  case 'assistant_draft_discarded':
1499
1519
  setters.flushStreamingBuffer();
1500
1520
  setters.setStreamingText(() => '');
1501
1521
  setters.cancelReasoningFlush();
1502
1522
  setters.setReasoningPreview(() => '');
1503
1523
  setters.setProgressStage('thinking');
1504
- setters.emitProgressLine?.(draftNotice(e.reason));
1524
+ if (e.textLength > 0) setters.emitProgressLine?.(draftNotice(e.reason));
1505
1525
  setters.setProgressNotice?.(draftNotice(e.reason));
1506
1526
  break;
1507
1527
  case 'tool_start':
@@ -1585,6 +1605,7 @@ export function handleEvent(
1585
1605
  // Diagnostics are intentionally local-safe and currently consumed by CLI/stream hosts.
1586
1606
  break;
1587
1607
  case 'turn_done':
1608
+ if (e.completionStatus === 'no_answer') setters.setError(e.warning ?? '本轮未生成最终答复,可以重试。');
1588
1609
  setters.setProgressStage('idle');
1589
1610
  setters.setTransientError?.(null);
1590
1611
  setters.bump();