micro-models-agent 2.10.0 → 2.12.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.
- package/CHANGELOG.md +33 -0
- package/dist/assets/app.js +22 -4
- package/dist/assets/index.html +29 -0
- package/dist/assets/js/dom.js +2 -1
- package/dist/assets/js/feed.js +38 -26
- package/dist/assets/js/format.js +1 -1
- package/dist/assets/js/rail.js +114 -0
- package/dist/assets/js/settings-controls.js +2 -2
- package/dist/assets/js/settings.js +246 -51
- package/dist/assets/js/store.js +3 -0
- package/dist/assets/js/tabs.js +104 -2
- package/dist/assets/styles.css +215 -66
- package/dist/cli/cache-line.js +1 -0
- package/dist/cli/command-suggest.js +5 -4
- package/dist/cli/commands.js +231 -122
- package/dist/cli/completer.js +132 -31
- package/dist/cli/index.js +1 -0
- package/dist/cli/json-payload.js +4 -4
- package/dist/cli/main.js +166 -61
- package/dist/cli/onboarding-commands.js +126 -0
- package/dist/cli/plugin-commands.js +2 -1
- package/dist/cli/relaunch.js +16 -13
- package/dist/cli/repl-commands-lsp.js +75 -0
- package/dist/cli/repl-commands-skills.js +105 -0
- package/dist/cli/repl-commands.js +589 -266
- package/dist/cli/repl.js +436 -177
- package/dist/cli/run-result.js +5 -6
- package/dist/cli/security-commands.js +37 -28
- package/dist/cli/setup-order.js +4 -55
- package/dist/cli/setup-prompt.js +3 -2
- package/dist/cli/setup.js +27 -107
- package/dist/cli/web-command.js +98 -0
- package/dist/config/budget.js +5 -5
- package/dist/config/config.js +103 -96
- package/dist/config/defaults.js +38 -8
- package/dist/config/domains.js +24 -27
- package/dist/config/env.js +46 -0
- package/dist/config/experts.js +2 -0
- package/dist/config/index.js +1 -0
- package/dist/config/paths.js +56 -0
- package/dist/config/redact.js +44 -0
- package/dist/config/registry-extra.js +334 -0
- package/dist/config/registry.js +584 -0
- package/dist/config/security.js +35 -36
- package/dist/config/timeouts.js +74 -0
- package/dist/config/utils.js +16 -15
- package/dist/core/agent/artifact-progress.js +59 -0
- package/dist/core/agent/artifact-resolve.js +79 -0
- package/dist/core/agent/audit-gate.js +7 -3
- package/dist/core/agent/compaction.js +2 -2
- package/dist/core/agent/constants.js +33 -4
- package/dist/core/agent/context-log.js +454 -0
- package/dist/core/agent/context-renderer.js +5 -0
- package/dist/core/agent/critic-gate.js +132 -0
- package/dist/core/agent/hallucination-gate.js +148 -38
- package/dist/core/agent/loop-state.js +15 -0
- package/dist/core/agent/prefix-monitor.js +1 -1
- package/dist/core/agent/reasoning-resolver.js +10 -1
- package/dist/core/agent/token-tracker.js +7 -4
- package/dist/core/agent/tool-batch.js +93 -18
- package/dist/core/agent/tool-images.js +18 -0
- package/dist/core/agent/tool-output.js +65 -11
- package/dist/core/agent/tool-pairing.js +60 -0
- package/dist/core/agent-moe.js +25 -24
- package/dist/core/agent.js +429 -108
- package/dist/core/bootstrap/agent-phase.js +66 -0
- package/dist/core/bootstrap/config-phase.js +86 -0
- package/dist/core/bootstrap/modules-phase.js +269 -0
- package/dist/core/bootstrap/provider-phase.js +183 -0
- package/dist/core/bootstrap/session-phase.js +204 -0
- package/dist/core/bootstrap/state.js +94 -0
- package/dist/core/bootstrap/workspace-phase.js +115 -0
- package/dist/core/bootstrap.js +92 -660
- package/dist/core/crash-handler.js +17 -7
- package/dist/core/environment.js +37 -12
- package/dist/core/host-plan.js +43 -0
- package/dist/core/host.js +23 -0
- package/dist/core/index.js +1 -0
- package/dist/core/prompt-builder.js +17 -1
- package/dist/core/prompt-overflow.js +42 -43
- package/dist/core/session-logger.js +122 -30
- package/dist/core/system-prompt.js +117 -0
- package/dist/core/version.js +6 -4
- package/dist/core/web-host.js +34 -0
- package/dist/core/workspace.js +19 -15
- package/dist/i18n/en.json +106 -21
- package/dist/i18n/index.js +37 -3
- package/dist/i18n/ru.json +109 -21
- package/dist/index.js +7 -3
- package/dist/llm/image-utils.js +55 -64
- package/dist/llm/llm-errors.js +9 -0
- package/dist/llm/model-loader.js +10 -32
- package/dist/llm/models-dev.js +121 -0
- package/dist/llm/openai-compat.js +146 -73
- package/dist/llm/orchestrator.js +33 -11
- package/dist/llm/provider-budget.js +2 -2
- package/dist/llm/provider-context.js +233 -0
- package/dist/llm/provider.js +1 -1
- package/dist/llm/response.js +5 -0
- package/dist/llm/token-counter.js +27 -11
- package/dist/logger/app-logger.js +48 -22
- package/dist/logger/file-log.js +28 -19
- package/dist/logger/index.js +1 -0
- package/dist/main.js +24285 -22447
- package/dist/migration/backup.js +14 -3
- package/dist/migration/detect.js +12 -3
- package/dist/migration/index.js +1 -0
- package/dist/modules/artifacts/store.js +9 -8
- package/dist/modules/browser/actions.js +6 -0
- package/dist/modules/browser/bridge-client.js +14 -12
- package/dist/modules/browser/bridge-path.js +4 -4
- package/dist/modules/browser/console-buffer.js +37 -0
- package/dist/modules/browser/cookie-store.js +5 -0
- package/dist/modules/browser/driver-types.js +1 -0
- package/dist/modules/browser/driver.js +19 -11
- package/dist/modules/browser/index.js +3 -1
- package/dist/modules/browser/module.js +2 -1
- package/dist/modules/browser/session.js +10 -30
- package/dist/modules/browser/snapshot.js +19 -13
- package/dist/modules/browser/types.js +1 -0
- package/dist/modules/certification/cli.js +28 -20
- package/dist/modules/certification/fact-checker.js +9 -1
- package/dist/modules/certification/loader.js +9 -2
- package/dist/modules/certification/manifest.js +83 -21
- package/dist/modules/certification/runner.js +23 -13
- package/dist/modules/certification/scenarios.js +20 -20
- package/dist/modules/certification/syntax-scenarios.js +1 -2
- package/dist/modules/context/chunk-query.js +11 -9
- package/dist/modules/context/fact-extractor.js +37 -39
- package/dist/modules/context/index.js +1 -0
- package/dist/modules/context/manager.js +106 -80
- package/dist/modules/critic/client.js +176 -0
- package/dist/modules/critic/evidence.js +81 -0
- package/dist/modules/critic/provider.js +45 -0
- package/dist/modules/critic/tools.js +78 -0
- package/dist/modules/critic/types.js +1 -0
- package/dist/modules/execution/audit-runners.js +28 -34
- package/dist/modules/execution/auditor.js +53 -49
- package/dist/modules/execution/execution-plugin.js +142 -102
- package/dist/modules/execution/index.js +1 -1
- package/dist/modules/execution/input-from.js +37 -13
- package/dist/modules/execution/module.js +368 -191
- package/dist/modules/execution/moe-executor.js +53 -26
- package/dist/modules/execution/plan-actions.js +320 -202
- package/dist/modules/execution/plan-checks.js +35 -0
- package/dist/modules/execution/plan-coverage.js +36 -33
- package/dist/modules/execution/plan-steps.js +11 -3
- package/dist/modules/execution/plan-store.js +83 -17
- package/dist/modules/execution/plan-tool.js +89 -35
- package/dist/modules/execution/plan-validator.js +30 -10
- package/dist/modules/execution/planner.js +22 -13
- package/dist/modules/execution/stuck-detector.js +196 -93
- package/dist/modules/execution/tracker.js +22 -8
- package/dist/modules/execution/verifier.js +69 -48
- package/dist/modules/execution/windows-commands.js +12 -12
- package/dist/modules/hallucination/artifact-claim.js +93 -0
- package/dist/modules/hallucination/confidence.js +13 -11
- package/dist/modules/hallucination/consistency.js +10 -2
- package/dist/modules/hallucination/detector.js +10 -5
- package/dist/modules/hallucination/factual.js +43 -26
- package/dist/modules/hallucination/index.js +1 -0
- package/dist/modules/hallucination/js-identifiers.js +44 -45
- package/dist/modules/hallucination/llm-judge.js +17 -12
- package/dist/modules/hallucination/success-claim.js +59 -0
- package/dist/modules/indexer/cache.js +52 -4
- package/dist/modules/indexer/index.js +1 -0
- package/dist/modules/indexer/map-command.js +2 -4
- package/dist/modules/indexer/map-select.js +16 -16
- package/dist/modules/indexer/module.js +47 -12
- package/dist/modules/indexer/project-profile.js +8 -7
- package/dist/modules/indexer/symbols.js +15 -15
- package/dist/modules/indexer/walker.js +159 -29
- package/dist/modules/lsp/check-tool.js +7 -5
- package/dist/modules/lsp/client.js +39 -39
- package/dist/modules/lsp/command.js +17 -24
- package/dist/modules/lsp/config.js +12 -11
- package/dist/modules/lsp/index.js +1 -0
- package/dist/modules/lsp/module.js +48 -46
- package/dist/modules/lsp/probe.js +13 -14
- package/dist/modules/lsp/project-root.js +14 -17
- package/dist/modules/lsp/startup-check.js +18 -16
- package/dist/modules/mcp/client.js +59 -62
- package/dist/modules/mcp/index.js +1 -0
- package/dist/modules/mcp/module.js +66 -37
- package/dist/modules/mcp/registry.js +5 -0
- package/dist/modules/memory/index.js +1 -0
- package/dist/modules/memory/module.js +12 -8
- package/dist/modules/memory/search.js +4 -1
- package/dist/modules/memory/store.js +40 -2
- package/dist/modules/onboarding/init.js +47 -0
- package/dist/modules/onboarding/meet.js +30 -0
- package/dist/modules/onboarding/mode.js +30 -0
- package/dist/modules/onboarding/prompts.js +43 -0
- package/dist/modules/pipelines/engine.js +10 -0
- package/dist/modules/pipelines/index.js +1 -0
- package/dist/modules/pipelines/parser.js +4 -1
- package/dist/modules/pipelines/template.js +4 -0
- package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
- package/dist/modules/plugins/builtin/notify.js +2 -0
- package/dist/modules/plugins/index.js +1 -0
- package/dist/modules/plugins/loader.js +18 -3
- package/dist/modules/plugins/manager.js +37 -17
- package/dist/modules/pricing/index.js +10 -11
- package/dist/modules/pricing/prices.js +12 -12
- package/dist/modules/processes/index.js +1 -0
- package/dist/modules/processes/kill-tree.js +27 -31
- package/dist/modules/processes/registry.js +44 -25
- package/dist/modules/processes/runner.js +4 -4
- package/dist/modules/providers/capabilities.js +28 -0
- package/dist/modules/providers/create.js +3 -4
- package/dist/modules/providers/factory.js +7 -7
- package/dist/modules/providers/fallback.js +12 -12
- package/dist/modules/providers/health.js +4 -4
- package/dist/modules/providers/manager.js +50 -19
- package/dist/modules/providers/naming.js +15 -0
- package/dist/modules/providers/preflight.js +71 -0
- package/dist/modules/providers/presets.js +39 -8
- package/dist/modules/providers/registry.js +7 -2
- package/dist/modules/reasoning/policy.js +8 -6
- package/dist/modules/reasoning/probe.js +30 -25
- package/dist/modules/security/audit-log.js +19 -36
- package/dist/modules/security/audit-notifier.js +35 -75
- package/dist/modules/security/command-validator.js +99 -51
- package/dist/modules/security/content-scanner.js +8 -8
- package/dist/modules/security/data-sanitizer.js +9 -16
- package/dist/modules/security/encryption.js +32 -52
- package/dist/modules/security/index.js +2 -1
- package/dist/modules/security/network-validator.js +120 -43
- package/dist/modules/security/path-validator.js +61 -46
- package/dist/modules/security/protected-paths.js +73 -0
- package/dist/modules/security/rate-limiter.js +17 -49
- package/dist/modules/security/security-policies.js +25 -57
- package/dist/modules/security/session-encryption.js +32 -71
- package/dist/modules/security/session-isolation.js +15 -28
- package/dist/modules/session/auto-name.js +63 -0
- package/dist/modules/session/export.js +98 -0
- package/dist/modules/session/index.js +1 -0
- package/dist/modules/session/manager.js +79 -28
- package/dist/modules/session/module.js +4 -3
- package/dist/modules/session/store.js +57 -20
- package/dist/modules/setup/answers.js +35 -0
- package/dist/modules/setup/apply.js +79 -0
- package/dist/modules/setup/discovery.js +72 -0
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/loader.js +9 -1
- package/dist/modules/skills/module.js +11 -0
- package/dist/modules/updater/changelog-reader.js +15 -16
- package/dist/modules/updater/checker.js +9 -4
- package/dist/modules/updater/dev-detect.js +7 -6
- package/dist/modules/updater/index.js +1 -0
- package/dist/modules/updater/module.js +17 -15
- package/dist/modules/user-profile/compressor.js +2 -0
- package/dist/modules/user-profile/index.js +1 -0
- package/dist/modules/user-profile/profile.js +10 -1
- package/dist/modules/webui/answer-api.js +29 -0
- package/dist/modules/webui/assets.js +50 -0
- package/dist/modules/webui/body.js +21 -0
- package/dist/modules/webui/commands-settings.js +209 -0
- package/dist/modules/webui/commands-shared.js +60 -0
- package/dist/modules/webui/commands.js +174 -0
- package/dist/modules/webui/config-api.js +134 -0
- package/dist/modules/webui/file-api.js +202 -0
- package/dist/modules/webui/forward.js +159 -0
- package/dist/modules/webui/history-api.js +112 -0
- package/dist/modules/webui/host-state.js +60 -0
- package/dist/modules/webui/i18n-api.js +9 -0
- package/dist/modules/webui/limits.js +6 -0
- package/dist/modules/webui/log-forward.js +20 -0
- package/dist/modules/webui/memory-commands.js +64 -0
- package/dist/modules/webui/model-cache.js +18 -0
- package/dist/modules/webui/module.js +148 -0
- package/dist/modules/webui/persist.js +24 -0
- package/dist/modules/webui/prompt-io.js +97 -0
- package/dist/modules/webui/providers-api.js +337 -0
- package/dist/modules/webui/providers-view.js +56 -0
- package/dist/modules/webui/reasoning-view.js +15 -0
- package/dist/modules/webui/run-agent.js +81 -0
- package/dist/modules/webui/server.js +284 -0
- package/dist/modules/webui/sessions-api.js +178 -0
- package/dist/modules/webui/settings-api.js +561 -0
- package/dist/modules/webui/setup-api.js +201 -0
- package/dist/modules/webui/state.js +74 -0
- package/dist/modules/webui/util.js +261 -0
- package/dist/output/bus.js +7 -2
- package/dist/output/channel.js +80 -28
- package/dist/output/format.js +2 -1
- package/dist/output/index.js +1 -0
- package/dist/output/json-sink.js +5 -3
- package/dist/output/machine.js +4 -3
- package/dist/output/session-sink.js +4 -4
- package/dist/tools/approve.js +4 -0
- package/dist/tools/attach-image.js +5 -4
- package/dist/tools/auto-fixer.js +26 -44
- package/dist/tools/auto-tags.js +83 -0
- package/dist/tools/bash.js +193 -116
- package/dist/tools/browser.js +76 -31
- package/dist/tools/chunk-query.js +14 -6
- package/dist/tools/create-dir.js +9 -5
- package/dist/tools/delete-file.js +9 -5
- package/dist/tools/download-file.js +32 -7
- package/dist/tools/edit-file.js +52 -14
- package/dist/tools/enable-tools.js +6 -6
- package/dist/tools/executor.js +132 -27
- package/dist/tools/file-info.js +3 -1
- package/dist/tools/filter-tools.js +3 -3
- package/dist/tools/glob-tool.js +4 -1
- package/dist/tools/grep-tool.js +13 -10
- package/dist/tools/hidden-tools-block.js +6 -6
- package/dist/tools/index.js +16 -8
- package/dist/tools/list-dir.js +4 -2
- package/dist/tools/load-skill.js +7 -0
- package/dist/tools/mcp-call.js +15 -4
- package/dist/tools/meet-done.js +14 -0
- package/dist/tools/move-file.js +14 -7
- package/dist/tools/path-utils.js +29 -29
- package/dist/tools/pipeline-run.js +29 -7
- package/dist/tools/preview.js +1 -1
- package/dist/tools/process-ids.js +31 -0
- package/dist/tools/process-kill.js +9 -16
- package/dist/tools/process-list.js +1 -0
- package/dist/tools/process-log.js +11 -16
- package/dist/tools/process-wait.js +63 -0
- package/dist/tools/prompt-io.js +4 -3
- package/dist/tools/question.js +172 -25
- package/dist/tools/read-file.js +55 -34
- package/dist/tools/recall.js +14 -8
- package/dist/tools/registry.js +6 -5
- package/dist/tools/remember.js +8 -4
- package/dist/tools/scope-request.js +11 -6
- package/dist/tools/search-history.js +5 -2
- package/dist/tools/session-info.js +2 -0
- package/dist/tools/set-thinking.js +8 -4
- package/dist/tools/subagent.js +59 -39
- package/dist/tools/syntax-validator.js +292 -90
- package/dist/tools/user-input.js +22 -18
- package/dist/tools/web-browse.js +9 -3
- package/dist/tools/web-fetch.js +12 -23
- package/dist/tools/web-search.js +7 -5
- package/dist/tools/write-file.js +45 -15
- package/dist/ui/action-log.js +13 -0
- package/dist/ui/box.js +4 -3
- package/dist/ui/colors.js +2 -0
- package/dist/ui/diff.js +6 -5
- package/dist/ui/index.js +1 -0
- package/dist/ui/line-editor.js +230 -122
- package/dist/ui/line-math.js +10 -2
- package/dist/ui/md-formatter.js +57 -37
- package/dist/ui/output.js +8 -3
- package/dist/ui/plan-view.js +21 -10
- package/dist/ui/renderer.js +393 -67
- package/dist/ui/spinner.js +16 -5
- package/dist/ui/table.js +15 -17
- package/dist/ui/theme.js +143 -0
- package/dist/utils/child-run.js +20 -0
- package/dist/utils/error.js +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/retry.js +2 -2
- package/dist/utils/truncate.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
/** Утилиты вывода тулов: лимиты, усечение, сводки ошибок. */
|
|
1
2
|
import { t } from "../../i18n/index";
|
|
2
|
-
import { TOOL_RESULT_MAX_TOKENS_RATIO, TOOL_RESULT_ABSOLUTE_MAX_CHARS, TOOL_ARGS_SUMMARY_MAX_CHARS, } from "./constants";
|
|
3
|
+
import { TOOL_RESULT_MAX_TOKENS_RATIO, TOOL_RESULT_ABSOLUTE_MAX_CHARS, TOOL_ARGS_SUMMARY_MAX_CHARS, TOOL_ARG_VALUE_MAX_CHARS, } from "./constants";
|
|
3
4
|
/**
|
|
4
5
|
* Макс. число символов результата тула при заданном остатке бюджета и
|
|
5
6
|
* признаке того, что тул сам ограничивает свой вывод.
|
|
@@ -22,27 +23,63 @@ export function truncateToolOutput(output, budget, currentTokens, bounded) {
|
|
|
22
23
|
return output;
|
|
23
24
|
const truncated = output.slice(0, maxChars);
|
|
24
25
|
const removedChars = output.length - maxChars;
|
|
25
|
-
return truncated
|
|
26
|
+
return `${truncated}\n\n${t("tool.truncated", { tokens: Math.ceil(removedChars / 2) })}`;
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* Компактная сигнатура аргументов тула для <system-summary>.
|
|
30
|
+
*
|
|
31
|
+
* Длинные строковые значения (content/new_string/text/…) сворачиваются до
|
|
32
|
+
* `…(N chars)`: их полный текст уже есть в assistant-сообщении с tool_calls
|
|
33
|
+
* и в role:"tool" результате, поэтому дублировать тело в сводке не нужно.
|
|
34
|
+
* Короткие скаляры (path/command/pattern/url) сохраняются как есть.
|
|
35
|
+
* Реализация не привязана к конкретным тулам — правило общее для любых args.
|
|
31
36
|
*/
|
|
32
37
|
export function summarizeToolArgs(args) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
if (args === undefined || args === null)
|
|
39
|
+
return "";
|
|
40
|
+
if (typeof args !== "object") {
|
|
41
|
+
const s = String(args);
|
|
42
|
+
return s ? ` (${s.slice(0, TOOL_ARGS_SUMMARY_MAX_CHARS)})` : "";
|
|
36
43
|
}
|
|
37
|
-
|
|
38
|
-
|
|
44
|
+
const parts = [];
|
|
45
|
+
for (const [key, value] of Object.entries(args)) {
|
|
46
|
+
let rendered;
|
|
47
|
+
if (typeof value === "string") {
|
|
48
|
+
rendered =
|
|
49
|
+
value.length > TOOL_ARG_VALUE_MAX_CHARS
|
|
50
|
+
? `${key}:…(${value.length} chars)`
|
|
51
|
+
: `${key}:${value}`;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
let json;
|
|
55
|
+
try {
|
|
56
|
+
json = JSON.stringify(value);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
json = String(value);
|
|
60
|
+
}
|
|
61
|
+
rendered =
|
|
62
|
+
json && json.length > TOOL_ARG_VALUE_MAX_CHARS ? `${key}:…` : `${key}:${json}`;
|
|
63
|
+
}
|
|
64
|
+
parts.push(rendered);
|
|
65
|
+
if (parts.join(", ").length > TOOL_ARGS_SUMMARY_MAX_CHARS)
|
|
66
|
+
break;
|
|
39
67
|
}
|
|
40
|
-
|
|
68
|
+
const s = parts.join(", ");
|
|
69
|
+
if (!s)
|
|
41
70
|
return "";
|
|
42
71
|
if (s.length <= TOOL_ARGS_SUMMARY_MAX_CHARS)
|
|
43
72
|
return ` (${s})`;
|
|
44
73
|
return ` (${s.slice(0, TOOL_ARGS_SUMMARY_MAX_CHARS)}…(${s.length} chars total))`;
|
|
45
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Является ли путь исполняемым shell-скриптом (обёрткой). Обобщённо, без
|
|
77
|
+
* привязки к языку проекта: используется, чтобы заметить попытку обойти
|
|
78
|
+
* security-блокировку через свежесозданный скрипт.
|
|
79
|
+
*/
|
|
80
|
+
export function isExecutableScriptPath(filePath) {
|
|
81
|
+
return /\.[a-z0-9]+$/i.test(filePath) && /\.(bat|cmd|sh|bash|ps1|zsh|fish)$/i.test(filePath);
|
|
82
|
+
}
|
|
46
83
|
/**
|
|
47
84
|
* Компактная пользовательская строка для упавшего тула.
|
|
48
85
|
*
|
|
@@ -60,3 +97,20 @@ export function compactToolError(output, max = 200) {
|
|
|
60
97
|
}
|
|
61
98
|
return "";
|
|
62
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Превращает model-facing падение тула в спокойную локализованную сводку.
|
|
102
|
+
*
|
|
103
|
+
* Отказы security/protected-path — мягкие гарды (агент должен спросить
|
|
104
|
+
* пользователя), поэтому рисуются варнингом, а сырые маркеры
|
|
105
|
+
* `[SECURITY BLOCKED]` / `[PROTECTED PATH]` в чат не попадают.
|
|
106
|
+
*/
|
|
107
|
+
export function toolFailureSummary(output, max = 200) {
|
|
108
|
+
const text = String(output ?? "");
|
|
109
|
+
if (text.includes("[SECURITY BLOCKED]")) {
|
|
110
|
+
return { text: t("tool.ui.security_blocked"), severity: "warn" };
|
|
111
|
+
}
|
|
112
|
+
if (text.includes("[PROTECTED PATH]")) {
|
|
113
|
+
return { text: t("tool.ui.protected_path"), severity: "warn" };
|
|
114
|
+
}
|
|
115
|
+
return { text: compactToolError(text, max), severity: "error" };
|
|
116
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Заглушка результата для незавершённого вызова. */
|
|
2
|
+
export const UNRESOLVED_TOOL_RESULT = "[Result unavailable]";
|
|
3
|
+
/**
|
|
4
|
+
* Приводит историю к валидному позиционному спариванию `assistant(tool_calls)`
|
|
5
|
+
* → непрерывный `tool`-блок. Не мутирует входные сообщения (кроме безопасного
|
|
6
|
+
* клонирования при merge) — возвращает новый массив.
|
|
7
|
+
* @param messages активная история; @returns нормализованная копия.
|
|
8
|
+
*/
|
|
9
|
+
export function repairToolCallPairing(messages) {
|
|
10
|
+
const out = [];
|
|
11
|
+
let pending = [];
|
|
12
|
+
// Закрывает незавершённые вызовы стабами, сохраняя их порядок.
|
|
13
|
+
const closePending = () => {
|
|
14
|
+
for (const call of pending) {
|
|
15
|
+
out.push({
|
|
16
|
+
role: "tool",
|
|
17
|
+
name: call.name,
|
|
18
|
+
content: UNRESOLVED_TOOL_RESULT,
|
|
19
|
+
tool_call_id: call.id,
|
|
20
|
+
success: false,
|
|
21
|
+
blocked: true,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
pending = [];
|
|
25
|
+
};
|
|
26
|
+
for (const msg of messages) {
|
|
27
|
+
if (msg.role === "assistant" && msg.tool_calls?.length) {
|
|
28
|
+
const last = out[out.length - 1];
|
|
29
|
+
if (last?.role === "assistant" && last.tool_calls?.length) {
|
|
30
|
+
// Подряд идущие assistant(tool_calls) — слить в один ход: провайдер
|
|
31
|
+
// видит второй assistant до ответов на первый и тоже падает.
|
|
32
|
+
const merged = {
|
|
33
|
+
...last,
|
|
34
|
+
tool_calls: [...last.tool_calls, ...msg.tool_calls],
|
|
35
|
+
};
|
|
36
|
+
out[out.length - 1] = merged;
|
|
37
|
+
pending = merged.tool_calls.map((tc) => ({ id: tc.id, name: tc.function.name }));
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
closePending();
|
|
41
|
+
out.push(msg);
|
|
42
|
+
pending = msg.tool_calls.map((tc) => ({ id: tc.id, name: tc.function.name }));
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (msg.role === "tool" && msg.tool_call_id) {
|
|
46
|
+
if (pending.some((c) => c.id === msg.tool_call_id)) {
|
|
47
|
+
out.push(msg);
|
|
48
|
+
pending = pending.filter((c) => c.id !== msg.tool_call_id);
|
|
49
|
+
}
|
|
50
|
+
// Осиротевший tool (нет объявленного вызова) — отбросить.
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Любая другая роль (user/system/assistant без tool_calls) разрывает блок:
|
|
54
|
+
// незавершённые вызовы закрываем ПЕРЕД ней.
|
|
55
|
+
closePending();
|
|
56
|
+
out.push(msg);
|
|
57
|
+
}
|
|
58
|
+
closePending();
|
|
59
|
+
return out;
|
|
60
|
+
}
|
package/dist/core/agent-moe.js
CHANGED
|
@@ -4,12 +4,13 @@ import { MoEExecutor } from "../modules/execution/moe-executor";
|
|
|
4
4
|
import { StepVerifier } from "../modules/execution/verifier";
|
|
5
5
|
import { newAbortError } from "../modules/execution/moe-executor";
|
|
6
6
|
import { t } from "../i18n/index";
|
|
7
|
+
/** Дефолтный лимит циклов re-plan MoE. */
|
|
7
8
|
export const DEFAULT_MOE_MAX_REPLAN_CYCLES = 3;
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Исполняет MoE-путь (Mixture of Experts): план → валидация → исполнение →
|
|
11
|
+
* верификация, с re-plan циклом по решению verifyAndMerge оркестратора.
|
|
12
|
+
* Возвращает сигнал фолбэка, когда MoE не может продолжить: вызывающий
|
|
13
|
+
* откатывается в одиночный цикл агента.
|
|
13
14
|
*/
|
|
14
15
|
export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
15
16
|
const { config, llmProvider, logger, toolExecutor, baseDir } = deps;
|
|
@@ -19,8 +20,8 @@ export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
|
19
20
|
if (signal?.aborted)
|
|
20
21
|
throw newAbortError();
|
|
21
22
|
};
|
|
22
|
-
//
|
|
23
|
-
//
|
|
23
|
+
// Однострочники оркестрации — machine-facing: в чат только при
|
|
24
|
+
// включённом verbose UI (config.ui.verbose).
|
|
24
25
|
const verbose = config.ui?.verbose === true;
|
|
25
26
|
const status = (message) => {
|
|
26
27
|
if (verbose)
|
|
@@ -40,17 +41,17 @@ export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
|
40
41
|
}, llmProvider, { getSessionId: () => sessionId });
|
|
41
42
|
}
|
|
42
43
|
if (!orchestrator.isEnabled()) {
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
logger.warn("
|
|
44
|
+
// Видно на дефолтном лог-уровне: включивший moe.enabled должен понимать,
|
|
45
|
+
// почему MoE не стартовал (нет orchestrator.model).
|
|
46
|
+
logger.warn(t("moe.no_orchestrator"));
|
|
46
47
|
return fallback();
|
|
47
48
|
}
|
|
48
|
-
status("
|
|
49
|
+
status(t("moe.planning"));
|
|
49
50
|
onPhase?.("thinking");
|
|
50
51
|
const planResult = await orchestrator.plan(input, undefined, signal);
|
|
51
52
|
onPhase?.("done");
|
|
52
53
|
if ("error" in planResult) {
|
|
53
|
-
logger.warn(
|
|
54
|
+
logger.warn(t("moe.plan_failed", { error: planResult.error }));
|
|
54
55
|
emit("moe_plan", { status: "error", error: planResult.error });
|
|
55
56
|
return fallback();
|
|
56
57
|
}
|
|
@@ -66,30 +67,30 @@ export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
|
66
67
|
for (let cycle = 1; cycle <= maxCycles; cycle++) {
|
|
67
68
|
ensureNotAborted();
|
|
68
69
|
if (cycle > 1) {
|
|
69
|
-
status(t("moe.replan_started", { cycle, max: maxCycles })
|
|
70
|
+
status(`${t("moe.replan_started", { cycle, max: maxCycles })}\n`);
|
|
70
71
|
emit("moe_replan", {
|
|
71
72
|
cycle,
|
|
72
73
|
title: currentPlan.title,
|
|
73
74
|
subtaskIds: currentPlan.subtasks.map((s) => s.id),
|
|
74
75
|
});
|
|
75
76
|
}
|
|
76
|
-
//
|
|
77
|
-
//
|
|
77
|
+
// Валидируем каждый план до исполнения — LLM-плану не доверяем никогда,
|
|
78
|
+
// включая re-plan от verifyAndMerge.
|
|
78
79
|
const validation = validatePlan(currentPlan, config);
|
|
79
80
|
if (!validation.valid) {
|
|
80
81
|
const applied = applyAutoFixes(currentPlan, validation.autoFixes);
|
|
81
82
|
const retry = validatePlan(applied, config);
|
|
82
83
|
if (!retry.valid) {
|
|
83
|
-
logger.warn
|
|
84
|
+
logger.diagnostic("warn", `MoE plan validation failed: ${retry.errors.join("; ")}`);
|
|
84
85
|
if (cycle === 1) {
|
|
85
|
-
status(
|
|
86
|
+
status(t("moe.plan_fallback"));
|
|
86
87
|
return fallback();
|
|
87
88
|
}
|
|
88
89
|
return partialFailure(mergedResults, retry.errors.join("; "));
|
|
89
90
|
}
|
|
90
91
|
currentPlan = applied;
|
|
91
92
|
if (validation.autoFixes.length > 0) {
|
|
92
|
-
status(
|
|
93
|
+
status(t("moe.plan_autofixed", { count: String(validation.autoFixes.length) }));
|
|
93
94
|
}
|
|
94
95
|
}
|
|
95
96
|
const executor = deps.executorOverride ??
|
|
@@ -106,20 +107,20 @@ export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
|
106
107
|
onScopeRequest: async (subtaskId, req) => {
|
|
107
108
|
const decision = await orchestrator.resolveScopeRequest(subtaskId, req, signal);
|
|
108
109
|
if (decision.action === "approve") {
|
|
109
|
-
status(t("moe.scope_approved", {
|
|
110
|
+
status(`${t("moe.scope_approved", {
|
|
110
111
|
subtask: subtaskId,
|
|
111
112
|
files: [...decision.write, ...decision.read].join(", "),
|
|
112
|
-
})
|
|
113
|
+
})}\n`);
|
|
113
114
|
}
|
|
114
115
|
else {
|
|
115
|
-
status(t("moe.scope_rejected", { subtask: subtaskId })
|
|
116
|
+
status(`${t("moe.scope_rejected", { subtask: subtaskId })}\n`);
|
|
116
117
|
}
|
|
117
118
|
return decision;
|
|
118
119
|
},
|
|
119
120
|
});
|
|
120
|
-
status(t("moe.executing", { count: String(currentPlan.subtasks.length), cycle: String(cycle) })
|
|
121
|
-
//
|
|
122
|
-
//
|
|
121
|
+
status(`${t("moe.executing", { count: String(currentPlan.subtasks.length), cycle: String(cycle) })}\n`);
|
|
122
|
+
// Селективный re-plan (Plan 5.1): успешные сабтаски прошлого цикла
|
|
123
|
+
// переносятся — переисполняются только упавшие/новые.
|
|
123
124
|
const skipIds = new Set();
|
|
124
125
|
const carriedResults = [];
|
|
125
126
|
for (const s of currentPlan.subtasks) {
|
|
@@ -198,7 +199,7 @@ export async function runWithMoE(deps, input, fallback, opts = {}) {
|
|
|
198
199
|
return buildFinalResult(mergedResults, verification.success, verifyResult);
|
|
199
200
|
}
|
|
200
201
|
if (!verifyResult.plan || !Array.isArray(verifyResult.plan.subtasks)) {
|
|
201
|
-
//
|
|
202
|
+
// Верификатор просил re-plan, но годного не дал — останавливаемся честно.
|
|
202
203
|
return partialFailure(mergedResults, verifyResult.explanation || "re-plan requested but no plan returned");
|
|
203
204
|
}
|
|
204
205
|
currentPlan = verifyResult.plan;
|