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,499 +0,0 @@
|
|
|
1
|
-
import { mergeSecurityConfig } from "../../config/security";
|
|
2
|
-
/**
|
|
3
|
-
* Strict: максимум безопасности, минимум гибкости.
|
|
4
|
-
* Для: продакшн, чувствительные данные, многопользовательские системы.
|
|
5
|
-
*/
|
|
6
|
-
export const STRICT_POLICY = {
|
|
7
|
-
name: "Strict",
|
|
8
|
-
description: "Maximum security with minimal flexibility. Blocks most dangerous operations.",
|
|
9
|
-
preset: "strict",
|
|
10
|
-
recommendedFor: ["production", "sensitive-data", "multi-user", "enterprise"],
|
|
11
|
-
config: {
|
|
12
|
-
enabled: true,
|
|
13
|
-
bash: {
|
|
14
|
-
enabled: true,
|
|
15
|
-
blacklist: [
|
|
16
|
-
"rm",
|
|
17
|
-
"dd",
|
|
18
|
-
"chmod",
|
|
19
|
-
"wget",
|
|
20
|
-
"curl",
|
|
21
|
-
"scp",
|
|
22
|
-
"ssh",
|
|
23
|
-
"nc",
|
|
24
|
-
"netcat",
|
|
25
|
-
"mknod",
|
|
26
|
-
"mkfifo",
|
|
27
|
-
"ln",
|
|
28
|
-
"chown",
|
|
29
|
-
"chgrp",
|
|
30
|
-
"useradd",
|
|
31
|
-
"usermod",
|
|
32
|
-
"passwd",
|
|
33
|
-
"sudo",
|
|
34
|
-
"su",
|
|
35
|
-
"exec",
|
|
36
|
-
"eval",
|
|
37
|
-
"source",
|
|
38
|
-
"kill",
|
|
39
|
-
"pkill",
|
|
40
|
-
"killall",
|
|
41
|
-
"shutdown",
|
|
42
|
-
"reboot",
|
|
43
|
-
"halt",
|
|
44
|
-
"poweroff",
|
|
45
|
-
"format",
|
|
46
|
-
"fdisk",
|
|
47
|
-
"parted",
|
|
48
|
-
"mkfs",
|
|
49
|
-
"mount",
|
|
50
|
-
"umount",
|
|
51
|
-
"mv",
|
|
52
|
-
"cp",
|
|
53
|
-
],
|
|
54
|
-
whitelist: ["ls", "cat", "echo", "grep", "find", "pwd", "whoami", "date"],
|
|
55
|
-
blockDangerousFlags: true,
|
|
56
|
-
dangerousFlags: [
|
|
57
|
-
"--force",
|
|
58
|
-
"-rf",
|
|
59
|
-
"--no-preserve-root",
|
|
60
|
-
"--recursive",
|
|
61
|
-
"--all",
|
|
62
|
-
"-x",
|
|
63
|
-
"-e",
|
|
64
|
-
"--delete",
|
|
65
|
-
"--remove",
|
|
66
|
-
"--dangerous",
|
|
67
|
-
"--yes",
|
|
68
|
-
"-y",
|
|
69
|
-
"--no-confirm",
|
|
70
|
-
"-R",
|
|
71
|
-
"--no-clobber",
|
|
72
|
-
],
|
|
73
|
-
dangerousOperators: [">", ">>", "2>", "2>>", "|", "&&", "||", ";", "&", "`", "$("],
|
|
74
|
-
logCommands: true,
|
|
75
|
-
},
|
|
76
|
-
paths: {
|
|
77
|
-
enabled: true,
|
|
78
|
-
denied: [
|
|
79
|
-
".git/",
|
|
80
|
-
"node_modules/",
|
|
81
|
-
".env",
|
|
82
|
-
"*.key",
|
|
83
|
-
"*.pem",
|
|
84
|
-
"*.crt",
|
|
85
|
-
"*.p12",
|
|
86
|
-
"*.pfx",
|
|
87
|
-
"*.secret",
|
|
88
|
-
"*.token",
|
|
89
|
-
"package-lock.json",
|
|
90
|
-
"bun.lock",
|
|
91
|
-
"yarn.lock",
|
|
92
|
-
"pnpm-lock.yaml",
|
|
93
|
-
".ssh/",
|
|
94
|
-
".config/",
|
|
95
|
-
".bashrc",
|
|
96
|
-
".bash_profile",
|
|
97
|
-
".zshrc",
|
|
98
|
-
".profile",
|
|
99
|
-
"/etc/",
|
|
100
|
-
"/usr/",
|
|
101
|
-
"/var/",
|
|
102
|
-
"/bin/",
|
|
103
|
-
"/sbin/",
|
|
104
|
-
"/root/",
|
|
105
|
-
"/home/",
|
|
106
|
-
],
|
|
107
|
-
allowed: [],
|
|
108
|
-
},
|
|
109
|
-
network: {
|
|
110
|
-
enabled: true,
|
|
111
|
-
deniedDomains: [
|
|
112
|
-
"localhost",
|
|
113
|
-
"127.0.0.1",
|
|
114
|
-
"0.0.0.0",
|
|
115
|
-
"::1",
|
|
116
|
-
"*.internal",
|
|
117
|
-
"*.local",
|
|
118
|
-
"192.168.*",
|
|
119
|
-
"10.*",
|
|
120
|
-
"172.16.*",
|
|
121
|
-
],
|
|
122
|
-
allowedDomains: [],
|
|
123
|
-
requestTimeout: 10000,
|
|
124
|
-
maxResponseSize: 10000,
|
|
125
|
-
},
|
|
126
|
-
maxRecursionDepth: 2,
|
|
127
|
-
maxFileOperations: 50,
|
|
128
|
-
rateLimits: {
|
|
129
|
-
maxRequestsPerMinute: 30,
|
|
130
|
-
maxParallelTasks: 3,
|
|
131
|
-
},
|
|
132
|
-
contentScan: {
|
|
133
|
-
enabled: true,
|
|
134
|
-
dangerousPatterns: [
|
|
135
|
-
/eval\(/,
|
|
136
|
-
/new Function\(/,
|
|
137
|
-
/child_process\.exec\(/,
|
|
138
|
-
/child_process\.spawn\(/,
|
|
139
|
-
/require\('child_process'\)/,
|
|
140
|
-
/require\('http'\)\.createServer/,
|
|
141
|
-
/require\('net'\)\.createServer/,
|
|
142
|
-
/process\.exit\(/,
|
|
143
|
-
/while\(true\)/,
|
|
144
|
-
/for\(;;\)/,
|
|
145
|
-
/rm -rf/,
|
|
146
|
-
/dd if=/,
|
|
147
|
-
/chmod 777/,
|
|
148
|
-
/wget /,
|
|
149
|
-
/curl /,
|
|
150
|
-
/ssh /,
|
|
151
|
-
/scp /,
|
|
152
|
-
],
|
|
153
|
-
},
|
|
154
|
-
sessionEncryption: {
|
|
155
|
-
enabled: true,
|
|
156
|
-
encryptHistory: true,
|
|
157
|
-
encryptSessionLog: true,
|
|
158
|
-
},
|
|
159
|
-
auditNotifier: {
|
|
160
|
-
enabled: true,
|
|
161
|
-
minSeverity: "low",
|
|
162
|
-
eventTypes: [
|
|
163
|
-
"security_block",
|
|
164
|
-
"bash_command",
|
|
165
|
-
"file_operation",
|
|
166
|
-
"network_request",
|
|
167
|
-
"authentication",
|
|
168
|
-
"configuration_change",
|
|
169
|
-
"session_start",
|
|
170
|
-
"session_end",
|
|
171
|
-
],
|
|
172
|
-
maxRetries: 3,
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* Balanced: вменяемая безопасность с разумной гибкостью.
|
|
178
|
-
* Для: разработка, однопользовательские системы, общее использование.
|
|
179
|
-
*/
|
|
180
|
-
export const BALANCED_POLICY = {
|
|
181
|
-
name: "Balanced",
|
|
182
|
-
description: "Good security with reasonable flexibility. Default policy.",
|
|
183
|
-
preset: "balanced",
|
|
184
|
-
recommendedFor: ["development", "single-user", "general-use", "testing"],
|
|
185
|
-
config: {
|
|
186
|
-
enabled: true,
|
|
187
|
-
bash: {
|
|
188
|
-
enabled: true,
|
|
189
|
-
blacklist: [
|
|
190
|
-
"rm",
|
|
191
|
-
"dd",
|
|
192
|
-
"chmod",
|
|
193
|
-
"wget",
|
|
194
|
-
"curl",
|
|
195
|
-
"scp",
|
|
196
|
-
"ssh",
|
|
197
|
-
"nc",
|
|
198
|
-
"netcat",
|
|
199
|
-
"mknod",
|
|
200
|
-
"mkfifo",
|
|
201
|
-
"useradd",
|
|
202
|
-
"usermod",
|
|
203
|
-
"passwd",
|
|
204
|
-
"sudo",
|
|
205
|
-
"su",
|
|
206
|
-
"shutdown",
|
|
207
|
-
"reboot",
|
|
208
|
-
"halt",
|
|
209
|
-
"poweroff",
|
|
210
|
-
"format",
|
|
211
|
-
"fdisk",
|
|
212
|
-
"parted",
|
|
213
|
-
"mkfs",
|
|
214
|
-
],
|
|
215
|
-
whitelist: [],
|
|
216
|
-
blockDangerousFlags: true,
|
|
217
|
-
dangerousFlags: [
|
|
218
|
-
"--force",
|
|
219
|
-
"-rf",
|
|
220
|
-
"--no-preserve-root",
|
|
221
|
-
"--recursive",
|
|
222
|
-
"--all",
|
|
223
|
-
"--delete",
|
|
224
|
-
"--remove",
|
|
225
|
-
"--dangerous",
|
|
226
|
-
"--yes",
|
|
227
|
-
"-y",
|
|
228
|
-
"--no-confirm",
|
|
229
|
-
],
|
|
230
|
-
dangerousOperators: ["|", "&&", "||", ";", "&", "`"],
|
|
231
|
-
logCommands: true,
|
|
232
|
-
},
|
|
233
|
-
paths: {
|
|
234
|
-
enabled: true,
|
|
235
|
-
denied: [
|
|
236
|
-
".git/",
|
|
237
|
-
"node_modules/",
|
|
238
|
-
".env",
|
|
239
|
-
"*.key",
|
|
240
|
-
"*.pem",
|
|
241
|
-
"*.crt",
|
|
242
|
-
"*.p12",
|
|
243
|
-
"*.pfx",
|
|
244
|
-
"*.secret",
|
|
245
|
-
"*.token",
|
|
246
|
-
"package-lock.json",
|
|
247
|
-
"bun.lock",
|
|
248
|
-
"yarn.lock",
|
|
249
|
-
"pnpm-lock.yaml",
|
|
250
|
-
".ssh/",
|
|
251
|
-
],
|
|
252
|
-
allowed: [],
|
|
253
|
-
},
|
|
254
|
-
network: {
|
|
255
|
-
enabled: true,
|
|
256
|
-
deniedDomains: [],
|
|
257
|
-
allowedDomains: [],
|
|
258
|
-
requestTimeout: 15000,
|
|
259
|
-
maxResponseSize: 15000,
|
|
260
|
-
},
|
|
261
|
-
maxRecursionDepth: 3,
|
|
262
|
-
maxFileOperations: 100,
|
|
263
|
-
rateLimits: {
|
|
264
|
-
maxRequestsPerMinute: 60,
|
|
265
|
-
maxParallelTasks: 5,
|
|
266
|
-
},
|
|
267
|
-
contentScan: {
|
|
268
|
-
enabled: true,
|
|
269
|
-
dangerousPatterns: [
|
|
270
|
-
/eval\(/,
|
|
271
|
-
/new Function\(/,
|
|
272
|
-
/child_process\.exec\(/,
|
|
273
|
-
/child_process\.spawn\(/,
|
|
274
|
-
/require\('child_process'\)/,
|
|
275
|
-
/process\.exit\(/,
|
|
276
|
-
/while\(true\)/,
|
|
277
|
-
/for\(;;\)/,
|
|
278
|
-
/rm -rf/,
|
|
279
|
-
/dd if=/,
|
|
280
|
-
/chmod 777/,
|
|
281
|
-
],
|
|
282
|
-
},
|
|
283
|
-
sessionEncryption: {
|
|
284
|
-
enabled: false,
|
|
285
|
-
encryptHistory: true,
|
|
286
|
-
encryptSessionLog: true,
|
|
287
|
-
},
|
|
288
|
-
auditNotifier: {
|
|
289
|
-
enabled: false,
|
|
290
|
-
minSeverity: "medium",
|
|
291
|
-
eventTypes: ["security_block", "bash_command", "file_operation", "network_request"],
|
|
292
|
-
maxRetries: 3,
|
|
293
|
-
},
|
|
294
|
-
},
|
|
295
|
-
};
|
|
296
|
-
/**
|
|
297
|
-
* Permissive: минимум безопасности, максимум гибкости.
|
|
298
|
-
* Для: доверенные окружения, локальная разработка, тесты.
|
|
299
|
-
*/
|
|
300
|
-
export const PERMISSIVE_POLICY = {
|
|
301
|
-
name: "Permissive",
|
|
302
|
-
description: "Minimal security with maximum flexibility. Use with caution.",
|
|
303
|
-
preset: "permissive",
|
|
304
|
-
recommendedFor: ["trusted-environment", "local-dev", "testing", "sandbox"],
|
|
305
|
-
config: {
|
|
306
|
-
enabled: true,
|
|
307
|
-
bash: {
|
|
308
|
-
enabled: true,
|
|
309
|
-
blacklist: [
|
|
310
|
-
"rm",
|
|
311
|
-
"dd",
|
|
312
|
-
"shutdown",
|
|
313
|
-
"reboot",
|
|
314
|
-
"halt",
|
|
315
|
-
"poweroff",
|
|
316
|
-
"format",
|
|
317
|
-
"fdisk",
|
|
318
|
-
"parted",
|
|
319
|
-
"mkfs",
|
|
320
|
-
],
|
|
321
|
-
whitelist: [],
|
|
322
|
-
blockDangerousFlags: false,
|
|
323
|
-
dangerousFlags: ["--force", "-rf", "--no-preserve-root"],
|
|
324
|
-
dangerousOperators: [],
|
|
325
|
-
logCommands: true,
|
|
326
|
-
},
|
|
327
|
-
paths: {
|
|
328
|
-
enabled: true,
|
|
329
|
-
denied: [".env", "*.key", "*.pem", "*.crt", "*.p12", "*.pfx"],
|
|
330
|
-
allowed: [],
|
|
331
|
-
},
|
|
332
|
-
network: {
|
|
333
|
-
enabled: true,
|
|
334
|
-
deniedDomains: [],
|
|
335
|
-
allowedDomains: [],
|
|
336
|
-
requestTimeout: 30000,
|
|
337
|
-
maxResponseSize: 30000,
|
|
338
|
-
},
|
|
339
|
-
maxRecursionDepth: 5,
|
|
340
|
-
maxFileOperations: 200,
|
|
341
|
-
rateLimits: {
|
|
342
|
-
maxRequestsPerMinute: 120,
|
|
343
|
-
maxParallelTasks: 10,
|
|
344
|
-
},
|
|
345
|
-
contentScan: {
|
|
346
|
-
enabled: true,
|
|
347
|
-
dangerousPatterns: [
|
|
348
|
-
/eval\(/,
|
|
349
|
-
/new Function\(/,
|
|
350
|
-
/while\(true\)/,
|
|
351
|
-
/for\(;;\)/,
|
|
352
|
-
/rm -rf/,
|
|
353
|
-
/dd if=/,
|
|
354
|
-
],
|
|
355
|
-
},
|
|
356
|
-
sessionEncryption: {
|
|
357
|
-
enabled: false,
|
|
358
|
-
encryptHistory: false,
|
|
359
|
-
encryptSessionLog: false,
|
|
360
|
-
},
|
|
361
|
-
auditNotifier: {
|
|
362
|
-
enabled: false,
|
|
363
|
-
minSeverity: "high",
|
|
364
|
-
eventTypes: ["security_block"],
|
|
365
|
-
maxRetries: 2,
|
|
366
|
-
},
|
|
367
|
-
},
|
|
368
|
-
};
|
|
369
|
-
/** Все доступные политики безопасности. */
|
|
370
|
-
export const SECURITY_POLICIES = {
|
|
371
|
-
strict: STRICT_POLICY,
|
|
372
|
-
balanced: BALANCED_POLICY,
|
|
373
|
-
permissive: PERMISSIVE_POLICY,
|
|
374
|
-
custom: {
|
|
375
|
-
name: "Custom",
|
|
376
|
-
description: "Custom security configuration",
|
|
377
|
-
preset: "custom",
|
|
378
|
-
recommendedFor: [],
|
|
379
|
-
config: {},
|
|
380
|
-
},
|
|
381
|
-
};
|
|
382
|
-
/** Менеджер политик безопасности (текущая + кастом). */
|
|
383
|
-
export class SecurityPolicyManager {
|
|
384
|
-
currentPolicy = "balanced";
|
|
385
|
-
customConfig = {};
|
|
386
|
-
/** Все доступные политики. */
|
|
387
|
-
getPolicies() {
|
|
388
|
-
return Object.values(SECURITY_POLICIES);
|
|
389
|
-
}
|
|
390
|
-
/** Политика по имени (неизвестная — balanced). */
|
|
391
|
-
getPolicy(preset) {
|
|
392
|
-
return SECURITY_POLICIES[preset] || SECURITY_POLICIES.balanced;
|
|
393
|
-
}
|
|
394
|
-
/** Текущая политика (custom — с кастомным конфигом). */
|
|
395
|
-
getCurrentPolicy() {
|
|
396
|
-
if (this.currentPolicy === "custom") {
|
|
397
|
-
return {
|
|
398
|
-
...SECURITY_POLICIES.custom,
|
|
399
|
-
config: this.customConfig,
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
return this.getPolicy(this.currentPolicy);
|
|
403
|
-
}
|
|
404
|
-
/** Назначить текущую политику. */
|
|
405
|
-
setPolicy(preset) {
|
|
406
|
-
this.currentPolicy = preset;
|
|
407
|
-
}
|
|
408
|
-
/** Задать кастомный конфиг (переключает на 'custom'). */
|
|
409
|
-
setCustomConfig(config) {
|
|
410
|
-
this.customConfig = config;
|
|
411
|
-
this.currentPolicy = "custom";
|
|
412
|
-
}
|
|
413
|
-
/** Текущий security-конфиг (политика + мерж дефолтов). */
|
|
414
|
-
getConfig() {
|
|
415
|
-
const policy = this.getCurrentPolicy();
|
|
416
|
-
return mergeSecurityConfig({
|
|
417
|
-
...policy.config,
|
|
418
|
-
...(this.currentPolicy === "custom" ? this.customConfig : {}),
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
/** Применить политику с опциональными оверрайдами; вернуть смерженный конфиг. */
|
|
422
|
-
applyPolicy(preset, customOverrides) {
|
|
423
|
-
this.setPolicy(preset);
|
|
424
|
-
if (customOverrides) {
|
|
425
|
-
this.customConfig = customOverrides;
|
|
426
|
-
this.currentPolicy = "custom";
|
|
427
|
-
}
|
|
428
|
-
return this.getConfig();
|
|
429
|
-
}
|
|
430
|
-
/** Рекомендованная политика для кейса (иначе — balanced). */
|
|
431
|
-
getRecommendation(useCase) {
|
|
432
|
-
for (const policy of this.getPolicies()) {
|
|
433
|
-
if (policy.recommendedFor.includes(useCase)) {
|
|
434
|
-
return policy;
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
return BALANCED_POLICY;
|
|
438
|
-
}
|
|
439
|
-
/** Разрешает ли текущая политика действие (bash/file_access/network). */
|
|
440
|
-
allowsAction(action, context) {
|
|
441
|
-
const config = this.getConfig();
|
|
442
|
-
switch (action) {
|
|
443
|
-
case "bash":
|
|
444
|
-
if (context?.command) {
|
|
445
|
-
const cmd = context.command.split(" ")[0];
|
|
446
|
-
return !config.bash.blacklist.includes(cmd);
|
|
447
|
-
}
|
|
448
|
-
return true;
|
|
449
|
-
case "file_access":
|
|
450
|
-
if (context?.path) {
|
|
451
|
-
for (const denied of config.paths.denied) {
|
|
452
|
-
if (context.path.includes(denied.replace("*", ""))) {
|
|
453
|
-
return false;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
return true;
|
|
458
|
-
case "network":
|
|
459
|
-
if (context?.path) {
|
|
460
|
-
for (const denied of config.network.deniedDomains) {
|
|
461
|
-
if (context.path.includes(denied.replace("*", ""))) {
|
|
462
|
-
return false;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
return true;
|
|
467
|
-
default:
|
|
468
|
-
return true;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
/** Посравнить две политики по ключам конфига. */
|
|
472
|
-
comparePolicies(policy1, policy2) {
|
|
473
|
-
const config1 = this.getPolicy(policy1).config;
|
|
474
|
-
const config2 = this.getPolicy(policy2).config;
|
|
475
|
-
const comparison = {};
|
|
476
|
-
const keys = new Set([...Object.keys(config1), ...Object.keys(config2)]);
|
|
477
|
-
for (const key of keys) {
|
|
478
|
-
comparison[key] = {
|
|
479
|
-
policy1: config1[key],
|
|
480
|
-
policy2: config2[key],
|
|
481
|
-
};
|
|
482
|
-
}
|
|
483
|
-
return comparison;
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
/** Глобальный менеджер политик. */
|
|
487
|
-
export const globalSecurityPolicyManager = new SecurityPolicyManager();
|
|
488
|
-
/** Создать менеджер политик. */
|
|
489
|
-
export function createSecurityPolicyManager() {
|
|
490
|
-
return new SecurityPolicyManager();
|
|
491
|
-
}
|
|
492
|
-
/** Политика по имени через глобальный менеджер. */
|
|
493
|
-
export function getSecurityPolicy(preset) {
|
|
494
|
-
return globalSecurityPolicyManager.getPolicy(preset);
|
|
495
|
-
}
|
|
496
|
-
/** Применить политику через глобальный менеджер. */
|
|
497
|
-
export function applySecurityPolicy(preset, customOverrides) {
|
|
498
|
-
return globalSecurityPolicyManager.applyPolicy(preset, customOverrides);
|
|
499
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
// Шифрование файлов сессий (history.jsonl, session.jsonl): чтение/запись/append.
|
|
2
|
-
import { readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync } from "fs";
|
|
3
|
-
import { join } from "path";
|
|
4
|
-
import { encryptString, decryptString, isEncryptedString, ConfigEncryptor, } from "./encryption";
|
|
5
|
-
import { defaultOutputBus } from "../../output";
|
|
6
|
-
import { globalMmaDir } from "../../config/paths";
|
|
7
|
-
/** Дефолтный конфиг шифрования сессии (выключено). */
|
|
8
|
-
export const DEFAULT_SESSION_ENCRYPTION = {
|
|
9
|
-
enabled: false,
|
|
10
|
-
encryptHistory: true,
|
|
11
|
-
encryptSessionLog: true,
|
|
12
|
-
};
|
|
13
|
-
/** Шифровальщик/расшифровщик файлов сессии. */
|
|
14
|
-
export class SessionFileEncryptor {
|
|
15
|
-
config;
|
|
16
|
-
encryptor;
|
|
17
|
-
constructor(config) {
|
|
18
|
-
this.config = { ...DEFAULT_SESSION_ENCRYPTION, ...config };
|
|
19
|
-
this.encryptor = new ConfigEncryptor({
|
|
20
|
-
keyPath: config?.keyPath || join(globalMmaDir(), ".session-encryption-key"),
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
/** Включено ли шифрование файлов сессии. */
|
|
24
|
-
isEnabled() {
|
|
25
|
-
return this.config.enabled;
|
|
26
|
-
}
|
|
27
|
-
/** Зашифровать содержимое файла сессии. */
|
|
28
|
-
encryptFileContent(content) {
|
|
29
|
-
if (!this.config.enabled)
|
|
30
|
-
return content;
|
|
31
|
-
return encryptString(content, this.encryptor.getKey());
|
|
32
|
-
}
|
|
33
|
-
/** Расшифровать содержимое файла сессии (plain text — как есть). */
|
|
34
|
-
decryptFileContent(content) {
|
|
35
|
-
if (!this.config.enabled)
|
|
36
|
-
return content;
|
|
37
|
-
if (!isEncryptedString(content))
|
|
38
|
-
return content;
|
|
39
|
-
return decryptString(content, this.encryptor.getKey());
|
|
40
|
-
}
|
|
41
|
-
/** Зашифровать JSON-объект (для структурных файлов). */
|
|
42
|
-
encryptJSON(obj) {
|
|
43
|
-
if (!this.config.enabled)
|
|
44
|
-
return JSON.stringify(obj);
|
|
45
|
-
return this.encryptFileContent(JSON.stringify(obj));
|
|
46
|
-
}
|
|
47
|
-
/** Расшифровать JSON-строку; мусор — ошибка. */
|
|
48
|
-
decryptJSON(content) {
|
|
49
|
-
let plain = content;
|
|
50
|
-
if (this.config.enabled) {
|
|
51
|
-
plain = this.decryptFileContent(content);
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
return JSON.parse(plain);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
throw new Error("Invalid JSON content in session file — file may be corrupted or encrypted with a different key");
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** Зашифровать JSONL-файл (по строке на объект). */
|
|
61
|
-
encryptJSONL(lines) {
|
|
62
|
-
if (!this.config.enabled)
|
|
63
|
-
return lines;
|
|
64
|
-
return lines.map((line) => this.encryptFileContent(line));
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Расшифровать JSONL. Строка с ошибкой (битая, оборванная крашем, чужой
|
|
68
|
-
* plaintext) логируется и ПРОПУСКАЕТСЯ — одна плохая строка не должна
|
|
69
|
-
* убивать всю историю сессии.
|
|
70
|
-
*/
|
|
71
|
-
decryptJSONL(lines) {
|
|
72
|
-
if (!this.config.enabled)
|
|
73
|
-
return lines;
|
|
74
|
-
return lines.flatMap((line) => {
|
|
75
|
-
try {
|
|
76
|
-
return [this.decryptFileContent(line)];
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
defaultOutputBus.log("error", "security", `[session-encryption] failed to decrypt JSONL line — skipping it: ${e instanceof Error ? e.message : String(e)}`, { persist: true });
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
/** Прочитать и расшифровать файл сессии. */
|
|
85
|
-
readSessionFile(filePath) {
|
|
86
|
-
const content = readFileSync(filePath, "utf8");
|
|
87
|
-
return this.decryptFileContent(content);
|
|
88
|
-
}
|
|
89
|
-
/** Зашифровать и записать файл сессии. */
|
|
90
|
-
writeSessionFile(filePath, content) {
|
|
91
|
-
const encrypted = this.encryptFileContent(content);
|
|
92
|
-
writeFileSync(filePath, encrypted, "utf8");
|
|
93
|
-
}
|
|
94
|
-
/** Прочитать и расшифровать JSON-файл сессии. */
|
|
95
|
-
readSessionJSON(filePath) {
|
|
96
|
-
const content = readFileSync(filePath, "utf8");
|
|
97
|
-
return this.decryptJSON(content);
|
|
98
|
-
}
|
|
99
|
-
/** Зашифровать и записать JSON-файл сессии. */
|
|
100
|
-
writeSessionJSON(filePath, obj) {
|
|
101
|
-
const content = this.encryptJSON(obj);
|
|
102
|
-
writeFileSync(filePath, content, "utf8");
|
|
103
|
-
}
|
|
104
|
-
/** Прочитать и расшифровать JSONL-файл сессии (битые строки пропускаются). */
|
|
105
|
-
readSessionJSONL(filePath) {
|
|
106
|
-
const content = readFileSync(filePath, "utf8");
|
|
107
|
-
const lines = content.split("\n").filter((line) => line.trim());
|
|
108
|
-
const decryptedLines = this.decryptJSONL(lines);
|
|
109
|
-
// Кривые строки пропускаем, а не роняем весь лог сессии
|
|
110
|
-
return decryptedLines.flatMap((line) => {
|
|
111
|
-
try {
|
|
112
|
-
return [JSON.parse(line)];
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return [];
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
/** Добавить зашифрованную запись в JSONL-файл. */
|
|
120
|
-
appendToSessionJSONL(filePath, obj) {
|
|
121
|
-
const encryptedLine = this.encryptFileContent(JSON.stringify(obj));
|
|
122
|
-
writeFileSync(filePath, `${encryptedLine}\n`, {
|
|
123
|
-
flag: "a",
|
|
124
|
-
encoding: "utf8",
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
/** Зашифровать все файлы каталога сессии (*.enc, оригиналы удаляются). */
|
|
128
|
-
encryptSessionDirectory(sessionDir) {
|
|
129
|
-
if (!this.config.enabled)
|
|
130
|
-
return;
|
|
131
|
-
const files = readdirSync(sessionDir);
|
|
132
|
-
for (const file of files) {
|
|
133
|
-
const filePath = join(sessionDir, file);
|
|
134
|
-
if (existsSync(filePath) && !file.endsWith(".enc")) {
|
|
135
|
-
try {
|
|
136
|
-
const content = readFileSync(filePath, "utf8");
|
|
137
|
-
const encrypted = this.encryptFileContent(content);
|
|
138
|
-
writeFileSync(`${filePath}.enc`, encrypted, "utf8");
|
|
139
|
-
unlinkSync(filePath);
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
// Бинарники и нечитаемое пропускаем
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/** Расшифровать все *.enc в каталоге сессии (оригиналы восстанавливаются). */
|
|
148
|
-
decryptSessionDirectory(sessionDir) {
|
|
149
|
-
if (!this.config.enabled)
|
|
150
|
-
return;
|
|
151
|
-
const files = readdirSync(sessionDir);
|
|
152
|
-
for (const file of files) {
|
|
153
|
-
if (file.endsWith(".enc")) {
|
|
154
|
-
const encFilePath = join(sessionDir, file);
|
|
155
|
-
const decFilePath = encFilePath.slice(0, -4); // снять .enc
|
|
156
|
-
try {
|
|
157
|
-
const content = readFileSync(encFilePath, "utf8");
|
|
158
|
-
const decrypted = this.decryptFileContent(content);
|
|
159
|
-
writeFileSync(decFilePath, decrypted, "utf8");
|
|
160
|
-
unlinkSync(encFilePath);
|
|
161
|
-
}
|
|
162
|
-
catch {
|
|
163
|
-
// Нерасшифровываемое пропускаем
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
/** Глобальный шифровальщик файлов сессии. */
|
|
170
|
-
export const globalSessionEncryptor = new SessionFileEncryptor();
|
|
171
|
-
/** Создать шифровальщик файлов сессии с кастомным конфигом. */
|
|
172
|
-
export function createSessionFileEncryptor(config) {
|
|
173
|
-
return new SessionFileEncryptor(config);
|
|
174
|
-
}
|
|
175
|
-
/** Хелпер: зашифровать объект сообщения (для SessionMessage). */
|
|
176
|
-
export function encryptSessionMessage(msg) {
|
|
177
|
-
return globalSessionEncryptor.encryptJSON(msg);
|
|
178
|
-
}
|
|
179
|
-
/** Хелпер: расшифровать сообщение сессии. */
|
|
180
|
-
export function decryptSessionMessage(encrypted) {
|
|
181
|
-
return globalSessionEncryptor.decryptJSON(encrypted);
|
|
182
|
-
}
|