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
|
@@ -1,15 +1,14 @@
|
|
|
1
|
+
// Аудит-лог: запись действий агента в audit.jsonl (глобально или в каталог сессии).
|
|
1
2
|
import { existsSync, mkdirSync, appendFileSync } from "fs";
|
|
2
|
-
import { resolve, join } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
3
|
import { globalAuditNotifier } from "./audit-notifier";
|
|
5
|
-
|
|
4
|
+
import { auditLogFile, globalLogsDir } from "../../config/paths";
|
|
5
|
+
let _globalAuditDir = globalLogsDir();
|
|
6
6
|
let _sessionAuditDir = null;
|
|
7
7
|
function getAuditDir() {
|
|
8
8
|
return _sessionAuditDir ?? _globalAuditDir;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* are written to the session-specific directory instead of the global one.
|
|
11
|
+
* Назначить каталог аудита для сессии: записи идут туда вместо глобального.
|
|
13
12
|
*/
|
|
14
13
|
export function setAuditSessionDir(dir) {
|
|
15
14
|
_sessionAuditDir = dir;
|
|
@@ -17,15 +16,11 @@ export function setAuditSessionDir(dir) {
|
|
|
17
16
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Clear the session directory — fall back to global audit dir.
|
|
22
|
-
*/
|
|
19
|
+
/** Сбросить каталог сессии — возврат к глобальному каталогу аудита. */
|
|
23
20
|
export function clearAuditSessionDir() {
|
|
24
21
|
_sessionAuditDir = null;
|
|
25
22
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Set the global audit log directory (used when no session dir is active).
|
|
28
|
-
*/
|
|
23
|
+
/** Назначить глобальный каталог аудита (когда каталог сессии не активен). */
|
|
29
24
|
export function setGlobalAuditDir(dir) {
|
|
30
25
|
_globalAuditDir = dir;
|
|
31
26
|
if (!existsSync(dir)) {
|
|
@@ -33,7 +28,8 @@ export function setGlobalAuditDir(dir) {
|
|
|
33
28
|
}
|
|
34
29
|
}
|
|
35
30
|
/**
|
|
36
|
-
*
|
|
31
|
+
* Записать запись аудита в audit.jsonl и уведомить notifier.
|
|
32
|
+
* Ошибки записи/уведомления глушатся — аудит не должен ронять агента.
|
|
37
33
|
*/
|
|
38
34
|
export function logAudit(entry) {
|
|
39
35
|
const dir = getAuditDir();
|
|
@@ -42,23 +38,20 @@ export function logAudit(entry) {
|
|
|
42
38
|
}
|
|
43
39
|
try {
|
|
44
40
|
const logEntry = JSON.stringify(entry);
|
|
45
|
-
appendFileSync(
|
|
41
|
+
appendFileSync(auditLogFile(dir), `${logEntry}\n`, "utf8");
|
|
46
42
|
}
|
|
47
43
|
catch {
|
|
48
|
-
//
|
|
49
|
-
// This shouldn't break the agent
|
|
44
|
+
// молча: невозможность записи не должна ломать агента
|
|
50
45
|
}
|
|
51
|
-
//
|
|
46
|
+
// Уведомить нотификатор аудита, если включён
|
|
52
47
|
try {
|
|
53
48
|
globalAuditNotifier.notify(entry);
|
|
54
49
|
}
|
|
55
50
|
catch {
|
|
56
|
-
//
|
|
51
|
+
// молча: падение нотификации не должно ломать агента
|
|
57
52
|
}
|
|
58
53
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Log a tool call
|
|
61
|
-
*/
|
|
54
|
+
/** Залогировать вызов тула. */
|
|
62
55
|
export function logToolCall(sessionId, tool, success, details) {
|
|
63
56
|
logAudit({
|
|
64
57
|
timestamp: new Date().toISOString(),
|
|
@@ -69,9 +62,7 @@ export function logToolCall(sessionId, tool, success, details) {
|
|
|
69
62
|
details,
|
|
70
63
|
});
|
|
71
64
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Log a file write operation
|
|
74
|
-
*/
|
|
65
|
+
/** Залогировать запись файла. */
|
|
75
66
|
export function logFileWrite(sessionId, path, success, details) {
|
|
76
67
|
logAudit({
|
|
77
68
|
timestamp: new Date().toISOString(),
|
|
@@ -82,9 +73,7 @@ export function logFileWrite(sessionId, path, success, details) {
|
|
|
82
73
|
details,
|
|
83
74
|
});
|
|
84
75
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Log a file delete operation
|
|
87
|
-
*/
|
|
76
|
+
/** Залогировать удаление файла. */
|
|
88
77
|
export function logFileDelete(sessionId, path, success, details) {
|
|
89
78
|
logAudit({
|
|
90
79
|
timestamp: new Date().toISOString(),
|
|
@@ -95,9 +84,7 @@ export function logFileDelete(sessionId, path, success, details) {
|
|
|
95
84
|
details,
|
|
96
85
|
});
|
|
97
86
|
}
|
|
98
|
-
/**
|
|
99
|
-
* Log a bash command execution
|
|
100
|
-
*/
|
|
87
|
+
/** Залогировать выполнение bash-команды. */
|
|
101
88
|
export function logBashCommand(sessionId, command, success, details) {
|
|
102
89
|
logAudit({
|
|
103
90
|
timestamp: new Date().toISOString(),
|
|
@@ -108,9 +95,7 @@ export function logBashCommand(sessionId, command, success, details) {
|
|
|
108
95
|
details,
|
|
109
96
|
});
|
|
110
97
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Log a network request
|
|
113
|
-
*/
|
|
98
|
+
/** Залогировать сетевой запрос. */
|
|
114
99
|
export function logNetworkRequest(sessionId, url, success, details) {
|
|
115
100
|
logAudit({
|
|
116
101
|
timestamp: new Date().toISOString(),
|
|
@@ -121,10 +106,8 @@ export function logNetworkRequest(sessionId, url, success, details) {
|
|
|
121
106
|
details,
|
|
122
107
|
});
|
|
123
108
|
}
|
|
124
|
-
/**
|
|
125
|
-
|
|
126
|
-
*/
|
|
127
|
-
export function logSecurityBlock(sessionId, action, reason, details) {
|
|
109
|
+
/** Залогировать срабатывание security-блока. */
|
|
110
|
+
export function logSecurityBlock(sessionId, _action, reason, details) {
|
|
128
111
|
logAudit({
|
|
129
112
|
timestamp: new Date().toISOString(),
|
|
130
113
|
sessionId,
|
|
@@ -1,23 +1,19 @@
|
|
|
1
|
+
// Нотификации о security-событиях: файл + webhook с ретраями и очередью.
|
|
1
2
|
import { writeFileSync, appendFileSync, existsSync, mkdirSync } from "fs";
|
|
2
3
|
import { join, dirname } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
4
|
import { backoffDelay } from "../../utils/retry";
|
|
5
5
|
import { defaultOutputBus } from "../../output";
|
|
6
|
-
/**
|
|
7
|
-
* Severity weights for comparison
|
|
8
|
-
*/
|
|
6
|
+
/** Веса severity для сравнения. */
|
|
9
7
|
const SEVERITY_WEIGHTS = {
|
|
10
8
|
low: 1,
|
|
11
9
|
medium: 2,
|
|
12
10
|
high: 3,
|
|
13
11
|
critical: 4,
|
|
14
12
|
};
|
|
15
|
-
/**
|
|
16
|
-
* Default audit notifier configuration
|
|
17
|
-
*/
|
|
13
|
+
/** Дефолтный конфиг нотификатора (выключен). */
|
|
18
14
|
export const DEFAULT_AUDIT_NOTIFIER_CONFIG = {
|
|
19
15
|
enabled: false,
|
|
20
|
-
filePath: join(
|
|
16
|
+
filePath: join(globalLogsDir(), "audit-notifications.jsonl"),
|
|
21
17
|
webhookTimeout: 5000,
|
|
22
18
|
minSeverity: "medium",
|
|
23
19
|
eventTypes: [
|
|
@@ -30,9 +26,7 @@ export const DEFAULT_AUDIT_NOTIFIER_CONFIG = {
|
|
|
30
26
|
],
|
|
31
27
|
maxRetries: 3,
|
|
32
28
|
};
|
|
33
|
-
/**
|
|
34
|
-
* Audit notifier for sending notifications about security events
|
|
35
|
-
*/
|
|
29
|
+
/** Нотификатор security-событий: файл + webhook с ретраями. */
|
|
36
30
|
export class AuditNotifier {
|
|
37
31
|
config;
|
|
38
32
|
retryQueue = [];
|
|
@@ -41,60 +35,44 @@ export class AuditNotifier {
|
|
|
41
35
|
this.config = { ...DEFAULT_AUDIT_NOTIFIER_CONFIG, ...config };
|
|
42
36
|
this.ensureLogDirectory();
|
|
43
37
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Check if notifier is enabled
|
|
46
|
-
*/
|
|
38
|
+
/** Включён ли нотификатор. */
|
|
47
39
|
isEnabled() {
|
|
48
40
|
return this.config.enabled;
|
|
49
41
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Enable the notifier
|
|
52
|
-
*/
|
|
42
|
+
/** Включить нотификатор. */
|
|
53
43
|
enable() {
|
|
54
44
|
this.config.enabled = true;
|
|
55
45
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Disable the notifier
|
|
58
|
-
*/
|
|
46
|
+
/** Выключить нотификатор. */
|
|
59
47
|
disable() {
|
|
60
48
|
this.config.enabled = false;
|
|
61
49
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Update configuration
|
|
64
|
-
*/
|
|
50
|
+
/** Обновить конфиг. */
|
|
65
51
|
updateConfig(config) {
|
|
66
52
|
this.config = { ...this.config, ...config };
|
|
67
53
|
this.ensureLogDirectory();
|
|
68
54
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Ensure the log directory exists
|
|
71
|
-
*/
|
|
55
|
+
/** Гарантировать каталог лога. */
|
|
72
56
|
ensureLogDirectory() {
|
|
73
57
|
if (this.config.filePath) {
|
|
74
58
|
const dir = dirname(this.config.filePath);
|
|
75
59
|
mkdirSync(dir, { recursive: true });
|
|
76
60
|
}
|
|
77
61
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Check if an event type should be notified
|
|
80
|
-
*/
|
|
62
|
+
/** Подпадает ли тип события под нотификацию. */
|
|
81
63
|
shouldNotify(eventType) {
|
|
82
64
|
if (!this.config.enabled)
|
|
83
65
|
return false;
|
|
84
66
|
return this.config.eventTypes?.includes(eventType) ?? false;
|
|
85
67
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Check if a severity level should be notified
|
|
88
|
-
*/
|
|
68
|
+
/** Дотягивает ли severity до порога. */
|
|
89
69
|
shouldNotifySeverity(severity) {
|
|
90
70
|
const minSeverity = this.config.minSeverity ?? "medium";
|
|
91
71
|
const minWeight = SEVERITY_WEIGHTS[minSeverity];
|
|
92
72
|
const eventWeight = SEVERITY_WEIGHTS[severity];
|
|
93
73
|
return eventWeight >= minWeight;
|
|
94
74
|
}
|
|
95
|
-
/**
|
|
96
|
-
* Send a notification for an audit event
|
|
97
|
-
*/
|
|
75
|
+
/** Нотифицировать аудит-событие: файл + webhook, падение — в retry-очередь. */
|
|
98
76
|
async notify(entry) {
|
|
99
77
|
if (!this.config.enabled)
|
|
100
78
|
return null;
|
|
@@ -112,9 +90,9 @@ export class AuditNotifier {
|
|
|
112
90
|
details: entry.details ? { details: entry.details } : undefined,
|
|
113
91
|
sessionId: entry.sessionId,
|
|
114
92
|
};
|
|
115
|
-
//
|
|
93
|
+
// Пишем в файл
|
|
116
94
|
this.writeToFile(notification);
|
|
117
|
-
//
|
|
95
|
+
// Шлём в webhook, если задан
|
|
118
96
|
if (this.config.webhookUrl) {
|
|
119
97
|
try {
|
|
120
98
|
await this.sendToWebhook(notification);
|
|
@@ -126,9 +104,7 @@ export class AuditNotifier {
|
|
|
126
104
|
}
|
|
127
105
|
return notification;
|
|
128
106
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Map audit log entry action to notification event type
|
|
131
|
-
*/
|
|
107
|
+
/** Маппинг action записи аудита в тип события нотификации. */
|
|
132
108
|
mapEventType(action) {
|
|
133
109
|
const typeMap = {
|
|
134
110
|
tool_call: "tool_call",
|
|
@@ -140,11 +116,9 @@ export class AuditNotifier {
|
|
|
140
116
|
};
|
|
141
117
|
return typeMap[action] || null;
|
|
142
118
|
}
|
|
143
|
-
/**
|
|
144
|
-
* Determine severity from audit log entry
|
|
145
|
-
*/
|
|
119
|
+
/** Severity из записи аудита (по типу action). */
|
|
146
120
|
determineSeverity(entry) {
|
|
147
|
-
//
|
|
121
|
+
// Дефолтная severity по типу action
|
|
148
122
|
const typeSeverity = {
|
|
149
123
|
security_block: "high",
|
|
150
124
|
bash_command: "high",
|
|
@@ -157,23 +131,22 @@ export class AuditNotifier {
|
|
|
157
131
|
};
|
|
158
132
|
return typeSeverity[entry.action] || "low";
|
|
159
133
|
}
|
|
160
|
-
/**
|
|
161
|
-
* Write notification to file
|
|
162
|
-
*/
|
|
134
|
+
/** Записать нотификацию в файл. */
|
|
163
135
|
writeToFile(notification) {
|
|
164
136
|
if (!this.config.filePath)
|
|
165
137
|
return;
|
|
166
138
|
try {
|
|
167
139
|
const line = JSON.stringify(notification);
|
|
168
|
-
appendFileSync(this.config.filePath, line
|
|
140
|
+
appendFileSync(this.config.filePath, `${line}\n`, "utf8");
|
|
169
141
|
}
|
|
170
142
|
catch (error) {
|
|
171
143
|
defaultOutputBus.log("error", "audit", `[AuditNotifier] Failed to write to file: ${error instanceof Error ? error.message : String(error)}`, { persist: true });
|
|
172
144
|
}
|
|
173
145
|
}
|
|
174
146
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
147
|
+
* Отправить нотификацию в webhook. Падение бросает исключение — политику
|
|
148
|
+
* ретраев решает вызывающий (notify() кладёт в очередь, processRetryQueue()
|
|
149
|
+
* считает попытки).
|
|
177
150
|
*/
|
|
178
151
|
async sendToWebhook(notification) {
|
|
179
152
|
if (!this.config.webhookUrl)
|
|
@@ -195,18 +168,14 @@ export class AuditNotifier {
|
|
|
195
168
|
clearTimeout(timeoutId);
|
|
196
169
|
}
|
|
197
170
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Add notification to retry queue
|
|
200
|
-
*/
|
|
171
|
+
/** Положить нотификацию в retry-очередь. */
|
|
201
172
|
addToRetryQueue(notification) {
|
|
202
173
|
this.retryQueue.push({ entry: notification, retries: 0 });
|
|
203
174
|
if (!this.isProcessing) {
|
|
204
175
|
this.processRetryQueue();
|
|
205
176
|
}
|
|
206
177
|
}
|
|
207
|
-
/**
|
|
208
|
-
* Process the retry queue
|
|
209
|
-
*/
|
|
178
|
+
/** Разобрать retry-очередь (бэкофф, лимит попыток). */
|
|
210
179
|
async processRetryQueue() {
|
|
211
180
|
if (this.retryQueue.length === 0 || this.isProcessing)
|
|
212
181
|
return;
|
|
@@ -224,11 +193,11 @@ export class AuditNotifier {
|
|
|
224
193
|
this.retryQueue.shift();
|
|
225
194
|
}
|
|
226
195
|
catch (error) {
|
|
227
|
-
// sendToWebhook
|
|
228
|
-
//
|
|
196
|
+
// sendToWebhook сам в очередь не кладёт — счётчик ретраев реально
|
|
197
|
+
// растёт, и maxRetries достижим.
|
|
229
198
|
item.retries++;
|
|
230
199
|
defaultOutputBus.log("warn", "audit", `[AuditNotifier] Webhook retry ${item.retries} failed: ${error instanceof Error ? error.message : String(error)}`, { persist: true });
|
|
231
|
-
//
|
|
200
|
+
// Экспоненциальный бэкофф перед следующей попыткой того же head-элемента.
|
|
232
201
|
const delay = backoffDelay(item.retries, 1000);
|
|
233
202
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
234
203
|
}
|
|
@@ -238,9 +207,7 @@ export class AuditNotifier {
|
|
|
238
207
|
this.isProcessing = false;
|
|
239
208
|
}
|
|
240
209
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Read notifications from file
|
|
243
|
-
*/
|
|
210
|
+
/** Прочитать нотификации из файла (последние N). */
|
|
244
211
|
readNotifications(limit = 100) {
|
|
245
212
|
if (!this.config.filePath || !existsSync(this.config.filePath)) {
|
|
246
213
|
return [];
|
|
@@ -255,18 +222,14 @@ export class AuditNotifier {
|
|
|
255
222
|
return [];
|
|
256
223
|
}
|
|
257
224
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Clear all notifications
|
|
260
|
-
*/
|
|
225
|
+
/** Очистить нотификации (файл + очередь). */
|
|
261
226
|
clearNotifications() {
|
|
262
227
|
if (this.config.filePath) {
|
|
263
228
|
writeFileSync(this.config.filePath, "", "utf8");
|
|
264
229
|
}
|
|
265
230
|
this.retryQueue = [];
|
|
266
231
|
}
|
|
267
|
-
/**
|
|
268
|
-
* Get notification statistics
|
|
269
|
-
*/
|
|
232
|
+
/** Статистика нотификаций: всего, по severity, по типам. */
|
|
270
233
|
getStats() {
|
|
271
234
|
const notifications = this.readNotifications();
|
|
272
235
|
const bySeverity = { low: 0, medium: 0, high: 0, critical: 0 };
|
|
@@ -293,15 +256,12 @@ export class AuditNotifier {
|
|
|
293
256
|
};
|
|
294
257
|
}
|
|
295
258
|
}
|
|
296
|
-
/**
|
|
297
|
-
* Global audit notifier instance
|
|
298
|
-
*/
|
|
259
|
+
/** Глобальный инстанс нотификатора аудита. */
|
|
299
260
|
export const globalAuditNotifier = new AuditNotifier();
|
|
300
|
-
/**
|
|
301
|
-
* Create an audit notifier with custom configuration
|
|
302
|
-
*/
|
|
261
|
+
/** Создать нотификатор аудита с кастомным конфигом. */
|
|
303
262
|
export function createAuditNotifier(config) {
|
|
304
263
|
return new AuditNotifier(config);
|
|
305
264
|
}
|
|
306
|
-
//
|
|
265
|
+
// Импорт readFileSync для readNotifications
|
|
307
266
|
import { readFileSync } from "fs";
|
|
267
|
+
import { globalLogsDir } from "../../config/paths";
|