micro-models-agent 2.16.1 → 2.17.2
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 +34 -0
- package/README.md +8 -3
- package/dist/assets/app.js +1 -314
- package/dist/assets/hljs.js +5 -1244
- package/dist/assets/index.html +11 -0
- package/dist/assets/js/api.js +1 -28
- package/dist/assets/js/core/menus.js +1 -0
- package/dist/assets/js/core/store/feed.js +1 -0
- package/dist/assets/js/core/store/index.js +1 -0
- package/dist/assets/js/core/store/session.js +1 -0
- package/dist/assets/js/core/store/settings.js +1 -0
- package/dist/assets/js/core/store/tabs.js +1 -0
- package/dist/assets/js/dialog.js +1 -105
- package/dist/assets/js/dom.js +1 -178
- package/dist/assets/js/feed/core.js +1 -0
- package/dist/assets/js/feed/history.js +1 -0
- package/dist/assets/js/feed/plan.js +1 -0
- package/dist/assets/js/feed/question.js +3 -0
- package/dist/assets/js/feed/sidebar.js +1 -0
- package/dist/assets/js/feed/stream.js +1 -0
- package/dist/assets/js/feed/turn.js +5 -0
- package/dist/assets/js/feed.js +1 -1250
- package/dist/assets/js/format.js +2 -122
- package/dist/assets/js/i18n.js +1 -46
- package/dist/assets/js/rail.js +1 -114
- package/dist/assets/js/session/cmdk.js +1 -0
- package/dist/assets/js/session/composer.js +1 -0
- package/dist/assets/js/session/sessions-menu.js +1 -0
- package/dist/assets/js/session/tabs.js +1 -0
- package/dist/assets/js/settings/controls.js +1 -0
- package/dist/assets/js/settings/editors.js +1 -0
- package/dist/assets/js/settings/form.js +1 -0
- package/dist/assets/js/settings/modal.js +1 -0
- package/dist/assets/js/settings/panels.js +1 -0
- package/dist/assets/js/settings/providers.js +1 -0
- package/dist/assets/js/settings/search.js +1 -0
- package/dist/assets/js/settings/subdialog.js +1 -0
- package/dist/assets/js/settings/write.js +1 -0
- package/dist/assets/js/settings.js +1 -1914
- package/dist/assets/js/sidebar/core.js +1 -0
- package/dist/assets/js/sidebar/lsp.js +2 -0
- package/dist/assets/js/sidebar/map.js +1 -0
- package/dist/assets/js/sidebar/state.js +1 -0
- package/dist/assets/js/sidebar/trace.js +5 -0
- package/dist/assets/js/sidebar.js +1 -705
- package/dist/assets/js/store.js +1 -82
- package/dist/assets/js/subdialog.js +1 -0
- package/dist/assets/md.js +1 -291
- package/dist/assets/setup.js +3 -816
- package/dist/assets/smd.js +29 -1665
- package/dist/assets/styles.css +1 -1598
- package/dist/certification/certifications.json +1 -494
- package/dist/i18n/en.json +1 -1851
- package/dist/i18n/ru.json +1 -1854
- package/dist/main.js +815 -55797
- package/dist/modules/browser/bridge-server.mjs +2 -252
- package/package.json +10 -5
- package/dist/assets/js/settings-controls.js +0 -452
- package/dist/assets/js/tabs.js +0 -867
- package/dist/cli/cache-line.js +0 -31
- package/dist/cli/command-suggest.js +0 -39
- package/dist/cli/commands.js +0 -781
- package/dist/cli/completer.js +0 -268
- package/dist/cli/index.js +0 -3
- package/dist/cli/json-payload.js +0 -32
- package/dist/cli/main.js +0 -346
- package/dist/cli/onboarding-commands.js +0 -126
- package/dist/cli/plugin-commands.js +0 -38
- package/dist/cli/relaunch.js +0 -40
- package/dist/cli/repl-commands-lsp.js +0 -75
- package/dist/cli/repl-commands-skills.js +0 -105
- package/dist/cli/repl-commands.js +0 -1218
- package/dist/cli/repl.js +0 -1238
- package/dist/cli/run-result.js +0 -38
- package/dist/cli/security-commands.js +0 -177
- package/dist/cli/setup-order.js +0 -6
- package/dist/cli/setup-prompt.js +0 -50
- package/dist/cli/setup.js +0 -161
- package/dist/cli/web-command.js +0 -98
- package/dist/config/budget.js +0 -48
- package/dist/config/config.js +0 -345
- package/dist/config/defaults.js +0 -197
- package/dist/config/domains.js +0 -135
- package/dist/config/env.js +0 -46
- package/dist/config/experts.js +0 -17
- package/dist/config/index.js +0 -5
- package/dist/config/paths.js +0 -56
- package/dist/config/redact.js +0 -44
- package/dist/config/registry-extra.js +0 -334
- package/dist/config/registry.js +0 -584
- package/dist/config/security.js +0 -212
- package/dist/config/timeouts.js +0 -74
- package/dist/config/types.js +0 -1
- package/dist/config/utils.js +0 -57
- package/dist/core/agent/artifact-progress.js +0 -59
- package/dist/core/agent/artifact-resolve.js +0 -79
- package/dist/core/agent/audit-gate.js +0 -53
- package/dist/core/agent/compaction.js +0 -89
- package/dist/core/agent/constants.js +0 -90
- package/dist/core/agent/context-log.js +0 -454
- package/dist/core/agent/context-renderer.js +0 -45
- package/dist/core/agent/critic-gate.js +0 -132
- package/dist/core/agent/hallucination-gate.js +0 -197
- package/dist/core/agent/loop-state.js +0 -68
- package/dist/core/agent/prefix-monitor.js +0 -101
- package/dist/core/agent/reasoning-resolver.js +0 -65
- package/dist/core/agent/token-tracker.js +0 -99
- package/dist/core/agent/tool-batch.js +0 -312
- package/dist/core/agent/tool-images.js +0 -18
- package/dist/core/agent/tool-output.js +0 -116
- package/dist/core/agent/tool-pairing.js +0 -60
- package/dist/core/agent-moe.js +0 -248
- package/dist/core/agent.js +0 -1299
- package/dist/core/bootstrap/agent-phase.js +0 -66
- package/dist/core/bootstrap/config-phase.js +0 -86
- package/dist/core/bootstrap/modules-phase.js +0 -269
- package/dist/core/bootstrap/provider-phase.js +0 -183
- package/dist/core/bootstrap/session-phase.js +0 -204
- package/dist/core/bootstrap/state.js +0 -94
- package/dist/core/bootstrap/workspace-phase.js +0 -115
- package/dist/core/bootstrap.js +0 -112
- package/dist/core/crash-handler.js +0 -62
- package/dist/core/environment.js +0 -224
- package/dist/core/host-plan.js +0 -43
- package/dist/core/host.js +0 -23
- package/dist/core/index.js +0 -3
- package/dist/core/prompt-builder.js +0 -95
- package/dist/core/prompt-overflow.js +0 -306
- package/dist/core/session-logger.js +0 -375
- package/dist/core/system-prompt.js +0 -117
- package/dist/core/types.js +0 -1
- package/dist/core/version.js +0 -28
- package/dist/core/web-host.js +0 -34
- package/dist/core/workspace.js +0 -80
- package/dist/i18n/index.js +0 -80
- package/dist/index.js +0 -30
- package/dist/llm/cache-usage.js +0 -76
- package/dist/llm/image-utils.js +0 -138
- package/dist/llm/index.js +0 -4
- package/dist/llm/llm-errors.js +0 -50
- package/dist/llm/model-loader.js +0 -86
- package/dist/llm/models-dev.js +0 -121
- package/dist/llm/openai-compat.js +0 -756
- package/dist/llm/orchestrator.js +0 -294
- package/dist/llm/provider-budget.js +0 -68
- package/dist/llm/provider-context.js +0 -233
- package/dist/llm/provider.js +0 -9
- package/dist/llm/response.js +0 -44
- package/dist/llm/stream-state.js +0 -26
- package/dist/llm/token-counter.js +0 -83
- package/dist/llm/types.js +0 -1
- package/dist/logger/app-logger.js +0 -212
- package/dist/logger/file-log.js +0 -160
- package/dist/logger/index.js +0 -2
- package/dist/migration/backup.js +0 -56
- package/dist/migration/detect.js +0 -61
- package/dist/migration/index.js +0 -3
- package/dist/modules/artifacts/store.js +0 -62
- package/dist/modules/browser/actions.js +0 -79
- package/dist/modules/browser/bridge-client.js +0 -203
- package/dist/modules/browser/bridge-path.js +0 -10
- package/dist/modules/browser/console-buffer.js +0 -37
- package/dist/modules/browser/cookie-store.js +0 -29
- package/dist/modules/browser/driver-types.js +0 -1
- package/dist/modules/browser/driver.js +0 -186
- package/dist/modules/browser/index.js +0 -9
- package/dist/modules/browser/module.js +0 -30
- package/dist/modules/browser/session.js +0 -322
- package/dist/modules/browser/snapshot.js +0 -154
- package/dist/modules/browser/types.js +0 -13
- package/dist/modules/certification/cli.js +0 -264
- package/dist/modules/certification/fact-checker.js +0 -90
- package/dist/modules/certification/loader.js +0 -127
- package/dist/modules/certification/manifest.js +0 -231
- package/dist/modules/certification/runner.js +0 -233
- package/dist/modules/certification/scenarios.js +0 -586
- package/dist/modules/certification/syntax-scenarios.js +0 -50
- package/dist/modules/certification/types.js +0 -1
- package/dist/modules/context/chunk-query.js +0 -122
- package/dist/modules/context/fact-extractor.js +0 -170
- package/dist/modules/context/history.js +0 -15
- package/dist/modules/context/index.js +0 -2
- package/dist/modules/context/manager.js +0 -482
- package/dist/modules/critic/client.js +0 -176
- package/dist/modules/critic/evidence.js +0 -81
- package/dist/modules/critic/provider.js +0 -45
- package/dist/modules/critic/tools.js +0 -78
- package/dist/modules/critic/types.js +0 -1
- package/dist/modules/execution/audit-runners.js +0 -206
- package/dist/modules/execution/auditor.js +0 -222
- package/dist/modules/execution/execution-plugin.js +0 -478
- package/dist/modules/execution/index.js +0 -8
- package/dist/modules/execution/input-from.js +0 -70
- package/dist/modules/execution/module.js +0 -891
- package/dist/modules/execution/moe-executor.js +0 -443
- package/dist/modules/execution/plan-actions.js +0 -642
- package/dist/modules/execution/plan-checks.js +0 -35
- package/dist/modules/execution/plan-coverage.js +0 -71
- package/dist/modules/execution/plan-persister.js +0 -46
- package/dist/modules/execution/plan-steps.js +0 -31
- package/dist/modules/execution/plan-store.js +0 -274
- package/dist/modules/execution/plan-tool.js +0 -249
- package/dist/modules/execution/plan-validator.js +0 -197
- package/dist/modules/execution/planner.js +0 -103
- package/dist/modules/execution/stuck-detector.js +0 -834
- package/dist/modules/execution/tracker.js +0 -92
- package/dist/modules/execution/transient-error.js +0 -30
- package/dist/modules/execution/types.js +0 -1
- package/dist/modules/execution/verifier.js +0 -343
- package/dist/modules/execution/windows-commands.js +0 -52
- package/dist/modules/hallucination/artifact-claim.js +0 -93
- package/dist/modules/hallucination/confidence.js +0 -81
- package/dist/modules/hallucination/consistency.js +0 -37
- package/dist/modules/hallucination/detector.js +0 -57
- package/dist/modules/hallucination/factual.js +0 -205
- package/dist/modules/hallucination/index.js +0 -6
- package/dist/modules/hallucination/js-identifiers.js +0 -261
- package/dist/modules/hallucination/llm-judge.js +0 -116
- package/dist/modules/hallucination/success-claim.js +0 -59
- package/dist/modules/index.js +0 -5
- package/dist/modules/indexer/cache.js +0 -88
- package/dist/modules/indexer/index.js +0 -4
- package/dist/modules/indexer/map-command.js +0 -33
- package/dist/modules/indexer/map-select.js +0 -87
- package/dist/modules/indexer/module.js +0 -293
- package/dist/modules/indexer/project-profile.js +0 -184
- package/dist/modules/indexer/symbols.js +0 -189
- package/dist/modules/indexer/walker.js +0 -285
- package/dist/modules/lsp/check-tool.js +0 -61
- package/dist/modules/lsp/client.js +0 -406
- package/dist/modules/lsp/command.js +0 -53
- package/dist/modules/lsp/config.js +0 -189
- package/dist/modules/lsp/index.js +0 -4
- package/dist/modules/lsp/module.js +0 -295
- package/dist/modules/lsp/probe.js +0 -86
- package/dist/modules/lsp/project-root.js +0 -69
- package/dist/modules/lsp/startup-check.js +0 -154
- package/dist/modules/lsp/types.js +0 -1
- package/dist/modules/mcp/client.js +0 -445
- package/dist/modules/mcp/index.js +0 -4
- package/dist/modules/mcp/module.js +0 -295
- package/dist/modules/mcp/registry.js +0 -20
- package/dist/modules/memory/index.js +0 -2
- package/dist/modules/memory/module.js +0 -101
- package/dist/modules/memory/search.js +0 -45
- package/dist/modules/memory/store.js +0 -107
- package/dist/modules/onboarding/init.js +0 -47
- package/dist/modules/onboarding/meet.js +0 -30
- package/dist/modules/onboarding/mode.js +0 -30
- package/dist/modules/onboarding/prompts.js +0 -43
- package/dist/modules/pipelines/engine.js +0 -70
- package/dist/modules/pipelines/index.js +0 -4
- package/dist/modules/pipelines/parser.js +0 -59
- package/dist/modules/pipelines/template.js +0 -18
- package/dist/modules/plugins/builtin/lint-on-write.js +0 -377
- package/dist/modules/plugins/builtin/notify.js +0 -11
- package/dist/modules/plugins/index.js +0 -2
- package/dist/modules/plugins/loader.js +0 -85
- package/dist/modules/plugins/manager.js +0 -244
- package/dist/modules/plugins/types.js +0 -1
- package/dist/modules/pricing/index.js +0 -70
- package/dist/modules/pricing/prices.js +0 -147
- package/dist/modules/processes/detect.js +0 -34
- package/dist/modules/processes/index.js +0 -4
- package/dist/modules/processes/kill-tree.js +0 -52
- package/dist/modules/processes/registry.js +0 -294
- package/dist/modules/processes/runner.js +0 -23
- package/dist/modules/providers/cache.js +0 -23
- package/dist/modules/providers/capabilities.js +0 -28
- package/dist/modules/providers/create.js +0 -21
- package/dist/modules/providers/factory.js +0 -28
- package/dist/modules/providers/fallback.js +0 -81
- package/dist/modules/providers/health.js +0 -47
- package/dist/modules/providers/index.js +0 -6
- package/dist/modules/providers/manager.js +0 -207
- package/dist/modules/providers/naming.js +0 -15
- package/dist/modules/providers/preflight.js +0 -71
- package/dist/modules/providers/presets.js +0 -232
- package/dist/modules/providers/registry.js +0 -27
- package/dist/modules/providers/types.js +0 -1
- package/dist/modules/reasoning/policy.js +0 -42
- package/dist/modules/reasoning/probe.js +0 -116
- package/dist/modules/registry.js +0 -48
- package/dist/modules/security/audit-log.js +0 -119
- package/dist/modules/security/audit-notifier.js +0 -267
- package/dist/modules/security/command-validator.js +0 -272
- package/dist/modules/security/content-scanner.js +0 -53
- package/dist/modules/security/data-sanitizer.js +0 -82
- package/dist/modules/security/encryption.js +0 -216
- package/dist/modules/security/index.js +0 -15
- package/dist/modules/security/network-validator.js +0 -236
- package/dist/modules/security/path-validator.js +0 -261
- package/dist/modules/security/protected-paths.js +0 -73
- package/dist/modules/security/rate-limiter.js +0 -98
- package/dist/modules/security/security-policies.js +0 -499
- package/dist/modules/security/session-encryption.js +0 -182
- package/dist/modules/security/session-isolation.js +0 -75
- package/dist/modules/session/auto-name.js +0 -63
- package/dist/modules/session/export.js +0 -98
- package/dist/modules/session/index.js +0 -4
- package/dist/modules/session/manager.js +0 -234
- package/dist/modules/session/module.js +0 -33
- package/dist/modules/session/store.js +0 -295
- package/dist/modules/session/types.js +0 -1
- package/dist/modules/setup/answers.js +0 -35
- package/dist/modules/setup/apply.js +0 -79
- package/dist/modules/setup/discovery.js +0 -72
- package/dist/modules/skills/index.js +0 -3
- package/dist/modules/skills/loader.js +0 -86
- package/dist/modules/skills/matcher.js +0 -27
- package/dist/modules/skills/module.js +0 -141
- package/dist/modules/types.js +0 -1
- package/dist/modules/updater/changelog-reader.js +0 -93
- package/dist/modules/updater/checker.js +0 -101
- package/dist/modules/updater/dev-detect.js +0 -18
- package/dist/modules/updater/index.js +0 -4
- package/dist/modules/updater/module.js +0 -129
- package/dist/modules/user-profile/compressor.js +0 -18
- package/dist/modules/user-profile/index.js +0 -2
- package/dist/modules/user-profile/profile.js +0 -77
- package/dist/modules/webui/answer-api.js +0 -29
- package/dist/modules/webui/assets.js +0 -50
- package/dist/modules/webui/body.js +0 -21
- package/dist/modules/webui/commands-settings.js +0 -209
- package/dist/modules/webui/commands-shared.js +0 -60
- package/dist/modules/webui/commands.js +0 -174
- package/dist/modules/webui/config-api.js +0 -134
- package/dist/modules/webui/file-api.js +0 -202
- package/dist/modules/webui/forward.js +0 -159
- package/dist/modules/webui/history-api.js +0 -112
- package/dist/modules/webui/host-state.js +0 -60
- package/dist/modules/webui/i18n-api.js +0 -9
- package/dist/modules/webui/limits.js +0 -6
- package/dist/modules/webui/log-forward.js +0 -20
- package/dist/modules/webui/memory-commands.js +0 -64
- package/dist/modules/webui/model-cache.js +0 -18
- package/dist/modules/webui/module.js +0 -148
- package/dist/modules/webui/persist.js +0 -24
- package/dist/modules/webui/prompt-io.js +0 -97
- package/dist/modules/webui/providers-api.js +0 -337
- package/dist/modules/webui/providers-view.js +0 -56
- package/dist/modules/webui/reasoning-view.js +0 -15
- package/dist/modules/webui/run-agent.js +0 -81
- package/dist/modules/webui/server.js +0 -284
- package/dist/modules/webui/sessions-api.js +0 -178
- package/dist/modules/webui/settings-api.js +0 -561
- package/dist/modules/webui/setup-api.js +0 -201
- package/dist/modules/webui/state.js +0 -74
- package/dist/modules/webui/util.js +0 -261
- package/dist/output/bus.js +0 -37
- package/dist/output/channel.js +0 -285
- package/dist/output/format.js +0 -15
- package/dist/output/index.js +0 -8
- package/dist/output/json-sink.js +0 -24
- package/dist/output/machine.js +0 -9
- package/dist/output/session-sink.js +0 -27
- package/dist/output/types.js +0 -1
- package/dist/tools/approve.js +0 -41
- package/dist/tools/attach-image.js +0 -102
- package/dist/tools/auto-fixer.js +0 -180
- package/dist/tools/auto-tags.js +0 -83
- package/dist/tools/bash.js +0 -649
- package/dist/tools/browser.js +0 -160
- package/dist/tools/chunk-query.js +0 -112
- package/dist/tools/create-dir.js +0 -60
- package/dist/tools/delete-file.js +0 -67
- package/dist/tools/download-file.js +0 -142
- package/dist/tools/edit-file.js +0 -136
- package/dist/tools/enable-tools.js +0 -59
- package/dist/tools/executor.js +0 -304
- package/dist/tools/file-info.js +0 -49
- package/dist/tools/filter-tools.js +0 -17
- package/dist/tools/glob-tool.js +0 -37
- package/dist/tools/grep-tool.js +0 -142
- package/dist/tools/hidden-tools-block.js +0 -37
- package/dist/tools/index.js +0 -88
- package/dist/tools/list-dir.js +0 -53
- package/dist/tools/load-skill.js +0 -51
- package/dist/tools/mcp-call.js +0 -80
- package/dist/tools/meet-done.js +0 -14
- package/dist/tools/move-file.js +0 -94
- package/dist/tools/path-utils.js +0 -108
- package/dist/tools/pipeline-run.js +0 -167
- package/dist/tools/preview.js +0 -2
- package/dist/tools/process-ids.js +0 -31
- package/dist/tools/process-kill.js +0 -33
- package/dist/tools/process-list.js +0 -38
- package/dist/tools/process-log.js +0 -49
- package/dist/tools/process-wait.js +0 -63
- package/dist/tools/prompt-io.js +0 -29
- package/dist/tools/question.js +0 -288
- package/dist/tools/read-file.js +0 -200
- package/dist/tools/recall.js +0 -124
- package/dist/tools/registry.js +0 -48
- package/dist/tools/remember.js +0 -72
- package/dist/tools/scope-check.js +0 -32
- package/dist/tools/scope-request.js +0 -96
- package/dist/tools/search-history.js +0 -88
- package/dist/tools/session-info.js +0 -46
- package/dist/tools/set-thinking.js +0 -75
- package/dist/tools/subagent.js +0 -257
- package/dist/tools/syntax-validator.js +0 -379
- package/dist/tools/types.js +0 -1
- package/dist/tools/user-input.js +0 -134
- package/dist/tools/web-browse.js +0 -93
- package/dist/tools/web-fetch.js +0 -108
- package/dist/tools/web-search.js +0 -107
- package/dist/tools/write-file.js +0 -128
- package/dist/ui/action-log.js +0 -13
- package/dist/ui/box.js +0 -78
- package/dist/ui/colors.js +0 -6
- package/dist/ui/diff.js +0 -189
- package/dist/ui/index.js +0 -7
- package/dist/ui/line-editor.js +0 -1083
- package/dist/ui/line-math.js +0 -98
- package/dist/ui/md-formatter.js +0 -322
- package/dist/ui/output.js +0 -19
- package/dist/ui/plan-view.js +0 -109
- package/dist/ui/renderer.js +0 -589
- package/dist/ui/spinner.js +0 -91
- package/dist/ui/table.js +0 -142
- package/dist/ui/theme.js +0 -143
- package/dist/utils/child-run.js +0 -20
- package/dist/utils/error.js +0 -4
- package/dist/utils/index.js +0 -6
- package/dist/utils/retry.js +0 -17
- package/dist/utils/sleep.js +0 -23
- package/dist/utils/truncate.js +0 -9
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Константы агентного цикла. Вынесены из agent.ts: без магических чисел,
|
|
3
|
-
* переиспользуются extracted-модулями, каждая константа несёт JSDoc-обоснование.
|
|
4
|
-
*/
|
|
5
|
-
/** Макс. доля бюджета истории под результат одного тула (по токенам). */
|
|
6
|
-
export const TOOL_RESULT_MAX_TOKENS_RATIO = 0.3;
|
|
7
|
-
/** Абсолютный потолок результата тула в символах. */
|
|
8
|
-
export const TOOL_RESULT_ABSOLUTE_MAX_CHARS = 15000;
|
|
9
|
-
/**
|
|
10
|
-
* Порог качества контекста, ниже которого включается принудительная
|
|
11
|
-
* компакция. См. FORCED_COMPACTION_COOLDOWN — без cooldown низкое
|
|
12
|
-
* качество ретриггерит компакцию на каждой итерации.
|
|
13
|
-
*/
|
|
14
|
-
export const QUALITY_TRIGGER_THRESHOLD = 40;
|
|
15
|
-
/**
|
|
16
|
-
* Макс. символов аргументов тула в <system-summary>. Не допускает
|
|
17
|
-
* дублирования `content` из write_file поверх role:"tool" сообщения,
|
|
18
|
-
* которое уже несёт результат.
|
|
19
|
-
*/
|
|
20
|
-
export const TOOL_ARGS_SUMMARY_MAX_CHARS = 240;
|
|
21
|
-
/**
|
|
22
|
-
* Макс. длина одного строкового значения аргумента в <system-summary>.
|
|
23
|
-
* Более длинные значения (content/new_string/text) заменяются на `…(N chars)`:
|
|
24
|
-
* их полный текст уже присутствует в assistant-сообщении с tool_calls и в
|
|
25
|
-
* role:"tool" результате, поэтому дублировать тело в сводке не нужно.
|
|
26
|
-
*/
|
|
27
|
-
export const TOOL_ARG_VALUE_MAX_CHARS = 48;
|
|
28
|
-
/**
|
|
29
|
-
* Мин. число итераций между принудительными компакциями по качеству.
|
|
30
|
-
* Без него компакция не может восстановить качество и выжигает весь
|
|
31
|
-
* бюджет на компактирование (наблюдалось: 56 компакций за ~28 минут).
|
|
32
|
-
*/
|
|
33
|
-
export const FORCED_COMPACTION_COOLDOWN = 3;
|
|
34
|
-
/** Макс. повторов при восстановимой ошибке LLM (например, токен-лимит). */
|
|
35
|
-
export const MAX_LLM_ERROR_RETRIES = 2;
|
|
36
|
-
/** Макс. повторов при вердикте халлюцинации "retry". */
|
|
37
|
-
export const MAX_HALLUCINATION_RETRIES = 3;
|
|
38
|
-
/**
|
|
39
|
-
* Макс. перепроверок заявления об успехе против свежих результатов тулов
|
|
40
|
-
* (success-claim check). Одна попытка: либо модель сверяется и правит
|
|
41
|
-
* формулировку, либо ответ принимается как есть (fail-open, не блок).
|
|
42
|
-
*/
|
|
43
|
-
export const MAX_CLAIM_CHECK_RETRIES = 1;
|
|
44
|
-
/** Порог подряд идущих неудач тулов до сообщения о восстановлении. */
|
|
45
|
-
export const MAX_CONSECUTIVE_TOOL_FAILURES = 5;
|
|
46
|
-
/**
|
|
47
|
-
* Порог подряд идущих ПОЛНОСТЬЮ провальных пакетов тулов (каждый вызов —
|
|
48
|
-
* неудача или tool-level блок вроде `[SECURITY BLOCKED]`) до honest-stop
|
|
49
|
-
* директивы. Ниже, чем MAX_CONSECUTIVE_TOOL_FAILURES: смешанные пакеты
|
|
50
|
-
* (успех + неудача) и успехи сбрасывают счётчик, поэтому срабатывание
|
|
51
|
-
* означает именно топтание без прогресса (наблюдалось: qwen3.5-9b перебирал
|
|
52
|
-
* python/python3/bun/pip/npx после двух блоков, не останавливаясь).
|
|
53
|
-
* Plugin-level блоки (`result.blocked`, guard-rails) в счётчик не входят —
|
|
54
|
-
* см. контракт ToolResult.blocked.
|
|
55
|
-
*/
|
|
56
|
-
export const MAX_CONSECUTIVE_FAILED_BATCHES = 4;
|
|
57
|
-
/**
|
|
58
|
-
* Жёсткая остановка retry-петли: столько полностью провальных пакетов подряд
|
|
59
|
-
* (директива honest-stop уже проигнорирована) — цикл прерывается с честной
|
|
60
|
-
* ошибкой вместо сжигания контекста. Зазор +2 к директиве даёт модели шанс
|
|
61
|
-
* остановиться самой или предложить честный ответ.
|
|
62
|
-
*/
|
|
63
|
-
export const HARD_STOP_FAILED_BATCHES = 6;
|
|
64
|
-
/**
|
|
65
|
-
* Мин. общих (не подряд идущих) неудач тула до записи правила в память.
|
|
66
|
-
* Фиксирует системные проблемы (ENOENT у LSP, сломанный конфиг), которые
|
|
67
|
-
* не всплывают по пути "5 подряд неудач".
|
|
68
|
-
*/
|
|
69
|
-
export const MIN_REPEATED_TOOL_FAILURES = 3;
|
|
70
|
-
/** Макс. повторов финального аудита. */
|
|
71
|
-
export const MAX_AUDIT_RETRIES = 3;
|
|
72
|
-
/** Макс. повторов пустого ответа. */
|
|
73
|
-
export const MAX_EMPTY_RESPONSE_RETRIES = 2;
|
|
74
|
-
/** Макс. повторных одинаковых тулов в режиме exit-on-complete. */
|
|
75
|
-
export const MAX_REPEATED_TOOL_CALLS = 2;
|
|
76
|
-
/**
|
|
77
|
-
* Макс. повторных одинаковых тулов в интерактивном режиме до жёсткой
|
|
78
|
-
* остановки. Выше, чем в exit-on-complete: сначала модель получает nudge
|
|
79
|
-
* (по одному разу на каждый повтор), и только потом цикл обрывается —
|
|
80
|
-
* без этого модель, игнорирующая подсказки, бесконечно повторяет один
|
|
81
|
-
* и тот же вызов (наблюдалось: session_info подряд после завершения задачи).
|
|
82
|
-
*/
|
|
83
|
-
export const MAX_REPEATED_TOOL_CALLS_INTERACTIVE = 5;
|
|
84
|
-
/**
|
|
85
|
-
* Порог цикла «перфекционизм»: столько правок одного файла (или запусков
|
|
86
|
-
* одной команды) за прогон, после которых цикл подталкивает модель закрыть
|
|
87
|
-
* задачу. Наблюдение ses_mthn3c2a: задача готова на итерации 13, модель ещё
|
|
88
|
-
* 20+ итераций микроредактировала один файл (edit → build → read → edit…).
|
|
89
|
-
*/
|
|
90
|
-
export const MUTATION_CYCLE_NUDGE_THRESHOLD = 5;
|
|
@@ -1,454 +0,0 @@
|
|
|
1
|
-
/** Git-подобный лог контекста LLM: snapshot'ы и diff между итерациями. */
|
|
2
|
-
/**
|
|
3
|
-
* Запись всего контекста, уходящего в LLM, в git-подобный diff-файл.
|
|
4
|
-
*
|
|
5
|
-
* Формат: snapshot 0 — полный контекст (каждая строка с "+", как новый файл в
|
|
6
|
-
* git); каждый следующий snapshot — построчный diff относительно предыдущего
|
|
7
|
-
* ("-" удалено, "+" добавлено). Секции канонического текста: [SYSTEM],
|
|
8
|
-
* [TOOLS], [HISTORY].
|
|
9
|
-
*
|
|
10
|
-
* Reasoning модели НЕ входит в контекст, отправляемый в LLM, поэтому он пишется
|
|
11
|
-
* отдельной аннотацией [OUTPUT] и в diff не участвует.
|
|
12
|
-
*
|
|
13
|
-
* Секреты редактируются общим sanitizeLogMessage (если redact=true).
|
|
14
|
-
*/
|
|
15
|
-
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "fs";
|
|
16
|
-
import { dirname } from "path";
|
|
17
|
-
/**
|
|
18
|
-
* Точечная редакция секретов для context-log.
|
|
19
|
-
*
|
|
20
|
-
* НЕ используем общий sanitizeLogMessage: его generic-паттерн (любая строка
|
|
21
|
-
* 30+ символов) и слишком широкий `pass` вырезают обычный текст контекста —
|
|
22
|
-
* имена скилов, "pass a file", `pass "background: true"` — что делает
|
|
23
|
-
* отладочный лог бесполезным. Здесь только безошибочно опознаваемые секреты.
|
|
24
|
-
*/
|
|
25
|
-
const SECRET_PATTERNS = [
|
|
26
|
-
[/\bsk-[A-Za-z0-9_-]{16,}\b/g, "sk-[REDACTED]"],
|
|
27
|
-
[/\bctx7sk-[A-Za-z0-9_-]{10,}\b/g, "ctx7sk-[REDACTED]"],
|
|
28
|
-
[/\bghp_[A-Za-z0-9]{20,}\b/g, "ghp_[REDACTED]"],
|
|
29
|
-
[/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g, "github_pat_[REDACTED]"],
|
|
30
|
-
[/\bAKIA[0-9A-Z]{16}\b/g, "AKIA[REDACTED]"],
|
|
31
|
-
[/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, "xox[REDACTED]"],
|
|
32
|
-
[/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{5,}\b/g, "[JWT REDACTED]"],
|
|
33
|
-
[/\b(Bearer)\s+[A-Za-z0-9._~+/-]{20,}=*/gi, "$1 [REDACTED]"],
|
|
34
|
-
[
|
|
35
|
-
/\b(api[_-]?key|access[_-]?token|auth[_-]?token|secret[_-]?key|private[_-]?key)\b(["']?\s*[=:]\s*["']?)([A-Za-z0-9_\-./+]{16,})/gi,
|
|
36
|
-
"$1$2[REDACTED]",
|
|
37
|
-
],
|
|
38
|
-
[/\b(password|passwd)\b(["']?\s*[=:]\s*["']?)([^\s"'&]{8,})/gi, "$1$2[REDACTED]"],
|
|
39
|
-
];
|
|
40
|
-
/** Заменяет только безошибочно опознаваемые секреты, не трогая обычный текст. */
|
|
41
|
-
export function redactContextSecrets(text) {
|
|
42
|
-
let out = text;
|
|
43
|
-
for (const [pattern, replacement] of SECRET_PATTERNS) {
|
|
44
|
-
out = out.replace(pattern, replacement);
|
|
45
|
-
}
|
|
46
|
-
return out;
|
|
47
|
-
}
|
|
48
|
-
/** Версия протокола заголовка — растёт при несовместимом изменении формата. */
|
|
49
|
-
export const CONTEXT_LOG_FORMAT = 1;
|
|
50
|
-
const BAR = "═".repeat(78);
|
|
51
|
-
const SEP = "─".repeat(78);
|
|
52
|
-
const CONTEXT_LINES = 3;
|
|
53
|
-
// Ограничение на размер LCS-матрицы. При большем «середине» diff деградирует
|
|
54
|
-
// до полной замены, чтобы не аллоцировать сотни МБ.
|
|
55
|
-
const MAX_LCS_CELLS = 4_000_000;
|
|
56
|
-
function safeJson(value) {
|
|
57
|
-
if (value === undefined)
|
|
58
|
-
return "";
|
|
59
|
-
if (typeof value === "string")
|
|
60
|
-
return value;
|
|
61
|
-
try {
|
|
62
|
-
return JSON.stringify(value);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return String(value);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function contentLines(content) {
|
|
69
|
-
if (content == null)
|
|
70
|
-
return [""];
|
|
71
|
-
if (typeof content === "string")
|
|
72
|
-
return content.length > 0 ? content.split("\n") : [""];
|
|
73
|
-
if (Array.isArray(content)) {
|
|
74
|
-
const lines = [];
|
|
75
|
-
for (const part of content) {
|
|
76
|
-
if (part && typeof part === "object") {
|
|
77
|
-
const p = part;
|
|
78
|
-
if (p.type === "text" && typeof p.text === "string") {
|
|
79
|
-
lines.push(...(p.text.length > 0 ? p.text.split("\n") : [""]));
|
|
80
|
-
}
|
|
81
|
-
else if (p.type === "image_url") {
|
|
82
|
-
lines.push("[image]");
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
lines.push(safeJson(part));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
lines.push(String(part));
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return lines.length > 0 ? lines : [""];
|
|
93
|
-
}
|
|
94
|
-
return [String(content)];
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Каноническое многострочное представление отправляемого контекста.
|
|
98
|
-
* Порядок фиксирован: system → tools → history. Стабильный формат — залог
|
|
99
|
-
* осмысленного diff между итерациями.
|
|
100
|
-
*/
|
|
101
|
-
export function serializeContextForLog(messages, tools) {
|
|
102
|
-
const out = [];
|
|
103
|
-
const system = [];
|
|
104
|
-
const rest = [];
|
|
105
|
-
for (const m of messages)
|
|
106
|
-
(m.role === "system" ? system : rest).push(m);
|
|
107
|
-
out.push("[SYSTEM]");
|
|
108
|
-
if (system.length === 0) {
|
|
109
|
-
out.push("(none)");
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
for (const m of system)
|
|
113
|
-
out.push(...contentLines(m.content));
|
|
114
|
-
}
|
|
115
|
-
out.push("");
|
|
116
|
-
out.push("[TOOLS]");
|
|
117
|
-
if (tools.length === 0) {
|
|
118
|
-
out.push("(none)");
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
for (const tool of tools) {
|
|
122
|
-
out.push(`${tool.name} | ${tool.description} | ${safeJson(tool.parameters)}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
out.push("");
|
|
126
|
-
out.push("[HISTORY]");
|
|
127
|
-
if (rest.length === 0) {
|
|
128
|
-
out.push("(empty)");
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
for (const m of rest) {
|
|
132
|
-
const head = [`role=${m.role}`];
|
|
133
|
-
if (m.tool_call_id)
|
|
134
|
-
head.push(`id=${m.tool_call_id}`);
|
|
135
|
-
if (m.name)
|
|
136
|
-
head.push(`name=${m.name}`);
|
|
137
|
-
if (m.success !== undefined)
|
|
138
|
-
head.push(`success=${m.success}`);
|
|
139
|
-
out.push(head.join(" "));
|
|
140
|
-
if (Array.isArray(m.tool_calls)) {
|
|
141
|
-
for (const tc of m.tool_calls) {
|
|
142
|
-
const name = tc.function?.name ?? "?";
|
|
143
|
-
const args = tc.function?.arguments;
|
|
144
|
-
out.push(` → ${name} ${typeof args === "string" ? args : safeJson(args)}`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
out.push(...contentLines(m.content));
|
|
148
|
-
out.push("");
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return out.join("\n");
|
|
152
|
-
}
|
|
153
|
-
function commonPrefixLen(a, b) {
|
|
154
|
-
const max = Math.min(a.length, b.length);
|
|
155
|
-
let i = 0;
|
|
156
|
-
while (i < max && a[i] === b[i])
|
|
157
|
-
i++;
|
|
158
|
-
return i;
|
|
159
|
-
}
|
|
160
|
-
function commonSuffixLen(a, b, prefix) {
|
|
161
|
-
const max = Math.min(a.length - prefix, b.length - prefix);
|
|
162
|
-
let i = 0;
|
|
163
|
-
while (i < max && a[a.length - 1 - i] === b[b.length - 1 - i])
|
|
164
|
-
i++;
|
|
165
|
-
return i;
|
|
166
|
-
}
|
|
167
|
-
/** LCS-дифф для средней части (уже без общего префикса/суффикса). */
|
|
168
|
-
function lcsOps(a, b) {
|
|
169
|
-
const n = a.length;
|
|
170
|
-
const m = b.length;
|
|
171
|
-
if (n === 0 && m === 0)
|
|
172
|
-
return [];
|
|
173
|
-
if (n === 0)
|
|
174
|
-
return b.map((line) => ({ type: "+", line }));
|
|
175
|
-
if (m === 0)
|
|
176
|
-
return a.map((line) => ({ type: "-", line }));
|
|
177
|
-
if (n * m > MAX_LCS_CELLS) {
|
|
178
|
-
const ops = [];
|
|
179
|
-
for (const line of a)
|
|
180
|
-
ops.push({ type: "-", line });
|
|
181
|
-
for (const line of b)
|
|
182
|
-
ops.push({ type: "+", line });
|
|
183
|
-
return ops;
|
|
184
|
-
}
|
|
185
|
-
const width = m + 1;
|
|
186
|
-
const dp = new Uint32Array((n + 1) * width);
|
|
187
|
-
for (let i = n - 1; i >= 0; i--) {
|
|
188
|
-
for (let j = m - 1; j >= 0; j--) {
|
|
189
|
-
dp[i * width + j] =
|
|
190
|
-
a[i] === b[j]
|
|
191
|
-
? dp[(i + 1) * width + (j + 1)] + 1
|
|
192
|
-
: Math.max(dp[(i + 1) * width + j], dp[i * width + (j + 1)]);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
const ops = [];
|
|
196
|
-
let i = 0;
|
|
197
|
-
let j = 0;
|
|
198
|
-
while (i < n && j < m) {
|
|
199
|
-
if (a[i] === b[j]) {
|
|
200
|
-
ops.push({ type: " ", line: a[i] });
|
|
201
|
-
i++;
|
|
202
|
-
j++;
|
|
203
|
-
}
|
|
204
|
-
else if (dp[(i + 1) * width + j] >= dp[i * width + (j + 1)]) {
|
|
205
|
-
ops.push({ type: "-", line: a[i] });
|
|
206
|
-
i++;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
ops.push({ type: "+", line: b[j] });
|
|
210
|
-
j++;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
while (i < n)
|
|
214
|
-
ops.push({ type: "-", line: a[i++] });
|
|
215
|
-
while (j < m)
|
|
216
|
-
ops.push({ type: "+", line: b[j++] });
|
|
217
|
-
return ops;
|
|
218
|
-
}
|
|
219
|
-
function renderHunks(ops, context) {
|
|
220
|
-
const changed = [];
|
|
221
|
-
for (let i = 0; i < ops.length; i++) {
|
|
222
|
-
if (ops[i].type !== " ")
|
|
223
|
-
changed.push(i);
|
|
224
|
-
}
|
|
225
|
-
if (changed.length === 0)
|
|
226
|
-
return [];
|
|
227
|
-
// Номера строк до/после для каждого op.
|
|
228
|
-
const oldNum = new Array(ops.length);
|
|
229
|
-
const newNum = new Array(ops.length);
|
|
230
|
-
let o = 1;
|
|
231
|
-
let nw = 1;
|
|
232
|
-
for (let i = 0; i < ops.length; i++) {
|
|
233
|
-
oldNum[i] = o;
|
|
234
|
-
newNum[i] = nw;
|
|
235
|
-
if (ops[i].type === " ") {
|
|
236
|
-
o++;
|
|
237
|
-
nw++;
|
|
238
|
-
}
|
|
239
|
-
else if (ops[i].type === "-") {
|
|
240
|
-
o++;
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
nw++;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
const groups = [];
|
|
247
|
-
let start = changed[0];
|
|
248
|
-
let end = changed[0];
|
|
249
|
-
for (let k = 1; k < changed.length; k++) {
|
|
250
|
-
if (changed[k] - end <= context * 2) {
|
|
251
|
-
end = changed[k];
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
groups.push([start, end]);
|
|
255
|
-
start = changed[k];
|
|
256
|
-
end = changed[k];
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
groups.push([start, end]);
|
|
260
|
-
const hunks = [];
|
|
261
|
-
for (const [s, e] of groups) {
|
|
262
|
-
const from = Math.max(0, s - context);
|
|
263
|
-
const to = Math.min(ops.length - 1, e + context);
|
|
264
|
-
let oldCount = 0;
|
|
265
|
-
let newCount = 0;
|
|
266
|
-
const body = [];
|
|
267
|
-
for (let i = from; i <= to; i++) {
|
|
268
|
-
const op = ops[i];
|
|
269
|
-
if (op.type !== "+")
|
|
270
|
-
oldCount++;
|
|
271
|
-
if (op.type !== "-")
|
|
272
|
-
newCount++;
|
|
273
|
-
body.push(`${op.type}${op.line}`);
|
|
274
|
-
}
|
|
275
|
-
hunks.push(`@@ -${oldNum[from]},${oldCount} +${newNum[from]},${newCount} @@`);
|
|
276
|
-
hunks.push(...body);
|
|
277
|
-
}
|
|
278
|
-
return hunks;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Плоский unified diff без ANSI и truncation.
|
|
282
|
-
* `prev`/`next` — многострочный текст. Возвращает "" при отсутствии изменений.
|
|
283
|
-
*/
|
|
284
|
-
export function unifiedDiff(prev, next, context = CONTEXT_LINES, fromLabel = "a", toLabel = "b") {
|
|
285
|
-
if (prev === next)
|
|
286
|
-
return "";
|
|
287
|
-
const a = prev.split("\n");
|
|
288
|
-
const b = next.split("\n");
|
|
289
|
-
const prefix = commonPrefixLen(a, b);
|
|
290
|
-
const suffix = commonSuffixLen(a, b, prefix);
|
|
291
|
-
const midA = a.slice(prefix, a.length - suffix);
|
|
292
|
-
const midB = b.slice(prefix, b.length - suffix);
|
|
293
|
-
const midOps = lcsOps(midA, midB);
|
|
294
|
-
const ops = [];
|
|
295
|
-
for (let i = 0; i < prefix; i++)
|
|
296
|
-
ops.push({ type: " ", line: a[i] });
|
|
297
|
-
ops.push(...midOps);
|
|
298
|
-
for (let i = suffix; i > 0; i--)
|
|
299
|
-
ops.push({ type: " ", line: a[a.length - i] });
|
|
300
|
-
const hunks = renderHunks(ops, context);
|
|
301
|
-
if (hunks.length === 0)
|
|
302
|
-
return "";
|
|
303
|
-
return [`--- ${fromLabel}`, `+++ ${toLabel}`, ...hunks].join("\n");
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Пишет git-подобный лог контекста в append-only файл.
|
|
307
|
-
*/
|
|
308
|
-
export class ContextLogger {
|
|
309
|
-
path;
|
|
310
|
-
sessionId;
|
|
311
|
-
model;
|
|
312
|
-
contextWindow;
|
|
313
|
-
runId;
|
|
314
|
-
redact;
|
|
315
|
-
now;
|
|
316
|
-
prev = null;
|
|
317
|
-
snapshotIndex = 0;
|
|
318
|
-
headerWritten = false;
|
|
319
|
-
outputIndex = 0;
|
|
320
|
-
constructor(opts) {
|
|
321
|
-
this.path = opts.path;
|
|
322
|
-
this.sessionId = opts.sessionId;
|
|
323
|
-
this.model = opts.model;
|
|
324
|
-
this.contextWindow = opts.contextWindow;
|
|
325
|
-
this.runId = opts.runId ?? process.pid;
|
|
326
|
-
this.redact = opts.redact !== false;
|
|
327
|
-
this.now = opts.now ?? (() => new Date());
|
|
328
|
-
}
|
|
329
|
-
get filePath() {
|
|
330
|
-
return this.path;
|
|
331
|
-
}
|
|
332
|
-
ensureHeader() {
|
|
333
|
-
if (this.headerWritten)
|
|
334
|
-
return;
|
|
335
|
-
this.headerWritten = true;
|
|
336
|
-
try {
|
|
337
|
-
mkdirSync(dirname(this.path), { recursive: true });
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
// best-effort: appendFileSync ниже сообщит об ошибке
|
|
341
|
-
}
|
|
342
|
-
const exists = existsSync(this.path);
|
|
343
|
-
let existing = "";
|
|
344
|
-
if (exists) {
|
|
345
|
-
try {
|
|
346
|
-
existing = readFileSync(this.path, "utf8");
|
|
347
|
-
}
|
|
348
|
-
catch {
|
|
349
|
-
existing = "";
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
// Продолжаем нумерацию snapshot'ов, если файл уже есть.
|
|
353
|
-
const matches = existing.match(/### snapshot (\d+)/g);
|
|
354
|
-
if (matches && matches.length > 0) {
|
|
355
|
-
const last = matches[matches.length - 1].match(/### snapshot (\d+)/);
|
|
356
|
-
if (last)
|
|
357
|
-
this.snapshotIndex = Number(last[1]) + 1;
|
|
358
|
-
}
|
|
359
|
-
if (existing.trim().length > 0) {
|
|
360
|
-
const runHeader = [
|
|
361
|
-
"",
|
|
362
|
-
BAR,
|
|
363
|
-
`===== run ${this.runId} · ${this.now().toISOString()} · session ${this.sessionId} =====`,
|
|
364
|
-
SEP,
|
|
365
|
-
"",
|
|
366
|
-
].join("\n");
|
|
367
|
-
this.append(runHeader);
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
const header = [
|
|
371
|
-
BAR,
|
|
372
|
-
"mma context log",
|
|
373
|
-
`session: ${this.sessionId} model: ${this.model} contextWindow: ${this.contextWindow}`,
|
|
374
|
-
`run ${this.runId} · started ${this.now().toISOString()}`,
|
|
375
|
-
"format: snapshot 0 = full context (all lines \"+\"); later snapshots are line diffs",
|
|
376
|
-
" (- removed, + added). [OUTPUT] = model output, NOT part of the LLM context.",
|
|
377
|
-
`secrets: ${this.redact ? "redacted" : "RAW"}`,
|
|
378
|
-
BAR,
|
|
379
|
-
"",
|
|
380
|
-
].join("\n");
|
|
381
|
-
this.append(header);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
append(text) {
|
|
385
|
-
try {
|
|
386
|
-
appendFileSync(this.path, text.endsWith("\n") ? text : `${text}\n`, "utf8");
|
|
387
|
-
}
|
|
388
|
-
catch {
|
|
389
|
-
// Логирование контекста не должно ронять агент.
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
sanitize(text) {
|
|
393
|
-
return this.redact ? redactContextSecrets(text) : text;
|
|
394
|
-
}
|
|
395
|
-
/** Записывает снимок отправляемого контекста (diff к предыдущему). */
|
|
396
|
-
record(messages, tools, meta) {
|
|
397
|
-
this.ensureHeader();
|
|
398
|
-
const text = this.sanitize(serializeContextForLog(messages, tools));
|
|
399
|
-
const idx = this.snapshotIndex;
|
|
400
|
-
const header = `### snapshot ${idx} · run ${this.runId} · iteration ${meta.iteration} · ${meta.ts} · ` +
|
|
401
|
-
`${meta.totalTokens}/${meta.contextWindow} tok ` +
|
|
402
|
-
`(system ${meta.systemTokens} · tools ${meta.toolTokens} · history ${meta.historyTokens})`;
|
|
403
|
-
let block;
|
|
404
|
-
if (this.prev === null) {
|
|
405
|
-
const lines = text.split("\n");
|
|
406
|
-
const body = lines.map((l) => `+${l}`).join("\n");
|
|
407
|
-
block = `${header}\n--- /dev/null\n+++ b/context@${idx}\n@@ -0,0 +1,${lines.length} @@\n${body}`;
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
const diff = unifiedDiff(this.prev, text, CONTEXT_LINES, `context@${idx - 1}`, `context@${idx}`);
|
|
411
|
-
block = diff ? `${header}\n${diff}` : `${header}\n(context unchanged)`;
|
|
412
|
-
}
|
|
413
|
-
this.prev = text;
|
|
414
|
-
this.snapshotIndex++;
|
|
415
|
-
this.append(`\n${block}\n`);
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Аннотация вывода модели. Reasoning/текст/tool_calls НЕ входят в контекст
|
|
419
|
-
* LLM для следующего запроса — поэтому это не diff, а плоская запись.
|
|
420
|
-
*/
|
|
421
|
-
recordOutput(out) {
|
|
422
|
-
const hasReasoning = !!out.reasoning?.trim();
|
|
423
|
-
const hasText = !!out.text?.trim();
|
|
424
|
-
const hasCalls = !!out.toolCalls && out.toolCalls.length > 0;
|
|
425
|
-
if (!hasReasoning && !hasText && !hasCalls)
|
|
426
|
-
return;
|
|
427
|
-
this.ensureHeader();
|
|
428
|
-
this.outputIndex++;
|
|
429
|
-
const lines = [
|
|
430
|
-
"",
|
|
431
|
-
`[OUTPUT #${this.outputIndex} ← result of iteration ${out.iteration}, NOT part of the LLM context]`,
|
|
432
|
-
];
|
|
433
|
-
if (hasReasoning) {
|
|
434
|
-
lines.push("▍reasoning:");
|
|
435
|
-
for (const line of this.sanitize(out.reasoning).split("\n"))
|
|
436
|
-
lines.push(`▍ ${line}`);
|
|
437
|
-
}
|
|
438
|
-
if (hasText) {
|
|
439
|
-
lines.push("▍assistant text:");
|
|
440
|
-
for (const line of this.sanitize(out.text).split("\n"))
|
|
441
|
-
lines.push(`▍ ${line}`);
|
|
442
|
-
}
|
|
443
|
-
if (hasCalls) {
|
|
444
|
-
lines.push("▍tool_calls:");
|
|
445
|
-
for (const call of out.toolCalls) {
|
|
446
|
-
lines.push(`▍ ${call.name} ${this.sanitize(safeJson(call.arguments))}`);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
this.append(lines.join("\n"));
|
|
450
|
-
}
|
|
451
|
-
/** Append-only логгер — закрывать нечего. Оставлено для симметрии API. */
|
|
452
|
-
close() {
|
|
453
|
-
}
|
|
454
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/** Рендер UI-индикаторов контекста (stats-бар, уведомление о компакции). */
|
|
2
|
-
import { pc } from "../../ui/colors";
|
|
3
|
-
/**
|
|
4
|
-
* Рендер UI-индикаторов контекста (stats-бар и уведомление о компакции).
|
|
5
|
-
*
|
|
6
|
-
* Вынесен из agent.ts, где рендеринг жил прямо в бизнес-логике цикла.
|
|
7
|
-
* `lastCompactionShown` хранится внутри и переживает несколько запусков
|
|
8
|
-
* цикла (как исходное поле Agent) — экземпляр должен быть полем класса,
|
|
9
|
-
* а не создаваться заново на каждый ход.
|
|
10
|
-
*/
|
|
11
|
-
export class ContextRenderer {
|
|
12
|
-
lastCompactionShown = 0;
|
|
13
|
-
/**
|
|
14
|
-
* Рисует индикаторы контекста (stats либо уведомление о компакции).
|
|
15
|
-
* @param ui UI-конфиг; @param contextManager менеджер контекста; @param onMeta sink мета-вывода.
|
|
16
|
-
*/
|
|
17
|
-
render(ui, contextManager, onMeta) {
|
|
18
|
-
if (ui?.showContextStats) {
|
|
19
|
-
this.renderStats(contextManager, onMeta);
|
|
20
|
-
}
|
|
21
|
-
else if (ui?.showCompaction) {
|
|
22
|
-
this.renderCompaction(contextManager, onMeta);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
renderStats(contextManager, onMeta) {
|
|
26
|
-
const ctxTokens = contextManager.getEstimatedTokens();
|
|
27
|
-
const ctxBudget = contextManager.getBudget();
|
|
28
|
-
const ctxPct = Math.min(100, Math.round((ctxTokens / ctxBudget.history) * 100));
|
|
29
|
-
const barLen = 10;
|
|
30
|
-
const filled = Math.round((ctxPct / 100) * barLen);
|
|
31
|
-
const ctxBar = pc.green("█".repeat(filled)) + pc.dim("░".repeat(barLen - filled));
|
|
32
|
-
const pctColor = ctxPct >= 75 ? pc.yellow : pc.dim;
|
|
33
|
-
const compCount = contextManager.getCompactionCount();
|
|
34
|
-
const quality = contextManager.getQuality();
|
|
35
|
-
const qualityColor = quality >= 70 ? pc.green : quality >= 40 ? pc.yellow : pc.red;
|
|
36
|
-
onMeta?.(`\n ${ctxBar} ${pctColor(`${ctxPct}%`)} ${pc.dim(`ctx: ${ctxTokens}/${ctxBudget.history}`)} ${pc.dim(`compactions: ${compCount}`)} ${qualityColor(`quality: ${quality}%`)}\n`);
|
|
37
|
-
}
|
|
38
|
-
renderCompaction(contextManager, onMeta) {
|
|
39
|
-
const compCount = contextManager.getCompactionCount();
|
|
40
|
-
if (compCount > this.lastCompactionShown) {
|
|
41
|
-
this.lastCompactionShown = compCount;
|
|
42
|
-
onMeta?.(pc.dim(`\n ⟳ Context compacted (${compCount})\n`));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|