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,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Фаза 6 bootstrap: сборка Agent.
|
|
3
|
-
*
|
|
4
|
-
* Порядок 1:1 с исходником: AgentDeps (статика + динамические блоки + ленивый
|
|
5
|
-
* health-check + пробы) → `new Agent` → поздний резолв context-probe
|
|
6
|
-
* (reconfigure под окно провайдера) → регистрация тула set_thinking.
|
|
7
|
-
*/
|
|
8
|
-
import { Agent } from "../agent";
|
|
9
|
-
import { applyProbedContext } from "./provider-phase";
|
|
10
|
-
/**
|
|
11
|
-
* Собирает AgentDeps, создаёт агента, применяет позднюю пробу и
|
|
12
|
-
* регистрирует set_thinking.
|
|
13
|
-
* @param input все собранные частями прошлых фаз.
|
|
14
|
-
* @param toolRegistry реестр для регистрации set_thinking.
|
|
15
|
-
* @returns готовый агент.
|
|
16
|
-
*/
|
|
17
|
-
export async function assembleAgent(input, toolRegistry) {
|
|
18
|
-
const { config, configRef, llmProvider, providerManager, toolExecutor, pluginManager, contextManager, hallucinationDetector, logger, baseDir, configDir, activeToolTags, promptBlocks, envReport, getDynamicPromptBlocks, lazyPromptBlocks, sessionManager, memoryStore, moduleRegistry, exitOnComplete, contextLogger, reasoningProbePromise, reasoningStrategy, execModule, toolCtx, contextProbePromise, } = input;
|
|
19
|
-
const agentDeps = {
|
|
20
|
-
config,
|
|
21
|
-
configRef,
|
|
22
|
-
llmProvider,
|
|
23
|
-
getProviderName: () => providerManager.activeName,
|
|
24
|
-
toolExecutor,
|
|
25
|
-
pluginManager,
|
|
26
|
-
contextManager,
|
|
27
|
-
hallucinationDetector,
|
|
28
|
-
logger,
|
|
29
|
-
baseDir,
|
|
30
|
-
configDir,
|
|
31
|
-
toolTags: activeToolTags,
|
|
32
|
-
promptBlocks,
|
|
33
|
-
envReport,
|
|
34
|
-
getDynamicPromptBlocks,
|
|
35
|
-
finalAudit: () => execModule.runFinalAudit(),
|
|
36
|
-
lazyPromptBlocks,
|
|
37
|
-
sessionManager,
|
|
38
|
-
memoryStore,
|
|
39
|
-
moduleRegistry,
|
|
40
|
-
exitOnComplete,
|
|
41
|
-
contextLogger,
|
|
42
|
-
reasoningProbe: () => reasoningProbePromise,
|
|
43
|
-
reasoningStrategy,
|
|
44
|
-
planSummary: () => execModule.getPlanSummary(),
|
|
45
|
-
toolCtx,
|
|
46
|
-
};
|
|
47
|
-
const agent = new Agent(agentDeps);
|
|
48
|
-
// Поздний резолв пробы: окно могло попасть в `config` после сборки
|
|
49
|
-
// ContextManager/провайдера — один reconfigure, чтобы бюджеты и провайдер
|
|
50
|
-
// его реально использовали. No-op, если проба села рано (то же значение)
|
|
51
|
-
// или ход уже был.
|
|
52
|
-
void contextProbePromise
|
|
53
|
-
.then((probe) => {
|
|
54
|
-
if (!probe)
|
|
55
|
-
return;
|
|
56
|
-
return applyProbedContext(agent, config, probe, logger);
|
|
57
|
-
})
|
|
58
|
-
.catch(() => { });
|
|
59
|
-
// Тул set_thinking (нужен общее reasoning-состояние агента)
|
|
60
|
-
if (config.reasoning) {
|
|
61
|
-
const { createSetThinkingTool } = await import("../../tools/set-thinking");
|
|
62
|
-
const setThinkingTool = createSetThinkingTool(agent.reasoningState, config.reasoning, () => agent.currentIteration);
|
|
63
|
-
toolRegistry.register(setThinkingTool);
|
|
64
|
-
}
|
|
65
|
-
return agent;
|
|
66
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Фаза 1 bootstrap: пути, конфиг, локаль, логгер.
|
|
3
|
-
*
|
|
4
|
-
* Порядок сайд-эффектов 1:1 с исходным `bootstrap()`: резолв каталога →
|
|
5
|
-
* `loadConfig` → `setLocale` → CLI-override reasoning → audit-нотифаер →
|
|
6
|
-
* создание `Logger` (+ отложенное логирование ошибки нотифаера) → синк
|
|
7
|
-
* бандл-манифеста сертификаций (best-effort, молча).
|
|
8
|
-
*/
|
|
9
|
-
import { join } from "path";
|
|
10
|
-
import { loadConfig } from "../../config/config";
|
|
11
|
-
import { Logger } from "../../logger/app-logger";
|
|
12
|
-
import { setLocale, setMissingKeyReporter } from "../../i18n/index";
|
|
13
|
-
import { globalMmaDir } from "../../config/paths";
|
|
14
|
-
import { errMsg } from "../../utils";
|
|
15
|
-
import { normalizeLogLevel } from "./state";
|
|
16
|
-
/**
|
|
17
|
-
* CLI --reasoning переопределяет конфигурационный режим
|
|
18
|
-
* (приоритет: CLI > config > default). "auto" пропускается — полагаемся
|
|
19
|
-
* на конфиг. Строка CLI приводится к типизированному ReasoningLevel.
|
|
20
|
-
*/
|
|
21
|
-
export function applyReasoningCliOverride(config, reasoningLevel) {
|
|
22
|
-
if (!reasoningLevel || reasoningLevel === "auto")
|
|
23
|
-
return;
|
|
24
|
-
if (!config.reasoning) {
|
|
25
|
-
config.reasoning = {
|
|
26
|
-
mode: reasoningLevel,
|
|
27
|
-
min: "low",
|
|
28
|
-
max: "high",
|
|
29
|
-
overrideCooldown: 3,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
config.reasoning.mode = reasoningLevel;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Грузит конфиг и готовит логгер.
|
|
38
|
-
* @param configDir каталог конфига (опционально); @param projectDir workspace (опционально);
|
|
39
|
-
* @param reasoningLevel CLI-override reasoning (опционально).
|
|
40
|
-
* @returns каталог, конфиг, флаг легаси и логгер.
|
|
41
|
-
*/
|
|
42
|
-
export async function initConfigPhase(configDir, projectDir, reasoningLevel) {
|
|
43
|
-
const dir = configDir || globalMmaDir();
|
|
44
|
-
const projectConfigPath = projectDir ? join(projectDir, ".mmrc") : join(process.cwd(), ".mmrc");
|
|
45
|
-
const { config, legacyDetected } = loadConfig({ configDir: dir, projectConfigPath });
|
|
46
|
-
setLocale(config.locale);
|
|
47
|
-
// CLI --reasoning перебивает режим конфига (приоритет: CLI > config > default)
|
|
48
|
-
applyReasoningCliOverride(config, reasoningLevel);
|
|
49
|
-
// Глобальный audit-нотифаер — по конфигу
|
|
50
|
-
let auditNotifyError;
|
|
51
|
-
try {
|
|
52
|
-
const { globalAuditNotifier } = await import("../../modules/security/audit-notifier");
|
|
53
|
-
if (config.security?.auditNotifier) {
|
|
54
|
-
globalAuditNotifier.updateConfig(config.security.auditNotifier);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
// Logger ещё не создан — запомним и залогируем после его инициализации.
|
|
59
|
-
auditNotifyError = errMsg(err);
|
|
60
|
-
}
|
|
61
|
-
const logger = new Logger(normalizeLogLevel(config.logLevel));
|
|
62
|
-
logger.setLogDir(join(dir, "logs"));
|
|
63
|
-
// Диагностика опечаток в ключах i18n — видна только на debug-уровне.
|
|
64
|
-
setMissingKeyReporter((key) => logger.debug(`Missing i18n key: ${key}`));
|
|
65
|
-
if (auditNotifyError) {
|
|
66
|
-
logger.debug(`Audit notifier config skipped: ${auditNotifyError}`);
|
|
67
|
-
}
|
|
68
|
-
logger.debug("MMA bootstrap", {
|
|
69
|
-
version: config.version,
|
|
70
|
-
model: config.model,
|
|
71
|
-
});
|
|
72
|
-
// Синхронизируем бандл-манифест версии пакета в ~/.mma/certifications.json
|
|
73
|
-
// (бандл-записи затирают свои ключи при апдейте; пользовательские сохраняются).
|
|
74
|
-
// Best-effort, молча.
|
|
75
|
-
try {
|
|
76
|
-
const { syncGlobalManifest } = await import("../../modules/certification/manifest");
|
|
77
|
-
const syncResult = syncGlobalManifest();
|
|
78
|
-
if (syncResult.synced) {
|
|
79
|
-
logger.debug("Certification manifest synced from package");
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Метки сертификации косметические — старт не блокируем никогда.
|
|
84
|
-
}
|
|
85
|
-
return { dir, projectConfigPath, config, legacyDetected, logger };
|
|
86
|
-
}
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Фаза 5 bootstrap: модули, плагины, промпт-блоки.
|
|
3
|
-
*
|
|
4
|
-
* Порядок 1:1 с исходником: ExecutionModule (+ restorePlan, детектор) →
|
|
5
|
-
* SessionModule → IndexerModule в реестр → MCP (init с таймаутом 10s) →
|
|
6
|
-
* Memory → Browser (опционально) → LSP → фоновый стартовый health-check →
|
|
7
|
-
* сбор tool definitions модулей → builtin-плагины в менеджер → внешние
|
|
8
|
-
* плагины (global + project) → onCompact/setPlanSummaryProvider → AGENTS.md
|
|
9
|
-
* блоки + статичные промпт-блоки → стартовый dry-run переполнения (варнинг).
|
|
10
|
-
*/
|
|
11
|
-
import { join } from "path";
|
|
12
|
-
import { buildHiddenToolsBlock } from "../../tools/hidden-tools-block";
|
|
13
|
-
import { ModuleRegistry } from "../../modules/registry";
|
|
14
|
-
import { PluginLoader } from "../../modules/plugins/loader";
|
|
15
|
-
import { plugin as lintOnWritePlugin } from "../../modules/plugins/builtin/lint-on-write";
|
|
16
|
-
import { plugin as notifyPlugin } from "../../modules/plugins/builtin/notify";
|
|
17
|
-
import { ExecutionModule } from "../../modules/execution/module";
|
|
18
|
-
import { SessionModule } from "../../modules/session/index";
|
|
19
|
-
import { BrowserModule } from "../../modules/browser/index";
|
|
20
|
-
import { LspModule, FileOnlyLogger, DEFAULT_LSP_CONFIG } from "../../modules/lsp/index";
|
|
21
|
-
import { runStartupHealthCheck } from "../../modules/lsp/startup-check";
|
|
22
|
-
import { MCPModule } from "../../modules/mcp/index";
|
|
23
|
-
import { MemoryModule } from "../../modules/memory/module";
|
|
24
|
-
import { MemoryStore } from "../../modules/memory/store";
|
|
25
|
-
import { t } from "../../i18n/index";
|
|
26
|
-
import { estimateTokens } from "../../llm/token-counter";
|
|
27
|
-
import { readMmaVersion } from "../version";
|
|
28
|
-
import { dryRunOverflow, overflowHint } from "../prompt-overflow";
|
|
29
|
-
import { isOneShotMode, loadAgentsMdBlocks, registerBuiltinPlugin, withTimeout } from "./state";
|
|
30
|
-
import { globalPluginsDir as resolveGlobalPluginsDir, projectMmaDir } from "../../config/paths";
|
|
31
|
-
/**
|
|
32
|
-
* Регистрирует модули, грузит плагины и собирает промпт-блоки.
|
|
33
|
-
* Тонкий оркестратор: вся пошаговая логика — в приватных хелперах ниже,
|
|
34
|
-
* порядок сайд-эффектов 1:1 с исходной монолитной версией.
|
|
35
|
-
* @param input связный вход фазы (см. ModulesPhaseInput в state.ts).
|
|
36
|
-
* @returns реестр модулей, exec-модуль и блоки системного промпта.
|
|
37
|
-
*/
|
|
38
|
-
export async function setupModulesPhase(input) {
|
|
39
|
-
const moduleRegistry = new ModuleRegistry();
|
|
40
|
-
const core = await registerCoreModules(input, moduleRegistry);
|
|
41
|
-
const startupCheckPromise = startLanguageModules(input, moduleRegistry);
|
|
42
|
-
registerModuleToolsAndPlugins(input, moduleRegistry, core);
|
|
43
|
-
const promptBlocks = buildStaticPromptBlocks(input, moduleRegistry, core);
|
|
44
|
-
dryRunStartupOverflow(input, promptBlocks);
|
|
45
|
-
// План-блок удалён: мутирует каждую итерацию (статусы шагов), инвалидируя
|
|
46
|
-
// локальный KV-кеш. Статус плана теперь инжектится в <system-summary>
|
|
47
|
-
// после каждого пакета тулов.
|
|
48
|
-
const getDynamicPromptBlocks = () => collectDynamicPromptBlocks(input, core.sessionModule);
|
|
49
|
-
const lazyPromptBlocks = makeLazyPromptBlocks(startupCheckPromise);
|
|
50
|
-
return {
|
|
51
|
-
moduleRegistry,
|
|
52
|
-
execModule: core.execModule,
|
|
53
|
-
sessionModule: core.sessionModule,
|
|
54
|
-
mcpModule: core.mcpModule,
|
|
55
|
-
memoryStore: core.memoryStore,
|
|
56
|
-
promptBlocks,
|
|
57
|
-
lazyPromptBlocks,
|
|
58
|
-
getDynamicPromptBlocks,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
/** Exec + Session + Indexer + MCP (init с таймаутом) + Memory. */
|
|
62
|
-
async function registerCoreModules(input, moduleRegistry) {
|
|
63
|
-
const { config, logger, dir, baseDir, hallucinationDetector } = input;
|
|
64
|
-
const execModule = new ExecutionModule(baseDir, config.stuckThreshold, config.errorWebSearch?.threshold ?? 5);
|
|
65
|
-
// План следует за сессией: restorePlan поднимает legacy-глобальный план,
|
|
66
|
-
// switchSession усыновляет его в слот стартовой сессии (или грузит её свой).
|
|
67
|
-
// REPL рисует чеклист только на plan/todo-событиях — без спроса не печатаем.
|
|
68
|
-
execModule.restorePlan();
|
|
69
|
-
try {
|
|
70
|
-
execModule.switchSession(input.sessionManager.getActive());
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// fail-open: без сессии трекер остаётся как поднял restorePlan
|
|
74
|
-
}
|
|
75
|
-
moduleRegistry.register(execModule);
|
|
76
|
-
execModule.setHallucinationDetector(hallucinationDetector);
|
|
77
|
-
const sessionModule = new SessionModule(input.sessionManager);
|
|
78
|
-
moduleRegistry.register(sessionModule);
|
|
79
|
-
moduleRegistry.register(input.indexerModule);
|
|
80
|
-
const mcpModule = new MCPModule(config);
|
|
81
|
-
try {
|
|
82
|
-
// Ограничиваем init MCP, чтобы один медленный/висящий сервер не стопил boot
|
|
83
|
-
// навсегда (B5): на таймауте — лог-и-дальше, MCP-тулы появятся поздно или
|
|
84
|
-
// не появятся, вместо stall'а старта.
|
|
85
|
-
await withTimeout(mcpModule.initialize(), 10_000);
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
logger.warn(`MCP init failed or timed out (${err instanceof Error ? err.message.slice(0, 120) : String(err)}) — continuing without MCP tools.`);
|
|
89
|
-
}
|
|
90
|
-
moduleRegistry.register(mcpModule);
|
|
91
|
-
// Общий глобальный стор памяти — один инстанс у модуля памяти и цикла,
|
|
92
|
-
// поэтому UI (`mma web` `/memory`) читают/пишут живые данные.
|
|
93
|
-
const memoryStore = new MemoryStore(join(dir, "memory"));
|
|
94
|
-
const memoryModule = new MemoryModule(memoryStore);
|
|
95
|
-
moduleRegistry.register(memoryModule);
|
|
96
|
-
return { execModule, sessionModule, mcpModule, memoryStore };
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Языковые модули: Browser (опционально) + LSP + фоновый стартовый health-check.
|
|
100
|
-
* @returns промис стартовой проверки (без await — резолвится к первому вводу).
|
|
101
|
-
*/
|
|
102
|
-
function startLanguageModules(input, moduleRegistry) {
|
|
103
|
-
const { config, logger, baseDir, exitOnComplete, pluginManager } = input;
|
|
104
|
-
if (config.browser.enabled) {
|
|
105
|
-
const browserModule = new BrowserModule();
|
|
106
|
-
moduleRegistry.register(browserModule);
|
|
107
|
-
registerBuiltinPlugin(pluginManager, browserModule.getPlugin());
|
|
108
|
-
}
|
|
109
|
-
const lspLogger = new FileOnlyLogger(logger);
|
|
110
|
-
const lspModule = new LspModule(config.lsp, undefined, lspLogger);
|
|
111
|
-
moduleRegistry.register(lspModule);
|
|
112
|
-
registerBuiltinPlugin(pluginManager, lspModule.getPlugin());
|
|
113
|
-
// Стартовый health-check: сканируем проект на существующие ошибки, чтобы модель
|
|
114
|
-
// знала baseline до работы. Пропуск для one-shot и тестов. Старт фоном (без
|
|
115
|
-
// await), чтобы баннер REPL не ждал `npx tsc` по проекту; Agent дожидается
|
|
116
|
-
// через `lazyPromptBlocks` перед первым LLM-вызовом (к вводу пользователя
|
|
117
|
-
// в интерактиве уже резолвнут).
|
|
118
|
-
return !isOneShotMode() && !exitOnComplete && process.env.NODE_ENV !== "test"
|
|
119
|
-
? runStartupHealthCheck(config.lsp ?? DEFAULT_LSP_CONFIG, baseDir, { logger: lspLogger })
|
|
120
|
-
: Promise.resolve(null);
|
|
121
|
-
}
|
|
122
|
-
/** Тулы модулей в реестр + builtin/external плагины в менеджер. */
|
|
123
|
-
function registerModuleToolsAndPlugins(input, moduleRegistry, core) {
|
|
124
|
-
const { logger, baseDir, toolRegistry, pluginManager, skillsModule, indexerModule } = input;
|
|
125
|
-
const moduleTools = moduleRegistry.collectToolDefinitions();
|
|
126
|
-
for (const tool of moduleTools) {
|
|
127
|
-
toolRegistry.register(tool);
|
|
128
|
-
}
|
|
129
|
-
registerBuiltinPlugin(pluginManager, core.execModule.getPlugin());
|
|
130
|
-
registerBuiltinPlugin(pluginManager, core.sessionModule.getPlugin());
|
|
131
|
-
registerBuiltinPlugin(pluginManager, skillsModule.getPlugin());
|
|
132
|
-
registerBuiltinPlugin(pluginManager, indexerModule.getPlugin());
|
|
133
|
-
registerBuiltinPlugin(pluginManager, core.mcpModule.getPlugin());
|
|
134
|
-
pluginManager.register(lintOnWritePlugin);
|
|
135
|
-
pluginManager.register(notifyPlugin);
|
|
136
|
-
const pluginLoader = new PluginLoader();
|
|
137
|
-
const globalPluginsDir = resolveGlobalPluginsDir();
|
|
138
|
-
const projectPluginsDir = join(projectMmaDir(baseDir), "plugins");
|
|
139
|
-
const mmaVersion = readMmaVersion();
|
|
140
|
-
pluginLoader.loadFromDir(globalPluginsDir, pluginManager, logger, {
|
|
141
|
-
source: "global",
|
|
142
|
-
mmaVersion,
|
|
143
|
-
});
|
|
144
|
-
pluginLoader.loadFromDir(projectPluginsDir, pluginManager, logger, {
|
|
145
|
-
source: "project",
|
|
146
|
-
mmaVersion,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Статичные промпт-блоки: systemInfo + реестреые + AGENTS.md + plan-напоминание.
|
|
151
|
-
* Заодно вешает onCompact и провайдер сводки плана (состояние — в замыканиях
|
|
152
|
-
* менеджера контекста, порядок 1:1 с исходником).
|
|
153
|
-
*/
|
|
154
|
-
function buildStaticPromptBlocks(input, moduleRegistry, core) {
|
|
155
|
-
const { config, baseDir, dir, noAgentsMd, sessionManager, contextManager, systemInfoPrompt } = input;
|
|
156
|
-
contextManager.onCompact = (summary) => {
|
|
157
|
-
const meta = sessionManager.getActiveMeta();
|
|
158
|
-
if (!meta || !config.session.autoSave)
|
|
159
|
-
return;
|
|
160
|
-
sessionManager.appendMessage({
|
|
161
|
-
role: summary.role,
|
|
162
|
-
content: summary.content,
|
|
163
|
-
name: summary.name,
|
|
164
|
-
timestamp: new Date().toISOString(),
|
|
165
|
-
});
|
|
166
|
-
};
|
|
167
|
-
// Активный план (id, прогресс, текущий шаг) — в сводку компакции, чтобы 9B
|
|
168
|
-
// модель не пересоздавала план с нуля сразу после неё (наблюдалось:
|
|
169
|
-
// ses_msvuao0h — plan_e07pb2 (1/6) выкинут ради свежего plan_xzq9xe той же
|
|
170
|
-
// итерацией, где старый план ещё был виден).
|
|
171
|
-
contextManager.setPlanSummaryProvider(() => core.execModule.getPlanSummary());
|
|
172
|
-
const agentsMdBlocks = loadAgentsMdBlocks(baseDir, dir, noAgentsMd === true);
|
|
173
|
-
return [
|
|
174
|
-
systemInfoPrompt,
|
|
175
|
-
...moduleRegistry.collectPromptBlocks(["indexer", "session"]),
|
|
176
|
-
...agentsMdBlocks,
|
|
177
|
-
// Статичное напоминание о плане: всегда в наличии, чтобы модель проверяла
|
|
178
|
-
// активный план до создания нового (даже на первой итерации, до появления
|
|
179
|
-
// <system-summary>).
|
|
180
|
-
{
|
|
181
|
-
content: "[Plan Reminder] An active plan may exist for this session. Before creating a new plan, check with `plan show`. If a plan is active, continue it — do NOT create a new plan.",
|
|
182
|
-
priority: "high",
|
|
183
|
-
essential: false,
|
|
184
|
-
estimatedTokens: 50,
|
|
185
|
-
},
|
|
186
|
-
];
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Стартовый dry-run переполнения (баннер, A3): тот же набор блоков, что возьмёт
|
|
190
|
-
* первая сборка Agent (статика + скиллы + карта + скрытые тулы), наружу —
|
|
191
|
-
* невместившиеся instructions/project-map. Agent сожмёт их перед первым
|
|
192
|
-
* LLM-вызовом; варнинг говорит ПОЛЬЗОВАТЕЛЮ почему и как вернуть полный текст.
|
|
193
|
-
*/
|
|
194
|
-
function dryRunStartupOverflow(input, promptBlocks) {
|
|
195
|
-
const { config, logger, dir, toolRegistry, activeToolTags, skillsModule, indexerModule } = input;
|
|
196
|
-
const dynamicBlocks = [];
|
|
197
|
-
const skillsBlock = skillsModule.getSystemPromptBlock();
|
|
198
|
-
if (skillsBlock)
|
|
199
|
-
dynamicBlocks.push(skillsBlock);
|
|
200
|
-
const mapBlock = indexerModule.getSystemPromptBlock();
|
|
201
|
-
if (mapBlock)
|
|
202
|
-
dynamicBlocks.push(mapBlock);
|
|
203
|
-
const hiddenToolsBlock = buildHiddenToolsBlock(toolRegistry.getAll(), activeToolTags);
|
|
204
|
-
if (hiddenToolsBlock) {
|
|
205
|
-
dynamicBlocks.push({
|
|
206
|
-
content: hiddenToolsBlock,
|
|
207
|
-
priority: "low",
|
|
208
|
-
essential: false,
|
|
209
|
-
estimatedTokens: estimateTokens(hiddenToolsBlock),
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
const systemBudget = Math.floor(config.contextWindow * config.contextBudget.systemPrompt);
|
|
213
|
-
const dry = dryRunOverflow([...promptBlocks, ...dynamicBlocks], systemBudget);
|
|
214
|
-
if (dry.overflow.length === 0)
|
|
215
|
-
return;
|
|
216
|
-
const overflowTokens = dry.overflow.reduce((s, b) => s + b.estimatedTokens, 0);
|
|
217
|
-
const needed = dry.includedTokens + overflowTokens;
|
|
218
|
-
const hint = overflowHint(config, dir, needed);
|
|
219
|
-
for (const b of dry.overflow) {
|
|
220
|
-
logger.warn(t("prompt.overflow.startup", {
|
|
221
|
-
block: b.kind === "instructions" ? "AGENTS.md" : "project map",
|
|
222
|
-
original: String(b.estimatedTokens),
|
|
223
|
-
needed: String(needed),
|
|
224
|
-
budget: String(systemBudget),
|
|
225
|
-
hint,
|
|
226
|
-
}));
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Динамические блоки (skills/сессия/карта/скрытые тулы) — собираются свежими
|
|
231
|
-
* при каждом вызове. Мета сессии — здесь, а не при bootstrap: сессия создаётся
|
|
232
|
-
* при bootstrap с messageCount 0, и статичный сбор всегда давал бы null.
|
|
233
|
-
* Контент стабилен на сессию (без per-turn полей) ради prefix KV-кеша.
|
|
234
|
-
*/
|
|
235
|
-
function collectDynamicPromptBlocks(input, sessionModule) {
|
|
236
|
-
const { toolRegistry, activeToolTags, toolCtx, skillsModule, indexerModule } = input;
|
|
237
|
-
const blocks = [];
|
|
238
|
-
const skillsBlock = skillsModule.getSystemPromptBlock();
|
|
239
|
-
if (skillsBlock)
|
|
240
|
-
blocks.push(skillsBlock);
|
|
241
|
-
const sessionBlock = sessionModule.getSystemPromptBlock();
|
|
242
|
-
if (sessionBlock)
|
|
243
|
-
blocks.push(sessionBlock);
|
|
244
|
-
const mapBlock = indexerModule.getSystemPromptBlock();
|
|
245
|
-
if (mapBlock)
|
|
246
|
-
blocks.push(mapBlock);
|
|
247
|
-
const hiddenToolsBlock = toolCtx.toolAllowlist
|
|
248
|
-
? null
|
|
249
|
-
: buildHiddenToolsBlock(toolRegistry.getAll(), activeToolTags);
|
|
250
|
-
if (hiddenToolsBlock) {
|
|
251
|
-
blocks.push({
|
|
252
|
-
content: hiddenToolsBlock,
|
|
253
|
-
priority: "low",
|
|
254
|
-
essential: false,
|
|
255
|
-
estimatedTokens: estimateTokens(hiddenToolsBlock),
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
return blocks;
|
|
259
|
-
}
|
|
260
|
-
/** Ленивые блоки: фоновая стартовая проверка, мемоизированная первым вызовом. */
|
|
261
|
-
function makeLazyPromptBlocks(startupCheckPromise) {
|
|
262
|
-
let startupCheckBlock = null;
|
|
263
|
-
return async () => {
|
|
264
|
-
if (startupCheckBlock)
|
|
265
|
-
return [startupCheckBlock];
|
|
266
|
-
startupCheckBlock = (await startupCheckPromise) ?? null;
|
|
267
|
-
return startupCheckBlock ? [startupCheckBlock] : [];
|
|
268
|
-
};
|
|
269
|
-
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Фаза 2 bootstrap: провайдер, автозагрузка модели, пробы.
|
|
3
|
-
*
|
|
4
|
-
* Порядок 1:1 с исходником: эндпоинт активной записи → автозагрузка модели
|
|
5
|
-
* → фоновая context-probe → профиль пользователя → сборка провайдера через
|
|
6
|
-
* общую фабрику (с ленивым session id) → reasoning-стратегия + фоновая
|
|
7
|
-
* reasoning-probe. Тяжёлые пробы — фоном, старт не блокируют.
|
|
8
|
-
*/
|
|
9
|
-
import { ModelLoader, probeModel, probeProviderContext } from "../../llm/model-loader";
|
|
10
|
-
import { join as joinDir } from "path";
|
|
11
|
-
import { buildActiveProvider } from "../../modules/providers/factory";
|
|
12
|
-
import { activeProviderEndpoint, reasoningStrategyForProvider } from "../../modules/providers/manager";
|
|
13
|
-
import { UserProfile } from "../../modules/user-profile/profile";
|
|
14
|
-
import { t } from "../../i18n/index";
|
|
15
|
-
/**
|
|
16
|
-
* Позднее применение резолвнутой context-probe. Проба приземляется фоном ПОСЛЕ
|
|
17
|
-
* сборки ContextManager/провайдера под стартовое окно — одна запись значения в
|
|
18
|
-
* `config` оставит бюджеты протухшими, поэтому нужен reconfigure (ресайз +
|
|
19
|
-
* пересборка провайдера).
|
|
20
|
-
*
|
|
21
|
-
* Пропуск, когда применять нечего (`config` больше не несёт значение пробы —
|
|
22
|
-
* совпало сразу или переопределено вручную) или ход уже был (ресайз посреди
|
|
23
|
-
* истории ломает бюджеты). Не бросает никогда.
|
|
24
|
-
*/
|
|
25
|
-
export async function applyProbedContext(agent, config, probe, logger) {
|
|
26
|
-
if (config.contextWindow !== probe.actual)
|
|
27
|
-
return false;
|
|
28
|
-
if (agent.currentIteration !== 0) {
|
|
29
|
-
logger.logSilent("debug", `Context probe: keeping startup contextWindow ${config.contextWindow} — a turn already ran`);
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
await agent.reconfigure(config);
|
|
34
|
-
logger.logSilent("info", `Context probe: applied provider context ${probe.actual} tokens (model "${probe.model}")`);
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Собирает провайдер и запускает фоновые пробы.
|
|
43
|
-
* @param config живой конфиг; @param logger настроенный логгер; @param dir каталог конфига (для профиля).
|
|
44
|
-
* @returns эндпоинт, пробы, профиль, менеджер, провайдер и биндер сессий.
|
|
45
|
-
*/
|
|
46
|
-
export async function setupProviderPhase(config, logger, dir) {
|
|
47
|
-
// Эндпоинт для пробы/автозагрузки: АКТИВНАЯ запись, не легаси-плоские поля
|
|
48
|
-
// (они зеркалят активное на момент последней записи и протухают после
|
|
49
|
-
// `/provider use` — наблюдалось: плоский localhost:1234 при активной записи
|
|
50
|
-
// opencode-go, и Zen вообще не опрашивался).
|
|
51
|
-
const probeEndpoint = activeProviderEndpoint(config.provider);
|
|
52
|
-
if (config.modelLoad.autoLoad) {
|
|
53
|
-
const modelLoader = new ModelLoader(probeEndpoint.baseUrl, logger);
|
|
54
|
-
const loadResult = await modelLoader.ensureModelLoaded({
|
|
55
|
-
model: config.model,
|
|
56
|
-
contextLength: config.contextWindow,
|
|
57
|
-
flashAttention: config.modelLoad.flashAttention,
|
|
58
|
-
offloadKvCacheToGpu: config.modelLoad.offloadKvCacheToGpu,
|
|
59
|
-
autoLoad: config.modelLoad.autoLoad,
|
|
60
|
-
});
|
|
61
|
-
if (!loadResult.success) {
|
|
62
|
-
logger.warn(t("env.model_autoload_failed", { error: String(loadResult.error ?? "") }));
|
|
63
|
-
}
|
|
64
|
-
else if (loadResult.alreadyLoaded) {
|
|
65
|
-
logger.debug(`Model ${config.model} already loaded`);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
logger.info(t("env.model_loaded", { model: config.model, seconds: String(loadResult.loadTime) }));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
// Context-проба (фоном): спрашиваем АКТИВНЫЙ провайдер о длине контекста,
|
|
72
|
-
// что РЕАЛЬНО отдаётся модели (загруженный инстанс, не максимум карточки),
|
|
73
|
-
// и берём как эффективный contextWindow — провайдер бьёт конфиг. Баннер не
|
|
74
|
-
// блокирует никогда; null = окно никто не сообщил (голый OpenAI-compat
|
|
75
|
-
// `/models`, офлайн, транзиентка) — храним настроенный (fail-open). Ручной
|
|
76
|
-
// `mma context <N>` / `/config contextWindow <N>` после — действует до конца сессии.
|
|
77
|
-
// Живой источник возможностей модели для тулов (browser vision и т.п.).
|
|
78
|
-
// Пресет и конфиг-оверрайд известны сразу, native-probe уточняет их
|
|
79
|
-
// асинхронно и записывает сюда, не блокируя старт. Геттер на toolCtx
|
|
80
|
-
// резолвит итог при каждом обращении, поэтому смена модели/провайдера
|
|
81
|
-
// через reconfigure видна тулам без пересборки контекста.
|
|
82
|
-
const capabilitiesRef = {};
|
|
83
|
-
// Значение на старте. Проба резолвится фоном — если пользователь успел
|
|
84
|
-
// сменить contextWindow раньше (веб-UI до приземления пробы), побеждает его
|
|
85
|
-
// явный выбор, а итог пробы только логируется.
|
|
86
|
-
const probeConfiguredAtStart = config.contextWindow;
|
|
87
|
-
const contextProbePromise = (async () => {
|
|
88
|
-
try {
|
|
89
|
-
const lmProbe = await probeModel(probeEndpoint.baseUrl, config.model);
|
|
90
|
-
if (lmProbe?.capabilities)
|
|
91
|
-
capabilitiesRef.probe = lmProbe.capabilities;
|
|
92
|
-
const lmContext = lmProbe ? { model: lmProbe.model, actual: lmProbe.contextLength } : null;
|
|
93
|
-
const detected = lmContext ??
|
|
94
|
-
(await probeProviderContext(probeEndpoint.baseUrl, config.model, {
|
|
95
|
-
apiKey: probeEndpoint.apiKey,
|
|
96
|
-
providerType: probeEndpoint.type,
|
|
97
|
-
}));
|
|
98
|
-
if (!detected)
|
|
99
|
-
return null;
|
|
100
|
-
if (detected.actual === config.contextWindow) {
|
|
101
|
-
logger.logSilent("debug", `Context probe: configured contextWindow matches provider context (${detected.actual})`);
|
|
102
|
-
}
|
|
103
|
-
else if (config.contextWindow !== probeConfiguredAtStart) {
|
|
104
|
-
logger.logSilent("debug", `Context probe: model "${detected.model}" serves ${detected.actual} tokens, keeping the explicit contextWindow ${config.contextWindow}`);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
logger.logSilent("info", `Context probe: auto-set contextWindow from provider — model "${detected.model}" serves ${detected.actual} tokens (configured was ${config.contextWindow}).`);
|
|
108
|
-
config.contextWindow = detected.actual;
|
|
109
|
-
}
|
|
110
|
-
return detected;
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
})();
|
|
116
|
-
// Профиль пользователя — грузим здесь же, как в исходнике (до сборки
|
|
117
|
-
// провайдера): load/collect/save без логгера, порядок важен для
|
|
118
|
-
// systemInfo-блока фазы workspace (профиль передаётся дальше).
|
|
119
|
-
const profile = new UserProfile(joinDir(dir));
|
|
120
|
-
profile.load() || profile.collect();
|
|
121
|
-
profile.save();
|
|
122
|
-
// Мультипровайдерный менеджер (Phase 2) + опциональная прозрачная failover-
|
|
123
|
-
// обёртка (Phase 4.2). Строится через общую фабрику, чтобы hot-swap через
|
|
124
|
-
// Agent.setProvider получал ТО ЖЕ fallback-поведение, что старт, а не голый
|
|
125
|
-
// менеджер, молча роняющий failover (B4).
|
|
126
|
-
//
|
|
127
|
-
// Session id резолвится лениво: менеджер сессий создаётся ниже, а провайдеры
|
|
128
|
-
// должны читать ТЕКУЩУЮ сессию в момент запроса (hot-swap, смена сессии).
|
|
129
|
-
// OpenCode Go режектит запросы без `x-opencode-session`.
|
|
130
|
-
let sessionSource;
|
|
131
|
-
const getSessionId = () => sessionSource?.()?.getActiveMeta()?.id;
|
|
132
|
-
const builtProvider = buildActiveProvider(config, logger, { getSessionId });
|
|
133
|
-
const providerManager = builtProvider.manager;
|
|
134
|
-
const llmProvider = builtProvider.provider;
|
|
135
|
-
// Стратегия reasoning АКТИВНОЙ записи (легаси-плоское `type` протухает после
|
|
136
|
-
// `/provider use` и давало чужую стратегию — напр. prompt-tag при opencode-go).
|
|
137
|
-
const reasoningStrategy = reasoningStrategyForProvider(config.provider);
|
|
138
|
-
// Reasoning-проба — ФОНОМ (B2). Раньше блокировала bootstrap лишним LLM
|
|
139
|
-
// round-trip на каждый запуск; теперь агент потребляет её лениво перед первым
|
|
140
|
-
// LLM-вызовом (тот же паттерн, что стартовый health-check), а до резолва
|
|
141
|
-
// механизм считается НЕ прошедшим. 24h TTL диск-кэша в probe.ts и так
|
|
142
|
-
// бережёт стабильный бэкенд от перепроверок.
|
|
143
|
-
let reasoningProbePromise = Promise.resolve(false);
|
|
144
|
-
if (config.reasoning && config.reasoning.mode !== "none" && reasoningStrategy !== "none") {
|
|
145
|
-
reasoningProbePromise = (async () => {
|
|
146
|
-
try {
|
|
147
|
-
const { probeReasoningSupport, getCachedProbeResult, setCachedProbeResult } = await import("../../modules/reasoning/probe");
|
|
148
|
-
const cacheK = `${probeEndpoint.baseUrl ?? ""}|${config.model}`;
|
|
149
|
-
const cached = getCachedProbeResult(cacheK);
|
|
150
|
-
const passed = cached !== undefined
|
|
151
|
-
? cached
|
|
152
|
-
: await probeReasoningSupport(llmProvider, reasoningStrategy);
|
|
153
|
-
// Кэшируем только определённый итог — транзиентная ошибка пробы (null)
|
|
154
|
-
// НЕ должна пинить «reasoning не поддерживается» на 24h TTL.
|
|
155
|
-
if (cached === undefined && passed !== null)
|
|
156
|
-
setCachedProbeResult(cacheK, passed);
|
|
157
|
-
logger.logSilent("info", t("env.reasoning_probe", {
|
|
158
|
-
strategy: reasoningStrategy,
|
|
159
|
-
result: passed === true ? t("env.reasoning_respected") : t("env.reasoning_ignored"),
|
|
160
|
-
}));
|
|
161
|
-
// null (транзиентка) — фолбэк «не пройдено» на эту сессию.
|
|
162
|
-
return passed === true;
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
})();
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
probeEndpoint,
|
|
171
|
-
profile,
|
|
172
|
-
capabilitiesRef,
|
|
173
|
-
probeConfiguredAtStart,
|
|
174
|
-
contextProbePromise,
|
|
175
|
-
providerManager,
|
|
176
|
-
llmProvider,
|
|
177
|
-
reasoningStrategy,
|
|
178
|
-
reasoningProbePromise,
|
|
179
|
-
bindSessionManager: (getManager) => {
|
|
180
|
-
sessionSource = getManager;
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|