principles-disciple 1.126.0 → 1.128.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/dist/commands/archive-impl.d.ts +18 -0
- package/dist/commands/archive-impl.js +105 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.js +76 -0
- package/dist/commands/context.d.ts +5 -0
- package/{src/commands/context.ts → dist/commands/context.js} +34 -83
- package/dist/commands/disable-impl.d.ts +22 -0
- package/dist/commands/disable-impl.js +118 -0
- package/dist/commands/evolution-status.d.ts +4 -0
- package/dist/commands/evolution-status.js +187 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.js +53 -0
- package/dist/commands/focus.d.ts +14 -0
- package/dist/commands/focus.js +443 -0
- package/dist/commands/pain.d.ts +6 -0
- package/{src/commands/pain.ts → dist/commands/pain.js} +137 -188
- package/dist/commands/principle-rollback.d.ts +4 -0
- package/dist/commands/principle-rollback.js +26 -0
- package/dist/commands/promote-impl.d.ts +22 -0
- package/dist/commands/promote-impl.js +194 -0
- package/dist/commands/rollback-impl.d.ts +32 -0
- package/dist/commands/rollback-impl.js +180 -0
- package/dist/commands/rollback.d.ts +19 -0
- package/{src/commands/rollback.ts → dist/commands/rollback.js} +10 -53
- package/dist/commands/samples.d.ts +2 -0
- package/dist/commands/samples.js +58 -0
- package/dist/commands/strategy.d.ts +2 -0
- package/dist/commands/strategy.js +16 -0
- package/dist/commands/thinking-os.d.ts +2 -0
- package/{src/commands/thinking-os.ts → dist/commands/thinking-os.js} +35 -58
- package/dist/commands/workflow-debug.d.ts +6 -0
- package/{src/commands/workflow-debug.ts → dist/commands/workflow-debug.js} +13 -33
- package/dist/config/defaults/runtime.d.ts +58 -0
- package/{src/config/defaults/runtime.ts → dist/config/defaults/runtime.js} +4 -41
- package/dist/config/errors.d.ts +86 -0
- package/dist/config/errors.js +107 -0
- package/{src/config/index.ts → dist/config/index.d.ts} +1 -2
- package/dist/config/index.js +7 -0
- package/dist/constants/diagnostician.d.ts +12 -0
- package/{src/constants/diagnostician.ts → dist/constants/diagnostician.js} +0 -1
- package/dist/constants/tools.d.ts +17 -0
- package/dist/constants/tools.js +53 -0
- package/dist/core/__tests__/focus-history.test.d.ts +1 -0
- package/dist/core/__tests__/focus-history.test.js +160 -0
- package/dist/core/bootstrap-rules.d.ts +50 -0
- package/dist/core/bootstrap-rules.js +187 -0
- package/dist/core/code-implementation-storage.d.ts +71 -0
- package/dist/core/code-implementation-storage.js +139 -0
- package/dist/core/config-health.d.ts +27 -0
- package/dist/core/config-health.js +60 -0
- package/dist/core/config-service.d.ts +15 -0
- package/{src/core/config-service.ts → dist/core/config-service.js} +4 -7
- package/dist/core/config.d.ts +111 -0
- package/{src/core/config.ts → dist/core/config.js} +46 -146
- package/dist/core/control-ui-db.d.ts +106 -0
- package/dist/core/control-ui-db.js +309 -0
- package/dist/core/correction-cue-learner.d.ts +33 -0
- package/dist/core/correction-cue-learner.js +184 -0
- package/dist/core/correction-types.d.ts +3 -0
- package/dist/core/correction-types.js +1 -0
- package/dist/core/detection-funnel.d.ts +33 -0
- package/{src/core/detection-funnel.ts → dist/core/detection-funnel.js} +17 -37
- package/dist/core/detection-service.d.ts +15 -0
- package/{src/core/detection-service.ts → dist/core/detection-service.js} +4 -7
- package/dist/core/dictionary-service.d.ts +15 -0
- package/{src/core/dictionary-service.ts → dist/core/dictionary-service.js} +4 -7
- package/dist/core/dictionary.d.ts +38 -0
- package/{src/core/dictionary.ts → dist/core/dictionary.js} +33 -59
- package/dist/core/empathy-keyword-matcher.d.ts +5 -0
- package/dist/core/empathy-keyword-matcher.js +40 -0
- package/dist/core/empathy-types.d.ts +2 -0
- package/dist/core/empathy-types.js +1 -0
- package/dist/core/event-log.d.ts +90 -0
- package/dist/core/event-log.js +702 -0
- package/dist/core/evolution-engine.d.ts +119 -0
- package/dist/core/evolution-engine.js +460 -0
- package/dist/core/evolution-logger.d.ts +137 -0
- package/dist/core/evolution-logger.js +261 -0
- package/dist/core/evolution-migration.d.ts +5 -0
- package/dist/core/evolution-migration.js +65 -0
- package/dist/core/evolution-reducer.d.ts +124 -0
- package/dist/core/evolution-reducer.js +730 -0
- package/dist/core/evolution-types.d.ts +50 -0
- package/dist/core/evolution-types.js +11 -0
- package/dist/core/external-training-contract.d.ts +276 -0
- package/dist/core/external-training-contract.js +269 -0
- package/dist/core/file-store.d.ts +41 -0
- package/dist/core/file-store.js +46 -0
- package/dist/core/focus-history.d.ts +50 -0
- package/dist/core/focus-history.js +574 -0
- package/dist/core/hygiene/tracker.d.ts +22 -0
- package/dist/core/hygiene/tracker.js +110 -0
- package/dist/core/init.d.ts +30 -0
- package/{src/core/init.ts → dist/core/init.js} +87 -118
- package/dist/core/local-worker-routing.d.ts +124 -0
- package/dist/core/local-worker-routing.js +216 -0
- package/dist/core/migration.d.ts +6 -0
- package/{src/core/migration.ts → dist/core/migration.js} +10 -18
- package/dist/core/model-deployment-registry.d.ts +218 -0
- package/dist/core/model-deployment-registry.js +502 -0
- package/dist/core/model-training-registry.d.ts +295 -0
- package/dist/core/model-training-registry.js +474 -0
- package/dist/core/observability.d.ts +40 -0
- package/dist/core/observability.js +164 -0
- package/dist/core/pain-diagnostic-gate.d.ts +36 -0
- package/dist/core/pain-diagnostic-gate.js +105 -0
- package/dist/core/pain.d.ts +87 -0
- package/dist/core/pain.js +223 -0
- package/dist/core/path-resolver.d.ts +60 -0
- package/{src/core/path-resolver.ts → dist/core/path-resolver.js} +41 -131
- package/dist/core/paths.d.ts +60 -0
- package/{src/core/paths.ts → dist/core/paths.js} +4 -13
- package/dist/core/pd-config-loader.d.ts +96 -0
- package/dist/core/pd-config-loader.js +307 -0
- package/dist/core/pd-task-reconciler.d.ts +89 -0
- package/dist/core/pd-task-reconciler.js +262 -0
- package/dist/core/pd-task-service.d.ts +2 -0
- package/dist/core/pd-task-service.js +32 -0
- package/dist/core/pd-task-store.d.ts +5 -0
- package/dist/core/pd-task-store.js +62 -0
- package/dist/core/pd-task-types.d.ts +8 -0
- package/dist/core/pd-task-types.js +2 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.d.ts +1 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.js +132 -0
- package/dist/core/principle-compiler/code-validator.d.ts +14 -0
- package/dist/core/principle-compiler/code-validator.js +86 -0
- package/dist/core/principle-compiler/compiler.d.ts +45 -0
- package/dist/core/principle-compiler/compiler.js +287 -0
- package/{src/core/principle-compiler/index.ts → dist/core/principle-compiler/index.d.ts} +0 -1
- package/dist/core/principle-compiler/index.js +10 -0
- package/dist/core/principle-compiler/ledger-registrar.d.ts +28 -0
- package/dist/core/principle-compiler/ledger-registrar.js +95 -0
- package/{src/core/principle-compiler/template-generator.ts → dist/core/principle-compiler/template-generator.d.ts} +0 -1
- package/dist/core/principle-compiler/template-generator.js +7 -0
- package/{src/core/principle-injection.ts → dist/core/principle-injection.d.ts} +1 -7
- package/dist/core/principle-injection.js +10 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.d.ts +15 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.js +34 -0
- package/dist/core/principle-internalization/lifecycle-read-model.d.ts +17 -0
- package/{src/core/principle-internalization/lifecycle-read-model.ts → dist/core/principle-internalization/lifecycle-read-model.js} +2 -21
- package/dist/core/principle-internalization/lifecycle-refresh.d.ts +2 -0
- package/dist/core/principle-internalization/lifecycle-refresh.js +4 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.d.ts +28 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.js +89 -0
- package/dist/core/principle-training-state.d.ts +47 -0
- package/dist/core/principle-training-state.js +113 -0
- package/dist/core/principle-tree-ledger-adapter.d.ts +32 -0
- package/dist/core/principle-tree-ledger-adapter.js +125 -0
- package/dist/core/principle-tree-ledger.d.ts +82 -0
- package/dist/core/principle-tree-ledger.js +527 -0
- package/dist/core/profile.d.ts +62 -0
- package/dist/core/profile.js +211 -0
- package/dist/core/promotion-gate.d.ts +243 -0
- package/dist/core/promotion-gate.js +554 -0
- package/dist/core/reflection/reflection-context.d.ts +31 -0
- package/dist/core/reflection/reflection-context.js +91 -0
- package/dist/core/replay-engine.d.ts +12 -0
- package/dist/core/replay-engine.js +82 -0
- package/dist/core/risk-calculator.d.ts +22 -0
- package/{src/core/risk-calculator.ts → dist/core/risk-calculator.js} +19 -49
- package/{src/core/rule-host-helpers.ts → dist/core/rule-host-helpers.d.ts} +0 -1
- package/dist/core/rule-host-helpers.js +7 -0
- package/{src/core/rule-host-types.ts → dist/core/rule-host-types.d.ts} +1 -8
- package/dist/core/rule-host-types.js +7 -0
- package/dist/core/rule-host.d.ts +86 -0
- package/dist/core/rule-host.js +311 -0
- package/dist/core/rule-implementation-runtime.d.ts +18 -0
- package/dist/core/rule-implementation-runtime.js +112 -0
- package/dist/core/runtime-v2-prompt-activation-reader.d.ts +22 -0
- package/dist/core/runtime-v2-prompt-activation-reader.js +99 -0
- package/{src/core/schema/db-types.ts → dist/core/schema/db-types.d.ts} +4 -9
- package/dist/core/schema/db-types.js +5 -0
- package/{src/core/schema/index.ts → dist/core/schema/index.d.ts} +1 -10
- package/dist/core/schema/index.js +15 -0
- package/dist/core/schema/migration-runner.d.ts +53 -0
- package/dist/core/schema/migration-runner.js +170 -0
- package/dist/core/schema/migrations/001-init-trajectory.d.ts +6 -0
- package/{src/core/schema/migrations/001-init-trajectory.ts → dist/core/schema/migrations/001-init-trajectory.js} +38 -56
- package/dist/core/schema/migrations/002-init-central.d.ts +5 -0
- package/{src/core/schema/migrations/002-init-central.ts → dist/core/schema/migrations/002-init-central.js} +27 -41
- package/dist/core/schema/migrations/003-init-workflow.d.ts +5 -0
- package/{src/core/schema/migrations/003-init-workflow.ts → dist/core/schema/migrations/003-init-workflow.js} +16 -21
- package/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +8 -0
- package/{src/core/schema/migrations/004-add-thinking-and-gfi.ts → dist/core/schema/migrations/004-add-thinking-and-gfi.js} +19 -27
- package/{src/core/schema/migrations/index.ts → dist/core/schema/migrations/index.d.ts} +1 -16
- package/dist/core/schema/migrations/index.js +27 -0
- package/dist/core/schema/schema-definitions.d.ts +46 -0
- package/{src/core/schema/schema-definitions.ts → dist/core/schema/schema-definitions.js} +242 -291
- package/dist/core/session-tracker.d.ts +119 -0
- package/{src/core/session-tracker.ts → dist/core/session-tracker.js} +96 -239
- package/dist/core/shadow-observation-registry.d.ts +217 -0
- package/dist/core/shadow-observation-registry.js +280 -0
- package/dist/core/surface-guard.d.ts +31 -0
- package/dist/core/surface-guard.js +131 -0
- package/dist/core/system-logger.d.ts +8 -0
- package/{src/core/system-logger.ts → dist/core/system-logger.js} +20 -34
- package/dist/core/thinking-models.d.ts +70 -0
- package/dist/core/thinking-models.js +300 -0
- package/dist/core/thinking-os-parser.d.ts +35 -0
- package/dist/core/thinking-os-parser.js +123 -0
- package/dist/core/trajectory-types.d.ts +220 -0
- package/dist/core/trajectory-types.js +8 -0
- package/dist/core/trajectory.d.ts +242 -0
- package/dist/core/trajectory.js +1500 -0
- package/dist/core/workflow-funnel-loader.d.ts +72 -0
- package/dist/core/workflow-funnel-loader.js +135 -0
- package/dist/core/workspace-context.d.ts +111 -0
- package/{src/core/workspace-context.ts → dist/core/workspace-context.js} +50 -105
- package/dist/core/workspace-dir-validation.d.ts +11 -0
- package/dist/core/workspace-dir-validation.js +37 -0
- package/dist/core/workspace-guidance-migrator.d.ts +12 -0
- package/{src/core/workspace-guidance-migrator.ts → dist/core/workspace-guidance-migrator.js} +21 -59
- package/dist/hooks/after-tool-call-helpers.d.ts +89 -0
- package/dist/hooks/after-tool-call-helpers.js +475 -0
- package/dist/hooks/after-tool-call-types.d.ts +86 -0
- package/dist/hooks/after-tool-call-types.js +13 -0
- package/dist/hooks/gate-block-helper.d.ts +44 -0
- package/dist/hooks/gate-block-helper.js +209 -0
- package/dist/hooks/gate.d.ts +16 -0
- package/dist/hooks/gate.js +381 -0
- package/dist/hooks/lifecycle.d.ts +5 -0
- package/dist/hooks/lifecycle.js +287 -0
- package/dist/hooks/llm.d.ts +13 -0
- package/{src/hooks/llm.ts → dist/hooks/llm.js} +63 -117
- package/dist/hooks/message-sanitize.d.ts +24 -0
- package/dist/hooks/message-sanitize.js +77 -0
- package/dist/hooks/pain.d.ts +33 -0
- package/dist/hooks/pain.js +294 -0
- package/dist/hooks/prompt.d.ts +52 -0
- package/dist/hooks/prompt.js +930 -0
- package/dist/hooks/raw-observation-adapter.d.ts +57 -0
- package/dist/hooks/raw-observation-adapter.js +170 -0
- package/dist/hooks/raw-observation-types.d.ts +62 -0
- package/dist/hooks/raw-observation-types.js +15 -0
- package/dist/hooks/subagent.d.ts +9 -0
- package/{src/hooks/subagent.ts → dist/hooks/subagent.js} +20 -60
- package/dist/hooks/trajectory-collector.d.ts +25 -0
- package/dist/hooks/trajectory-collector.js +225 -0
- package/dist/hooks/trajectory-evidence.d.ts +11 -0
- package/dist/hooks/trajectory-evidence.js +88 -0
- package/dist/hooks/triage-adapter.d.ts +58 -0
- package/{src/hooks/triage-adapter.ts → dist/hooks/triage-adapter.js} +36 -68
- package/dist/hooks/trigger-cooldown-tracker.d.ts +30 -0
- package/dist/hooks/trigger-cooldown-tracker.js +55 -0
- package/dist/i18n/commands.d.ts +26 -0
- package/dist/i18n/commands.js +96 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +829 -0
- package/dist/openclaw-sdk.d.ts +293 -0
- package/dist/openclaw-sdk.js +4 -0
- package/dist/service/central-database.d.ts +138 -0
- package/dist/service/central-database.js +731 -0
- package/dist/service/central-sync-service.d.ts +8 -0
- package/dist/service/central-sync-service.js +71 -0
- package/dist/service/correction-observer-service.d.ts +19 -0
- package/{src/service/correction-observer-service.ts → dist/service/correction-observer-service.js} +36 -76
- package/dist/service/evolution-dedup.d.ts +27 -0
- package/{src/service/evolution-dedup.ts → dist/service/evolution-dedup.js} +11 -31
- package/{src/service/evolution-queue-migration.ts → dist/service/evolution-queue-migration.d.ts} +15 -62
- package/dist/service/evolution-queue-migration.js +53 -0
- package/dist/service/evolution-worker.d.ts +103 -0
- package/{src/service/evolution-worker.ts → dist/service/evolution-worker.js} +169 -331
- package/dist/service/internalization-auto-consumer-service.d.ts +8 -0
- package/dist/service/internalization-auto-consumer-service.js +322 -0
- package/dist/service/keyword-optimization-service.d.ts +44 -0
- package/dist/service/keyword-optimization-service.js +137 -0
- package/dist/service/phase3-input-filter.d.ts +73 -0
- package/dist/service/phase3-input-filter.js +172 -0
- package/dist/service/queue-io.d.ts +30 -0
- package/dist/service/queue-io.js +79 -0
- package/{src/service/queue-migration.ts → dist/service/queue-migration.d.ts} +6 -45
- package/dist/service/queue-migration.js +56 -0
- package/dist/service/runtime-summary-service.d.ts +158 -0
- package/dist/service/runtime-summary-service.js +636 -0
- package/dist/service/subagent-workflow/subagent-error-utils.d.ts +8 -0
- package/{src/service/subagent-workflow/subagent-error-utils.ts → dist/service/subagent-workflow/subagent-error-utils.js} +3 -6
- package/{src/service/subagent-workflow/types.ts → dist/service/subagent-workflow/types.d.ts} +17 -80
- package/dist/service/subagent-workflow/types.js +11 -0
- package/dist/service/subagent-workflow/workflow-store.d.ts +30 -0
- package/{src/service/subagent-workflow/workflow-store.ts → dist/service/subagent-workflow/workflow-store.js} +43 -108
- package/dist/service/trajectory-service.d.ts +2 -0
- package/dist/service/trajectory-service.js +16 -0
- package/dist/service/workflow-watchdog.d.ts +23 -0
- package/dist/service/workflow-watchdog.js +103 -0
- package/dist/types/event-types.d.ts +2 -0
- package/dist/types/event-types.js +1 -0
- package/dist/types/hygiene-types.d.ts +2 -0
- package/dist/types/hygiene-types.js +1 -0
- package/{src/types/principle-tree-schema.ts → dist/types/principle-tree-schema.d.ts} +2 -25
- package/dist/types/principle-tree-schema.js +24 -0
- package/dist/types/queue.d.ts +2 -0
- package/dist/types/queue.js +1 -0
- package/dist/types/runtime-summary.d.ts +1 -0
- package/dist/types/runtime-summary.js +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js +16 -0
- package/dist/utils/file-lock.d.ts +68 -0
- package/dist/utils/file-lock.js +310 -0
- package/dist/utils/hashing.d.ts +9 -0
- package/{src/utils/hashing.ts → dist/utils/hashing.js} +4 -6
- package/dist/utils/io.d.ts +11 -0
- package/dist/utils/io.js +174 -0
- package/dist/utils/node-vm-polyfill.d.ts +9 -0
- package/{src/utils/node-vm-polyfill.ts → dist/utils/node-vm-polyfill.js} +0 -2
- package/dist/utils/retry.d.ts +210 -0
- package/dist/utils/retry.js +375 -0
- package/dist/utils/session-key.d.ts +10 -0
- package/{src/utils/session-key.ts → dist/utils/session-key.js} +5 -4
- package/dist/utils/shadow-fingerprint.d.ts +16 -0
- package/dist/utils/shadow-fingerprint.js +34 -0
- package/dist/utils/workspace-resolver.d.ts +82 -0
- package/dist/utils/workspace-resolver.js +288 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +8 -2
- package/templates/workspace/.principles/DECISION_POLICY.json +44 -0
- package/templates/workspace/.principles/PRINCIPLES.md +20 -0
- package/templates/workspace/.principles/PROFILE.json +54 -0
- package/templates/workspace/.principles/PROFILE.schema.json +56 -0
- package/templates/workspace/.principles/THINKING_OS.md +65 -0
- package/templates/workspace/.principles/THINKING_OS_ARCHIVE.md +7 -0
- package/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +9 -0
- package/templates/workspace/.principles/models/_INDEX.md +27 -0
- package/templates/workspace/.principles/models/first_principles.md +62 -0
- package/templates/workspace/.principles/models/marketing_4p.md +52 -0
- package/templates/workspace/.principles/models/porter_five.md +63 -0
- package/templates/workspace/.principles/models/swot.md +60 -0
- package/templates/workspace/.principles/models/user_story_map.md +63 -0
- package/templates/workspace/.state/WORKBOARD.json +4 -0
- package/.dependency-cruiser.json +0 -19
- package/ADVANCED_CONFIG_ZH.md +0 -93
- package/AGENT_INSTALL.md +0 -173
- package/AGENT_INSTALL_EN.md +0 -173
- package/CHANGELOG.md +0 -26
- package/INSTALL.md +0 -254
- package/SKILL.md +0 -63
- package/esbuild.config.js +0 -104
- package/src/commands/archive-impl.ts +0 -147
- package/src/commands/capabilities.ts +0 -89
- package/src/commands/disable-impl.ts +0 -159
- package/src/commands/evolution-status.ts +0 -247
- package/src/commands/export.ts +0 -59
- package/src/commands/focus.ts +0 -523
- package/src/commands/principle-rollback.ts +0 -32
- package/src/commands/promote-impl.ts +0 -254
- package/src/commands/rollback-impl.ts +0 -246
- package/src/commands/samples.ts +0 -65
- package/src/commands/strategy.ts +0 -21
- package/src/config/errors.ts +0 -180
- package/src/constants/tools.ts +0 -62
- package/src/core/AGENTS.md +0 -34
- package/src/core/__tests__/focus-history.test.ts +0 -210
- package/src/core/bootstrap-rules.ts +0 -216
- package/src/core/code-implementation-storage.ts +0 -213
- package/src/core/config-health.ts +0 -72
- package/src/core/control-ui-db.ts +0 -454
- package/src/core/correction-cue-learner.ts +0 -239
- package/src/core/correction-types.ts +0 -16
- package/src/core/empathy-keyword-matcher.ts +0 -64
- package/src/core/empathy-types.ts +0 -18
- package/src/core/event-log.ts +0 -787
- package/src/core/evolution-engine.ts +0 -613
- package/src/core/evolution-logger.ts +0 -357
- package/src/core/evolution-migration.ts +0 -77
- package/src/core/evolution-reducer.ts +0 -891
- package/src/core/evolution-types.ts +0 -110
- package/src/core/external-training-contract.ts +0 -530
- package/src/core/file-store.ts +0 -80
- package/src/core/focus-history.ts +0 -763
- package/src/core/hygiene/tracker.ts +0 -122
- package/src/core/local-worker-routing.ts +0 -337
- package/src/core/model-deployment-registry.ts +0 -724
- package/src/core/model-training-registry.ts +0 -815
- package/src/core/observability.ts +0 -242
- package/src/core/pain-diagnostic-gate.ts +0 -169
- package/src/core/pain.ts +0 -309
- package/src/core/pd-config-loader.ts +0 -400
- package/src/core/pd-task-reconciler.ts +0 -380
- package/src/core/pd-task-service.ts +0 -43
- package/src/core/pd-task-store.ts +0 -78
- package/src/core/pd-task-types.ts +0 -24
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +0 -174
- package/src/core/principle-compiler/code-validator.ts +0 -93
- package/src/core/principle-compiler/compiler.ts +0 -327
- package/src/core/principle-compiler/ledger-registrar.ts +0 -116
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +0 -42
- package/src/core/principle-internalization/lifecycle-refresh.ts +0 -11
- package/src/core/principle-internalization/principle-lifecycle-service.ts +0 -170
- package/src/core/principle-training-state.ts +0 -177
- package/src/core/principle-tree-ledger-adapter.ts +0 -145
- package/src/core/principle-tree-ledger.ts +0 -725
- package/src/core/profile.ts +0 -228
- package/src/core/promotion-gate.ts +0 -854
- package/src/core/reflection/reflection-context.ts +0 -133
- package/src/core/replay-engine.ts +0 -106
- package/src/core/rule-host.ts +0 -386
- package/src/core/rule-implementation-runtime.ts +0 -145
- package/src/core/runtime-v2-prompt-activation-reader.ts +0 -114
- package/src/core/schema/migration-runner.ts +0 -207
- package/src/core/shadow-observation-registry.ts +0 -508
- package/src/core/surface-guard.ts +0 -188
- package/src/core/thinking-models.ts +0 -377
- package/src/core/thinking-os-parser.ts +0 -165
- package/src/core/trajectory-types.ts +0 -247
- package/src/core/trajectory.ts +0 -1831
- package/src/core/workflow-funnel-loader.ts +0 -195
- package/src/core/workspace-dir-validation.ts +0 -52
- package/src/hooks/AGENTS.md +0 -31
- package/src/hooks/after-tool-call-helpers.ts +0 -601
- package/src/hooks/after-tool-call-types.ts +0 -99
- package/src/hooks/gate-block-helper.ts +0 -265
- package/src/hooks/gate.ts +0 -394
- package/src/hooks/lifecycle.ts +0 -334
- package/src/hooks/message-sanitize.ts +0 -102
- package/src/hooks/pain.ts +0 -358
- package/src/hooks/prompt.ts +0 -1102
- package/src/hooks/raw-observation-adapter.ts +0 -215
- package/src/hooks/raw-observation-types.ts +0 -77
- package/src/hooks/trajectory-collector.ts +0 -253
- package/src/hooks/trajectory-evidence.ts +0 -97
- package/src/hooks/trigger-cooldown-tracker.ts +0 -82
- package/src/i18n/commands.ts +0 -101
- package/src/index.ts +0 -939
- package/src/openclaw-sdk.ts +0 -312
- package/src/service/central-database.ts +0 -936
- package/src/service/central-sync-service.ts +0 -85
- package/src/service/internalization-auto-consumer-service.ts +0 -397
- package/src/service/keyword-optimization-service.ts +0 -169
- package/src/service/phase3-input-filter.ts +0 -237
- package/src/service/queue-io.ts +0 -108
- package/src/service/runtime-summary-service.ts +0 -990
- package/src/service/trajectory-service.ts +0 -16
- package/src/service/workflow-watchdog.ts +0 -125
- package/src/types/event-types.ts +0 -39
- package/src/types/hygiene-types.ts +0 -8
- package/src/types/queue.ts +0 -15
- package/src/types/runtime-summary.ts +0 -5
- package/src/types.ts +0 -53
- package/src/utils/file-lock.ts +0 -394
- package/src/utils/io.ts +0 -176
- package/src/utils/retry.ts +0 -573
- package/src/utils/shadow-fingerprint.ts +0 -42
- package/src/utils/workspace-resolver.ts +0 -393
- package/tests/README.md +0 -120
- package/tests/build-artifacts.test.ts +0 -55
- package/tests/commands/evolution-status.test.ts +0 -511
- package/tests/commands/export.test.ts +0 -78
- package/tests/commands/pain.test.ts +0 -287
- package/tests/commands/samples.test.ts +0 -65
- package/tests/commands/strategy.test.ts +0 -19
- package/tests/commands/thinking-os.test.ts +0 -88
- package/tests/core/bootstrap-rules.test.ts +0 -596
- package/tests/core/code-implementation-storage.test.ts +0 -300
- package/tests/core/code-validator.test.ts +0 -197
- package/tests/core/config-service.test.ts +0 -89
- package/tests/core/config.test.ts +0 -90
- package/tests/core/control-ui-db.test.ts +0 -75
- package/tests/core/core-principle-registry-drift.test.ts +0 -39
- package/tests/core/core-template-guidance.test.ts +0 -21
- package/tests/core/correction-cue-learner.test.ts +0 -345
- package/tests/core/detection-service.test.ts +0 -50
- package/tests/core/dictionary-service.test.ts +0 -116
- package/tests/core/dictionary.test.ts +0 -171
- package/tests/core/empathy-keyword-matcher.test.ts +0 -209
- package/tests/core/event-log.test.ts +0 -484
- package/tests/core/evolution-engine.test.ts +0 -610
- package/tests/core/evolution-logger.test.ts +0 -148
- package/tests/core/evolution-migration.test.ts +0 -374
- package/tests/core/evolution-paths.test.ts +0 -21
- package/tests/core/evolution-reducer.compilation-retry.test.ts +0 -189
- package/tests/core/evolution-reducer.detector-metadata.test.ts +0 -602
- package/tests/core/evolution-types-loop.test.ts +0 -48
- package/tests/core/external-training-contract.test.ts +0 -463
- package/tests/core/file-store.test.ts +0 -102
- package/tests/core/focus-history.test.ts +0 -874
- package/tests/core/init-flatten.test.ts +0 -69
- package/tests/core/init-refactor.test.ts +0 -87
- package/tests/core/init-v1.3.test.ts +0 -46
- package/tests/core/init.test.ts +0 -190
- package/tests/core/ledger-registrar.test.ts +0 -235
- package/tests/core/migration.test.ts +0 -84
- package/tests/core/model-deployment-registry.test.ts +0 -858
- package/tests/core/model-training-registry.test.ts +0 -908
- package/tests/core/observability.test.ts +0 -382
- package/tests/core/pain-diagnostic-gate.test.ts +0 -614
- package/tests/core/pain-score.property.test.ts +0 -19
- package/tests/core/pain.test.ts +0 -132
- package/tests/core/path-resolver.test.ts +0 -57
- package/tests/core/paths-refactor.test.ts +0 -20
- package/tests/core/pd-config-loader.test.ts +0 -407
- package/tests/core/pd-task-store.test.ts +0 -126
- package/tests/core/phase7-rollout-integration.test.ts +0 -477
- package/tests/core/principle-compiler.test.ts +0 -350
- package/tests/core/principle-injection.test.ts +0 -223
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +0 -193
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +0 -350
- package/tests/core/principle-internalization/lifecycle-routing-policy.test.ts +0 -212
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +0 -56
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +0 -189
- package/tests/core/principle-training-state.test.ts +0 -939
- package/tests/core/principle-tree-ledger-adapter.test.ts +0 -253
- package/tests/core/principle-tree-ledger.test.ts +0 -423
- package/tests/core/profile.test.ts +0 -56
- package/tests/core/promotion-gate.test.ts +0 -561
- package/tests/core/queue-purge.test.ts +0 -337
- package/tests/core/reflection-context.test.ts +0 -342
- package/tests/core/regression-v1-9-1.test.ts +0 -266
- package/tests/core/replay-engine.test.ts +0 -165
- package/tests/core/risk-calculator.test.ts +0 -168
- package/tests/core/rule-host-adversarial-output.test.ts +0 -242
- package/tests/core/rule-host-autocorrect-vm.test.ts +0 -163
- package/tests/core/rule-host-helpers.test.ts +0 -120
- package/tests/core/rule-host-resource-bounds.test.ts +0 -231
- package/tests/core/rule-host-sqlite-source.test.ts +0 -720
- package/tests/core/rule-host-unhealthy-visibility.test.ts +0 -261
- package/tests/core/rule-host-validation.test.ts +0 -315
- package/tests/core/rule-implementation-runtime.test.ts +0 -49
- package/tests/core/session-tracker.test.ts +0 -191
- package/tests/core/surface-guard.test.ts +0 -338
- package/tests/core/template-generator.test.ts +0 -101
- package/tests/core/trajectory.test.ts +0 -427
- package/tests/core/workflow-funnel-loader.test.ts +0 -1028
- package/tests/core/workspace-context-factory.test.ts +0 -18
- package/tests/core/workspace-context.test.ts +0 -187
- package/tests/core/workspace-guidance-migrator.test.ts +0 -248
- package/tests/core-anti-growth.test.ts +0 -182
- package/tests/evolution-worker-quarantine.test.ts +0 -400
- package/tests/evolution-worker-slimming.test.ts +0 -380
- package/tests/fixtures/legacy-queue-v1.json +0 -74
- package/tests/fixtures/production-compatibility.test.ts +0 -147
- package/tests/fixtures/production-mock-generator.ts +0 -282
- package/tests/globalSetup.ts +0 -38
- package/tests/hook-workspace-nextaction-contract.test.ts +0 -50
- package/tests/hooks/confirm-first-removal.test.ts +0 -188
- package/tests/hooks/gate-auto-correct-shadow.test.ts +0 -309
- package/tests/hooks/gate-auto-correct.test.ts +0 -664
- package/tests/hooks/gate-block-helper-profile.test.ts +0 -186
- package/tests/hooks/gate-no-path-write-tool.test.ts +0 -171
- package/tests/hooks/gate-rule-host-pipeline.test.ts +0 -230
- package/tests/hooks/gate-rule-host-real-pipeline.test.ts +0 -190
- package/tests/hooks/lifecycle.test.ts +0 -248
- package/tests/hooks/message-sanitize.test.ts +0 -244
- package/tests/hooks/pain-emission-characterization.test.ts +0 -420
- package/tests/hooks/pain.test.ts +0 -795
- package/tests/hooks/prompt-characterization.test.ts +0 -476
- package/tests/hooks/prompt-diet.test.ts +0 -335
- package/tests/hooks/prompt-size-guard.test.ts +0 -319
- package/tests/hooks/raw-observation-adapter.test.ts +0 -312
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +0 -895
- package/tests/hooks/single-gate-pain-admission.test.ts +0 -258
- package/tests/hooks/subagent.test.ts +0 -469
- package/tests/hooks/trajectory-collector.test.ts +0 -269
- package/tests/hooks/trajectory-evidence.test.ts +0 -280
- package/tests/hooks/triage-adapter.test.ts +0 -331
- package/tests/hygiene-tracker.test.ts +0 -77
- package/tests/index.test.ts +0 -142
- package/tests/integration/auto-entry-gate.test.ts +0 -256
- package/tests/integration/gate-real-io.e2e.test.ts +0 -248
- package/tests/integration/m8-legacy-paths.test.ts +0 -63
- package/tests/integration/mvp-surface-registry-guard.test.ts +0 -536
- package/tests/integration/pain-id-chain-e2e.test.ts +0 -313
- package/tests/integration/principle-compiler-e2e.test.ts +0 -403
- package/tests/integration/principle-lifecycle.e2e.test.ts +0 -198
- package/tests/integration/runtime-v2-pain-guard.test.ts +0 -125
- package/tests/integration/trajectory-lifecycle.e2e.test.ts +0 -523
- package/tests/internalization-auto-consumer-gate.test.ts +0 -158
- package/tests/internalization-auto-consumer-service.test.ts +0 -219
- package/tests/plugin-config-resolution-cutover.test.ts +0 -359
- package/tests/queue/async-lock.test.ts +0 -200
- package/tests/runtime-v2-discovery-guard.test.ts +0 -153
- package/tests/scripts/validate-live-path.test.ts +0 -286
- package/tests/service/central-database.test.ts +0 -457
- package/tests/service/correction-observer-service.test.ts +0 -505
- package/tests/service/evolution-worker.compilation-backfill.test.ts +0 -203
- package/tests/service/evolution-worker.correction-observer.test.ts +0 -50
- package/tests/service/evolution-worker.queue.test.ts +0 -296
- package/tests/service/evolution-worker.timeout.test.ts +0 -233
- package/tests/service/keyword-optimization-service.test.ts +0 -121
- package/tests/service/phase3-input-filter.test.ts +0 -289
- package/tests/service/queue-io.test.ts +0 -168
- package/tests/service/queue-migration.test.ts +0 -147
- package/tests/service/runtime-summary-service.test.ts +0 -1100
- package/tests/service/workflow-watchdog.test.ts +0 -281
- package/tests/task-compliance.test.ts +0 -166
- package/tests/test-utils.ts +0 -48
- package/tests/utils/file-lock.test.ts +0 -409
- package/tests/utils/hashing.test.ts +0 -32
- package/tests/utils/hook-workspace-resolver.test.ts +0 -524
- package/tests/utils/io.test.ts +0 -39
- package/tests/utils/retry.test.ts +0 -327
- package/tests/utils/session-key.test.ts +0 -52
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -61
- package/vitest.unit.config.ts +0 -12
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate Block Helper - Single Authoritative Block Persistence
|
|
3
|
+
*
|
|
4
|
+
* PURPOSE: Provide ONE authoritative implementation for gate block persistence.
|
|
5
|
+
*
|
|
6
|
+
* All gate sources (rule-host) must use this
|
|
7
|
+
* helper to ensure consistent block tracking, event logging, and retry behavior.
|
|
8
|
+
*
|
|
9
|
+
* This eliminates the "multi-truth source" problem where different modules
|
|
10
|
+
* had their own block persistence implementations.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import { getSession, trackBlock } from '../core/session-tracker.js';
|
|
14
|
+
import { evaluatePainDiagnosticGate } from '../core/pain-diagnostic-gate.js';
|
|
15
|
+
import { emitPainDetectedEvent } from './pain.js';
|
|
16
|
+
import { loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
|
|
17
|
+
import { evaluateEvidenceTriage } from './triage-adapter.js';
|
|
18
|
+
import { isRisky } from '../utils/io.js';
|
|
19
|
+
import { normalizeProfile } from '../core/profile.js';
|
|
20
|
+
import { SystemLogger } from '../core/system-logger.js';
|
|
21
|
+
import { TRAJECTORY_GATE_BLOCK_RETRY_DELAY_MS, TRAJECTORY_GATE_BLOCK_MAX_RETRIES } from '../config/index.js';
|
|
22
|
+
/**
|
|
23
|
+
* Single authoritative block helper.
|
|
24
|
+
*
|
|
25
|
+
* Responsibilities:
|
|
26
|
+
* 1. Call trackBlock() for session-level GFI tracking
|
|
27
|
+
* 2. Record to EventLog for operator visibility
|
|
28
|
+
* 3. Record to trajectory for analytics
|
|
29
|
+
* 4. Handle retry logic for trajectory persistence failures
|
|
30
|
+
* 5. Generate consistent operator-facing block message
|
|
31
|
+
*
|
|
32
|
+
* @param wctx - Workspace context
|
|
33
|
+
* @param blockCtx - Block context with file, reason, tool info
|
|
34
|
+
* @param logger - Logger instance
|
|
35
|
+
* @returns PluginHookBeforeToolCallResult with block=true
|
|
36
|
+
*/
|
|
37
|
+
export function recordGateBlockAndReturn(wctx, blockCtx, logger) {
|
|
38
|
+
const { filePath, reason, toolName, sessionId, blockSource } = blockCtx;
|
|
39
|
+
// Default logger if not provided
|
|
40
|
+
const logWarn = (msg) => logger.warn?.(msg);
|
|
41
|
+
const logError = (msg) => logger.error?.(msg);
|
|
42
|
+
// Log the block event
|
|
43
|
+
const sourceTag = blockSource ? `[${blockSource}]` : '';
|
|
44
|
+
logError(`[PD_GATE]${sourceTag} BLOCKED: ${filePath}. Reason: ${reason}`);
|
|
45
|
+
// 1. Track block for session-level GFI calculation
|
|
46
|
+
if (sessionId) {
|
|
47
|
+
trackBlock(sessionId);
|
|
48
|
+
}
|
|
49
|
+
// 2. Prepare trajectory payload
|
|
50
|
+
const trajectoryPayload = {
|
|
51
|
+
sessionId: sessionId ?? null,
|
|
52
|
+
toolName,
|
|
53
|
+
filePath,
|
|
54
|
+
reason,
|
|
55
|
+
blockSource: blockSource ?? 'gate',
|
|
56
|
+
};
|
|
57
|
+
// 3. Record to EventLog (primary persistence)
|
|
58
|
+
try {
|
|
59
|
+
wctx.eventLog.recordGateBlock(sessionId, {
|
|
60
|
+
toolName,
|
|
61
|
+
filePath,
|
|
62
|
+
reason,
|
|
63
|
+
blockSource: blockSource ?? 'gate',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logWarn(`[PD_GATE] Failed to record gate block event: ${String(error)}`);
|
|
68
|
+
}
|
|
69
|
+
// 4. Record to trajectory (secondary persistence with retry)
|
|
70
|
+
try {
|
|
71
|
+
wctx.trajectory?.recordGateBlock?.(trajectoryPayload);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logWarn(`[PD_GATE] Failed to record trajectory gate block: ${String(error)}`);
|
|
75
|
+
scheduleTrajectoryGateBlockRetry(wctx, trajectoryPayload, 1, logWarn, logError);
|
|
76
|
+
}
|
|
77
|
+
// 5. Record gate block pain context. Runtime V2 diagnosis is gated by GFI
|
|
78
|
+
// so one mild block does not start a long diagnostician run.
|
|
79
|
+
if (sessionId) {
|
|
80
|
+
const GATE_BLOCK_PAIN_SCORE = 45; // Must be >= pain_trigger (40) so single gate block can trigger diagnosis (PRI-274)
|
|
81
|
+
// Record to trajectory (fire-and-forget, no .pain_flag file needed)
|
|
82
|
+
wctx.trajectory?.recordPainEvent?.({
|
|
83
|
+
sessionId,
|
|
84
|
+
source: 'gate_blocked',
|
|
85
|
+
score: GATE_BLOCK_PAIN_SCORE,
|
|
86
|
+
reason: `Gate blocked ${toolName} on ${filePath}: ${reason}`,
|
|
87
|
+
severity: 'mild',
|
|
88
|
+
origin: 'system_infer',
|
|
89
|
+
});
|
|
90
|
+
// PEAT-B1: Evidence triage (feature-flagged)
|
|
91
|
+
let triageAdmitted = true;
|
|
92
|
+
const gateBlockTriageFlag = loadFeatureFlagFromConfig(wctx.workspaceDir, 'painEvidenceAdmission');
|
|
93
|
+
if (gateBlockTriageFlag.enabled) {
|
|
94
|
+
// Load profile with 1MB size guard, matching pain.ts pattern
|
|
95
|
+
const profilePath = wctx.resolve('PROFILE');
|
|
96
|
+
let profile = normalizeProfile({});
|
|
97
|
+
if (fs.existsSync(profilePath)) {
|
|
98
|
+
try {
|
|
99
|
+
const content = fs.readFileSync(profilePath, 'utf8');
|
|
100
|
+
if (content.length > 1024 * 1024) {
|
|
101
|
+
logger.warn?.('[PD_GATE] PROFILE.json exceeds 1 MB, skipping');
|
|
102
|
+
SystemLogger.log(wctx.workspaceDir, 'PROFILE_PARSE_WARN', 'PROFILE.json exceeds 1 MB, skipping — fallback to non-risky');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
profile = normalizeProfile(JSON.parse(content));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
logger.warn?.(`[PD_GATE] Failed to parse PROFILE.json: ${String(e)}`);
|
|
110
|
+
SystemLogger.log(wctx.workspaceDir, 'PROFILE_PARSE_WARN', `Failed to parse PROFILE.json: ${String(e)} — fallback to non-risky`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Real judgment for rulehost blocks: if a principle blocked an action on a risky path,
|
|
114
|
+
// it IS a high-confidence unsafe action. The pain score (45) is the evidence friction
|
|
115
|
+
// weight, NOT the action risk severity. The rulehost principle already determined
|
|
116
|
+
// this action was important enough to block — that is the real signal.
|
|
117
|
+
const isUnsafe = isRisky(filePath, profile.risk_paths);
|
|
118
|
+
const triage = evaluateEvidenceTriage('rulehost_block', GATE_BLOCK_PAIN_SCORE, {
|
|
119
|
+
isUnsafeHighConfidence: isUnsafe,
|
|
120
|
+
});
|
|
121
|
+
if (triage.decision !== 'admit') {
|
|
122
|
+
triageAdmitted = false;
|
|
123
|
+
logger.info?.(`[PD_GATE] Triage ${triage.decision}: ${triage.reason}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const session = getSession(sessionId);
|
|
127
|
+
if (triageAdmitted) {
|
|
128
|
+
const gate = evaluatePainDiagnosticGate({
|
|
129
|
+
source: 'gate_blocked',
|
|
130
|
+
score: GATE_BLOCK_PAIN_SCORE,
|
|
131
|
+
currentGfi: session?.currentGfi ?? 0,
|
|
132
|
+
consecutiveErrors: session?.consecutiveErrors ?? 0,
|
|
133
|
+
sessionId,
|
|
134
|
+
errorHash: `${toolName}:${filePath}:${reason}`,
|
|
135
|
+
thresholds: {
|
|
136
|
+
painTrigger: wctx.config.get('thresholds.pain_trigger') || 40,
|
|
137
|
+
highSeverity: wctx.config.get('severity_thresholds.high') || 70,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
if (gate.shouldDiagnose) {
|
|
141
|
+
void emitPainDetectedEvent(wctx, {
|
|
142
|
+
ts: new Date().toISOString(),
|
|
143
|
+
type: 'pain_detected',
|
|
144
|
+
data: {
|
|
145
|
+
painId: `gate_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,
|
|
146
|
+
painType: 'user_frustration',
|
|
147
|
+
source: 'gate_blocked',
|
|
148
|
+
reason: `Gate blocked ${toolName} on ${filePath}: ${reason}`,
|
|
149
|
+
score: GATE_BLOCK_PAIN_SCORE,
|
|
150
|
+
sessionId,
|
|
151
|
+
agentId: 'main',
|
|
152
|
+
},
|
|
153
|
+
}).catch((emitErr) => {
|
|
154
|
+
logWarn(`[PD_GATE] Failed to emit gate block pain event: ${String(emitErr)}`);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
logger.info?.(`[PD_GATE] Gate block recorded without Runtime V2 diagnosis: ${gate.detail}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// 6. Return consistent block result with contextual operator guidance
|
|
163
|
+
const blockMessage = buildContextualBlockMessage({ filePath, reason });
|
|
164
|
+
return {
|
|
165
|
+
block: true,
|
|
166
|
+
blockReason: blockMessage,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Build contextual block message based on block source.
|
|
171
|
+
* - rule-host: principle-based guidance
|
|
172
|
+
* - default/gate: generic security gate message
|
|
173
|
+
*/
|
|
174
|
+
function buildContextualBlockMessage({ filePath, reason, }) {
|
|
175
|
+
// rule-host or generic gate blocks
|
|
176
|
+
return `[Principles Disciple] Security Gate Blocked this action.
|
|
177
|
+
File: ${filePath}
|
|
178
|
+
Reason: ${reason}
|
|
179
|
+
|
|
180
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
181
|
+
📋 How to unblock this operation:
|
|
182
|
+
|
|
183
|
+
This action was blocked by a Rule Host principle.
|
|
184
|
+
If the blocked path is correct and safe, explain the reasoning to the owner
|
|
185
|
+
and ask for explicit confirmation to proceed.
|
|
186
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Schedule retry for trajectory gate block persistence.
|
|
190
|
+
*
|
|
191
|
+
* Uses exponential backoff with max retries.
|
|
192
|
+
* Failures are logged but do not affect the runtime block decision.
|
|
193
|
+
*/
|
|
194
|
+
function scheduleTrajectoryGateBlockRetry(wctx, payload, attempt, logWarn, logError) {
|
|
195
|
+
if (attempt > TRAJECTORY_GATE_BLOCK_MAX_RETRIES) {
|
|
196
|
+
logError(`[PD_GATE] Failed to persist trajectory gate block after ${TRAJECTORY_GATE_BLOCK_MAX_RETRIES} retries: ${payload.toolName} ${payload.filePath}`);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
setTimeout(() => {
|
|
200
|
+
try {
|
|
201
|
+
wctx.trajectory?.recordGateBlock?.(payload);
|
|
202
|
+
logWarn(`[PD_GATE] Trajectory gate block persisted on retry ${attempt}`);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
logWarn(`[PD_GATE] Retrying trajectory gate block persistence (attempt ${attempt + 1}): ${String(error)}`);
|
|
206
|
+
scheduleTrajectoryGateBlockRetry(wctx, payload, attempt + 1, logWarn, logError);
|
|
207
|
+
}
|
|
208
|
+
}, TRAJECTORY_GATE_BLOCK_RETRY_DELAY_MS * attempt).unref();
|
|
209
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Gate Hook - Rule Host Only
|
|
3
|
+
*
|
|
4
|
+
* This is the SINGLE AUTHORITATIVE orchestration path.
|
|
5
|
+
* All blocking logic is now dynamic via Rule Host — no hardcoded gates remain.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Early Return: Skip if not write/bash/agent tool or no workspace
|
|
9
|
+
* 2. Rule Host: Dynamic principle-based evaluation (sole gate)
|
|
10
|
+
*/
|
|
11
|
+
import type { PluginHookBeforeToolCallEvent, PluginHookToolContext, PluginHookBeforeToolCallResult, PluginLogger } from '../openclaw-sdk.js';
|
|
12
|
+
export declare function handleBeforeToolCall(event: PluginHookBeforeToolCallEvent, ctx: PluginHookToolContext & {
|
|
13
|
+
workspaceDir?: string;
|
|
14
|
+
pluginConfig?: Record<string, unknown>;
|
|
15
|
+
logger?: Partial<PluginLogger>;
|
|
16
|
+
}): PluginHookBeforeToolCallResult | void;
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Gate Hook - Rule Host Only
|
|
3
|
+
*
|
|
4
|
+
* This is the SINGLE AUTHORITATIVE orchestration path.
|
|
5
|
+
* All blocking logic is now dynamic via Rule Host — no hardcoded gates remain.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Early Return: Skip if not write/bash/agent tool or no workspace
|
|
9
|
+
* 2. Rule Host: Dynamic principle-based evaluation (sole gate)
|
|
10
|
+
*/
|
|
11
|
+
import { normalizePath } from '../utils/io.js';
|
|
12
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
13
|
+
import { recordGateBlockAndReturn } from './gate-block-helper.js';
|
|
14
|
+
import { RuleHost } from '../core/rule-host.js';
|
|
15
|
+
import { validateCorrectionProposal, validateProposedPathBounds } from '@principles/core/runtime-v2';
|
|
16
|
+
import { AGENT_TOOLS, BASH_TOOLS_SET, WRITE_TOOLS } from '../constants/tools.js';
|
|
17
|
+
import { getSession, hasRecentThinking } from '../core/session-tracker.js';
|
|
18
|
+
import { getEvolutionEngine } from '../core/evolution-engine.js';
|
|
19
|
+
import { EventLogService } from '../core/event-log.js';
|
|
20
|
+
import { estimateLineChanges } from '../core/risk-calculator.js';
|
|
21
|
+
export function handleBeforeToolCall(event, ctx) {
|
|
22
|
+
const logger = ctx.logger || console;
|
|
23
|
+
// 1. Identify tool type
|
|
24
|
+
const isBash = BASH_TOOLS_SET.has(event.toolName);
|
|
25
|
+
const isWriteTool = WRITE_TOOLS.has(event.toolName);
|
|
26
|
+
const isAgentTool = AGENT_TOOLS.has(event.toolName);
|
|
27
|
+
if (!ctx.workspaceDir || (!isWriteTool && !isBash && !isAgentTool)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const wctx = WorkspaceContext.fromHookContext(ctx);
|
|
31
|
+
// 2. Resolve the target file path
|
|
32
|
+
let filePath = event.params?.file_path || event.params?.path || event.params?.file || event.params?.target;
|
|
33
|
+
// Heuristic for bash mutation detection
|
|
34
|
+
if (isBash && !filePath) {
|
|
35
|
+
const command = String(event.params?.command || event.params?.args || '');
|
|
36
|
+
const mutationMatch = /(?:>|>>|sed\s+-i|rm|mv|mkdir|touch|cp)\s+(?:-[a-zA-Z]+\s+)*([^\s;&|<>]+)/.exec(command);
|
|
37
|
+
if (mutationMatch) {
|
|
38
|
+
filePath = mutationMatch[1];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Bash command without a clear file target — let it through to Rule Host
|
|
42
|
+
filePath = command;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Write tools without a file path must still go through RuleHost evaluation.
|
|
46
|
+
// Use a synthetic path so RuleHost can evaluate and potentially block.
|
|
47
|
+
if (!filePath && isWriteTool) {
|
|
48
|
+
filePath = `<tool:${event.toolName}>`;
|
|
49
|
+
}
|
|
50
|
+
if (typeof filePath !== 'string')
|
|
51
|
+
return;
|
|
52
|
+
const relPath = normalizePath(filePath, ctx.workspaceDir);
|
|
53
|
+
// 3. Rule Host Evaluation — sole gate
|
|
54
|
+
try {
|
|
55
|
+
const ruleHost = new RuleHost(wctx.stateDir, logger, { workspaceDir: ctx.workspaceDir });
|
|
56
|
+
const hostInput = {
|
|
57
|
+
action: {
|
|
58
|
+
toolName: event.toolName,
|
|
59
|
+
normalizedPath: relPath,
|
|
60
|
+
paramsSummary: _extractParamsSummary(event.params ?? {}),
|
|
61
|
+
},
|
|
62
|
+
workspace: {
|
|
63
|
+
isRiskPath: false, // Rule Host determines risk dynamically
|
|
64
|
+
// DEPRECATED (PRI-286): planStatus/hasPlanFile are legacy compatibility fields.
|
|
65
|
+
// Live PD no longer reads or manages PLAN.md state. These fields must not be
|
|
66
|
+
// used for new MVP behavior. Future "plan-first" enforcement must come from
|
|
67
|
+
// owner-approved RuleHost/code_tool_hook activation, not built-in state.
|
|
68
|
+
planStatus: 'NONE',
|
|
69
|
+
hasPlanFile: false,
|
|
70
|
+
},
|
|
71
|
+
session: {
|
|
72
|
+
sessionId: ctx.sessionId,
|
|
73
|
+
currentGfi: _getCurrentGfi(ctx.sessionId),
|
|
74
|
+
recentThinking: _hasRecentThinking(ctx.sessionId),
|
|
75
|
+
},
|
|
76
|
+
evolution: {
|
|
77
|
+
epTier: _getEpTier(wctx.workspaceDir),
|
|
78
|
+
},
|
|
79
|
+
derived: {
|
|
80
|
+
estimatedLineChanges: estimateLineChanges({ toolName: event.toolName, params: event.params ?? {} }),
|
|
81
|
+
bashRisk: _getBashRisk(event),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const hostResult = ruleHost.evaluate(hostInput);
|
|
85
|
+
// Always emit rulehost_evaluated
|
|
86
|
+
try {
|
|
87
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
88
|
+
eventLog.recordRuleHostEvaluated({
|
|
89
|
+
toolName: event.toolName,
|
|
90
|
+
filePath: relPath,
|
|
91
|
+
matched: hostResult?.matched ?? false,
|
|
92
|
+
decision: hostResult?.decision ?? 'allow',
|
|
93
|
+
ruleId: hostResult?.ruleId,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (evErr) {
|
|
97
|
+
logger?.warn?.(`[PD_GATE] Failed to record rulehost_evaluated: ${String(evErr)}`);
|
|
98
|
+
}
|
|
99
|
+
if (hostResult?.decision === 'block') {
|
|
100
|
+
try {
|
|
101
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
102
|
+
eventLog.recordRuleEnforced({
|
|
103
|
+
ruleId: hostResult.ruleId || 'unknown',
|
|
104
|
+
principleId: hostResult.principleId || 'unknown',
|
|
105
|
+
enforcement: 'block',
|
|
106
|
+
toolName: event.toolName,
|
|
107
|
+
filePath: relPath,
|
|
108
|
+
});
|
|
109
|
+
eventLog.recordRuleHostBlocked({
|
|
110
|
+
toolName: event.toolName,
|
|
111
|
+
filePath: relPath,
|
|
112
|
+
reason: hostResult.reason,
|
|
113
|
+
ruleId: hostResult.ruleId,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (evErr) {
|
|
117
|
+
logger?.warn?.(`[PD_GATE] Failed to record rule_enforced/rulehost_blocked: ${String(evErr)}`);
|
|
118
|
+
}
|
|
119
|
+
return recordGateBlockAndReturn(wctx, {
|
|
120
|
+
filePath: relPath,
|
|
121
|
+
reason: hostResult.reason,
|
|
122
|
+
toolName: event.toolName,
|
|
123
|
+
sessionId: ctx.sessionId,
|
|
124
|
+
blockSource: 'rule-host',
|
|
125
|
+
}, logger);
|
|
126
|
+
}
|
|
127
|
+
if (hostResult?.decision === 'requireApproval') {
|
|
128
|
+
try {
|
|
129
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
130
|
+
eventLog.recordRuleEnforced({
|
|
131
|
+
ruleId: hostResult.ruleId || 'unknown',
|
|
132
|
+
principleId: hostResult.principleId || 'unknown',
|
|
133
|
+
enforcement: 'requireApproval',
|
|
134
|
+
toolName: event.toolName,
|
|
135
|
+
filePath: relPath,
|
|
136
|
+
});
|
|
137
|
+
eventLog.recordRuleHostRequireApproval({
|
|
138
|
+
toolName: event.toolName,
|
|
139
|
+
filePath: relPath,
|
|
140
|
+
reason: hostResult.reason,
|
|
141
|
+
ruleId: hostResult.ruleId,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (evErr) {
|
|
145
|
+
logger?.warn?.(`[PD_GATE] Failed to record rule_enforced/rulehost_requireApproval: ${String(evErr)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (hostResult?.decision === 'auto_correct' && hostResult.correctionProposal) {
|
|
149
|
+
const proposal = hostResult.correctionProposal;
|
|
150
|
+
let validation;
|
|
151
|
+
try {
|
|
152
|
+
validation = validateCorrectionProposal(proposal);
|
|
153
|
+
}
|
|
154
|
+
catch (validationError) {
|
|
155
|
+
validation = { valid: false, errors: [`Validator threw: ${String(validationError)}`] };
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
159
|
+
const correctedFields = Array.isArray(proposal.correctedFields)
|
|
160
|
+
? proposal.correctedFields.map((f) => typeof f === 'object' && f !== null ? String(f.field) : String(f))
|
|
161
|
+
: [];
|
|
162
|
+
eventLog.recordRuleHostAutoCorrectProposed({
|
|
163
|
+
toolName: event.toolName,
|
|
164
|
+
filePath: relPath,
|
|
165
|
+
ruleId: String(proposal.ruleId ?? 'unknown'),
|
|
166
|
+
principleId: proposal.principleId != null ? String(proposal.principleId) : undefined,
|
|
167
|
+
confidence: typeof proposal.confidence === 'number' ? proposal.confidence : 0,
|
|
168
|
+
reason: hostResult.reason,
|
|
169
|
+
applicationMode: proposal.applicationMode === 'live' ? 'live' : 'shadow',
|
|
170
|
+
correctedFields,
|
|
171
|
+
validationValid: validation.valid,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (evErr) {
|
|
175
|
+
logger?.warn?.(`[PD_GATE] Failed to record rulehost_auto_correct_proposed: ${String(evErr)}`);
|
|
176
|
+
}
|
|
177
|
+
if (proposal.applicationMode === 'live' && validation.valid) {
|
|
178
|
+
if (!event.params) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const originalParams = { ...event.params };
|
|
182
|
+
const nextParams = {};
|
|
183
|
+
const appliedFields = [];
|
|
184
|
+
try {
|
|
185
|
+
if (!Array.isArray(proposal.correctedFields)) {
|
|
186
|
+
throw new Error('proposal.correctedFields is not an array');
|
|
187
|
+
}
|
|
188
|
+
if (!proposal.proposedParams || typeof proposal.proposedParams !== 'object' || Array.isArray(proposal.proposedParams)) {
|
|
189
|
+
throw new Error('proposal.proposedParams must be an object');
|
|
190
|
+
}
|
|
191
|
+
const trustedWorkspaceDir = ctx.workspaceDir;
|
|
192
|
+
if (typeof trustedWorkspaceDir === 'string' && trustedWorkspaceDir.trim().length > 0) {
|
|
193
|
+
const pathBoundsResult = validateProposedPathBounds(proposal.proposedParams, trustedWorkspaceDir);
|
|
194
|
+
if (!pathBoundsResult.valid) {
|
|
195
|
+
throw new Error(`Path boundary violation: ${pathBoundsResult.reason}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
const hasPathField = Object.keys(proposal.proposedParams).some(k => typeof proposal.proposedParams[k] === 'string' && (k === 'file_path' || k === 'path' || k === 'filePath'));
|
|
200
|
+
if (hasPathField) {
|
|
201
|
+
throw new Error('Cannot apply live auto-correction with path fields: no trusted workspace directory available');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
for (const cf of proposal.correctedFields) {
|
|
205
|
+
if (typeof cf !== 'object' || cf === null || typeof cf.field !== 'string') {
|
|
206
|
+
throw new Error('correctedFields entry must be an object with a string field');
|
|
207
|
+
}
|
|
208
|
+
const field = cf.field;
|
|
209
|
+
if (!Object.hasOwn(event.params, field)) {
|
|
210
|
+
throw new Error(`Field '${field}' not found in event.params`);
|
|
211
|
+
}
|
|
212
|
+
if (!Object.hasOwn(proposal.proposedParams, field)) {
|
|
213
|
+
throw new Error(`Field '${field}' not found in proposal.proposedParams`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (const cf of proposal.correctedFields) {
|
|
217
|
+
if (typeof cf === 'object' && cf !== null && typeof cf.field === 'string') {
|
|
218
|
+
const field = cf.field;
|
|
219
|
+
const originalValue = event.params[field];
|
|
220
|
+
const appliedValue = proposal.proposedParams[field];
|
|
221
|
+
nextParams[field] = appliedValue;
|
|
222
|
+
appliedFields.push({
|
|
223
|
+
field,
|
|
224
|
+
original: originalValue,
|
|
225
|
+
applied: appliedValue,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
Object.assign(event.params, nextParams);
|
|
230
|
+
try {
|
|
231
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
232
|
+
eventLog.recordRuleHostAutoCorrectApplied({
|
|
233
|
+
toolName: event.toolName,
|
|
234
|
+
filePath: relPath,
|
|
235
|
+
ruleId: String(proposal.ruleId ?? 'unknown'),
|
|
236
|
+
principleId: proposal.principleId != null ? String(proposal.principleId) : undefined,
|
|
237
|
+
confidence: typeof proposal.confidence === 'number' ? proposal.confidence : 0,
|
|
238
|
+
reason: hostResult.reason || proposal.correctedFields?.[0]?.reason || 'auto-correct applied',
|
|
239
|
+
correctedFields: appliedFields,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch (evErr) {
|
|
243
|
+
logger?.warn?.(`[PD_GATE] Failed to record rulehost_auto_correct_applied: ${String(evErr)}`);
|
|
244
|
+
}
|
|
245
|
+
if (proposal.notifyAgent === true && appliedFields.length > 0) {
|
|
246
|
+
const messages = appliedFields.map(f => `[PD Auto-Correct] Rule ${proposal.ruleId}: ${proposal.correctedFields?.[0]?.reason || 'correction applied'}. Parameter '${f.field}' was adjusted from ${JSON.stringify(f.original)} to ${JSON.stringify(f.applied)}.`);
|
|
247
|
+
return {
|
|
248
|
+
toolArgs: event.toolArgs,
|
|
249
|
+
skipToolCall: false,
|
|
250
|
+
_pdAutoCorrectWarning: messages.join('\n'),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (applyError) {
|
|
255
|
+
if (event.params) {
|
|
256
|
+
Object.assign(event.params, originalParams);
|
|
257
|
+
}
|
|
258
|
+
const errorMsg = String(applyError);
|
|
259
|
+
const isPathViolation = errorMsg.includes('Path boundary violation') || errorMsg.includes('no trusted workspace directory');
|
|
260
|
+
if (isPathViolation) {
|
|
261
|
+
logger?.warn?.(`[PD_GATE] Live auto-correction rejected — path out of bounds: ${errorMsg}`);
|
|
262
|
+
try {
|
|
263
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
264
|
+
eventLog.recordRuleHostAutoCorrectProposed({
|
|
265
|
+
toolName: event.toolName,
|
|
266
|
+
filePath: relPath,
|
|
267
|
+
ruleId: String(proposal.ruleId ?? 'unknown'),
|
|
268
|
+
principleId: proposal.principleId != null ? String(proposal.principleId) : undefined,
|
|
269
|
+
confidence: typeof proposal.confidence === 'number' ? proposal.confidence : 0,
|
|
270
|
+
reason: `Path boundary rejected: ${errorMsg}`,
|
|
271
|
+
applicationMode: 'shadow',
|
|
272
|
+
correctedFields: Array.isArray(proposal.correctedFields)
|
|
273
|
+
? proposal.correctedFields.map((f) => typeof f === 'object' && f !== null ? String(f.field) : String(f))
|
|
274
|
+
: [],
|
|
275
|
+
validationValid: false,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
catch (evErr) {
|
|
279
|
+
logger?.warn?.(`[PD_GATE] Failed to record path rejection telemetry: ${String(evErr)}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
logger?.warn?.(`[PD_GATE] Failed to apply auto-correction, using original params: ${errorMsg}`);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else if (hostResult?.decision === 'auto_correct') {
|
|
289
|
+
// auto_correct without correctionProposal — emit telemetry for observability
|
|
290
|
+
try {
|
|
291
|
+
const eventLog = EventLogService.get(wctx.stateDir, logger);
|
|
292
|
+
eventLog.recordRuleHostAutoCorrectProposed({
|
|
293
|
+
toolName: event.toolName,
|
|
294
|
+
filePath: relPath,
|
|
295
|
+
ruleId: hostResult.ruleId ?? 'unknown',
|
|
296
|
+
confidence: 0,
|
|
297
|
+
reason: hostResult.reason ?? 'auto_correct without correctionProposal',
|
|
298
|
+
applicationMode: 'shadow',
|
|
299
|
+
correctedFields: [],
|
|
300
|
+
validationValid: false,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
catch (evErr) {
|
|
304
|
+
logger?.warn?.(`[PD_GATE] Failed to record rulehost_auto_correct_proposed (no proposal): ${String(evErr)}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (hostError) {
|
|
309
|
+
logger.warn?.(`[PD_GATE:RULE_HOST] Host evaluation failed, allowing conservatively: ${String(hostError)}`);
|
|
310
|
+
}
|
|
311
|
+
// All checks passed - allow the operation
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
// Private helpers
|
|
316
|
+
// ---------------------------------------------------------------------------
|
|
317
|
+
function _extractParamsSummary(params) {
|
|
318
|
+
const summary = {};
|
|
319
|
+
// NOTE: Do NOT redact here — this feeds into RuleHost.evaluate() which
|
|
320
|
+
// may match against paramsSummary.command. Redaction happens at
|
|
321
|
+
// EventLog.record() before persistence.
|
|
322
|
+
if (params.file_path)
|
|
323
|
+
summary.file_path = params.file_path;
|
|
324
|
+
if (params.path)
|
|
325
|
+
summary.path = params.path;
|
|
326
|
+
if (params.command)
|
|
327
|
+
summary.command = params.command;
|
|
328
|
+
if (params.args)
|
|
329
|
+
summary.args = params.args;
|
|
330
|
+
if (params.old_string)
|
|
331
|
+
summary.old_string = params.old_string;
|
|
332
|
+
if (params.new_string)
|
|
333
|
+
summary.new_string = params.new_string;
|
|
334
|
+
return summary;
|
|
335
|
+
}
|
|
336
|
+
function _getCurrentGfi(sessionId) {
|
|
337
|
+
if (!sessionId)
|
|
338
|
+
return 0;
|
|
339
|
+
try {
|
|
340
|
+
return getSession(sessionId)?.currentGfi ?? 0;
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
return 0;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function _hasRecentThinking(sessionId) {
|
|
347
|
+
if (!sessionId)
|
|
348
|
+
return false;
|
|
349
|
+
try {
|
|
350
|
+
return hasRecentThinking(sessionId);
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function _getEpTier(workspaceDir) {
|
|
357
|
+
try {
|
|
358
|
+
const engine = getEvolutionEngine(workspaceDir);
|
|
359
|
+
return engine.getTier();
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
return 0;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function _getBashRisk(event) {
|
|
366
|
+
if (!BASH_TOOLS_SET.has(event.toolName))
|
|
367
|
+
return 'unknown';
|
|
368
|
+
try {
|
|
369
|
+
const command = String(event.params?.command || event.params?.args || '');
|
|
370
|
+
const isDangerous = /\brm\s+-rf\b|\bchmod\b|\bchown\b|>\s*\/dev\//.test(command);
|
|
371
|
+
if (isDangerous)
|
|
372
|
+
return 'dangerous';
|
|
373
|
+
const isMutation = /(?:>|>>|sed|rm|mv|mkdir|touch|cp|npm|yarn|pnpm|pip|cargo)/.test(command);
|
|
374
|
+
if (isMutation)
|
|
375
|
+
return 'normal';
|
|
376
|
+
return 'safe';
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return 'unknown';
|
|
380
|
+
}
|
|
381
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PluginHookBeforeResetEvent, PluginHookBeforeCompactionEvent, PluginHookAfterCompactionEvent, PluginHookAgentContext } from '../openclaw-sdk.js';
|
|
2
|
+
export declare function handleBeforeReset(event: PluginHookBeforeResetEvent, ctx: PluginHookAgentContext): Promise<void>;
|
|
3
|
+
export declare function extractPainFromSessionFile(sessionFile: string, ctx: PluginHookAgentContext): Promise<void>;
|
|
4
|
+
export declare function handleBeforeCompaction(event: PluginHookBeforeCompactionEvent, ctx: PluginHookAgentContext): Promise<void>;
|
|
5
|
+
export declare function handleAfterCompaction(event: PluginHookAfterCompactionEvent, ctx: PluginHookAgentContext): Promise<void>;
|