micro-models-agent 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/assets/js/tabs.js +22 -3
- package/dist/cli/cache-line.js +1 -0
- package/dist/cli/command-suggest.js +5 -4
- package/dist/cli/commands.js +231 -122
- package/dist/cli/completer.js +132 -31
- package/dist/cli/index.js +1 -0
- package/dist/cli/json-payload.js +4 -4
- package/dist/cli/main.js +166 -61
- package/dist/cli/onboarding-commands.js +126 -0
- package/dist/cli/plugin-commands.js +2 -1
- package/dist/cli/relaunch.js +16 -13
- package/dist/cli/repl-commands-lsp.js +75 -0
- package/dist/cli/repl-commands-skills.js +105 -0
- package/dist/cli/repl-commands.js +589 -266
- package/dist/cli/repl.js +436 -177
- package/dist/cli/run-result.js +5 -6
- package/dist/cli/security-commands.js +37 -28
- package/dist/cli/setup-order.js +4 -55
- package/dist/cli/setup-prompt.js +3 -2
- package/dist/cli/setup.js +27 -107
- package/dist/cli/web-command.js +98 -0
- package/dist/config/budget.js +5 -5
- package/dist/config/config.js +103 -96
- package/dist/config/defaults.js +38 -8
- package/dist/config/domains.js +24 -27
- package/dist/config/env.js +46 -0
- package/dist/config/experts.js +2 -0
- package/dist/config/index.js +1 -0
- package/dist/config/paths.js +56 -0
- package/dist/config/redact.js +44 -0
- package/dist/config/registry-extra.js +334 -0
- package/dist/config/registry.js +584 -0
- package/dist/config/security.js +35 -36
- package/dist/config/timeouts.js +74 -0
- package/dist/config/utils.js +16 -15
- package/dist/core/agent/artifact-progress.js +59 -0
- package/dist/core/agent/artifact-resolve.js +79 -0
- package/dist/core/agent/audit-gate.js +7 -3
- package/dist/core/agent/compaction.js +2 -2
- package/dist/core/agent/constants.js +33 -4
- package/dist/core/agent/context-log.js +454 -0
- package/dist/core/agent/context-renderer.js +5 -0
- package/dist/core/agent/critic-gate.js +132 -0
- package/dist/core/agent/hallucination-gate.js +148 -38
- package/dist/core/agent/loop-state.js +15 -0
- package/dist/core/agent/prefix-monitor.js +1 -1
- package/dist/core/agent/reasoning-resolver.js +10 -1
- package/dist/core/agent/token-tracker.js +7 -4
- package/dist/core/agent/tool-batch.js +93 -18
- package/dist/core/agent/tool-images.js +18 -0
- package/dist/core/agent/tool-output.js +65 -11
- package/dist/core/agent/tool-pairing.js +60 -0
- package/dist/core/agent-moe.js +25 -24
- package/dist/core/agent.js +429 -108
- package/dist/core/bootstrap/agent-phase.js +66 -0
- package/dist/core/bootstrap/config-phase.js +86 -0
- package/dist/core/bootstrap/modules-phase.js +269 -0
- package/dist/core/bootstrap/provider-phase.js +183 -0
- package/dist/core/bootstrap/session-phase.js +204 -0
- package/dist/core/bootstrap/state.js +94 -0
- package/dist/core/bootstrap/workspace-phase.js +115 -0
- package/dist/core/bootstrap.js +92 -660
- package/dist/core/crash-handler.js +17 -7
- package/dist/core/environment.js +37 -12
- package/dist/core/host-plan.js +43 -0
- package/dist/core/host.js +23 -0
- package/dist/core/index.js +1 -0
- package/dist/core/prompt-builder.js +17 -1
- package/dist/core/prompt-overflow.js +42 -43
- package/dist/core/session-logger.js +122 -30
- package/dist/core/system-prompt.js +117 -0
- package/dist/core/version.js +6 -4
- package/dist/core/web-host.js +34 -0
- package/dist/core/workspace.js +19 -15
- package/dist/i18n/index.js +37 -3
- package/dist/index.js +7 -3
- package/dist/llm/image-utils.js +55 -64
- package/dist/llm/llm-errors.js +9 -0
- package/dist/llm/model-loader.js +10 -32
- package/dist/llm/models-dev.js +121 -0
- package/dist/llm/openai-compat.js +146 -73
- package/dist/llm/orchestrator.js +33 -11
- package/dist/llm/provider-budget.js +2 -2
- package/dist/llm/provider-context.js +233 -0
- package/dist/llm/provider.js +1 -1
- package/dist/llm/response.js +5 -0
- package/dist/llm/token-counter.js +27 -11
- package/dist/logger/app-logger.js +48 -22
- package/dist/logger/file-log.js +28 -19
- package/dist/logger/index.js +1 -0
- package/dist/main.js +273 -47
- package/dist/migration/backup.js +14 -3
- package/dist/migration/detect.js +12 -3
- package/dist/migration/index.js +1 -0
- package/dist/modules/artifacts/store.js +9 -8
- package/dist/modules/browser/actions.js +6 -0
- package/dist/modules/browser/bridge-client.js +14 -12
- package/dist/modules/browser/bridge-path.js +4 -4
- package/dist/modules/browser/console-buffer.js +37 -0
- package/dist/modules/browser/cookie-store.js +5 -0
- package/dist/modules/browser/driver-types.js +1 -0
- package/dist/modules/browser/driver.js +19 -11
- package/dist/modules/browser/index.js +3 -1
- package/dist/modules/browser/module.js +2 -1
- package/dist/modules/browser/session.js +10 -30
- package/dist/modules/browser/snapshot.js +19 -13
- package/dist/modules/browser/types.js +1 -0
- package/dist/modules/certification/cli.js +28 -20
- package/dist/modules/certification/fact-checker.js +9 -1
- package/dist/modules/certification/loader.js +9 -2
- package/dist/modules/certification/manifest.js +83 -21
- package/dist/modules/certification/runner.js +23 -13
- package/dist/modules/certification/scenarios.js +20 -20
- package/dist/modules/certification/syntax-scenarios.js +1 -2
- package/dist/modules/context/chunk-query.js +11 -9
- package/dist/modules/context/fact-extractor.js +37 -39
- package/dist/modules/context/index.js +1 -0
- package/dist/modules/context/manager.js +106 -80
- package/dist/modules/critic/client.js +176 -0
- package/dist/modules/critic/evidence.js +81 -0
- package/dist/modules/critic/provider.js +45 -0
- package/dist/modules/critic/tools.js +78 -0
- package/dist/modules/critic/types.js +1 -0
- package/dist/modules/execution/audit-runners.js +28 -34
- package/dist/modules/execution/auditor.js +53 -49
- package/dist/modules/execution/execution-plugin.js +142 -102
- package/dist/modules/execution/index.js +1 -1
- package/dist/modules/execution/input-from.js +37 -13
- package/dist/modules/execution/module.js +368 -191
- package/dist/modules/execution/moe-executor.js +53 -26
- package/dist/modules/execution/plan-actions.js +320 -202
- package/dist/modules/execution/plan-checks.js +35 -0
- package/dist/modules/execution/plan-coverage.js +36 -33
- package/dist/modules/execution/plan-steps.js +11 -3
- package/dist/modules/execution/plan-store.js +83 -17
- package/dist/modules/execution/plan-tool.js +89 -35
- package/dist/modules/execution/plan-validator.js +30 -10
- package/dist/modules/execution/planner.js +22 -13
- package/dist/modules/execution/stuck-detector.js +196 -93
- package/dist/modules/execution/tracker.js +22 -8
- package/dist/modules/execution/verifier.js +69 -48
- package/dist/modules/execution/windows-commands.js +12 -12
- package/dist/modules/hallucination/artifact-claim.js +93 -0
- package/dist/modules/hallucination/confidence.js +13 -11
- package/dist/modules/hallucination/consistency.js +10 -2
- package/dist/modules/hallucination/detector.js +10 -5
- package/dist/modules/hallucination/factual.js +43 -26
- package/dist/modules/hallucination/index.js +1 -0
- package/dist/modules/hallucination/js-identifiers.js +44 -45
- package/dist/modules/hallucination/llm-judge.js +17 -12
- package/dist/modules/hallucination/success-claim.js +59 -0
- package/dist/modules/indexer/cache.js +52 -4
- package/dist/modules/indexer/index.js +1 -0
- package/dist/modules/indexer/map-command.js +2 -4
- package/dist/modules/indexer/map-select.js +16 -16
- package/dist/modules/indexer/module.js +47 -12
- package/dist/modules/indexer/project-profile.js +8 -7
- package/dist/modules/indexer/symbols.js +15 -15
- package/dist/modules/indexer/walker.js +159 -29
- package/dist/modules/lsp/check-tool.js +7 -5
- package/dist/modules/lsp/client.js +39 -39
- package/dist/modules/lsp/command.js +17 -24
- package/dist/modules/lsp/config.js +12 -11
- package/dist/modules/lsp/index.js +1 -0
- package/dist/modules/lsp/module.js +48 -46
- package/dist/modules/lsp/probe.js +13 -14
- package/dist/modules/lsp/project-root.js +14 -17
- package/dist/modules/lsp/startup-check.js +18 -16
- package/dist/modules/mcp/client.js +59 -62
- package/dist/modules/mcp/index.js +1 -0
- package/dist/modules/mcp/module.js +66 -37
- package/dist/modules/mcp/registry.js +5 -0
- package/dist/modules/memory/index.js +1 -0
- package/dist/modules/memory/module.js +12 -8
- package/dist/modules/memory/search.js +4 -1
- package/dist/modules/memory/store.js +40 -2
- package/dist/modules/onboarding/init.js +47 -0
- package/dist/modules/onboarding/meet.js +30 -0
- package/dist/modules/onboarding/mode.js +30 -0
- package/dist/modules/onboarding/prompts.js +43 -0
- package/dist/modules/pipelines/engine.js +10 -0
- package/dist/modules/pipelines/index.js +1 -0
- package/dist/modules/pipelines/parser.js +4 -1
- package/dist/modules/pipelines/template.js +4 -0
- package/dist/modules/plugins/builtin/lint-on-write.js +80 -67
- package/dist/modules/plugins/builtin/notify.js +2 -0
- package/dist/modules/plugins/index.js +1 -0
- package/dist/modules/plugins/loader.js +18 -3
- package/dist/modules/plugins/manager.js +37 -17
- package/dist/modules/pricing/index.js +10 -11
- package/dist/modules/pricing/prices.js +12 -12
- package/dist/modules/processes/index.js +1 -0
- package/dist/modules/processes/kill-tree.js +27 -31
- package/dist/modules/processes/registry.js +44 -25
- package/dist/modules/processes/runner.js +4 -4
- package/dist/modules/providers/capabilities.js +28 -0
- package/dist/modules/providers/create.js +3 -4
- package/dist/modules/providers/factory.js +7 -7
- package/dist/modules/providers/fallback.js +12 -12
- package/dist/modules/providers/health.js +4 -4
- package/dist/modules/providers/manager.js +50 -19
- package/dist/modules/providers/naming.js +15 -0
- package/dist/modules/providers/preflight.js +71 -0
- package/dist/modules/providers/presets.js +39 -8
- package/dist/modules/providers/registry.js +7 -2
- package/dist/modules/reasoning/policy.js +8 -6
- package/dist/modules/reasoning/probe.js +30 -25
- package/dist/modules/security/audit-log.js +19 -36
- package/dist/modules/security/audit-notifier.js +35 -75
- package/dist/modules/security/command-validator.js +99 -51
- package/dist/modules/security/content-scanner.js +8 -8
- package/dist/modules/security/data-sanitizer.js +9 -16
- package/dist/modules/security/encryption.js +32 -52
- package/dist/modules/security/index.js +2 -1
- package/dist/modules/security/network-validator.js +120 -43
- package/dist/modules/security/path-validator.js +61 -46
- package/dist/modules/security/protected-paths.js +73 -0
- package/dist/modules/security/rate-limiter.js +17 -49
- package/dist/modules/security/security-policies.js +25 -57
- package/dist/modules/security/session-encryption.js +32 -71
- package/dist/modules/security/session-isolation.js +15 -28
- package/dist/modules/session/auto-name.js +63 -0
- package/dist/modules/session/export.js +98 -0
- package/dist/modules/session/index.js +1 -0
- package/dist/modules/session/manager.js +79 -28
- package/dist/modules/session/module.js +4 -3
- package/dist/modules/session/store.js +57 -20
- package/dist/modules/setup/answers.js +35 -0
- package/dist/modules/setup/apply.js +79 -0
- package/dist/modules/setup/discovery.js +72 -0
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/loader.js +9 -1
- package/dist/modules/skills/module.js +11 -0
- package/dist/modules/updater/changelog-reader.js +15 -16
- package/dist/modules/updater/checker.js +9 -4
- package/dist/modules/updater/dev-detect.js +7 -6
- package/dist/modules/updater/index.js +1 -0
- package/dist/modules/updater/module.js +17 -15
- package/dist/modules/user-profile/compressor.js +2 -0
- package/dist/modules/user-profile/index.js +1 -0
- package/dist/modules/user-profile/profile.js +10 -1
- package/dist/modules/webui/answer-api.js +29 -0
- package/dist/modules/webui/assets.js +50 -0
- package/dist/modules/webui/body.js +21 -0
- package/dist/modules/webui/commands-settings.js +209 -0
- package/dist/modules/webui/commands-shared.js +60 -0
- package/dist/modules/webui/commands.js +174 -0
- package/dist/modules/webui/config-api.js +134 -0
- package/dist/modules/webui/file-api.js +202 -0
- package/dist/modules/webui/forward.js +159 -0
- package/dist/modules/webui/history-api.js +112 -0
- package/dist/modules/webui/host-state.js +60 -0
- package/dist/modules/webui/i18n-api.js +9 -0
- package/dist/modules/webui/limits.js +6 -0
- package/dist/modules/webui/log-forward.js +20 -0
- package/dist/modules/webui/memory-commands.js +64 -0
- package/dist/modules/webui/model-cache.js +18 -0
- package/dist/modules/webui/module.js +148 -0
- package/dist/modules/webui/persist.js +24 -0
- package/dist/modules/webui/prompt-io.js +97 -0
- package/dist/modules/webui/providers-api.js +337 -0
- package/dist/modules/webui/providers-view.js +56 -0
- package/dist/modules/webui/reasoning-view.js +15 -0
- package/dist/modules/webui/run-agent.js +81 -0
- package/dist/modules/webui/server.js +284 -0
- package/dist/modules/webui/sessions-api.js +178 -0
- package/dist/modules/webui/settings-api.js +561 -0
- package/dist/modules/webui/setup-api.js +201 -0
- package/dist/modules/webui/state.js +74 -0
- package/dist/modules/webui/util.js +261 -0
- package/dist/output/bus.js +7 -2
- package/dist/output/channel.js +80 -28
- package/dist/output/format.js +2 -1
- package/dist/output/index.js +1 -0
- package/dist/output/json-sink.js +5 -3
- package/dist/output/machine.js +4 -3
- package/dist/output/session-sink.js +4 -4
- package/dist/tools/approve.js +4 -0
- package/dist/tools/attach-image.js +5 -4
- package/dist/tools/auto-fixer.js +26 -44
- package/dist/tools/auto-tags.js +83 -0
- package/dist/tools/bash.js +193 -116
- package/dist/tools/browser.js +76 -31
- package/dist/tools/chunk-query.js +14 -6
- package/dist/tools/create-dir.js +9 -5
- package/dist/tools/delete-file.js +9 -5
- package/dist/tools/download-file.js +32 -7
- package/dist/tools/edit-file.js +52 -14
- package/dist/tools/enable-tools.js +6 -6
- package/dist/tools/executor.js +132 -27
- package/dist/tools/file-info.js +3 -1
- package/dist/tools/filter-tools.js +3 -3
- package/dist/tools/glob-tool.js +4 -1
- package/dist/tools/grep-tool.js +13 -10
- package/dist/tools/hidden-tools-block.js +6 -6
- package/dist/tools/index.js +16 -8
- package/dist/tools/list-dir.js +4 -2
- package/dist/tools/load-skill.js +7 -0
- package/dist/tools/mcp-call.js +15 -4
- package/dist/tools/meet-done.js +14 -0
- package/dist/tools/move-file.js +14 -7
- package/dist/tools/path-utils.js +29 -29
- package/dist/tools/pipeline-run.js +29 -7
- package/dist/tools/preview.js +1 -1
- package/dist/tools/process-ids.js +31 -0
- package/dist/tools/process-kill.js +9 -16
- package/dist/tools/process-list.js +1 -0
- package/dist/tools/process-log.js +11 -16
- package/dist/tools/process-wait.js +63 -0
- package/dist/tools/prompt-io.js +4 -3
- package/dist/tools/question.js +172 -25
- package/dist/tools/read-file.js +55 -34
- package/dist/tools/recall.js +14 -8
- package/dist/tools/registry.js +6 -5
- package/dist/tools/remember.js +8 -4
- package/dist/tools/scope-request.js +11 -6
- package/dist/tools/search-history.js +5 -2
- package/dist/tools/session-info.js +2 -0
- package/dist/tools/set-thinking.js +8 -4
- package/dist/tools/subagent.js +59 -39
- package/dist/tools/syntax-validator.js +292 -90
- package/dist/tools/user-input.js +22 -18
- package/dist/tools/web-browse.js +9 -3
- package/dist/tools/web-fetch.js +12 -23
- package/dist/tools/web-search.js +7 -5
- package/dist/tools/write-file.js +45 -15
- package/dist/ui/action-log.js +13 -0
- package/dist/ui/box.js +4 -3
- package/dist/ui/colors.js +2 -0
- package/dist/ui/diff.js +6 -5
- package/dist/ui/index.js +1 -0
- package/dist/ui/line-editor.js +230 -122
- package/dist/ui/line-math.js +10 -2
- package/dist/ui/md-formatter.js +57 -37
- package/dist/ui/output.js +8 -3
- package/dist/ui/plan-view.js +21 -10
- package/dist/ui/renderer.js +393 -67
- package/dist/ui/spinner.js +16 -5
- package/dist/ui/table.js +15 -17
- package/dist/ui/theme.js +143 -0
- package/dist/utils/child-run.js +20 -0
- package/dist/utils/error.js +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/retry.js +2 -2
- package/dist/utils/truncate.js +1 -1
- package/package.json +1 -1
package/dist/tools/web-search.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
/** Веб-поиск (DuckDuckGo HTML): тул и shared-функция для автопоиска ошибок. */
|
|
1
2
|
import { t } from "../i18n/index";
|
|
2
3
|
import { isUrlAllowed, sanitizeUrl } from "../modules/security/network-validator";
|
|
3
4
|
import { logNetworkRequest, logSecurityBlock } from "../modules/security/audit-log";
|
|
4
5
|
import { getSessionSecurityConfig } from "../modules/security/session-isolation";
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* setting (the error search uses errorWebSearch.requestTimeoutMs).
|
|
7
|
+
* Общий веб-поиск (DuckDuckGo HTML) для тула web_search и автопоиска ошибок
|
|
8
|
+
* (execution-модуль). `networkConfig` — резолвленная сетевая security-конфигурация
|
|
9
|
+
* (undefined при выключенной безопасности); `requestTimeoutMs` переопределяет
|
|
10
|
+
* таймаут, когда у вызывающего свой (автопоиск — errorWebSearch.requestTimeoutMs).
|
|
11
11
|
*/
|
|
12
12
|
export async function performWebSearch(query, numResults, networkConfig, requestTimeoutMs) {
|
|
13
13
|
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
|
|
@@ -41,11 +41,13 @@ export async function performWebSearch(query, numResults, networkConfig, request
|
|
|
41
41
|
return { success: false, results: [], error: err.message };
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
/** Форматирует выдачу нумерованным списком. */
|
|
44
45
|
function formatResults(results) {
|
|
45
46
|
return results
|
|
46
47
|
.map((r, i) => `${i + 1}. ${r.title}\n URL: ${r.url}\n ${r.snippet}`)
|
|
47
48
|
.join("\n");
|
|
48
49
|
}
|
|
50
|
+
/** Ищет в вебе (заголовки + сниппеты); поисковики открывать не надо. */
|
|
49
51
|
export const webSearchTool = {
|
|
50
52
|
name: "web_search",
|
|
51
53
|
icon: "🌍",
|
package/dist/tools/write-file.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
/** Тул записи файла: скоуп, security-скан, валидация синтаксиса, diff. */
|
|
1
2
|
import { writeFileSync, mkdirSync, existsSync, readFileSync } from "fs";
|
|
2
|
-
import { dirname } from "path";
|
|
3
|
+
import { resolve, dirname } from "path";
|
|
3
4
|
import { t } from "../i18n/index";
|
|
4
5
|
import { isPathWritable } from "../modules/security/path-validator";
|
|
5
6
|
import { scanContent } from "../modules/security/content-scanner";
|
|
@@ -8,6 +9,9 @@ import { getSessionSecurityConfig } from "../modules/security/session-isolation"
|
|
|
8
9
|
import { generateDiff, generateNewFileDiff } from "../ui/diff";
|
|
9
10
|
import { safeResolvePath } from "./path-utils";
|
|
10
11
|
import { preValidateSyntax, detectImportConflicts } from "./syntax-validator";
|
|
12
|
+
import { errMsg } from "../utils";
|
|
13
|
+
import { protectedPathBlock } from "../modules/security/protected-paths";
|
|
14
|
+
/** Создаёт/перезаписывает файл; parent-dirs, проверки, diff в ответе. */
|
|
11
15
|
export const writeFileTool = {
|
|
12
16
|
name: "write_file",
|
|
13
17
|
icon: "📝",
|
|
@@ -24,7 +28,19 @@ export const writeFileTool = {
|
|
|
24
28
|
handler: async (ctx, args) => {
|
|
25
29
|
const path = String(args.path);
|
|
26
30
|
const resolved = safeResolvePath(ctx.baseDir, path);
|
|
27
|
-
|
|
31
|
+
if (ctx.writePathAllowlist) {
|
|
32
|
+
const ok = ctx.writePathAllowlist.some((p) => resolve(p).toLowerCase() === resolve(resolved).toLowerCase());
|
|
33
|
+
if (!ok) {
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
output: t("file.path_not_allowed", {
|
|
37
|
+
path: `${path} — ${t("onboarding.write_restricted")}`,
|
|
38
|
+
reason: t("onboarding.write_restricted"),
|
|
39
|
+
}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Проверка прав по резолвленному пути.
|
|
28
44
|
const scopeCheck = isPathWritable(ctx.baseDir, resolved, ctx.scope, ctx.config.security?.paths);
|
|
29
45
|
if (!scopeCheck.allowed) {
|
|
30
46
|
logSecurityBlock(ctx.sessionId, "file_write", scopeCheck.reason || "Path not allowed", path);
|
|
@@ -35,11 +51,15 @@ export const writeFileTool = {
|
|
|
35
51
|
}),
|
|
36
52
|
};
|
|
37
53
|
}
|
|
38
|
-
//
|
|
54
|
+
// Always-on fallback (security выкл): защищённые пути — спросить юзера.
|
|
55
|
+
const protectedBlock = protectedPathBlock(ctx, resolved, path);
|
|
56
|
+
if (protectedBlock)
|
|
57
|
+
return protectedBlock;
|
|
58
|
+
// Сессионный security-конфиг.
|
|
39
59
|
const securityConfig = ctx.sessionContext
|
|
40
60
|
? getSessionSecurityConfig(ctx.config, ctx.sessionContext)
|
|
41
61
|
: ctx.config.security;
|
|
42
|
-
//
|
|
62
|
+
// Лимит файловых операций.
|
|
43
63
|
const maxFileOps = securityConfig?.maxFileOperations ?? 100;
|
|
44
64
|
const currentCount = ctx.fileOperationsCount ?? 0;
|
|
45
65
|
if (currentCount >= maxFileOps) {
|
|
@@ -49,9 +69,9 @@ export const writeFileTool = {
|
|
|
49
69
|
output: `[SECURITY BLOCKED] Maximum file operations (${maxFileOps}) exceeded`,
|
|
50
70
|
};
|
|
51
71
|
}
|
|
52
|
-
//
|
|
53
|
-
// contentScan
|
|
54
|
-
//
|
|
72
|
+
// Скан контента на опасные паттерны — только при включённой безопасности.
|
|
73
|
+
// У contentScan свой флаг `enabled`, но при выключенном глобальном свитче
|
|
74
|
+
// он молчит (ложные срабатывания на обычном CLI-коде).
|
|
55
75
|
const content = String(args.content);
|
|
56
76
|
if (securityConfig?.enabled && securityConfig?.contentScan?.enabled) {
|
|
57
77
|
const scanResult = scanContent(content, path, securityConfig.contentScan);
|
|
@@ -67,7 +87,7 @@ export const writeFileTool = {
|
|
|
67
87
|
if (!existsSync(dir)) {
|
|
68
88
|
mkdirSync(dir, { recursive: true });
|
|
69
89
|
}
|
|
70
|
-
//
|
|
90
|
+
// Превалидация синтаксиса ДО записи — иначе петля "файл записан" + syntax error.
|
|
71
91
|
const validation = await preValidateSyntax(resolved, content, ctx.baseDir);
|
|
72
92
|
if (!validation.valid) {
|
|
73
93
|
return {
|
|
@@ -75,20 +95,30 @@ export const writeFileTool = {
|
|
|
75
95
|
output: t("file.syntax_error", { path, error: validation.error || "Unknown syntax error" }),
|
|
76
96
|
};
|
|
77
97
|
}
|
|
78
|
-
//
|
|
98
|
+
// Конфликты import/export — только warning (код может быть валиден).
|
|
79
99
|
const conflicts = detectImportConflicts(content);
|
|
80
100
|
const fileExists = existsSync(resolved);
|
|
81
101
|
let oldContent = "";
|
|
82
|
-
|
|
83
|
-
|
|
102
|
+
try {
|
|
103
|
+
if (fileExists) {
|
|
104
|
+
oldContent = readFileSync(resolved, "utf-8");
|
|
105
|
+
}
|
|
106
|
+
writeFileSync(resolved, content, "utf-8");
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
// Ошибка ФС (ENOSPC/EPERM/…) должна вернуть путь и причину, а не
|
|
110
|
+
// вылететь голым Node-исключением в цикл агента.
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
output: t("file.write_failed", { path, error: errMsg(err) }),
|
|
114
|
+
};
|
|
84
115
|
}
|
|
85
|
-
writeFileSync(resolved, content, "utf-8");
|
|
86
116
|
const diff = fileExists ? generateDiff(oldContent, content) : generateNewFileDiff(content);
|
|
87
|
-
//
|
|
117
|
+
// Счётчик файловых операций.
|
|
88
118
|
ctx.fileOperationsCount = currentCount + 1;
|
|
89
|
-
//
|
|
119
|
+
// Успешная запись в аудит-лог.
|
|
90
120
|
logFileWrite(ctx.sessionId, path, true, `File ${fileExists ? "updated" : "created"}`);
|
|
91
|
-
//
|
|
121
|
+
// Предупреждение о конфликтах — в вывод.
|
|
92
122
|
let output = t("file.written", { path });
|
|
93
123
|
if (conflicts.length > 0) {
|
|
94
124
|
output += `\n[WARNING] Import/export conflicts: ${conflicts.join(", ")}`;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
let last = null;
|
|
2
|
+
/** Запоминает последнее действие. */
|
|
3
|
+
export function recordLastAction(action) {
|
|
4
|
+
last = action;
|
|
5
|
+
}
|
|
6
|
+
/** Отдаёт последнее действие (null — не было). */
|
|
7
|
+
export function getLastAction() {
|
|
8
|
+
return last;
|
|
9
|
+
}
|
|
10
|
+
/** Сбрасывает запомненное действие. */
|
|
11
|
+
export function clearLastAction() {
|
|
12
|
+
last = null;
|
|
13
|
+
}
|
package/dist/ui/box.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
// Рамки только для мастера первого запуска (в чате запрещены, см. STYLE.md).
|
|
1
2
|
import stringWidth from "string-width";
|
|
2
3
|
import { pc } from "./colors";
|
|
3
4
|
import { getTerminalWidth } from "./table";
|
|
4
|
-
/**
|
|
5
|
+
/** Переносит строку по колонкам, сохраняя ANSI-коды. */
|
|
5
6
|
export function wrapText(text, width) {
|
|
6
7
|
if (width < 1)
|
|
7
8
|
return text ? [text] : [];
|
|
@@ -45,7 +46,7 @@ function padTo(text, width) {
|
|
|
45
46
|
const gap = Math.max(0, width - stringWidth(text));
|
|
46
47
|
return text + " ".repeat(gap);
|
|
47
48
|
}
|
|
48
|
-
/**
|
|
49
|
+
/** Рендерит рамку с опц. заголовком в верхней границе. */
|
|
49
50
|
export function box(lines, opts = {}) {
|
|
50
51
|
const pad = opts.padding ?? 1;
|
|
51
52
|
const width = Math.max(20, Math.min(opts.width ?? getTerminalWidth(), 120));
|
|
@@ -70,7 +71,7 @@ export function box(lines, opts = {}) {
|
|
|
70
71
|
out.push(pc.dim(`└${"─".repeat(width - 2)}┘`));
|
|
71
72
|
return out;
|
|
72
73
|
}
|
|
73
|
-
/**
|
|
74
|
+
/** Горизонтальная линейка по ширине терминала (макс. 60 кол.). */
|
|
74
75
|
export function divider(width) {
|
|
75
76
|
const w = Math.min(width ?? getTerminalWidth(), 60);
|
|
76
77
|
return pc.dim("─".repeat(w));
|
package/dist/ui/colors.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
// Цвета терминала (picocolors): вкл только в TTY и без CI/NO_COLOR.
|
|
1
2
|
import { createColors } from "picocolors";
|
|
2
3
|
const isTty = () => process.stdout.isTTY === true;
|
|
3
4
|
const enabled = isTty() && !process.env.CI && !process.env.NO_COLOR;
|
|
5
|
+
/** Палитра picocolors (no-op вне TTY / при CI / NO_COLOR). */
|
|
4
6
|
export const pc = createColors(enabled);
|
package/dist/ui/diff.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
// Диффы правок файлов для чата: LCS с капами, цветные строки ±.
|
|
1
2
|
import { pc } from "./colors";
|
|
2
3
|
const CONTEXT_LINES = 3;
|
|
3
4
|
const MAX_DIFF_LINES = 100;
|
|
4
|
-
// LCS
|
|
5
|
-
//
|
|
6
|
-
// "changed N lines" summary instead of a full LCS.
|
|
5
|
+
// LCS — O(m*n) по времени и памяти: режем вход DP, чтобы огромный edit_file не
|
|
6
|
+
// отъел сотни МБ. За капом дифф деградирует до сводки "изменено N строк".
|
|
7
7
|
const MAX_LCS_INPUT_LINES = 2000;
|
|
8
8
|
function computeLCS(oldLines, newLines) {
|
|
9
9
|
const m = oldLines.length;
|
|
@@ -126,6 +126,7 @@ function formatLine(line, maxNumWidth) {
|
|
|
126
126
|
return ` ${numStr} ${line.content}`;
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
|
+
/** Строка диффа старого/нового содержимого. */
|
|
129
130
|
export function generateDiff(oldContent, newContent) {
|
|
130
131
|
if (oldContent === newContent)
|
|
131
132
|
return "";
|
|
@@ -133,8 +134,7 @@ export function generateDiff(oldContent, newContent) {
|
|
|
133
134
|
const newLines = newContent.split("\n");
|
|
134
135
|
if (oldLines.length > MAX_LCS_INPUT_LINES ||
|
|
135
136
|
newLines.length > MAX_LCS_INPUT_LINES) {
|
|
136
|
-
//
|
|
137
|
-
// allocating an m*n matrix.
|
|
137
|
+
// Слишком велик для O(m*n) DP — ограниченная сводка вместо матрицы m*n.
|
|
138
138
|
return pc.dim(` ... (file too large for line diff: ${oldLines.length} -> ${newLines.length} lines)`);
|
|
139
139
|
}
|
|
140
140
|
const diff = buildDiff(oldLines, newLines);
|
|
@@ -153,6 +153,7 @@ export function generateDiff(oldContent, newContent) {
|
|
|
153
153
|
}
|
|
154
154
|
return lines.join("\n");
|
|
155
155
|
}
|
|
156
|
+
/** Дифф нового файла: все строки как добавленные. */
|
|
156
157
|
export function generateNewFileDiff(content) {
|
|
157
158
|
const lines = content.split("\n");
|
|
158
159
|
const maxNumWidth = Math.max(String(lines.length).length, 3);
|
package/dist/ui/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// Фасад UI: форматтеры, вывод, таблицы, спиннер, рендерер.
|
|
1
2
|
export { formatMarkdown, formatError, formatSuccess, formatWarning, FormattingStream, } from "./md-formatter";
|
|
2
3
|
export { writeOutput, writeError, writeSuccess, writeWarning } from "./output";
|
|
3
4
|
export { formatTable, splitRow, isSeparatorRow, getTerminalWidth } from "./table";
|