micro-models-agent 2.11.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 +10 -0
- package/dist/assets/js/tabs.js +22 -3
- 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/index.js +37 -3
- 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 +273 -47
- 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
|
@@ -9,8 +9,9 @@ import { isTransientError } from "./transient-error";
|
|
|
9
9
|
import { sleep } from "../../utils/sleep";
|
|
10
10
|
import { backoffDelay } from "../../utils/retry";
|
|
11
11
|
import { errMsg } from "../../utils";
|
|
12
|
+
/** Макс. циклов расширения scope на подзадачу. */
|
|
12
13
|
export const MAX_SCOPE_EXPANSION_CYCLES = 2;
|
|
13
|
-
/**
|
|
14
|
+
/** Униформная ошибка прерывания для цикла агента (err.name === "AbortError"). */
|
|
14
15
|
export function newAbortError() {
|
|
15
16
|
const e = new Error(t("tool.aborted", { name: "MoE execution" }));
|
|
16
17
|
e.name = "AbortError";
|
|
@@ -28,10 +29,11 @@ function buildErrorDetail(stuckDetector, baseError, lastError) {
|
|
|
28
29
|
}
|
|
29
30
|
if (lastError) {
|
|
30
31
|
errorDetail +=
|
|
31
|
-
|
|
32
|
+
`\n\n${t("exec.skills_hint")}`;
|
|
32
33
|
}
|
|
33
34
|
return errorDetail;
|
|
34
35
|
}
|
|
36
|
+
/** Топосорт подзадач в волны готовых (зависимости удовлетворены). Пусто при цикле. */
|
|
35
37
|
export function topologicalSort(subtasks) {
|
|
36
38
|
const sorted = [];
|
|
37
39
|
const remaining = new Set(subtasks.map((s) => s.id));
|
|
@@ -95,6 +97,9 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
95
97
|
let lastError = "";
|
|
96
98
|
const stuckDetector = new StuckDetector(maxAttempts * 2, maxAttempts);
|
|
97
99
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
100
|
+
// Стабильный id между попытками: передача `attempt` ресетила состояние
|
|
101
|
+
// детектора на каждом ретрае (новый stepId → resetStepState), ошибки тулов
|
|
102
|
+
// не накапливались и exhausted-retries диагностика всегда пустовала.
|
|
98
103
|
stuckDetector.recordIteration(1);
|
|
99
104
|
try {
|
|
100
105
|
const allowedFiles = subtask.allowed_files || [];
|
|
@@ -143,15 +148,15 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
143
148
|
});
|
|
144
149
|
if (result.success) {
|
|
145
150
|
if (deps.config.subagent?.resultMode === "file") {
|
|
146
|
-
//
|
|
147
|
-
//
|
|
151
|
+
// Структурное поле из тула subagent — языконезависимо (парсинг
|
|
152
|
+
// локализованной строки вывода ломался под ru).
|
|
148
153
|
const abs = result.artifactPath ?? "";
|
|
149
154
|
if (abs) {
|
|
150
155
|
const store = new ArtifactStore({
|
|
151
156
|
baseDir: deps.baseDir,
|
|
152
157
|
sessionId: deps.sessionId || "moe",
|
|
153
158
|
});
|
|
154
|
-
const full = store.read(abs.split(/[\\/]/).pop() || ""); //
|
|
159
|
+
const full = store.read(abs.split(/[\\/]/).pop() || ""); // только имя файла, в jail root
|
|
155
160
|
deps.logger.debug(`MoE subtask "${subtask.id}" attached artifact ${abs} (${full?.length ?? 0} chars) to Router`);
|
|
156
161
|
return {
|
|
157
162
|
subtaskId: subtask.id,
|
|
@@ -172,7 +177,7 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
172
177
|
}
|
|
173
178
|
lastError = result.output;
|
|
174
179
|
stuckDetector.recordToolError("subagent", result.output);
|
|
175
|
-
//
|
|
180
|
+
// Инжектим actionable-хинты в промпт следующего ретрая
|
|
176
181
|
if (attempt < maxAttempts) {
|
|
177
182
|
const hints = stuckDetector.getActionableHints();
|
|
178
183
|
const recovery = stuckDetector.getRecoveryMessage();
|
|
@@ -186,10 +191,10 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
186
191
|
if (isTransientError(lastError) && attempt < maxAttempts) {
|
|
187
192
|
const delay = backoffDelay(attempt - 1, 1000, 8000);
|
|
188
193
|
deps.logger.debug(`Retrying subtask "${subtask.id}" (attempt ${attempt}/${maxAttempts}) after ${delay}ms: transient error`);
|
|
189
|
-
await sleep(delay);
|
|
194
|
+
await sleep(delay, deps.signal);
|
|
190
195
|
continue;
|
|
191
196
|
}
|
|
192
|
-
//
|
|
197
|
+
// Нетранзиентный фейл — собираем детальную ошибку с хинтами
|
|
193
198
|
const errorDetail = buildErrorDetail(stuckDetector, result.output, lastError);
|
|
194
199
|
return {
|
|
195
200
|
subtaskId: subtask.id,
|
|
@@ -204,15 +209,15 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
204
209
|
catch (e) {
|
|
205
210
|
lastError = e.message;
|
|
206
211
|
stuckDetector.recordToolError("subagent", e.message);
|
|
207
|
-
//
|
|
208
|
-
//
|
|
212
|
+
// Прерывание юзера (Esc) — НИКОГДА не транзиент: пробрасываем сразу, чтобы
|
|
213
|
+
// барьер волны и цикл агента увидели abort вместо ретрая.
|
|
209
214
|
if (e?.name === "AbortError") {
|
|
210
215
|
throw e;
|
|
211
216
|
}
|
|
212
217
|
if (isTransientError(lastError) && attempt < maxAttempts) {
|
|
213
218
|
const delay = backoffDelay(attempt - 1, 1000, 8000);
|
|
214
219
|
deps.logger.debug(`Retrying subtask "${subtask.id}" (attempt ${attempt}/${maxAttempts}) after ${delay}ms: ${lastError}`);
|
|
215
|
-
await sleep(delay);
|
|
220
|
+
await sleep(delay, deps.signal);
|
|
216
221
|
continue;
|
|
217
222
|
}
|
|
218
223
|
const errorDetail = buildErrorDetail(stuckDetector, e.message, lastError);
|
|
@@ -226,7 +231,7 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
226
231
|
};
|
|
227
232
|
}
|
|
228
233
|
}
|
|
229
|
-
//
|
|
234
|
+
// Ретраи исчерпаны — собираем итоговый фейл
|
|
230
235
|
const stuckReason = stuckDetector.getStuckReason();
|
|
231
236
|
let finalError = lastError;
|
|
232
237
|
if (stuckReason) {
|
|
@@ -241,13 +246,14 @@ async function executeSubtask(subtask, deps, depResults, sharedContext, onUsage)
|
|
|
241
246
|
durationMs: Date.now() - startTime,
|
|
242
247
|
};
|
|
243
248
|
}
|
|
249
|
+
/** Исполнитель MoE-плана: волны, параллелизм, scope-ретраи, usage по тегам. */
|
|
244
250
|
export class MoEExecutor {
|
|
245
251
|
deps;
|
|
246
252
|
usageByTag = new Map();
|
|
247
253
|
constructor(deps) {
|
|
248
254
|
this.deps = deps;
|
|
249
255
|
}
|
|
250
|
-
/**
|
|
256
|
+
/** Агрегированный usage токенов по expert_tag всех исполненных подзадач. */
|
|
251
257
|
getUsageByTag() {
|
|
252
258
|
return Object.fromEntries(this.usageByTag);
|
|
253
259
|
}
|
|
@@ -264,6 +270,14 @@ export class MoEExecutor {
|
|
|
264
270
|
entry.subtasks += 1;
|
|
265
271
|
this.usageByTag.set(expertTag, entry);
|
|
266
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* Исполняет план волнами топосорта с капом параллелизма. Поддерживает
|
|
275
|
+
* селективный re-plan (skipIds + carriedResults). Abort (Esc) останавливает
|
|
276
|
+
* на барьере волны.
|
|
277
|
+
* @param opts.skipIds подзадачи, НЕ переисполняемые — их прошлые успешные
|
|
278
|
+
* результаты инжектятся как carriedResults, чтобы резолвились зависимости
|
|
279
|
+
* переисполняемых.
|
|
280
|
+
*/
|
|
267
281
|
async executePlan(plan, opts) {
|
|
268
282
|
const skipIds = opts?.skipIds;
|
|
269
283
|
const carried = opts?.carriedResults ?? [];
|
|
@@ -271,6 +285,12 @@ export class MoEExecutor {
|
|
|
271
285
|
const errors = [];
|
|
272
286
|
const warnings = [];
|
|
273
287
|
const subtasks = skipIds && skipIds.size > 0 ? plan.subtasks.filter((s) => !skipIds.has(s.id)) : plan.subtasks;
|
|
288
|
+
// Селективный re-plan, где все подзадачи уже успешны: исполнять нечего.
|
|
289
|
+
// Раньше проваливалось в topologicalSort([]) и репортилось bogus
|
|
290
|
+
// "possible cycle", сжигая оставшиеся re-plan циклы.
|
|
291
|
+
if (subtasks.length === 0) {
|
|
292
|
+
return { success: true, results, errors: [], warnings };
|
|
293
|
+
}
|
|
274
294
|
const waves = topologicalSort(subtasks);
|
|
275
295
|
if (waves.length === 0) {
|
|
276
296
|
return {
|
|
@@ -280,7 +300,7 @@ export class MoEExecutor {
|
|
|
280
300
|
warnings: [],
|
|
281
301
|
};
|
|
282
302
|
}
|
|
283
|
-
//
|
|
303
|
+
// Проверяем, что все подзадачи вошли — ловим молчаливые дропы от висячих зависимостей
|
|
284
304
|
const sortedCount = waves.flat().length;
|
|
285
305
|
if (sortedCount < subtasks.length) {
|
|
286
306
|
const missing = subtasks
|
|
@@ -298,7 +318,7 @@ export class MoEExecutor {
|
|
|
298
318
|
for (let waveIdx = 0; waveIdx < waves.length; waveIdx++) {
|
|
299
319
|
const wave = waves[waveIdx];
|
|
300
320
|
const depResults = new Map(results.map((r) => [r.subtaskId, r]));
|
|
301
|
-
//
|
|
321
|
+
// Кап конкурентных подзадач на волну (rateLimits.maxParallelTasks, по умолчанию 5).
|
|
302
322
|
const maxParallel = this.deps.config?.security?.rateLimits?.maxParallelTasks ?? 5;
|
|
303
323
|
let active = 0;
|
|
304
324
|
const waiters = [];
|
|
@@ -314,8 +334,8 @@ export class MoEExecutor {
|
|
|
314
334
|
const wavePromises = wave.map(async (subtask) => {
|
|
315
335
|
await acquire();
|
|
316
336
|
if (this.deps.signal?.aborted) {
|
|
317
|
-
//
|
|
318
|
-
//
|
|
337
|
+
// Проверяем после acquire: подзадачи, queued за летящей, не стартуют,
|
|
338
|
+
// если Esc нажат посреди волны.
|
|
319
339
|
release();
|
|
320
340
|
throw newAbortError();
|
|
321
341
|
}
|
|
@@ -359,8 +379,8 @@ export class MoEExecutor {
|
|
|
359
379
|
return result;
|
|
360
380
|
});
|
|
361
381
|
await Promise.all(wavePromises);
|
|
362
|
-
//
|
|
363
|
-
//
|
|
382
|
+
// Барьер волны: при прерывании встаём перед следующей волной, а не
|
|
383
|
+
// стартуем новых сабагентов после Esc.
|
|
364
384
|
if (this.deps.signal?.aborted)
|
|
365
385
|
throw newAbortError();
|
|
366
386
|
}
|
|
@@ -377,13 +397,17 @@ export class MoEExecutor {
|
|
|
377
397
|
};
|
|
378
398
|
}
|
|
379
399
|
/**
|
|
380
|
-
* Scope
|
|
381
|
-
*
|
|
382
|
-
*
|
|
383
|
-
*
|
|
400
|
+
* Scope-протокол (спек §Post-MVP): <scope-request> упавшего сабагента идёт
|
|
401
|
+
* роутеру; approve расширяет scope подзадачи и переисполняет ТОЛЬКО её,
|
|
402
|
+
* reject фейлит её (чинится полным re-plan). Расширение капировано, не
|
|
403
|
+
* автоматически.
|
|
384
404
|
*/
|
|
385
405
|
async resolveScopeAndRetry(subtask, failed, depResults, sharedContext) {
|
|
386
406
|
let current = failed;
|
|
407
|
+
// Расширение scope применяем к ЛОКАЛЬНОЙ копии: оригинальный объект плана
|
|
408
|
+
// остаётся неизменным для verifier/re-plan (иначе верификация видит scope,
|
|
409
|
+
// которого не было в утверждённом плане).
|
|
410
|
+
let scoped = subtask;
|
|
387
411
|
for (let cycle = 0; cycle < MAX_SCOPE_EXPANSION_CYCLES; cycle++) {
|
|
388
412
|
const req = current.scopeRequest;
|
|
389
413
|
if (!req)
|
|
@@ -396,10 +420,13 @@ export class MoEExecutor {
|
|
|
396
420
|
error: `${current.error}\nRouter rejected scope request for files: ${req.files.join(", ")}`,
|
|
397
421
|
};
|
|
398
422
|
}
|
|
399
|
-
|
|
400
|
-
|
|
423
|
+
scoped = {
|
|
424
|
+
...scoped,
|
|
425
|
+
allowed_files: uniq([...(scoped.allowed_files || []), ...decision.write]),
|
|
426
|
+
read_only_files: uniq([...(scoped.read_only_files || []), ...decision.read]),
|
|
427
|
+
};
|
|
401
428
|
this.deps.logger.info?.(`MoE: approved scope expansion for "${subtask.id}": +write [${decision.write.join(", ")}] +read [${decision.read.join(", ")}]`);
|
|
402
|
-
const retry = await executeSubtask(
|
|
429
|
+
const retry = await executeSubtask(scoped, this.deps, depResults, sharedContext, (tag, usage) => this.recordUsage(tag, usage));
|
|
403
430
|
if (retry.success || !retry.scopeRequest)
|
|
404
431
|
return retry;
|
|
405
432
|
current = retry;
|