principles-disciple 1.127.0 → 1.129.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 -96
- 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,380 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRI-294: Split EvolutionWorker-era services into MVP hook adapters.
|
|
3
|
-
*
|
|
4
|
-
* Tests prove:
|
|
5
|
-
* 1. All guardHook/guardService surface IDs in index.ts exist in the registry.
|
|
6
|
-
* 2. CorrectionObserver starts independently of EvolutionWorker.
|
|
7
|
-
* 3. Core hooks are enabled; non-core hooks are disabled by default.
|
|
8
|
-
* 4. EvolutionWorker-era prompt injection has been removed.
|
|
9
|
-
* 5. EvolutionWorker service is NOT registered via api.registerService.
|
|
10
|
-
*
|
|
11
|
-
* ERR-024: dead validators/services must not appear as protection if not wired.
|
|
12
|
-
* ERR-025: tests must exercise production hook/service paths.
|
|
13
|
-
* ERR-027: registry/docs must match actual runtime surface.
|
|
14
|
-
*/
|
|
15
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
16
|
-
import * as fs from 'fs';
|
|
17
|
-
import * as path from 'path';
|
|
18
|
-
import * as os from 'os';
|
|
19
|
-
import * as yaml from 'js-yaml';
|
|
20
|
-
import { PLUGIN_SURFACE_REGISTRY, computeEffectiveFlags, DEFAULT_FEATURE_FLAGS } from '@principles/core/runtime-v2';
|
|
21
|
-
|
|
22
|
-
// ── Helpers ──
|
|
23
|
-
|
|
24
|
-
function createTempWorkspace(): string {
|
|
25
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-slimming-'));
|
|
26
|
-
fs.mkdirSync(path.join(dir, '.pd'), { recursive: true });
|
|
27
|
-
fs.mkdirSync(path.join(dir, '.state'), { recursive: true });
|
|
28
|
-
return dir;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function deepMergeFeatures(
|
|
32
|
-
defaults: Record<string, unknown>,
|
|
33
|
-
overrides: Record<string, unknown>,
|
|
34
|
-
): Record<string, unknown> {
|
|
35
|
-
const result: Record<string, unknown> = { ...defaults };
|
|
36
|
-
for (const [key, value] of Object.entries(overrides)) {
|
|
37
|
-
if (
|
|
38
|
-
value != null &&
|
|
39
|
-
typeof value === 'object' &&
|
|
40
|
-
!Array.isArray(value) &&
|
|
41
|
-
Object.hasOwn(result, key) &&
|
|
42
|
-
result[key] != null &&
|
|
43
|
-
typeof result[key] === 'object' &&
|
|
44
|
-
!Array.isArray(result[key])
|
|
45
|
-
) {
|
|
46
|
-
result[key] = { ...(result[key] as Record<string, unknown>), ...(value as Record<string, unknown>) };
|
|
47
|
-
} else {
|
|
48
|
-
result[key] = value;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return result;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function writeConfigYaml(workspaceDir: string, featureOverrides: Record<string, unknown>): void {
|
|
55
|
-
const configPath = path.join(workspaceDir, '.pd', 'config.yaml');
|
|
56
|
-
const defaultFeatures: Record<string, unknown> = {
|
|
57
|
-
prompt: { category: 'core', enabled: true },
|
|
58
|
-
code_tool_hook: { category: 'core', enabled: true },
|
|
59
|
-
defer_archive: { category: 'core', enabled: true },
|
|
60
|
-
correction_observer: { category: 'quiet', enabled: false },
|
|
61
|
-
empathy_observer: { category: 'quiet', enabled: false },
|
|
62
|
-
evolution_worker: { category: 'quiet', enabled: false },
|
|
63
|
-
nocturnal: { category: 'gone', enabled: false },
|
|
64
|
-
};
|
|
65
|
-
const config = {
|
|
66
|
-
version: 1,
|
|
67
|
-
features: deepMergeFeatures(defaultFeatures, featureOverrides),
|
|
68
|
-
runtimeProfiles: {
|
|
69
|
-
'openclaw.default': { type: 'openclaw', source: 'default' },
|
|
70
|
-
},
|
|
71
|
-
internalAgents: {
|
|
72
|
-
defaultRuntime: 'openclaw.default',
|
|
73
|
-
agents: {
|
|
74
|
-
diagnostician: { enabled: true },
|
|
75
|
-
dreamer: { enabled: true },
|
|
76
|
-
scribe: { enabled: true },
|
|
77
|
-
artificer: { enabled: true },
|
|
78
|
-
philosopher: { enabled: false },
|
|
79
|
-
evaluator: { enabled: false },
|
|
80
|
-
rolloutReviewer: { enabled: false },
|
|
81
|
-
trainer: { enabled: false },
|
|
82
|
-
correctionObserver: { enabled: false },
|
|
83
|
-
empathyObserver: { enabled: false },
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
const content = yaml.dump(config, { schema: yaml.JSON_SCHEMA });
|
|
88
|
-
fs.writeFileSync(configPath, content, 'utf8');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function createMockLogger() {
|
|
92
|
-
return {
|
|
93
|
-
info: vi.fn(),
|
|
94
|
-
warn: vi.fn(),
|
|
95
|
-
error: vi.fn(),
|
|
96
|
-
debug: vi.fn(),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Mock dependencies for service start tests
|
|
101
|
-
vi.mock('../src/core/dictionary-service.js', () => ({
|
|
102
|
-
DictionaryService: { get: vi.fn(() => ({ flush: vi.fn() })) },
|
|
103
|
-
}));
|
|
104
|
-
|
|
105
|
-
vi.mock('../src/core/session-tracker.js', () => ({
|
|
106
|
-
initPersistence: vi.fn(),
|
|
107
|
-
flushAllSessions: vi.fn(),
|
|
108
|
-
listSessions: vi.fn(() => []),
|
|
109
|
-
}));
|
|
110
|
-
|
|
111
|
-
vi.mock('../src/core/workspace-context.js', () => {
|
|
112
|
-
const mockCtx = {
|
|
113
|
-
stateDir: '',
|
|
114
|
-
workspaceDir: '',
|
|
115
|
-
config: { get: vi.fn() },
|
|
116
|
-
eventLog: { recordHookExecution: vi.fn() },
|
|
117
|
-
dictionary: { flush: vi.fn() },
|
|
118
|
-
resolve: vi.fn((key: string) => `/mock/${key}`),
|
|
119
|
-
trajectory: null,
|
|
120
|
-
};
|
|
121
|
-
return {
|
|
122
|
-
WorkspaceContext: {
|
|
123
|
-
fromHookContext: vi.fn(() => mockCtx),
|
|
124
|
-
clearCache: vi.fn(),
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// Import after mocks
|
|
130
|
-
import { loadFeatureFlagFromWorkspace, shouldStartEvolutionWorker, shouldStartCorrectionObserver } from '../src/index.js';
|
|
131
|
-
import { CorrectionObserverService } from '../src/service/correction-observer-service.js';
|
|
132
|
-
|
|
133
|
-
// ── 1. Surface Registry Coverage Audit ──
|
|
134
|
-
|
|
135
|
-
describe('PRI-294: Surface registry coverage audit', () => {
|
|
136
|
-
// Surface IDs actually used in index.ts guardHook/guardService calls
|
|
137
|
-
const USED_SURFACE_IDS = [
|
|
138
|
-
'hook:before_prompt_build',
|
|
139
|
-
'hook:before_tool_call',
|
|
140
|
-
'hook:after_tool_call',
|
|
141
|
-
'hook:llm_output',
|
|
142
|
-
'hook:subagent_spawning',
|
|
143
|
-
'hook:subagent_ended',
|
|
144
|
-
'hook:before_reset',
|
|
145
|
-
'hook:before_compaction',
|
|
146
|
-
'hook:after_compaction',
|
|
147
|
-
'hook:before_message_write', // PRI-346: SQLite fallback trajectory collection
|
|
148
|
-
// Services registered via guardService
|
|
149
|
-
'service:correction-observer',
|
|
150
|
-
'service:trajectory',
|
|
151
|
-
'service:pd-task',
|
|
152
|
-
'service:central-sync',
|
|
153
|
-
];
|
|
154
|
-
|
|
155
|
-
for (const surfaceId of USED_SURFACE_IDS) {
|
|
156
|
-
it(`used surface '${surfaceId}' exists in registry`, () => {
|
|
157
|
-
const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
|
|
158
|
-
expect(entry).toBeDefined();
|
|
159
|
-
expect(entry!.id).toBe(surfaceId);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
it('all used surface IDs are accounted for (no orphan surfaces)', () => {
|
|
164
|
-
const registeredIds = new Set(PLUGIN_SURFACE_REGISTRY.map(s => s.id));
|
|
165
|
-
const usedButNotRegistered = USED_SURFACE_IDS.filter(id => !registeredIds.has(id));
|
|
166
|
-
expect(usedButNotRegistered).toEqual([]);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('registry has no unexpected surfaces beyond what index.ts uses', () => {
|
|
170
|
-
const usedSet = new Set(USED_SURFACE_IDS);
|
|
171
|
-
// These are used but not directly via guardHook/guardService in the main hook path
|
|
172
|
-
const additionallyRegistered = [
|
|
173
|
-
'service:evolution-worker', // Previously registered, now removed per PRI-294
|
|
174
|
-
'startup:workspace-init',
|
|
175
|
-
'startup:evolution-worker',
|
|
176
|
-
'startup:correction-observer',
|
|
177
|
-
'service:internalization-auto-consumer', // PRI-381: bounded auto-consumer
|
|
178
|
-
'startup:internalization-auto-consumer', // PRI-381: auto-consumer startup
|
|
179
|
-
];
|
|
180
|
-
const allowedIds = new Set([...usedSet, ...additionallyRegistered]);
|
|
181
|
-
const unaccounted = PLUGIN_SURFACE_REGISTRY
|
|
182
|
-
.map(s => s.id)
|
|
183
|
-
.filter(id => !allowedIds.has(id));
|
|
184
|
-
// Unaccounted surfaces should be empty — every registry entry must trace to a caller
|
|
185
|
-
expect(unaccounted).toEqual([]);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
// ── 2. CorrectionObserver Independence ──
|
|
190
|
-
|
|
191
|
-
describe('PRI-294: CorrectionObserver independence from EvolutionWorker', () => {
|
|
192
|
-
let workspaceDir: string;
|
|
193
|
-
|
|
194
|
-
beforeEach(() => {
|
|
195
|
-
workspaceDir = createTempWorkspace();
|
|
196
|
-
CorrectionObserverService.stop?.({ logger: createMockLogger() });
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
afterEach(() => {
|
|
200
|
-
CorrectionObserverService.stop?.({ logger: createMockLogger() });
|
|
201
|
-
try {
|
|
202
|
-
fs.rmSync(workspaceDir, { recursive: true, force: true });
|
|
203
|
-
} catch {
|
|
204
|
-
// best-effort
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it('CorrectionObserver starts when EvolutionWorker is disabled (default)', () => {
|
|
209
|
-
writeConfigYaml(workspaceDir, {
|
|
210
|
-
correction_observer: { enabled: true },
|
|
211
|
-
});
|
|
212
|
-
const logger = createMockLogger();
|
|
213
|
-
|
|
214
|
-
// Verify EvolutionWorker is disabled
|
|
215
|
-
const ewGate = shouldStartEvolutionWorker(workspaceDir, logger);
|
|
216
|
-
expect(ewGate.shouldStart).toBe(false);
|
|
217
|
-
|
|
218
|
-
// Verify CorrectionObserver is enabled
|
|
219
|
-
const coGate = shouldStartCorrectionObserver(workspaceDir, logger);
|
|
220
|
-
expect(coGate.shouldStart).toBe(true);
|
|
221
|
-
expect(coGate.disabledInfo).toBeNull();
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it('CorrectionObserver starts when EvolutionWorker is explicitly enabled', () => {
|
|
225
|
-
writeConfigYaml(workspaceDir, {
|
|
226
|
-
evolution_worker: { enabled: true },
|
|
227
|
-
correction_observer: { enabled: true },
|
|
228
|
-
});
|
|
229
|
-
const logger = createMockLogger();
|
|
230
|
-
|
|
231
|
-
const ewGate = shouldStartEvolutionWorker(workspaceDir, logger);
|
|
232
|
-
expect(ewGate.shouldStart).toBe(true);
|
|
233
|
-
|
|
234
|
-
const coGate = shouldStartCorrectionObserver(workspaceDir, logger);
|
|
235
|
-
expect(coGate.shouldStart).toBe(true);
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('CorrectionObserver can be independently disabled', () => {
|
|
239
|
-
writeConfigYaml(workspaceDir, {
|
|
240
|
-
correction_observer: { enabled: false },
|
|
241
|
-
});
|
|
242
|
-
const logger = createMockLogger();
|
|
243
|
-
|
|
244
|
-
const coGate = shouldStartCorrectionObserver(workspaceDir, logger);
|
|
245
|
-
expect(coGate.shouldStart).toBe(false);
|
|
246
|
-
expect(coGate.disabledInfo).not.toBeNull();
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
// ── 3. Core vs Non-Core Surface Defaults ──
|
|
251
|
-
|
|
252
|
-
describe('PRI-294: MVP core hooks enabled, non-core disabled', () => {
|
|
253
|
-
const CORE_HOOKS = [
|
|
254
|
-
'hook:before_prompt_build',
|
|
255
|
-
'hook:before_tool_call',
|
|
256
|
-
'hook:after_tool_call',
|
|
257
|
-
'hook:llm_output',
|
|
258
|
-
];
|
|
259
|
-
|
|
260
|
-
const QUIET_HOOKS = [
|
|
261
|
-
'hook:subagent_spawning',
|
|
262
|
-
'hook:subagent_ended',
|
|
263
|
-
'hook:before_reset',
|
|
264
|
-
'hook:before_compaction',
|
|
265
|
-
'hook:after_compaction',
|
|
266
|
-
];
|
|
267
|
-
|
|
268
|
-
for (const surfaceId of CORE_HOOKS) {
|
|
269
|
-
it(`core hook '${surfaceId}' is enabled by default`, () => {
|
|
270
|
-
const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
|
|
271
|
-
expect(entry).toBeDefined();
|
|
272
|
-
expect(entry!.category).toBe('core');
|
|
273
|
-
expect(entry!.enabledByDefault).toBe(true);
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
for (const surfaceId of QUIET_HOOKS) {
|
|
278
|
-
it(`quiet hook '${surfaceId}' is disabled by default`, () => {
|
|
279
|
-
const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === surfaceId);
|
|
280
|
-
expect(entry).toBeDefined();
|
|
281
|
-
expect(entry!.category).toBe('quiet');
|
|
282
|
-
expect(entry!.enabledByDefault).toBe(false);
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
it('CorrectionObserver service surface is core and enabled', () => {
|
|
287
|
-
const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === 'service:correction-observer');
|
|
288
|
-
expect(entry).toBeDefined();
|
|
289
|
-
expect(entry!.category).toBe('core');
|
|
290
|
-
expect(entry!.enabledByDefault).toBe(true);
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
it('EvolutionWorker service surface is quiet and disabled', () => {
|
|
294
|
-
const entry = PLUGIN_SURFACE_REGISTRY.find(s => s.id === 'service:evolution-worker');
|
|
295
|
-
expect(entry).toBeDefined();
|
|
296
|
-
expect(entry!.category).toBe('quiet');
|
|
297
|
-
expect(entry!.enabledByDefault).toBe(false);
|
|
298
|
-
expect(entry!.disabledReason).toBeDefined();
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
it('all disabled surfaces have disabledReason (ERR-002 observability)', () => {
|
|
302
|
-
const disabledWithoutReason = PLUGIN_SURFACE_REGISTRY.filter(
|
|
303
|
-
s => !s.enabledByDefault && s.category !== 'core' && !s.disabledReason,
|
|
304
|
-
);
|
|
305
|
-
expect(disabledWithoutReason).toEqual([]);
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
// ── 4. EvolutionWorker-era prompt injection removed ──
|
|
310
|
-
|
|
311
|
-
describe('PRI-294: EvolutionWorker-era prompt injection removed', () => {
|
|
312
|
-
it('prompt.ts does not inject EVOLUTION_WORKER key into agent prompt', async () => {
|
|
313
|
-
const promptPath = path.resolve(__dirname, '../src/hooks/prompt.ts');
|
|
314
|
-
const src = fs.readFileSync(promptPath, 'utf-8');
|
|
315
|
-
// Check that the EVOLUTION_WORKER PathResolver key is not injected into
|
|
316
|
-
// the prependSystemContext template string (the runtime prompt).
|
|
317
|
-
// Comments referencing EVOLUTION_WORKER for documentation are fine.
|
|
318
|
-
// Match: inside template literal interpolation that resolves EVOLUTION_WORKER
|
|
319
|
-
expect(src).not.toMatch(/\$\{.*EVOLUTION_WORKER.*\}/);
|
|
320
|
-
// Also check no template literal contains "PathResolver key: EVOLUTION_WORKER"
|
|
321
|
-
expect(src).not.toContain('PathResolver key: EVOLUTION_WORKER');
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it('prompt.ts does not inject INTERNAL SYSTEM LAYOUT section into prompt', async () => {
|
|
325
|
-
const promptPath = path.resolve(__dirname, '../src/hooks/prompt.ts');
|
|
326
|
-
const src = fs.readFileSync(promptPath, 'utf-8');
|
|
327
|
-
// The INTERNAL SYSTEM LAYOUT section was EvolutionWorker-era injection.
|
|
328
|
-
// Verify the actual rendered section header is gone — only comments should remain.
|
|
329
|
-
// Remove all single-line comments, then check no INTERNAL SYSTEM LAYOUT in code.
|
|
330
|
-
const withoutComments = src.replace(/\/\/.*$/gm, '');
|
|
331
|
-
expect(withoutComments).not.toContain('INTERNAL SYSTEM LAYOUT');
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
// ── 5. EvolutionWorker NOT registered via api.registerService ──
|
|
336
|
-
|
|
337
|
-
describe('PRI-294: EvolutionWorker not registered as service', () => {
|
|
338
|
-
it('index.ts does not register EvolutionWorker via api.registerService', async () => {
|
|
339
|
-
const indexPath = path.resolve(__dirname, '../src/index.ts');
|
|
340
|
-
const src = fs.readFileSync(indexPath, 'utf-8');
|
|
341
|
-
// Should NOT have guardService('service:evolution-worker', ...)
|
|
342
|
-
expect(src).not.toMatch(/guardService\(\s*['"]service:evolution-worker['"]/);
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
it('index.ts does not pre-assign EvolutionWorkerService.api outside gate', async () => {
|
|
346
|
-
const indexPath = path.resolve(__dirname, '../src/index.ts');
|
|
347
|
-
const src = fs.readFileSync(indexPath, 'utf-8');
|
|
348
|
-
// The only EvolutionWorkerService.api assignment should be inside the gate
|
|
349
|
-
const apiAssignments = src.match(/EvolutionWorkerService\.api\s*=\s*api/g) ?? [];
|
|
350
|
-
// Should be exactly one: inside the shouldStartEvolutionWorker gate
|
|
351
|
-
expect(apiAssignments.length).toBe(1);
|
|
352
|
-
});
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
// ── 6. Feature flag registry completeness ──
|
|
356
|
-
|
|
357
|
-
describe('PRI-294: Feature flag registry matches surface registry', () => {
|
|
358
|
-
it('evolution_worker flag exists in DEFAULT_FEATURE_FLAGS as quiet+disabled', () => {
|
|
359
|
-
const flag = DEFAULT_FEATURE_FLAGS.find(f => f.id === 'evolution_worker');
|
|
360
|
-
expect(flag).toBeDefined();
|
|
361
|
-
expect(flag!.category).toBe('quiet');
|
|
362
|
-
expect(flag!.enabled).toBe(false);
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
it('correction_observer flag exists in DEFAULT_FEATURE_FLAGS', () => {
|
|
366
|
-
const flag = DEFAULT_FEATURE_FLAGS.find(f => f.id === 'correction_observer');
|
|
367
|
-
expect(flag).toBeDefined();
|
|
368
|
-
expect(flag!.enabled).toBe(true);
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it('nocturnal and idle_trigger are gone flags', () => {
|
|
372
|
-
const nocturnal = DEFAULT_FEATURE_FLAGS.find(f => f.id === 'nocturnal');
|
|
373
|
-
expect(nocturnal).toBeDefined();
|
|
374
|
-
expect(nocturnal!.category).toBe('gone');
|
|
375
|
-
|
|
376
|
-
const idle = DEFAULT_FEATURE_FLAGS.find(f => f.id === 'idle_trigger');
|
|
377
|
-
expect(idle).toBeDefined();
|
|
378
|
-
expect(idle!.category).toBe('gone');
|
|
379
|
-
});
|
|
380
|
-
});
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "legacy-pain-001",
|
|
4
|
-
"task": "Diagnose tool_failure pain from write operation",
|
|
5
|
-
"score": 78,
|
|
6
|
-
"source": "tool_failure",
|
|
7
|
-
"reason": "Tool write failed on test.md. Error: EACCES permission denied",
|
|
8
|
-
"timestamp": "2026-04-10T08:30:00.000Z",
|
|
9
|
-
"enqueued_at": "2026-04-10T08:30:05.000Z",
|
|
10
|
-
"started_at": null,
|
|
11
|
-
"completed_at": null,
|
|
12
|
-
"assigned_session_key": null,
|
|
13
|
-
"trigger_text_preview": "Tool write failed on test.md",
|
|
14
|
-
"status": "pending",
|
|
15
|
-
"resolution": null,
|
|
16
|
-
"session_id": null,
|
|
17
|
-
"agent_id": null,
|
|
18
|
-
"traceId": "trace-legacy-001"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "legacy-pain-002",
|
|
22
|
-
"task": "Diagnose runtime_unavailable pain from agent session",
|
|
23
|
-
"score": 65,
|
|
24
|
-
"source": "runtime_unavailable",
|
|
25
|
-
"reason": "Agent session timed out after 300s inactivity window",
|
|
26
|
-
"timestamp": "2026-04-11T14:22:00.000Z",
|
|
27
|
-
"enqueued_at": "2026-04-11T14:22:10.000Z",
|
|
28
|
-
"started_at": "2026-04-11T14:25:00.000Z",
|
|
29
|
-
"completed_at": null,
|
|
30
|
-
"assigned_session_key": "session-key-abc123",
|
|
31
|
-
"trigger_text_preview": "Agent session timed out",
|
|
32
|
-
"status": "in_progress",
|
|
33
|
-
"resolution": null,
|
|
34
|
-
"session_id": "session-abc123",
|
|
35
|
-
"agent_id": "main",
|
|
36
|
-
"traceId": "trace-legacy-002"
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "legacy-pain-003",
|
|
40
|
-
"task": "Diagnose gate_block pain from scoring validation",
|
|
41
|
-
"score": 90,
|
|
42
|
-
"source": "gate_block",
|
|
43
|
-
"reason": "Principle score 0.12 below threshold 0.70 for late_marker_no_principle",
|
|
44
|
-
"timestamp": "2026-04-12T09:15:00.000Z",
|
|
45
|
-
"enqueued_at": "2026-04-12T09:15:30.000Z",
|
|
46
|
-
"started_at": "2026-04-12T09:16:00.000Z",
|
|
47
|
-
"completed_at": "2026-04-12T09:20:45.000Z",
|
|
48
|
-
"assigned_session_key": "session-key-def456",
|
|
49
|
-
"trigger_text_preview": "Principle score below threshold",
|
|
50
|
-
"status": "completed",
|
|
51
|
-
"resolution": "late_marker_no_principle",
|
|
52
|
-
"session_id": "session-def456",
|
|
53
|
-
"agent_id": "main",
|
|
54
|
-
"traceId": "trace-legacy-003"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"id": "legacy-pain-004",
|
|
58
|
-
"task": "Diagnose thin_violation pain from rule scoring",
|
|
59
|
-
"score": 55,
|
|
60
|
-
"source": "thin_violation",
|
|
61
|
-
"reason": "Rule 'no-bare-throw' triggered but violation was benign; investigate scoring bias",
|
|
62
|
-
"timestamp": "2026-04-13T16:45:00.000Z",
|
|
63
|
-
"enqueued_at": "2026-04-13T16:45:15.000Z",
|
|
64
|
-
"started_at": "2026-04-13T16:46:00.000Z",
|
|
65
|
-
"completed_at": "2026-04-13T16:50:30.000Z",
|
|
66
|
-
"assigned_session_key": "session-key-ghi789",
|
|
67
|
-
"trigger_text_preview": "Rule scoring bias investigation",
|
|
68
|
-
"status": "failed",
|
|
69
|
-
"resolution": "failed_max_retries",
|
|
70
|
-
"session_id": "session-ghi789",
|
|
71
|
-
"agent_id": "main",
|
|
72
|
-
"traceId": "trace-legacy-004"
|
|
73
|
-
}
|
|
74
|
-
]
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Production Compatibility Tests
|
|
3
|
-
*
|
|
4
|
-
* These tests validate that new code works correctly with production data patterns.
|
|
5
|
-
* Run with: npm test -- tests/fixtures/production-compatibility.test.ts
|
|
6
|
-
*
|
|
7
|
-
* NOTE: These tests require access to ~/.openclaw directory (production data)
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import * as fs from 'fs';
|
|
11
|
-
import * as path from 'path';
|
|
12
|
-
import { describe, expect, it, beforeAll } from 'vitest';
|
|
13
|
-
import {
|
|
14
|
-
loadProductionPainFlag,
|
|
15
|
-
loadProductionEvolutionQueue,
|
|
16
|
-
loadProductionPainCandidates,
|
|
17
|
-
generateTestFixtureFromProduction,
|
|
18
|
-
validateProductionCompatibility,
|
|
19
|
-
createMockQueueItem,
|
|
20
|
-
createMockPainFlag,
|
|
21
|
-
PRODUCTION_FIXTURES,
|
|
22
|
-
} from './production-mock-generator.js';
|
|
23
|
-
|
|
24
|
-
// Skip tests if production data not available
|
|
25
|
-
const hasProductionData = fs.existsSync(PRODUCTION_FIXTURES.STATE_DIR);
|
|
26
|
-
|
|
27
|
-
describe.skipIf(!hasProductionData)('Production Data Compatibility', () => {
|
|
28
|
-
describe('Data Loading', () => {
|
|
29
|
-
it('should load production pain_flag', () => {
|
|
30
|
-
const painFlag = loadProductionPainFlag();
|
|
31
|
-
// May be null if no active pain
|
|
32
|
-
if (painFlag) {
|
|
33
|
-
expect(painFlag).toHaveProperty('score');
|
|
34
|
-
expect(painFlag).toHaveProperty('source');
|
|
35
|
-
expect(painFlag).toHaveProperty('reason');
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('should load production evolution_queue', () => {
|
|
40
|
-
const queue = loadProductionEvolutionQueue();
|
|
41
|
-
expect(Array.isArray(queue)).toBe(true);
|
|
42
|
-
|
|
43
|
-
if (queue.length > 0) {
|
|
44
|
-
const item = queue[0];
|
|
45
|
-
expect(item).toHaveProperty('id');
|
|
46
|
-
expect(item).toHaveProperty('score');
|
|
47
|
-
expect(item).toHaveProperty('status');
|
|
48
|
-
expect(['pending', 'in_progress', 'completed', 'resolved']).toContain(item.status);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should load production pain_candidates', () => {
|
|
53
|
-
const candidates = loadProductionPainCandidates();
|
|
54
|
-
expect(typeof candidates).toBe('object');
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('New Field Compatibility', () => {
|
|
59
|
-
it('should detect missing session_id in pain_flag (expected: fails until production updated)', () => {
|
|
60
|
-
const result = validateProductionCompatibility();
|
|
61
|
-
|
|
62
|
-
// This test documents the current state - not a failure
|
|
63
|
-
console.log('Compatibility issues:', result.issues);
|
|
64
|
-
console.log('Production data:', result.productionData);
|
|
65
|
-
|
|
66
|
-
// New fields are expected to be missing in production
|
|
67
|
-
if (!result.compatible) {
|
|
68
|
-
console.log('⚠️ Production data does not have new fields (session_id, agent_id)');
|
|
69
|
-
console.log(' This is expected after code changes. Production will be updated on next pain event.');
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should handle queue items without session_id gracefully', () => {
|
|
74
|
-
const queue = loadProductionEvolutionQueue();
|
|
75
|
-
|
|
76
|
-
for (const item of queue.slice(0, 5)) {
|
|
77
|
-
// Code should handle missing session_id/agent_id
|
|
78
|
-
expect(() => {
|
|
79
|
-
const normalized = {
|
|
80
|
-
...item,
|
|
81
|
-
session_id: item.session_id || undefined,
|
|
82
|
-
agent_id: item.agent_id || undefined,
|
|
83
|
-
};
|
|
84
|
-
return normalized;
|
|
85
|
-
}).not.toThrow();
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('Pattern Extraction', () => {
|
|
91
|
-
it('should extract patterns from production data', () => {
|
|
92
|
-
const fixture = generateTestFixtureFromProduction();
|
|
93
|
-
|
|
94
|
-
expect(fixture.patterns).toBeDefined();
|
|
95
|
-
expect(fixture.patterns.painSources.length).toBeGreaterThanOrEqual(0);
|
|
96
|
-
|
|
97
|
-
console.log('Pain sources:', fixture.patterns.painSources);
|
|
98
|
-
console.log('Score distribution:', fixture.patterns.scoreDistribution);
|
|
99
|
-
console.log('Status distribution:', fixture.patterns.statusDistribution);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
describe('Mock Generation', () => {
|
|
104
|
-
it('should create realistic mock queue items', () => {
|
|
105
|
-
const item = createMockQueueItem({
|
|
106
|
-
session_id: 'test-session-123',
|
|
107
|
-
agent_id: 'main',
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
expect(item.session_id).toBe('test-session-123');
|
|
111
|
-
expect(item.agent_id).toBe('main');
|
|
112
|
-
expect(item.id).toBeDefined();
|
|
113
|
-
expect(item.timestamp).toBeDefined();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('should create realistic mock pain flags', () => {
|
|
117
|
-
const flag = createMockPainFlag({
|
|
118
|
-
session_id: 'test-session-456',
|
|
119
|
-
agent_id: 'builder',
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
expect(flag.session_id).toBe('test-session-456');
|
|
123
|
-
expect(flag.agent_id).toBe('builder');
|
|
124
|
-
expect(flag.time).toBeDefined();
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
describe('Edge Cases from Production', () => {
|
|
130
|
-
it('should handle empty evolution queue', () => {
|
|
131
|
-
const item = createMockQueueItem(); // Uses fallback template
|
|
132
|
-
expect(item).toBeDefined();
|
|
133
|
-
expect(item.id).toBeDefined();
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should handle very long reason strings', () => {
|
|
137
|
-
const longReason = 'A'.repeat(10000);
|
|
138
|
-
const item = createMockQueueItem({ reason: longReason });
|
|
139
|
-
expect(item.reason).toBe(longReason);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
it('should handle special characters in reason', () => {
|
|
143
|
-
const specialReason = 'Error: "quotes" and \n newlines \t tabs';
|
|
144
|
-
const item = createMockQueueItem({ reason: specialReason });
|
|
145
|
-
expect(item.reason).toBe(specialReason);
|
|
146
|
-
});
|
|
147
|
-
});
|