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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import type { PluginHookLlmOutputEvent, PluginHookAgentContext, TokenUsage } from '../openclaw-sdk.js';
|
|
4
3
|
import { trackLlmOutput, recordThinkingCheckpoint, resetFriction } from '../core/session-tracker.js';
|
|
5
4
|
import { normalizeSeverity } from '../core/empathy-types.js';
|
|
6
5
|
import { ControlUiDatabase } from '../core/control-ui-db.js';
|
|
@@ -12,42 +11,30 @@ import { atomicWriteFileSync } from '../utils/io.js';
|
|
|
12
11
|
import { emitPainDetectedEvent, buildTrajectoryEvidence } from './pain.js';
|
|
13
12
|
import { evaluatePainDiagnosticGate } from '../core/pain-diagnostic-gate.js';
|
|
14
13
|
import { loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
|
|
15
|
-
import { resolveSourceKind
|
|
14
|
+
import { resolveSourceKind } from './raw-observation-adapter.js';
|
|
16
15
|
import { evaluateEvidenceTriage } from './triage-adapter.js';
|
|
17
|
-
|
|
18
|
-
export interface EmpathySignal {
|
|
19
|
-
detected: boolean;
|
|
20
|
-
severity: 'mild' | 'moderate' | 'severe';
|
|
21
|
-
confidence: number;
|
|
22
|
-
reason?: string;
|
|
23
|
-
mode?: 'structured' | 'legacy_tag';
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function clamp(value: number, min: number, max: number): number {
|
|
16
|
+
function clamp(value, min, max) {
|
|
27
17
|
return Math.max(min, Math.min(max, value));
|
|
28
18
|
}
|
|
29
|
-
|
|
30
|
-
function parseConfidence(raw?: string): number {
|
|
19
|
+
function parseConfidence(raw) {
|
|
31
20
|
const parsed = Number(raw);
|
|
32
|
-
if (!Number.isFinite(parsed))
|
|
21
|
+
if (!Number.isFinite(parsed))
|
|
22
|
+
return 1;
|
|
33
23
|
return clamp(parsed, 0, 1);
|
|
34
24
|
}
|
|
35
|
-
|
|
36
|
-
function parseTrustedLegacyTag(text: string): RegExpMatchArray | null {
|
|
25
|
+
function parseTrustedLegacyTag(text) {
|
|
37
26
|
return /^\s*\[EMOTIONAL_DAMAGE_DETECTED(?::(mild|moderate|severe))?\]\s*$/i.exec(text);
|
|
38
27
|
}
|
|
39
|
-
|
|
40
28
|
/**
|
|
41
29
|
* 检测标签是否是被用户诱导/引用输出的(回显),而非 LLM 主动输出的情绪信号
|
|
42
30
|
*/
|
|
43
|
-
function isEchoedTag(text
|
|
31
|
+
function isEchoedTag(text, tagMatch) {
|
|
44
32
|
const tagIndex = tagMatch.index ?? 0;
|
|
45
33
|
const before = text.substring(Math.max(0, tagIndex - 100), tagIndex).toLowerCase();
|
|
46
|
-
|
|
47
34
|
// 1. 检查是否在引号内(用户引用)
|
|
48
35
|
const quotesBefore = (before.match(/["'\u300c\u300d\u201c\u201d`]/g) || []).length;
|
|
49
|
-
if (quotesBefore % 2 === 1)
|
|
50
|
-
|
|
36
|
+
if (quotesBefore % 2 === 1)
|
|
37
|
+
return true;
|
|
51
38
|
// 2. Strong patterns: 用户指令关键词(任意位置匹配)
|
|
52
39
|
const strongPatterns = [
|
|
53
40
|
/用户(说|让|要求|让我输出)/,
|
|
@@ -57,9 +44,9 @@ function isEchoedTag(text: string, tagMatch: RegExpMatchArray): boolean {
|
|
|
57
44
|
/你让我输出/,
|
|
58
45
|
];
|
|
59
46
|
for (const pattern of strongPatterns) {
|
|
60
|
-
if (pattern.test(before))
|
|
47
|
+
if (pattern.test(before))
|
|
48
|
+
return true;
|
|
61
49
|
}
|
|
62
|
-
|
|
63
50
|
// 3. Weak patterns: 仅在标签 15 字符内触发
|
|
64
51
|
const weakPatterns = [
|
|
65
52
|
{ pattern: /echo/, window: 15 },
|
|
@@ -68,21 +55,19 @@ function isEchoedTag(text: string, tagMatch: RegExpMatchArray): boolean {
|
|
|
68
55
|
];
|
|
69
56
|
for (const { pattern, window } of weakPatterns) {
|
|
70
57
|
const nearTag = text.substring(Math.max(0, tagIndex - window), tagIndex).toLowerCase();
|
|
71
|
-
if (pattern.test(nearTag))
|
|
58
|
+
if (pattern.test(nearTag))
|
|
59
|
+
return true;
|
|
72
60
|
}
|
|
73
|
-
|
|
74
61
|
// 4. 检查是否在代码块内
|
|
75
62
|
const codeBlocksBefore = (before.match(/```/g) || []).length;
|
|
76
|
-
if (codeBlocksBefore % 2 === 1)
|
|
77
|
-
|
|
63
|
+
if (codeBlocksBefore % 2 === 1)
|
|
64
|
+
return true;
|
|
78
65
|
return false;
|
|
79
66
|
}
|
|
80
|
-
|
|
81
|
-
export function extractEmpathySignal(text: string): EmpathySignal {
|
|
67
|
+
export function extractEmpathySignal(text) {
|
|
82
68
|
if (!text || typeof text !== 'string') {
|
|
83
69
|
return { detected: false, severity: 'mild', confidence: 1 };
|
|
84
70
|
}
|
|
85
|
-
|
|
86
71
|
const xmlMatch = /<empathy\s+([^>]*)\/?>(?:<\/empathy>)?/i.exec(text);
|
|
87
72
|
if (xmlMatch?.[1]) {
|
|
88
73
|
const [, attrs] = xmlMatch;
|
|
@@ -94,14 +79,11 @@ export function extractEmpathySignal(text: string): EmpathySignal {
|
|
|
94
79
|
return { detected: true, severity, confidence, reason, mode: 'structured' };
|
|
95
80
|
}
|
|
96
81
|
}
|
|
97
|
-
|
|
98
82
|
const jsonMatch = /"empathy"\s*:\s*\{[\s\S]*?\}/i.exec(text);
|
|
99
83
|
if (jsonMatch) {
|
|
100
84
|
const jsonText = `{${jsonMatch[0]}}`;
|
|
101
85
|
try {
|
|
102
|
-
const parsed = JSON.parse(jsonText)
|
|
103
|
-
empathy?: { damageDetected?: boolean; severity?: string; confidence?: number; reason?: string };
|
|
104
|
-
};
|
|
86
|
+
const parsed = JSON.parse(jsonText);
|
|
105
87
|
if (parsed.empathy?.damageDetected === true) {
|
|
106
88
|
return {
|
|
107
89
|
detected: true,
|
|
@@ -111,11 +93,11 @@ export function extractEmpathySignal(text: string): EmpathySignal {
|
|
|
111
93
|
mode: 'structured'
|
|
112
94
|
};
|
|
113
95
|
}
|
|
114
|
-
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
115
98
|
// ignore malformed snippet
|
|
116
99
|
}
|
|
117
100
|
}
|
|
118
|
-
|
|
119
101
|
const tagMatch = parseTrustedLegacyTag(text);
|
|
120
102
|
if (tagMatch) {
|
|
121
103
|
if (isEchoedTag(text, tagMatch)) {
|
|
@@ -128,44 +110,40 @@ export function extractEmpathySignal(text: string): EmpathySignal {
|
|
|
128
110
|
mode: 'legacy_tag'
|
|
129
111
|
};
|
|
130
112
|
}
|
|
131
|
-
|
|
132
113
|
return { detected: false, severity: 'mild', confidence: 1 };
|
|
133
114
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
115
|
+
export function isEmpathyAuditPayload(text) {
|
|
116
|
+
if (!text || typeof text !== 'string')
|
|
117
|
+
return false;
|
|
137
118
|
const trimmed = text.trim();
|
|
138
|
-
if (/^\{[\s\S]*"damageDetected"[\s\S]*\}$/.test(trimmed))
|
|
139
|
-
|
|
140
|
-
if (
|
|
119
|
+
if (/^\{[\s\S]*"damageDetected"[\s\S]*\}$/.test(trimmed))
|
|
120
|
+
return true;
|
|
121
|
+
if (/^<empathy\s+([^>]*)\/?>/i.test(trimmed))
|
|
122
|
+
return true;
|
|
123
|
+
if (/^\s*\[EMOTIONAL_DAMAGE_DETECTED(?::(mild|moderate|severe))?\]\s*$/i.test(trimmed))
|
|
124
|
+
return true;
|
|
141
125
|
return false;
|
|
142
126
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
ctx: PluginHookAgentContext & { workspaceDir?: string }
|
|
147
|
-
): void {
|
|
148
|
-
if (!ctx.workspaceDir || !ctx.sessionId) return;
|
|
149
|
-
|
|
127
|
+
export function handleLlmOutput(event, ctx) {
|
|
128
|
+
if (!ctx.workspaceDir || !ctx.sessionId)
|
|
129
|
+
return;
|
|
150
130
|
const wctx = WorkspaceContext.fromHookContext(ctx);
|
|
151
|
-
const {config} = wctx;
|
|
152
|
-
const {eventLog} = wctx;
|
|
153
|
-
|
|
131
|
+
const { config } = wctx;
|
|
132
|
+
const { eventLog } = wctx;
|
|
154
133
|
// Track this turn in the core session memory
|
|
155
|
-
const trigger =
|
|
156
|
-
const usage = event.usage
|
|
157
|
-
const sessionId =
|
|
158
|
-
const workspaceDir =
|
|
159
|
-
const sessionKey =
|
|
134
|
+
const trigger = event.trigger ?? undefined;
|
|
135
|
+
const usage = event.usage;
|
|
136
|
+
const sessionId = ctx.sessionId ?? 'unknown';
|
|
137
|
+
const workspaceDir = ctx.workspaceDir;
|
|
138
|
+
const sessionKey = ctx.sessionKey ?? 'unknown';
|
|
160
139
|
const state = trackLlmOutput(sessionId, usage, config, workspaceDir, sessionKey, trigger);
|
|
161
|
-
|
|
162
140
|
// We need actual assistant text to analyze
|
|
163
|
-
if (!event.assistantTexts || event.assistantTexts.length === 0)
|
|
164
|
-
|
|
141
|
+
if (!event.assistantTexts || event.assistantTexts.length === 0)
|
|
142
|
+
return;
|
|
165
143
|
const text = event.assistantTexts.join('\n');
|
|
166
144
|
const signal = extractEmpathySignal(text);
|
|
167
145
|
const createdAt = new Date().toISOString();
|
|
168
|
-
let assistantTurnId
|
|
146
|
+
let assistantTurnId = null;
|
|
169
147
|
try {
|
|
170
148
|
assistantTurnId = wctx.trajectory?.recordAssistantTurn?.({
|
|
171
149
|
sessionId: ctx.sessionId,
|
|
@@ -178,15 +156,14 @@ export function handleLlmOutput(
|
|
|
178
156
|
empathySignalJson: signal,
|
|
179
157
|
createdAt,
|
|
180
158
|
});
|
|
181
|
-
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
182
161
|
ctx.logger?.warn?.(`[PD:LLM] Failed to persist assistant turn to trajectory: ${String(error)}`);
|
|
183
162
|
}
|
|
184
|
-
|
|
185
163
|
// ── Track B: Semantic Pain Detection (V1.3.0 Funnel) ──
|
|
186
164
|
const detectionText = isEmpathyAuditPayload(text) ? '' : text;
|
|
187
165
|
const detectionService = DetectionService.get(wctx.stateDir);
|
|
188
166
|
const detection = detectionService.detect(detectionText);
|
|
189
|
-
|
|
190
167
|
if (detection.detected) {
|
|
191
168
|
eventLog.recordRuleMatch(ctx.sessionId, {
|
|
192
169
|
ruleId: detection.ruleId || detection.source,
|
|
@@ -195,7 +172,6 @@ export function handleLlmOutput(
|
|
|
195
172
|
textPreview: detectionText.substring(0, 100)
|
|
196
173
|
});
|
|
197
174
|
}
|
|
198
|
-
|
|
199
175
|
let painScore = detection.detected ? (detection.severity || 0) : 0;
|
|
200
176
|
let source = detection.detected
|
|
201
177
|
? (detection.ruleId ? `llm_${detection.ruleId.toLowerCase()}` : `llm_${detection.source}`)
|
|
@@ -203,18 +179,12 @@ export function handleLlmOutput(
|
|
|
203
179
|
let matchedReason = detection.detected
|
|
204
180
|
? `Agent triggered pain detection (Source: ${detection.source}${detection.ruleId ? `, Rule: ${detection.ruleId}` : ''})`
|
|
205
181
|
: '';
|
|
206
|
-
|
|
207
182
|
// ═══ Natural Language Rollback Detection ═══
|
|
208
183
|
const rollbackMatch = /^\s*\[EMPATHY_ROLLBACK_REQUEST\]\s*$/m.exec(text);
|
|
209
184
|
if (rollbackMatch) {
|
|
210
185
|
const eventId = eventLog.getLastEmpathyEventId(ctx.sessionId);
|
|
211
186
|
if (eventId) {
|
|
212
|
-
const rolledBackScore = eventLog.rollbackEmpathyEvent(
|
|
213
|
-
eventId,
|
|
214
|
-
ctx.sessionId,
|
|
215
|
-
'Natural language rollback request detected',
|
|
216
|
-
'natural_language'
|
|
217
|
-
);
|
|
187
|
+
const rolledBackScore = eventLog.rollbackEmpathyEvent(eventId, ctx.sessionId, 'Natural language rollback request detected', 'natural_language');
|
|
218
188
|
if (rolledBackScore > 0) {
|
|
219
189
|
// Reset GFI after successful rollback
|
|
220
190
|
resetFriction(ctx.sessionId, ctx.workspaceDir, {
|
|
@@ -224,22 +194,18 @@ export function handleLlmOutput(
|
|
|
224
194
|
}
|
|
225
195
|
}
|
|
226
196
|
}
|
|
227
|
-
|
|
228
197
|
// 3. Paralysis Check (from session state tracker)
|
|
229
198
|
const stuckThreshold = config.get('thresholds.stuck_loops_trigger') || 3;
|
|
230
199
|
const inputThreshold = config.get('thresholds.cognitive_paralysis_input') || 4000;
|
|
231
200
|
const paralysisScore = config.get('scores.paralysis') || 40;
|
|
232
|
-
|
|
233
201
|
if (state.stuckLoops >= stuckThreshold && state.totalInputTokens > inputThreshold && painScore < paralysisScore) {
|
|
234
202
|
painScore = paralysisScore;
|
|
235
203
|
source = 'llm_paralysis';
|
|
236
204
|
matchedReason = `Agent is stuck in low-output loops (${state.stuckLoops} consecutive turns with tiny output but huge context), indicating cognitive paralysis.`;
|
|
237
205
|
}
|
|
238
|
-
|
|
239
206
|
// If a semantic pain threshold is crossed, only valuable episodes enter Runtime v2.
|
|
240
207
|
// Lower-signal detections remain in the event log/GFI layer for accumulation.
|
|
241
208
|
const painTriggerThreshold = config.get('thresholds.pain_trigger') || 30;
|
|
242
|
-
|
|
243
209
|
// GFI-triggered pain: when accumulated friction crosses highGfi threshold,
|
|
244
210
|
// emit pain signal even if L1 detection didn't fire.
|
|
245
211
|
const highGfiThreshold = Math.max(config.get('severity_thresholds.high') || 70, painTriggerThreshold + 30);
|
|
@@ -250,14 +216,13 @@ export function handleLlmOutput(
|
|
|
250
216
|
isGfiTriggered = true;
|
|
251
217
|
matchedReason = `Accumulated GFI (${state.currentGfi.toFixed(1)}) crossed highGfi threshold (${highGfiThreshold}). Source: empathy keyword friction.`;
|
|
252
218
|
}
|
|
253
|
-
|
|
254
219
|
if (painScore >= painTriggerThreshold) {
|
|
255
220
|
// PEAT-B1: Evidence triage (feature-flagged)
|
|
256
221
|
let triageAdmitted = true;
|
|
257
|
-
const llmTriageFlag = loadFeatureFlagFromConfig(ctx.workspaceDir
|
|
222
|
+
const llmTriageFlag = loadFeatureFlagFromConfig(ctx.workspaceDir, 'painEvidenceAdmission');
|
|
258
223
|
if (llmTriageFlag.enabled) {
|
|
259
224
|
// PRI-360 S1: Build RawObservation for unified source mapping
|
|
260
|
-
const rawObs
|
|
225
|
+
const rawObs = {
|
|
261
226
|
observedAt: new Date().toISOString(),
|
|
262
227
|
workspaceId: ctx.workspaceDir,
|
|
263
228
|
sessionId: ctx.sessionId,
|
|
@@ -271,14 +236,12 @@ export function handleLlmOutput(
|
|
|
271
236
|
ctx.logger?.info?.(`[PD:LLM] Triage ${triage.decision}: ${triage.reason}`);
|
|
272
237
|
}
|
|
273
238
|
}
|
|
274
|
-
|
|
275
239
|
eventLog.recordPainSignal(ctx.sessionId, {
|
|
276
240
|
score: painScore,
|
|
277
241
|
source: source,
|
|
278
242
|
reason: matchedReason,
|
|
279
243
|
isRisky: false
|
|
280
244
|
});
|
|
281
|
-
|
|
282
245
|
if (triageAdmitted) {
|
|
283
246
|
const gate = evaluatePainDiagnosticGate({
|
|
284
247
|
source: source === 'llm_paralysis' ? 'llm_paralysis' : 'semantic',
|
|
@@ -293,7 +256,6 @@ export function handleLlmOutput(
|
|
|
293
256
|
semanticPain: Math.max(painTriggerThreshold, 60),
|
|
294
257
|
},
|
|
295
258
|
});
|
|
296
|
-
|
|
297
259
|
if (gate.shouldDiagnose) {
|
|
298
260
|
const evidence = buildTrajectoryEvidence(wctx, ctx.sessionId || 'unknown');
|
|
299
261
|
emitPainDetectedEvent(wctx, {
|
|
@@ -301,7 +263,7 @@ export function handleLlmOutput(
|
|
|
301
263
|
type: 'pain_detected',
|
|
302
264
|
data: {
|
|
303
265
|
painId: `llm_${Date.now()}`,
|
|
304
|
-
painType: 'user_frustration'
|
|
266
|
+
painType: 'user_frustration',
|
|
305
267
|
source,
|
|
306
268
|
reason: `${matchedReason}; diagnosticGate=${gate.reason}`,
|
|
307
269
|
score: painScore,
|
|
@@ -311,17 +273,16 @@ export function handleLlmOutput(
|
|
|
311
273
|
evidence,
|
|
312
274
|
},
|
|
313
275
|
});
|
|
314
|
-
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
315
278
|
ctx.logger?.info?.(`[PD:LLM] Pain signal recorded without Runtime V2 diagnosis: ${gate.detail}`);
|
|
316
279
|
}
|
|
317
|
-
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
318
282
|
ctx.logger?.info?.(`[PD:LLM] Triage evidence-only: pain signal recorded without diagnosis or gate evaluation`);
|
|
319
283
|
}
|
|
320
284
|
}
|
|
321
|
-
|
|
322
285
|
// ═══ Thinking OS: Mental Model Usage Tracking ═══
|
|
323
|
-
|
|
324
|
-
|
|
325
286
|
trackThinkingModelUsage({
|
|
326
287
|
text,
|
|
327
288
|
wctx,
|
|
@@ -332,56 +293,41 @@ export function handleLlmOutput(
|
|
|
332
293
|
logger: ctx.logger,
|
|
333
294
|
});
|
|
334
295
|
}
|
|
335
|
-
|
|
336
|
-
function trackThinkingModelUsage(args: {
|
|
337
|
-
text: string;
|
|
338
|
-
wctx: WorkspaceContext;
|
|
339
|
-
sessionId?: string;
|
|
340
|
-
runId: string;
|
|
341
|
-
assistantTurnId: number | null;
|
|
342
|
-
createdAt: string;
|
|
343
|
-
logger?: PluginHookAgentContext['logger'];
|
|
344
|
-
}): void {
|
|
296
|
+
function trackThinkingModelUsage(args) {
|
|
345
297
|
const { text, wctx, sessionId, runId, assistantTurnId, createdAt, logger } = args;
|
|
346
298
|
const logPath = wctx.resolve('THINKING_OS_USAGE');
|
|
347
299
|
const logDir = path.dirname(logPath);
|
|
348
|
-
if (!fs.existsSync(logDir))
|
|
349
|
-
|
|
350
|
-
let usageLog
|
|
351
|
-
|
|
300
|
+
if (!fs.existsSync(logDir))
|
|
301
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
302
|
+
let usageLog = {};
|
|
352
303
|
if (fs.existsSync(logPath)) {
|
|
353
304
|
try {
|
|
354
305
|
usageLog = JSON.parse(fs.readFileSync(logPath, 'utf8'));
|
|
355
|
-
}
|
|
306
|
+
}
|
|
307
|
+
catch (e) {
|
|
356
308
|
logger?.error?.(`[PD:LLM] Failed to parse thinking OS usage log: ${String(e)}`);
|
|
357
309
|
}
|
|
358
310
|
}
|
|
359
|
-
|
|
360
311
|
const matches = detectThinkingModelMatches(text, wctx.workspaceDir);
|
|
361
312
|
for (const match of matches) {
|
|
362
313
|
usageLog[match.modelId] = (usageLog[match.modelId] || 0) + 1;
|
|
363
314
|
}
|
|
364
|
-
|
|
365
315
|
usageLog._total_turns = (usageLog._total_turns || 0) + 1;
|
|
366
|
-
|
|
367
316
|
try {
|
|
368
317
|
atomicWriteFileSync(logPath, JSON.stringify(usageLog, null, 2));
|
|
369
|
-
}
|
|
318
|
+
}
|
|
319
|
+
catch (e) {
|
|
370
320
|
logger?.error?.(`[PD:LLM] Failed to write thinking OS usage log: ${String(e)}`);
|
|
371
321
|
}
|
|
372
|
-
|
|
373
322
|
if (matches.length === 0) {
|
|
374
323
|
return;
|
|
375
324
|
}
|
|
376
|
-
|
|
377
325
|
if (sessionId) {
|
|
378
326
|
recordThinkingCheckpoint(sessionId, wctx.workspaceDir);
|
|
379
327
|
}
|
|
380
|
-
|
|
381
328
|
if (!sessionId || !assistantTurnId) {
|
|
382
329
|
return;
|
|
383
330
|
}
|
|
384
|
-
|
|
385
331
|
const uiDb = new ControlUiDatabase({ workspaceDir: wctx.workspaceDir });
|
|
386
332
|
try {
|
|
387
333
|
const recentContext = uiDb.getRecentThinkingContext(sessionId, createdAt);
|
|
@@ -399,7 +345,6 @@ function trackThinkingModelUsage(args: {
|
|
|
399
345
|
eventType: event.eventType,
|
|
400
346
|
}));
|
|
401
347
|
const triggerExcerpt = text.length > 280 ? `${text.slice(0, 277)}...` : text;
|
|
402
|
-
|
|
403
348
|
for (const match of matches) {
|
|
404
349
|
const scenarios = deriveThinkingScenarios(match.modelId, {
|
|
405
350
|
recentToolCalls: toolContext,
|
|
@@ -413,7 +358,6 @@ function trackThinkingModelUsage(args: {
|
|
|
413
358
|
})),
|
|
414
359
|
recentPrincipleEvents: principleContext,
|
|
415
360
|
});
|
|
416
|
-
|
|
417
361
|
uiDb.recordThinkingModelEvent({
|
|
418
362
|
sessionId,
|
|
419
363
|
runId,
|
|
@@ -428,9 +372,11 @@ function trackThinkingModelUsage(args: {
|
|
|
428
372
|
createdAt,
|
|
429
373
|
});
|
|
430
374
|
}
|
|
431
|
-
}
|
|
375
|
+
}
|
|
376
|
+
catch (error) {
|
|
432
377
|
logger?.warn?.(`[PD:LLM] Failed to persist thinking model events: ${String(error)}`);
|
|
433
|
-
}
|
|
378
|
+
}
|
|
379
|
+
finally {
|
|
434
380
|
uiDb.dispose();
|
|
435
381
|
}
|
|
436
382
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PluginHookBeforeMessageWriteEvent, PluginHookBeforeMessageWriteResult } from '../openclaw-sdk.js';
|
|
2
|
+
import { convergePath, MAX_EVIDENCE_VALUE_CHARS } from '@principles/core/runtime-v2';
|
|
3
|
+
export { MAX_EVIDENCE_VALUE_CHARS, convergePath };
|
|
4
|
+
/**
|
|
5
|
+
* Sanitize a single string value for evidence storage.
|
|
6
|
+
* Delegates to core sanitizer with optional workspaceDir for path convergence.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitizeForEvidence(value: unknown, workspaceDir?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Recursively sanitize any value for evidence storage.
|
|
11
|
+
* Delegates to core sanitizer.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sanitizeValueForEvidence(value: unknown, workspaceDir?: string): unknown;
|
|
14
|
+
/**
|
|
15
|
+
* Sanitize tool-call params for evidence/trajectory storage.
|
|
16
|
+
* Delegates to core sanitizer — accepts unknown, runtime-validates.
|
|
17
|
+
*
|
|
18
|
+
* ERR-001: no `as` casts on input
|
|
19
|
+
* ERR-055: ANY-segment sensitive field matching
|
|
20
|
+
* ERR-056: token redaction on ALL strings via recursive sanitizeValue
|
|
21
|
+
*/
|
|
22
|
+
export declare function sanitizeToolParamsForEvidence(params: unknown, workspaceDir?: string): Record<string, unknown>;
|
|
23
|
+
export declare function sanitizeAssistantText(text: string): string;
|
|
24
|
+
export declare function handleBeforeMessageWrite(event: PluginHookBeforeMessageWriteEvent): PluginHookBeforeMessageWriteResult | void;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { sanitizeString as coreSanitizeString, sanitizeValue as coreSanitizeValue, sanitizeToolParams as coreSanitizeToolParams, convergePath, MAX_EVIDENCE_VALUE_CHARS, } from '@principles/core/runtime-v2';
|
|
2
|
+
const INTERNAL_TAG_PATTERNS = [
|
|
3
|
+
/\[EMOTIONAL_DAMAGE_DETECTED(?::(?:mild|moderate|severe))?\]/gi,
|
|
4
|
+
/\[EMPATHY_ROLLBACK_REQUEST\]/gi,
|
|
5
|
+
/<empathy\s+[^>]*\/?>(?:<\/empathy>)?/gi,
|
|
6
|
+
];
|
|
7
|
+
/**
|
|
8
|
+
* Type predicate: true if msg is an assistant message with content.
|
|
9
|
+
* Used for safe narrowing after spread operations on message union.
|
|
10
|
+
*/
|
|
11
|
+
function isAssistantMessageWithContent(msg) {
|
|
12
|
+
return (typeof msg === 'object' &&
|
|
13
|
+
msg !== null &&
|
|
14
|
+
msg.role === 'assistant' &&
|
|
15
|
+
typeof msg.content === 'string');
|
|
16
|
+
}
|
|
17
|
+
// Re-export core constants and functions for backward compatibility
|
|
18
|
+
export { MAX_EVIDENCE_VALUE_CHARS, convergePath };
|
|
19
|
+
/**
|
|
20
|
+
* Sanitize a single string value for evidence storage.
|
|
21
|
+
* Delegates to core sanitizer with optional workspaceDir for path convergence.
|
|
22
|
+
*/
|
|
23
|
+
export function sanitizeForEvidence(value, workspaceDir) {
|
|
24
|
+
if (value === null || value === undefined)
|
|
25
|
+
return '';
|
|
26
|
+
return coreSanitizeString(String(value), workspaceDir);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Recursively sanitize any value for evidence storage.
|
|
30
|
+
* Delegates to core sanitizer.
|
|
31
|
+
*/
|
|
32
|
+
export function sanitizeValueForEvidence(value, workspaceDir) {
|
|
33
|
+
return coreSanitizeValue(value, 0, workspaceDir);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sanitize tool-call params for evidence/trajectory storage.
|
|
37
|
+
* Delegates to core sanitizer — accepts unknown, runtime-validates.
|
|
38
|
+
*
|
|
39
|
+
* ERR-001: no `as` casts on input
|
|
40
|
+
* ERR-055: ANY-segment sensitive field matching
|
|
41
|
+
* ERR-056: token redaction on ALL strings via recursive sanitizeValue
|
|
42
|
+
*/
|
|
43
|
+
export function sanitizeToolParamsForEvidence(params, workspaceDir) {
|
|
44
|
+
return coreSanitizeToolParams(params, workspaceDir);
|
|
45
|
+
}
|
|
46
|
+
export function sanitizeAssistantText(text) {
|
|
47
|
+
let result = text;
|
|
48
|
+
for (const pattern of INTERNAL_TAG_PATTERNS) {
|
|
49
|
+
result = result.replace(pattern, '');
|
|
50
|
+
}
|
|
51
|
+
return result
|
|
52
|
+
.replace(/[ \t]+\n/g, '\n')
|
|
53
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
54
|
+
.trim();
|
|
55
|
+
}
|
|
56
|
+
export function handleBeforeMessageWrite(event) {
|
|
57
|
+
const msg = event.message;
|
|
58
|
+
if (!msg || msg.role !== 'assistant')
|
|
59
|
+
return;
|
|
60
|
+
if (isAssistantMessageWithContent(msg)) {
|
|
61
|
+
const sanitized = sanitizeAssistantText(msg.content);
|
|
62
|
+
if (sanitized !== msg.content) {
|
|
63
|
+
return { message: { ...msg, content: sanitized } };
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (Array.isArray(msg.content)) {
|
|
68
|
+
const next = msg.content.map((part) => {
|
|
69
|
+
if (part && typeof part === 'object' && part.type === 'text' && typeof part.text === 'string') {
|
|
70
|
+
return { ...part, text: sanitizeAssistantText(part.text) };
|
|
71
|
+
}
|
|
72
|
+
return part;
|
|
73
|
+
});
|
|
74
|
+
return { message: { ...msg, content: next } };
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pain Hook — PRI-326 decomposed
|
|
3
|
+
*
|
|
4
|
+
* After-tool-call hook that captures tool failures and emits pain signals.
|
|
5
|
+
*
|
|
6
|
+
* Pipeline stages (delegated to after-tool-call-helpers):
|
|
7
|
+
* 1. classifyToolCallOutcome — determine failure/success + source
|
|
8
|
+
* 2. buildToolCallObservation — normalize event into observation
|
|
9
|
+
* 3. handleFrictionTracking — GFI, event log, trajectory recording
|
|
10
|
+
* 4. handleProbationFeedback — probation attribution + cleanup
|
|
11
|
+
* 5. evaluatePainAdmission — triage + gate evaluation
|
|
12
|
+
* 6. emitPainIfAdmitted — pain signal emission
|
|
13
|
+
*
|
|
14
|
+
* The manual pain path (toolName === 'pain') remains inline because it
|
|
15
|
+
* has a different control flow (early return, no triage, no gate on cooldown).
|
|
16
|
+
*/
|
|
17
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
18
|
+
import type { EvolutionLoopEvent } from '../core/evolution-types.js';
|
|
19
|
+
import type { PluginHookAfterToolCallEvent, PluginHookToolContext, OpenClawPluginApi } from '../openclaw-sdk.js';
|
|
20
|
+
import { buildTrajectoryEvidence } from './trajectory-evidence.js';
|
|
21
|
+
export { buildTrajectoryEvidence };
|
|
22
|
+
export declare function emitPainDetectedEvent(wctx: WorkspaceContext, event: EvolutionLoopEvent): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Handle after_tool_call hook — decomposed into pipeline stages.
|
|
25
|
+
*
|
|
26
|
+
* Pipeline: classify → record → triage → gate → emit
|
|
27
|
+
*
|
|
28
|
+
* Manual pain (toolName === 'pain') is handled inline with early return.
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleAfterToolCall(event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext & {
|
|
31
|
+
workspaceDir?: string;
|
|
32
|
+
pluginConfig?: Record<string, unknown>;
|
|
33
|
+
}, api?: OpenClawPluginApi): void;
|