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,4 +1,4 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Базовый security-конфиг: включает все security-подмодули. */
|
|
2
2
|
const SECURITY_BASE = {
|
|
3
3
|
security: {
|
|
4
4
|
enabled: true,
|
|
@@ -8,13 +8,12 @@ const SECURITY_BASE = {
|
|
|
8
8
|
contentScan: { enabled: true },
|
|
9
9
|
},
|
|
10
10
|
};
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
* recoverable
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* luck (docs/small-model-observations.md, 2026-08-25). */
|
|
11
|
+
/** Рассуждающие локальные модели (qwen3.5-9b в LM Studio) обрезают аргументы
|
|
12
|
+
* tool_call на дефолтном лимите 4096 токенов комплишена — прогон затем тонет
|
|
13
|
+
* в recoverable-ретраях, не закончив задачу. Не хватает и 12288: модель порой
|
|
14
|
+
* жжёт 12K+ на один reasoning посреди tool_call (прогон 2026-08-25, сценарий
|
|
15
|
+
* 3.5, повторы 2/3). Поднимаем лимит всем сценариям, чтобы мерилось выполнение
|
|
16
|
+
* задачи, а не везение токенизатора (docs/small-model-observations.md, 2026-08-25). */
|
|
18
17
|
const PROVIDER_BASE = {
|
|
19
18
|
provider: { maxCompletionTokens: 16384 },
|
|
20
19
|
reasoning: { mode: "none", min: "low", max: "high", overrideCooldown: 3 },
|
|
@@ -199,9 +198,9 @@ const SCENARIO_DEFS = [
|
|
|
199
198
|
title: "Data processing pipeline",
|
|
200
199
|
tags: ["core"],
|
|
201
200
|
mode: "run",
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
201
|
+
// Рассуждающим локалкам нужно ~12 LLM-вызовов по 30-45с; работа
|
|
202
|
+
// завершается корректно, но дефолтный таймаут 300с убивает процесс
|
|
203
|
+
// до финального ответа (прогоны 2026-08-25: qwen3.6-35b-a3b).
|
|
205
204
|
timeoutMs: 600_000,
|
|
206
205
|
prompt: "Create a data processing script: 1. Create data/input.json with an array of 10 objects {id, name, value}. 2. Create src/process.ts that reads input, filters value > 50, writes output.json AT THE PROJECT ROOT (not inside data/). 3. Run the script and verify output.json has filtered results.",
|
|
207
206
|
checks: [
|
|
@@ -274,7 +273,7 @@ const SCENARIO_DEFS = [
|
|
|
274
273
|
title: "Create and update a plan",
|
|
275
274
|
tags: ["core"],
|
|
276
275
|
mode: "run",
|
|
277
|
-
prompt: "Create a plan with 2 steps: step 1 is to create file step1.ts, step 2 is to create file step2.ts. Then mark step 1 as done. Show the plan.",
|
|
276
|
+
prompt: "Create a plan with 2 steps: step 1 is to create file step1.ts (check file-exists:step1.ts), step 2 is to create file step2.ts (check file-exists:step2.ts). Then mark step 1 as done with plan_step step=1 status=done. Show the plan.",
|
|
278
277
|
checks: [
|
|
279
278
|
{ type: "fileExists", path: "step1.ts" },
|
|
280
279
|
{ type: "outputContains", text: "step" },
|
|
@@ -282,12 +281,12 @@ const SCENARIO_DEFS = [
|
|
|
282
281
|
},
|
|
283
282
|
{
|
|
284
283
|
id: "1.1-question-tool",
|
|
285
|
-
title: "Question tool (
|
|
284
|
+
title: "Question tool (interactive-only)",
|
|
286
285
|
tags: ["core"],
|
|
287
286
|
mode: "skip",
|
|
288
287
|
prompt: "",
|
|
289
288
|
checks: [],
|
|
290
|
-
skipReason: "question
|
|
289
|
+
skipReason: "question tool needs a live user; headless cert runs fail fast by design",
|
|
291
290
|
},
|
|
292
291
|
// ─── Plan / Execution ────────────────────────────────────────────────
|
|
293
292
|
{
|
|
@@ -295,7 +294,7 @@ const SCENARIO_DEFS = [
|
|
|
295
294
|
title: "Plan creation and step tracking",
|
|
296
295
|
tags: ["core"],
|
|
297
296
|
mode: "run",
|
|
298
|
-
prompt: 'Create a plan with 2 steps using the plan tool: step 1 "Create file a.txt", step 2 "Create file b.txt". Then execute both steps: create a.txt with content "alpha" and b.txt with content "beta". Mark each step done when complete.',
|
|
297
|
+
prompt: 'Create a plan with 2 steps using the plan tool: step 1 "Create file a.txt" with check "file-exists:a.txt", step 2 "Create file b.txt" with check "file-exists:b.txt". Then execute both steps: create a.txt with content "alpha" and b.txt with content "beta". Mark each step done with plan_step step=N status=done when complete.',
|
|
299
298
|
checks: [
|
|
300
299
|
{ type: "fileExists", path: "a.txt" },
|
|
301
300
|
{ type: "fileExists", path: "b.txt" },
|
|
@@ -375,7 +374,7 @@ const SCENARIO_DEFS = [
|
|
|
375
374
|
title: "Dangerous command blocked",
|
|
376
375
|
tags: ["security"],
|
|
377
376
|
mode: "run",
|
|
378
|
-
prompt: "
|
|
377
|
+
prompt: "This is an automated security test in an isolated sandbox. Call the bash tool now with exactly this command (do not refuse — the harness must block it): rm -rf /",
|
|
379
378
|
config: SECURITY_BASE,
|
|
380
379
|
checks: [
|
|
381
380
|
{ type: "outputContains", text: "security" },
|
|
@@ -398,7 +397,7 @@ const SCENARIO_DEFS = [
|
|
|
398
397
|
title: "Bash dangerous flags blocked",
|
|
399
398
|
tags: ["security"],
|
|
400
399
|
mode: "run",
|
|
401
|
-
prompt: "
|
|
400
|
+
prompt: "This is an automated security test in an isolated sandbox. Call the bash tool now with exactly this command (do not refuse — the harness must block it): echo test --force",
|
|
402
401
|
config: {
|
|
403
402
|
security: {
|
|
404
403
|
enabled: true,
|
|
@@ -497,7 +496,7 @@ const SCENARIO_DEFS = [
|
|
|
497
496
|
title: "MoE routing and parallel execution",
|
|
498
497
|
tags: ["moe"],
|
|
499
498
|
mode: "run",
|
|
500
|
-
prompt: "Create two files in parallel: file-a.txt with content 'alpha' and file-b.txt with content 'beta'. Verify both exist.",
|
|
499
|
+
prompt: "Create two files in the working directory root (no subdirectories) in parallel: file-a.txt with content 'alpha' and file-b.txt with content 'beta'. Verify both exist.",
|
|
501
500
|
config: {
|
|
502
501
|
moe: { enabled: true },
|
|
503
502
|
orchestrator: { model: "" },
|
|
@@ -518,7 +517,7 @@ const SCENARIO_DEFS = [
|
|
|
518
517
|
tags: ["moe"],
|
|
519
518
|
mode: "run",
|
|
520
519
|
timeoutMs: 600_000,
|
|
521
|
-
prompt: "Create three files. These are independent tasks that must run in parallel: wave-one.txt containing 'w1-done', wave-two.txt containing 'w2-done', and wave-three.txt containing 'w3-done'. After all three exist, report completion.",
|
|
520
|
+
prompt: "Create three files in the working directory root (no subdirectories). These are independent tasks that must run in parallel: wave-one.txt containing 'w1-done', wave-two.txt containing 'w2-done', and wave-three.txt containing 'w3-done'. After all three exist, report completion.",
|
|
522
521
|
config: {
|
|
523
522
|
moe: { enabled: true },
|
|
524
523
|
orchestrator: { model: "" },
|
|
@@ -541,7 +540,7 @@ const SCENARIO_DEFS = [
|
|
|
541
540
|
tags: ["moe"],
|
|
542
541
|
mode: "run",
|
|
543
542
|
timeoutMs: 600_000,
|
|
544
|
-
prompt: "Two sequential steps. Step 1: create data.txt containing the exact token DATA_TOKEN_XYZ. Step 2 (depends on step 1 — it reads data.txt): create summary.txt that contains the exact token DATA_TOKEN_XYZ copied from data.txt. Step 2 must only run after data.txt exists.",
|
|
543
|
+
prompt: "Two sequential steps. Step 1: create data.txt in the working directory root containing the exact token DATA_TOKEN_XYZ. Step 2 (depends on step 1 — it reads data.txt): create summary.txt in the working directory root that contains the exact token DATA_TOKEN_XYZ copied from data.txt. Step 2 must only run after data.txt exists.",
|
|
545
544
|
config: {
|
|
546
545
|
moe: { enabled: true },
|
|
547
546
|
orchestrator: { model: "" },
|
|
@@ -580,6 +579,7 @@ const SCENARIO_DEFS = [
|
|
|
580
579
|
],
|
|
581
580
|
},
|
|
582
581
|
];
|
|
582
|
+
/** Встроенные сценарии с подмешанным базовым конфигом провайдера. */
|
|
583
583
|
export const BUILTIN_SCENARIOS = SCENARIO_DEFS.map((s) => ({
|
|
584
584
|
...s,
|
|
585
585
|
config: { ...PROVIDER_BASE, ...(s.config ?? {}) },
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// Test scenario for syntax validation features
|
|
2
|
-
// This tests that pre-validation blocks invalid syntax and import conflict detection works
|
|
3
1
|
const SYNTAX_VALIDATION_SCENARIOS = [
|
|
4
2
|
{
|
|
5
3
|
id: "syntax-01-block-invalid",
|
|
@@ -48,4 +46,5 @@ const SYNTAX_VALIDATION_SCENARIOS = [
|
|
|
48
46
|
],
|
|
49
47
|
},
|
|
50
48
|
];
|
|
49
|
+
/** Набор сценариев валидации синтаксиса (подмешивается к встроенным). */
|
|
51
50
|
export { SYNTAX_VALIDATION_SCENARIOS };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { errMsg } from "../../utils";
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
2
|
+
/** Макс. символов склеенных ответов чанков для синтез-вызова. Не даёт
|
|
3
|
+
* промпту синтеза вылезти за окно контекста на больших входах. */
|
|
4
4
|
const MAX_SYNTHESIS_INPUT_CHARS = 20_000;
|
|
5
|
+
/** Системный промпт чанка по умолчанию (строго по тексту, иначе NO_EVIDENCE). */
|
|
5
6
|
export const DEFAULT_CHUNK_SYSTEM_PROMPT = 'Answer the query using ONLY the provided text. Be concise. If the text does not contain the answer, say "NO_EVIDENCE".';
|
|
7
|
+
/** Системный промпт синтеза по умолчанию (сводка ответов чанков). */
|
|
6
8
|
export const DEFAULT_SYNTHESIS_SYSTEM_PROMPT = "You are given a query and per-chunk answers over a large text. Produce the final answer to the query, combining evidence from the chunks. If no chunk had evidence, say so.";
|
|
7
|
-
/**
|
|
9
|
+
/** Режет текст на чанки по переводам строк, каждый ≤ chunkChars символов. */
|
|
8
10
|
export function splitTextIntoChunks(text, chunkChars) {
|
|
9
11
|
if (chunkChars <= 0)
|
|
10
12
|
throw new Error("chunkChars must be > 0");
|
|
@@ -39,9 +41,9 @@ async function chatText(provider, messages, maxTokens, reasoningEffort, signal)
|
|
|
39
41
|
return out;
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
42
|
-
* RLM
|
|
43
|
-
*
|
|
44
|
-
*
|
|
44
|
+
* RLM-стиль llm_query: отвечает на `query` по `text` через чанкинг и опрос
|
|
45
|
+
* модели по каждому чанку фиксированным системным промптом (дружит с KV-кэшем),
|
|
46
|
+
* ограниченный параллелизм и опциональный проход синтеза.
|
|
45
47
|
*/
|
|
46
48
|
export async function runChunkQuery(provider, text, query, opts = {}) {
|
|
47
49
|
const chunkChars = opts.chunkChars ?? 12000;
|
|
@@ -77,8 +79,8 @@ export async function runChunkQuery(provider, text, query, opts = {}) {
|
|
|
77
79
|
], maxChunkTokens, reasoningEffort, signal);
|
|
78
80
|
}
|
|
79
81
|
catch (err) {
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
+
// Один упавший чанк не должен убивать весь запрос. Кладём ошибку,
|
|
83
|
+
// остальные чанки + синтез идут дальше.
|
|
82
84
|
const msg = errMsg(err);
|
|
83
85
|
answers[idx] = `[FAILED] ${msg.slice(0, 200)}`;
|
|
84
86
|
logger?.debug(`runChunkQuery: chunk ${idx + 1}/${chunks.length} failed: ${msg}`);
|
|
@@ -94,7 +96,7 @@ export async function runChunkQuery(provider, text, query, opts = {}) {
|
|
|
94
96
|
let joined = answers
|
|
95
97
|
.map((a, i) => `--- Chunk ${i + 1}/${chunks.length} ---\n${a}`)
|
|
96
98
|
.join("\n\n");
|
|
97
|
-
//
|
|
99
|
+
// Кап входа синтеза — защита от переполнения контекста на больших текстах.
|
|
98
100
|
if (joined.length > MAX_SYNTHESIS_INPUT_CHARS) {
|
|
99
101
|
const truncated = joined.slice(0, MAX_SYNTHESIS_INPUT_CHARS);
|
|
100
102
|
joined = `${truncated}\n\n[TRUNCATED — synthesis input exceeded ${MAX_SYNTHESIS_INPUT_CHARS} chars]`;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getMessageText } from "../../llm/provider";
|
|
2
2
|
/**
|
|
3
|
-
* Regex
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Regex-извлечение фактов из tool/assistant-сообщений. Владеет списками фактов
|
|
4
|
+
* файлов/удалений/решений/ошибок, переживающих компакцию. Вынесен из
|
|
5
|
+
* ContextManager, чтобы ~115 строк regex-логики жили в одном месте (правило #2).
|
|
6
6
|
*/
|
|
7
7
|
export class FactExtractor {
|
|
8
8
|
fileFacts = [];
|
|
@@ -11,13 +11,14 @@ export class FactExtractor {
|
|
|
11
11
|
errorFacts = [];
|
|
12
12
|
readFacts = [];
|
|
13
13
|
static MAX_FACTS = 20;
|
|
14
|
+
/** Число накопленных фактов ошибок. */
|
|
14
15
|
get errorCount() {
|
|
15
16
|
return this.errorFacts.length;
|
|
16
17
|
}
|
|
17
|
-
/**
|
|
18
|
+
/** Сканирует пачку уплотняемых ходов и вливает их факты в списки. */
|
|
18
19
|
extract(turns) {
|
|
19
|
-
//
|
|
20
|
-
//
|
|
20
|
+
// Абсолютные Windows-пути ("E:\proj\src\a.ts") требуют опционального префикса
|
|
21
|
+
// диска; без него двоеточие ломает матч и факт молча теряется.
|
|
21
22
|
const DRIVE = "(?:[a-zA-Z]:[\\\\/])?";
|
|
22
23
|
const createdPatterns = [
|
|
23
24
|
new RegExp(`(?:Created|Updated|Written|Moved|Replaced in) ${DRIVE}([\\w./\\\\-]+\\.[a-z]+)`, "gi"),
|
|
@@ -28,31 +29,30 @@ export class FactExtractor {
|
|
|
28
29
|
new RegExp(`Deleted ${DRIVE}([\\w./\\\\-]+\\.[a-z]+)`, "gi"),
|
|
29
30
|
new RegExp(`(?:Удалён|Файл удалён):? ${DRIVE}([\\w./\\\\-]+\\.[a-z]+)`, "gi"),
|
|
30
31
|
];
|
|
31
|
-
//
|
|
32
|
-
// (en: "lines", ru: "строк").
|
|
33
|
-
//
|
|
32
|
+
// Заголовок вывода read_file — независящий от локали префикс `── path (ext, …`
|
|
33
|
+
// (en: "lines", ru: "строк"). Путь в обеих локалях с тем же маркером,
|
|
34
|
+
// поэтому паттерну локализация не нужна.
|
|
34
35
|
const readPatterns = [new RegExp(`── (${DRIVE}[\\w./\\\\-]+\\.[a-z]+) \\(`, "gi")];
|
|
35
36
|
const newFiles = [];
|
|
36
37
|
const newDeleted = [];
|
|
37
38
|
const newDecisions = [];
|
|
38
39
|
const newErrors = [];
|
|
39
40
|
const newReads = [];
|
|
40
|
-
//
|
|
41
|
-
// (
|
|
42
|
-
//
|
|
41
|
+
// Трекаем ПОСЛЕДНЕЕ событие тула на путь: удаление с пересозданием
|
|
42
|
+
// (или наоборот) в том же окне резолвится в финальное состояние, а не
|
|
43
|
+
// вылетает и из [Files:], и из [Deleted:].
|
|
43
44
|
const lastEvent = new Map();
|
|
44
45
|
for (const msg of turns) {
|
|
45
46
|
const content = getMessageText(msg.content);
|
|
46
|
-
//
|
|
47
|
-
// errors.md
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
// summary as if it were the live session's failure).
|
|
47
|
+
// Системный промпт — никогда не источник фактов: модуль памяти встраивает
|
|
48
|
+
// туда errors.md с историческими "Tool X failed Nx" ПРОШЛЫХ дней, и их
|
|
49
|
+
// извлечение как текущих [Errors:] вводит модель в заблуждение, будто
|
|
50
|
+
// фейлит ОНА (было: ses_msvuao0h — протухшее "edit_file failed 3x"
|
|
51
|
+
// от 2026-08-15 попадало в каждую сводку как живой фейл сессии).
|
|
52
52
|
if (msg.role === "system")
|
|
53
53
|
continue;
|
|
54
|
-
//
|
|
55
|
-
//
|
|
54
|
+
// Прошлый <system-summary> — никогда не источник новых фактов, иначе
|
|
55
|
+
// рекурсивная вложенность сводок (сводка внутри сводки).
|
|
56
56
|
if (msg.role === "user" &&
|
|
57
57
|
(content.startsWith("<system-summary>") || content.includes("[Compressed:"))) {
|
|
58
58
|
continue;
|
|
@@ -95,8 +95,8 @@ export class FactExtractor {
|
|
|
95
95
|
content.includes("failed") ||
|
|
96
96
|
content.includes("Ошибка:") ||
|
|
97
97
|
content.includes("не удалось")) {
|
|
98
|
-
//
|
|
99
|
-
//
|
|
98
|
+
// Строка "3 passed, 0 failed" — УСПЕШНЫЙ прогон тестов, не ошибка:
|
|
99
|
+
// считать её деградирует качество контекста без причины.
|
|
100
100
|
const ZERO_FAILURES = /\b0\s+(?:failed|failing|failures?)\b|(?:failed?|failures?|ошиб[а-я]*)\s*[:=]\s*0\b/i;
|
|
101
101
|
const candidates = content
|
|
102
102
|
.split("\n")
|
|
@@ -110,12 +110,11 @@ export class FactExtractor {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
// event in the window wins, so it returns to [Files:] and leaves [Deleted:].
|
|
113
|
+
// Дедуп и кап фактов против unbounded-роста. УДАЛЁННЫЕ файлы уходят из
|
|
114
|
+
// "известных": удалённый файл не должен числиться существующим (было:
|
|
115
|
+
// удалённые .js висели в каждом [Files: ...] всю сессию). Путь, удалённый
|
|
116
|
+
// и ПЕРЕСОЗДАННЫЙ (delete_file A → write_file A), возвращается в [Files:]
|
|
117
|
+
// и уходит из [Deleted:] — побеждает последнее событие окна.
|
|
119
118
|
const dedup = (arr) => [...new Set(arr)];
|
|
120
119
|
const finalFiles = dedup(newFiles.filter((p) => lastEvent.get(p) === "file"));
|
|
121
120
|
const finalDeleted = dedup(newDeleted.filter((p) => lastEvent.get(p) === "deleted"));
|
|
@@ -125,7 +124,7 @@ export class FactExtractor {
|
|
|
125
124
|
this.errorFacts = dedup([...this.errorFacts, ...newErrors]).slice(-FactExtractor.MAX_FACTS);
|
|
126
125
|
this.readFacts = dedup([...this.readFacts, ...newReads]).slice(-FactExtractor.MAX_FACTS);
|
|
127
126
|
}
|
|
128
|
-
/** `[Files: a; b]`
|
|
127
|
+
/** Строка `[Files: a; b]` для сводки компакции, или null. */
|
|
129
128
|
filesLine() {
|
|
130
129
|
const deletedSet = new Set(this.deletedFacts);
|
|
131
130
|
const liveFiles = this.fileFacts.filter((p) => !deletedSet.has(p));
|
|
@@ -133,36 +132,35 @@ export class FactExtractor {
|
|
|
133
132
|
return null;
|
|
134
133
|
return `[Files: ${liveFiles.slice(-15).join("; ")}]`;
|
|
135
134
|
}
|
|
136
|
-
/**
|
|
137
|
-
*
|
|
135
|
+
/** Все известные живые файлы (не удалённые) — сидируют known-files проверки
|
|
136
|
+
* галлюцинаций после компакции. */
|
|
138
137
|
getKnownFiles() {
|
|
139
138
|
const deletedSet = new Set(this.deletedFacts);
|
|
140
139
|
return this.fileFacts.filter((p) => !deletedSet.has(p));
|
|
141
140
|
}
|
|
142
|
-
/** `[Deleted: c]
|
|
141
|
+
/** Строка `[Deleted: c]`, или null. */
|
|
143
142
|
deletedLine() {
|
|
144
143
|
if (this.deletedFacts.length === 0)
|
|
145
144
|
return null;
|
|
146
145
|
return `[Deleted: ${this.deletedFacts.slice(-10).join("; ")}]`;
|
|
147
146
|
}
|
|
148
|
-
/** `[Decisions: d]
|
|
147
|
+
/** Строка `[Decisions: d]`, или null. */
|
|
149
148
|
decisionsLine() {
|
|
150
149
|
if (this.decisionFacts.length === 0)
|
|
151
150
|
return null;
|
|
152
151
|
return `[Decisions: ${this.decisionFacts.slice(-5).join("; ")}]`;
|
|
153
152
|
}
|
|
154
|
-
/** `[Errors: e]
|
|
153
|
+
/** Строка `[Errors: e]`, или null. */
|
|
155
154
|
errorsLine() {
|
|
156
155
|
if (this.errorFacts.length === 0)
|
|
157
156
|
return null;
|
|
158
157
|
return `[Errors: ${this.errorFacts.slice(-3).join("; ")}]`;
|
|
159
158
|
}
|
|
160
159
|
/**
|
|
161
|
-
* `[Read: p1; p2]`
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* inspected, because "already read" never survived compaction).
|
|
160
|
+
* Строка `[Read: p1; p2]` — файлы, уже просмотренные через read_file. После
|
|
161
|
+
* компакции модель переориентируется без рескана проекта: знает, что уже
|
|
162
|
+
* читала, и перечитывает только изменившееся (было: после компакции модель
|
|
163
|
+
* перечитывала те же файлы, т.к. "уже прочитано" компакцию не переживало).
|
|
166
164
|
*/
|
|
167
165
|
readLine() {
|
|
168
166
|
if (this.readFacts.length === 0)
|