principles-disciple 1.126.0 → 1.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/archive-impl.d.ts +18 -0
- package/dist/commands/archive-impl.js +105 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.js +76 -0
- package/dist/commands/context.d.ts +5 -0
- package/{src/commands/context.ts → dist/commands/context.js} +34 -83
- package/dist/commands/disable-impl.d.ts +22 -0
- package/dist/commands/disable-impl.js +118 -0
- package/dist/commands/evolution-status.d.ts +4 -0
- package/dist/commands/evolution-status.js +187 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.js +53 -0
- package/dist/commands/focus.d.ts +14 -0
- package/dist/commands/focus.js +443 -0
- package/dist/commands/pain.d.ts +6 -0
- package/{src/commands/pain.ts → dist/commands/pain.js} +137 -188
- package/dist/commands/principle-rollback.d.ts +4 -0
- package/dist/commands/principle-rollback.js +26 -0
- package/dist/commands/promote-impl.d.ts +22 -0
- package/dist/commands/promote-impl.js +194 -0
- package/dist/commands/rollback-impl.d.ts +32 -0
- package/dist/commands/rollback-impl.js +180 -0
- package/dist/commands/rollback.d.ts +19 -0
- package/{src/commands/rollback.ts → dist/commands/rollback.js} +10 -53
- package/dist/commands/samples.d.ts +2 -0
- package/dist/commands/samples.js +58 -0
- package/dist/commands/strategy.d.ts +2 -0
- package/dist/commands/strategy.js +16 -0
- package/dist/commands/thinking-os.d.ts +2 -0
- package/{src/commands/thinking-os.ts → dist/commands/thinking-os.js} +35 -58
- package/dist/commands/workflow-debug.d.ts +6 -0
- package/{src/commands/workflow-debug.ts → dist/commands/workflow-debug.js} +13 -33
- package/dist/config/defaults/runtime.d.ts +58 -0
- package/{src/config/defaults/runtime.ts → dist/config/defaults/runtime.js} +4 -41
- package/dist/config/errors.d.ts +86 -0
- package/dist/config/errors.js +107 -0
- package/{src/config/index.ts → dist/config/index.d.ts} +1 -2
- package/dist/config/index.js +7 -0
- package/dist/constants/diagnostician.d.ts +12 -0
- package/{src/constants/diagnostician.ts → dist/constants/diagnostician.js} +0 -1
- package/dist/constants/tools.d.ts +17 -0
- package/dist/constants/tools.js +53 -0
- package/dist/core/__tests__/focus-history.test.d.ts +1 -0
- package/dist/core/__tests__/focus-history.test.js +160 -0
- package/dist/core/bootstrap-rules.d.ts +50 -0
- package/dist/core/bootstrap-rules.js +187 -0
- package/dist/core/code-implementation-storage.d.ts +71 -0
- package/dist/core/code-implementation-storage.js +139 -0
- package/dist/core/config-health.d.ts +27 -0
- package/dist/core/config-health.js +60 -0
- package/dist/core/config-service.d.ts +15 -0
- package/{src/core/config-service.ts → dist/core/config-service.js} +4 -7
- package/dist/core/config.d.ts +111 -0
- package/{src/core/config.ts → dist/core/config.js} +46 -146
- package/dist/core/control-ui-db.d.ts +106 -0
- package/dist/core/control-ui-db.js +309 -0
- package/dist/core/correction-cue-learner.d.ts +33 -0
- package/dist/core/correction-cue-learner.js +184 -0
- package/dist/core/correction-types.d.ts +3 -0
- package/dist/core/correction-types.js +1 -0
- package/dist/core/detection-funnel.d.ts +33 -0
- package/{src/core/detection-funnel.ts → dist/core/detection-funnel.js} +17 -37
- package/dist/core/detection-service.d.ts +15 -0
- package/{src/core/detection-service.ts → dist/core/detection-service.js} +4 -7
- package/dist/core/dictionary-service.d.ts +15 -0
- package/{src/core/dictionary-service.ts → dist/core/dictionary-service.js} +4 -7
- package/dist/core/dictionary.d.ts +38 -0
- package/{src/core/dictionary.ts → dist/core/dictionary.js} +33 -59
- package/dist/core/empathy-keyword-matcher.d.ts +5 -0
- package/dist/core/empathy-keyword-matcher.js +40 -0
- package/dist/core/empathy-types.d.ts +2 -0
- package/dist/core/empathy-types.js +1 -0
- package/dist/core/event-log.d.ts +90 -0
- package/dist/core/event-log.js +702 -0
- package/dist/core/evolution-engine.d.ts +119 -0
- package/dist/core/evolution-engine.js +460 -0
- package/dist/core/evolution-logger.d.ts +137 -0
- package/dist/core/evolution-logger.js +261 -0
- package/dist/core/evolution-migration.d.ts +5 -0
- package/dist/core/evolution-migration.js +65 -0
- package/dist/core/evolution-reducer.d.ts +124 -0
- package/dist/core/evolution-reducer.js +730 -0
- package/dist/core/evolution-types.d.ts +50 -0
- package/dist/core/evolution-types.js +11 -0
- package/dist/core/external-training-contract.d.ts +276 -0
- package/dist/core/external-training-contract.js +269 -0
- package/dist/core/file-store.d.ts +41 -0
- package/dist/core/file-store.js +46 -0
- package/dist/core/focus-history.d.ts +50 -0
- package/dist/core/focus-history.js +574 -0
- package/dist/core/hygiene/tracker.d.ts +22 -0
- package/dist/core/hygiene/tracker.js +110 -0
- package/dist/core/init.d.ts +30 -0
- package/{src/core/init.ts → dist/core/init.js} +87 -118
- package/dist/core/local-worker-routing.d.ts +124 -0
- package/dist/core/local-worker-routing.js +216 -0
- package/dist/core/migration.d.ts +6 -0
- package/{src/core/migration.ts → dist/core/migration.js} +10 -18
- package/dist/core/model-deployment-registry.d.ts +218 -0
- package/dist/core/model-deployment-registry.js +502 -0
- package/dist/core/model-training-registry.d.ts +295 -0
- package/dist/core/model-training-registry.js +474 -0
- package/dist/core/observability.d.ts +40 -0
- package/dist/core/observability.js +164 -0
- package/dist/core/pain-diagnostic-gate.d.ts +36 -0
- package/dist/core/pain-diagnostic-gate.js +105 -0
- package/dist/core/pain.d.ts +87 -0
- package/dist/core/pain.js +223 -0
- package/dist/core/path-resolver.d.ts +60 -0
- package/{src/core/path-resolver.ts → dist/core/path-resolver.js} +41 -131
- package/dist/core/paths.d.ts +60 -0
- package/{src/core/paths.ts → dist/core/paths.js} +4 -13
- package/dist/core/pd-config-loader.d.ts +96 -0
- package/dist/core/pd-config-loader.js +307 -0
- package/dist/core/pd-task-reconciler.d.ts +89 -0
- package/dist/core/pd-task-reconciler.js +262 -0
- package/dist/core/pd-task-service.d.ts +2 -0
- package/dist/core/pd-task-service.js +32 -0
- package/dist/core/pd-task-store.d.ts +5 -0
- package/dist/core/pd-task-store.js +62 -0
- package/dist/core/pd-task-types.d.ts +8 -0
- package/dist/core/pd-task-types.js +2 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.d.ts +1 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.js +132 -0
- package/dist/core/principle-compiler/code-validator.d.ts +14 -0
- package/dist/core/principle-compiler/code-validator.js +86 -0
- package/dist/core/principle-compiler/compiler.d.ts +45 -0
- package/dist/core/principle-compiler/compiler.js +287 -0
- package/{src/core/principle-compiler/index.ts → dist/core/principle-compiler/index.d.ts} +0 -1
- package/dist/core/principle-compiler/index.js +10 -0
- package/dist/core/principle-compiler/ledger-registrar.d.ts +28 -0
- package/dist/core/principle-compiler/ledger-registrar.js +95 -0
- package/{src/core/principle-compiler/template-generator.ts → dist/core/principle-compiler/template-generator.d.ts} +0 -1
- package/dist/core/principle-compiler/template-generator.js +7 -0
- package/{src/core/principle-injection.ts → dist/core/principle-injection.d.ts} +1 -7
- package/dist/core/principle-injection.js +10 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.d.ts +15 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.js +34 -0
- package/dist/core/principle-internalization/lifecycle-read-model.d.ts +17 -0
- package/{src/core/principle-internalization/lifecycle-read-model.ts → dist/core/principle-internalization/lifecycle-read-model.js} +2 -21
- package/dist/core/principle-internalization/lifecycle-refresh.d.ts +2 -0
- package/dist/core/principle-internalization/lifecycle-refresh.js +4 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.d.ts +28 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.js +89 -0
- package/dist/core/principle-training-state.d.ts +47 -0
- package/dist/core/principle-training-state.js +113 -0
- package/dist/core/principle-tree-ledger-adapter.d.ts +32 -0
- package/dist/core/principle-tree-ledger-adapter.js +125 -0
- package/dist/core/principle-tree-ledger.d.ts +82 -0
- package/dist/core/principle-tree-ledger.js +527 -0
- package/dist/core/profile.d.ts +62 -0
- package/dist/core/profile.js +211 -0
- package/dist/core/promotion-gate.d.ts +243 -0
- package/dist/core/promotion-gate.js +554 -0
- package/dist/core/reflection/reflection-context.d.ts +31 -0
- package/dist/core/reflection/reflection-context.js +91 -0
- package/dist/core/replay-engine.d.ts +12 -0
- package/dist/core/replay-engine.js +82 -0
- package/dist/core/risk-calculator.d.ts +22 -0
- package/{src/core/risk-calculator.ts → dist/core/risk-calculator.js} +19 -49
- package/{src/core/rule-host-helpers.ts → dist/core/rule-host-helpers.d.ts} +0 -1
- package/dist/core/rule-host-helpers.js +7 -0
- package/{src/core/rule-host-types.ts → dist/core/rule-host-types.d.ts} +1 -8
- package/dist/core/rule-host-types.js +7 -0
- package/dist/core/rule-host.d.ts +86 -0
- package/dist/core/rule-host.js +311 -0
- package/dist/core/rule-implementation-runtime.d.ts +18 -0
- package/dist/core/rule-implementation-runtime.js +112 -0
- package/dist/core/runtime-v2-prompt-activation-reader.d.ts +22 -0
- package/dist/core/runtime-v2-prompt-activation-reader.js +99 -0
- package/{src/core/schema/db-types.ts → dist/core/schema/db-types.d.ts} +4 -9
- package/dist/core/schema/db-types.js +5 -0
- package/{src/core/schema/index.ts → dist/core/schema/index.d.ts} +1 -10
- package/dist/core/schema/index.js +15 -0
- package/dist/core/schema/migration-runner.d.ts +53 -0
- package/dist/core/schema/migration-runner.js +170 -0
- package/dist/core/schema/migrations/001-init-trajectory.d.ts +6 -0
- package/{src/core/schema/migrations/001-init-trajectory.ts → dist/core/schema/migrations/001-init-trajectory.js} +38 -56
- package/dist/core/schema/migrations/002-init-central.d.ts +5 -0
- package/{src/core/schema/migrations/002-init-central.ts → dist/core/schema/migrations/002-init-central.js} +27 -41
- package/dist/core/schema/migrations/003-init-workflow.d.ts +5 -0
- package/{src/core/schema/migrations/003-init-workflow.ts → dist/core/schema/migrations/003-init-workflow.js} +16 -21
- package/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +8 -0
- package/{src/core/schema/migrations/004-add-thinking-and-gfi.ts → dist/core/schema/migrations/004-add-thinking-and-gfi.js} +19 -27
- package/{src/core/schema/migrations/index.ts → dist/core/schema/migrations/index.d.ts} +1 -16
- package/dist/core/schema/migrations/index.js +27 -0
- package/dist/core/schema/schema-definitions.d.ts +46 -0
- package/{src/core/schema/schema-definitions.ts → dist/core/schema/schema-definitions.js} +242 -291
- package/dist/core/session-tracker.d.ts +119 -0
- package/{src/core/session-tracker.ts → dist/core/session-tracker.js} +96 -239
- package/dist/core/shadow-observation-registry.d.ts +217 -0
- package/dist/core/shadow-observation-registry.js +280 -0
- package/dist/core/surface-guard.d.ts +31 -0
- package/dist/core/surface-guard.js +131 -0
- package/dist/core/system-logger.d.ts +8 -0
- package/{src/core/system-logger.ts → dist/core/system-logger.js} +20 -34
- package/dist/core/thinking-models.d.ts +70 -0
- package/dist/core/thinking-models.js +300 -0
- package/dist/core/thinking-os-parser.d.ts +35 -0
- package/dist/core/thinking-os-parser.js +123 -0
- package/dist/core/trajectory-types.d.ts +220 -0
- package/dist/core/trajectory-types.js +8 -0
- package/dist/core/trajectory.d.ts +242 -0
- package/dist/core/trajectory.js +1500 -0
- package/dist/core/workflow-funnel-loader.d.ts +72 -0
- package/dist/core/workflow-funnel-loader.js +135 -0
- package/dist/core/workspace-context.d.ts +111 -0
- package/{src/core/workspace-context.ts → dist/core/workspace-context.js} +50 -105
- package/dist/core/workspace-dir-validation.d.ts +11 -0
- package/dist/core/workspace-dir-validation.js +37 -0
- package/dist/core/workspace-guidance-migrator.d.ts +12 -0
- package/{src/core/workspace-guidance-migrator.ts → dist/core/workspace-guidance-migrator.js} +21 -59
- package/dist/hooks/after-tool-call-helpers.d.ts +89 -0
- package/dist/hooks/after-tool-call-helpers.js +475 -0
- package/dist/hooks/after-tool-call-types.d.ts +86 -0
- package/dist/hooks/after-tool-call-types.js +13 -0
- package/dist/hooks/gate-block-helper.d.ts +44 -0
- package/dist/hooks/gate-block-helper.js +209 -0
- package/dist/hooks/gate.d.ts +16 -0
- package/dist/hooks/gate.js +381 -0
- package/dist/hooks/lifecycle.d.ts +5 -0
- package/dist/hooks/lifecycle.js +287 -0
- package/dist/hooks/llm.d.ts +13 -0
- package/{src/hooks/llm.ts → dist/hooks/llm.js} +63 -117
- package/dist/hooks/message-sanitize.d.ts +24 -0
- package/dist/hooks/message-sanitize.js +77 -0
- package/dist/hooks/pain.d.ts +33 -0
- package/dist/hooks/pain.js +294 -0
- package/dist/hooks/prompt.d.ts +52 -0
- package/dist/hooks/prompt.js +930 -0
- package/dist/hooks/raw-observation-adapter.d.ts +57 -0
- package/dist/hooks/raw-observation-adapter.js +170 -0
- package/dist/hooks/raw-observation-types.d.ts +62 -0
- package/dist/hooks/raw-observation-types.js +15 -0
- package/dist/hooks/subagent.d.ts +9 -0
- package/{src/hooks/subagent.ts → dist/hooks/subagent.js} +20 -60
- package/dist/hooks/trajectory-collector.d.ts +25 -0
- package/dist/hooks/trajectory-collector.js +225 -0
- package/dist/hooks/trajectory-evidence.d.ts +11 -0
- package/dist/hooks/trajectory-evidence.js +88 -0
- package/dist/hooks/triage-adapter.d.ts +58 -0
- package/{src/hooks/triage-adapter.ts → dist/hooks/triage-adapter.js} +36 -68
- package/dist/hooks/trigger-cooldown-tracker.d.ts +30 -0
- package/dist/hooks/trigger-cooldown-tracker.js +55 -0
- package/dist/i18n/commands.d.ts +26 -0
- package/dist/i18n/commands.js +96 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +829 -0
- package/dist/openclaw-sdk.d.ts +293 -0
- package/dist/openclaw-sdk.js +4 -0
- package/dist/service/central-database.d.ts +138 -0
- package/dist/service/central-database.js +731 -0
- package/dist/service/central-sync-service.d.ts +8 -0
- package/dist/service/central-sync-service.js +71 -0
- package/dist/service/correction-observer-service.d.ts +19 -0
- package/{src/service/correction-observer-service.ts → dist/service/correction-observer-service.js} +36 -76
- package/dist/service/evolution-dedup.d.ts +27 -0
- package/{src/service/evolution-dedup.ts → dist/service/evolution-dedup.js} +11 -31
- package/{src/service/evolution-queue-migration.ts → dist/service/evolution-queue-migration.d.ts} +15 -62
- package/dist/service/evolution-queue-migration.js +53 -0
- package/dist/service/evolution-worker.d.ts +103 -0
- package/{src/service/evolution-worker.ts → dist/service/evolution-worker.js} +169 -331
- package/dist/service/internalization-auto-consumer-service.d.ts +8 -0
- package/dist/service/internalization-auto-consumer-service.js +322 -0
- package/dist/service/keyword-optimization-service.d.ts +44 -0
- package/dist/service/keyword-optimization-service.js +137 -0
- package/dist/service/phase3-input-filter.d.ts +73 -0
- package/dist/service/phase3-input-filter.js +172 -0
- package/dist/service/queue-io.d.ts +30 -0
- package/dist/service/queue-io.js +79 -0
- package/{src/service/queue-migration.ts → dist/service/queue-migration.d.ts} +6 -45
- package/dist/service/queue-migration.js +56 -0
- package/dist/service/runtime-summary-service.d.ts +158 -0
- package/dist/service/runtime-summary-service.js +636 -0
- package/dist/service/subagent-workflow/subagent-error-utils.d.ts +8 -0
- package/{src/service/subagent-workflow/subagent-error-utils.ts → dist/service/subagent-workflow/subagent-error-utils.js} +3 -6
- package/{src/service/subagent-workflow/types.ts → dist/service/subagent-workflow/types.d.ts} +17 -80
- package/dist/service/subagent-workflow/types.js +11 -0
- package/dist/service/subagent-workflow/workflow-store.d.ts +30 -0
- package/{src/service/subagent-workflow/workflow-store.ts → dist/service/subagent-workflow/workflow-store.js} +43 -108
- package/dist/service/trajectory-service.d.ts +2 -0
- package/dist/service/trajectory-service.js +16 -0
- package/dist/service/workflow-watchdog.d.ts +23 -0
- package/dist/service/workflow-watchdog.js +103 -0
- package/dist/types/event-types.d.ts +2 -0
- package/dist/types/event-types.js +1 -0
- package/dist/types/hygiene-types.d.ts +2 -0
- package/dist/types/hygiene-types.js +1 -0
- package/{src/types/principle-tree-schema.ts → dist/types/principle-tree-schema.d.ts} +2 -25
- package/dist/types/principle-tree-schema.js +24 -0
- package/dist/types/queue.d.ts +2 -0
- package/dist/types/queue.js +1 -0
- package/dist/types/runtime-summary.d.ts +1 -0
- package/dist/types/runtime-summary.js +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js +16 -0
- package/dist/utils/file-lock.d.ts +68 -0
- package/dist/utils/file-lock.js +310 -0
- package/dist/utils/hashing.d.ts +9 -0
- package/{src/utils/hashing.ts → dist/utils/hashing.js} +4 -6
- package/dist/utils/io.d.ts +11 -0
- package/dist/utils/io.js +174 -0
- package/dist/utils/node-vm-polyfill.d.ts +9 -0
- package/{src/utils/node-vm-polyfill.ts → dist/utils/node-vm-polyfill.js} +0 -2
- package/dist/utils/retry.d.ts +210 -0
- package/dist/utils/retry.js +375 -0
- package/dist/utils/session-key.d.ts +10 -0
- package/{src/utils/session-key.ts → dist/utils/session-key.js} +5 -4
- package/dist/utils/shadow-fingerprint.d.ts +16 -0
- package/dist/utils/shadow-fingerprint.js +34 -0
- package/dist/utils/workspace-resolver.d.ts +82 -0
- package/dist/utils/workspace-resolver.js +288 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +8 -2
- package/templates/workspace/.principles/DECISION_POLICY.json +44 -0
- package/templates/workspace/.principles/PRINCIPLES.md +20 -0
- package/templates/workspace/.principles/PROFILE.json +54 -0
- package/templates/workspace/.principles/PROFILE.schema.json +56 -0
- package/templates/workspace/.principles/THINKING_OS.md +65 -0
- package/templates/workspace/.principles/THINKING_OS_ARCHIVE.md +7 -0
- package/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +9 -0
- package/templates/workspace/.principles/models/_INDEX.md +27 -0
- package/templates/workspace/.principles/models/first_principles.md +62 -0
- package/templates/workspace/.principles/models/marketing_4p.md +52 -0
- package/templates/workspace/.principles/models/porter_five.md +63 -0
- package/templates/workspace/.principles/models/swot.md +60 -0
- package/templates/workspace/.principles/models/user_story_map.md +63 -0
- package/templates/workspace/.state/WORKBOARD.json +4 -0
- package/.dependency-cruiser.json +0 -19
- package/ADVANCED_CONFIG_ZH.md +0 -93
- package/AGENT_INSTALL.md +0 -173
- package/AGENT_INSTALL_EN.md +0 -173
- package/CHANGELOG.md +0 -26
- package/INSTALL.md +0 -254
- package/SKILL.md +0 -63
- package/esbuild.config.js +0 -104
- package/src/commands/archive-impl.ts +0 -147
- package/src/commands/capabilities.ts +0 -89
- package/src/commands/disable-impl.ts +0 -159
- package/src/commands/evolution-status.ts +0 -247
- package/src/commands/export.ts +0 -59
- package/src/commands/focus.ts +0 -523
- package/src/commands/principle-rollback.ts +0 -32
- package/src/commands/promote-impl.ts +0 -254
- package/src/commands/rollback-impl.ts +0 -246
- package/src/commands/samples.ts +0 -65
- package/src/commands/strategy.ts +0 -21
- package/src/config/errors.ts +0 -180
- package/src/constants/tools.ts +0 -62
- package/src/core/AGENTS.md +0 -34
- package/src/core/__tests__/focus-history.test.ts +0 -210
- package/src/core/bootstrap-rules.ts +0 -216
- package/src/core/code-implementation-storage.ts +0 -213
- package/src/core/config-health.ts +0 -72
- package/src/core/control-ui-db.ts +0 -454
- package/src/core/correction-cue-learner.ts +0 -239
- package/src/core/correction-types.ts +0 -16
- package/src/core/empathy-keyword-matcher.ts +0 -64
- package/src/core/empathy-types.ts +0 -18
- package/src/core/event-log.ts +0 -787
- package/src/core/evolution-engine.ts +0 -613
- package/src/core/evolution-logger.ts +0 -357
- package/src/core/evolution-migration.ts +0 -77
- package/src/core/evolution-reducer.ts +0 -891
- package/src/core/evolution-types.ts +0 -110
- package/src/core/external-training-contract.ts +0 -530
- package/src/core/file-store.ts +0 -80
- package/src/core/focus-history.ts +0 -763
- package/src/core/hygiene/tracker.ts +0 -122
- package/src/core/local-worker-routing.ts +0 -337
- package/src/core/model-deployment-registry.ts +0 -724
- package/src/core/model-training-registry.ts +0 -815
- package/src/core/observability.ts +0 -242
- package/src/core/pain-diagnostic-gate.ts +0 -169
- package/src/core/pain.ts +0 -309
- package/src/core/pd-config-loader.ts +0 -400
- package/src/core/pd-task-reconciler.ts +0 -380
- package/src/core/pd-task-service.ts +0 -43
- package/src/core/pd-task-store.ts +0 -78
- package/src/core/pd-task-types.ts +0 -24
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +0 -174
- package/src/core/principle-compiler/code-validator.ts +0 -93
- package/src/core/principle-compiler/compiler.ts +0 -327
- package/src/core/principle-compiler/ledger-registrar.ts +0 -116
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +0 -42
- package/src/core/principle-internalization/lifecycle-refresh.ts +0 -11
- package/src/core/principle-internalization/principle-lifecycle-service.ts +0 -170
- package/src/core/principle-training-state.ts +0 -177
- package/src/core/principle-tree-ledger-adapter.ts +0 -145
- package/src/core/principle-tree-ledger.ts +0 -725
- package/src/core/profile.ts +0 -228
- package/src/core/promotion-gate.ts +0 -854
- package/src/core/reflection/reflection-context.ts +0 -133
- package/src/core/replay-engine.ts +0 -106
- package/src/core/rule-host.ts +0 -386
- package/src/core/rule-implementation-runtime.ts +0 -145
- package/src/core/runtime-v2-prompt-activation-reader.ts +0 -114
- package/src/core/schema/migration-runner.ts +0 -207
- package/src/core/shadow-observation-registry.ts +0 -508
- package/src/core/surface-guard.ts +0 -188
- package/src/core/thinking-models.ts +0 -377
- package/src/core/thinking-os-parser.ts +0 -165
- package/src/core/trajectory-types.ts +0 -247
- package/src/core/trajectory.ts +0 -1831
- package/src/core/workflow-funnel-loader.ts +0 -195
- package/src/core/workspace-dir-validation.ts +0 -52
- package/src/hooks/AGENTS.md +0 -31
- package/src/hooks/after-tool-call-helpers.ts +0 -601
- package/src/hooks/after-tool-call-types.ts +0 -99
- package/src/hooks/gate-block-helper.ts +0 -265
- package/src/hooks/gate.ts +0 -394
- package/src/hooks/lifecycle.ts +0 -334
- package/src/hooks/message-sanitize.ts +0 -102
- package/src/hooks/pain.ts +0 -358
- package/src/hooks/prompt.ts +0 -1102
- package/src/hooks/raw-observation-adapter.ts +0 -215
- package/src/hooks/raw-observation-types.ts +0 -77
- package/src/hooks/trajectory-collector.ts +0 -253
- package/src/hooks/trajectory-evidence.ts +0 -97
- package/src/hooks/trigger-cooldown-tracker.ts +0 -82
- package/src/i18n/commands.ts +0 -101
- package/src/index.ts +0 -939
- package/src/openclaw-sdk.ts +0 -312
- package/src/service/central-database.ts +0 -936
- package/src/service/central-sync-service.ts +0 -85
- package/src/service/internalization-auto-consumer-service.ts +0 -397
- package/src/service/keyword-optimization-service.ts +0 -169
- package/src/service/phase3-input-filter.ts +0 -237
- package/src/service/queue-io.ts +0 -108
- package/src/service/runtime-summary-service.ts +0 -990
- package/src/service/trajectory-service.ts +0 -16
- package/src/service/workflow-watchdog.ts +0 -125
- package/src/types/event-types.ts +0 -39
- package/src/types/hygiene-types.ts +0 -8
- package/src/types/queue.ts +0 -15
- package/src/types/runtime-summary.ts +0 -5
- package/src/types.ts +0 -53
- package/src/utils/file-lock.ts +0 -394
- package/src/utils/io.ts +0 -176
- package/src/utils/retry.ts +0 -573
- package/src/utils/shadow-fingerprint.ts +0 -42
- package/src/utils/workspace-resolver.ts +0 -393
- package/tests/README.md +0 -120
- package/tests/build-artifacts.test.ts +0 -55
- package/tests/commands/evolution-status.test.ts +0 -511
- package/tests/commands/export.test.ts +0 -78
- package/tests/commands/pain.test.ts +0 -287
- package/tests/commands/samples.test.ts +0 -65
- package/tests/commands/strategy.test.ts +0 -19
- package/tests/commands/thinking-os.test.ts +0 -88
- package/tests/core/bootstrap-rules.test.ts +0 -596
- package/tests/core/code-implementation-storage.test.ts +0 -300
- package/tests/core/code-validator.test.ts +0 -197
- package/tests/core/config-service.test.ts +0 -89
- package/tests/core/config.test.ts +0 -90
- package/tests/core/control-ui-db.test.ts +0 -75
- package/tests/core/core-principle-registry-drift.test.ts +0 -39
- package/tests/core/core-template-guidance.test.ts +0 -21
- package/tests/core/correction-cue-learner.test.ts +0 -345
- package/tests/core/detection-service.test.ts +0 -50
- package/tests/core/dictionary-service.test.ts +0 -116
- package/tests/core/dictionary.test.ts +0 -171
- package/tests/core/empathy-keyword-matcher.test.ts +0 -209
- package/tests/core/event-log.test.ts +0 -484
- package/tests/core/evolution-engine.test.ts +0 -610
- package/tests/core/evolution-logger.test.ts +0 -148
- package/tests/core/evolution-migration.test.ts +0 -374
- package/tests/core/evolution-paths.test.ts +0 -21
- package/tests/core/evolution-reducer.compilation-retry.test.ts +0 -189
- package/tests/core/evolution-reducer.detector-metadata.test.ts +0 -602
- package/tests/core/evolution-types-loop.test.ts +0 -48
- package/tests/core/external-training-contract.test.ts +0 -463
- package/tests/core/file-store.test.ts +0 -102
- package/tests/core/focus-history.test.ts +0 -874
- package/tests/core/init-flatten.test.ts +0 -69
- package/tests/core/init-refactor.test.ts +0 -87
- package/tests/core/init-v1.3.test.ts +0 -46
- package/tests/core/init.test.ts +0 -190
- package/tests/core/ledger-registrar.test.ts +0 -235
- package/tests/core/migration.test.ts +0 -84
- package/tests/core/model-deployment-registry.test.ts +0 -858
- package/tests/core/model-training-registry.test.ts +0 -908
- package/tests/core/observability.test.ts +0 -382
- package/tests/core/pain-diagnostic-gate.test.ts +0 -614
- package/tests/core/pain-score.property.test.ts +0 -19
- package/tests/core/pain.test.ts +0 -132
- package/tests/core/path-resolver.test.ts +0 -57
- package/tests/core/paths-refactor.test.ts +0 -20
- package/tests/core/pd-config-loader.test.ts +0 -407
- package/tests/core/pd-task-store.test.ts +0 -126
- package/tests/core/phase7-rollout-integration.test.ts +0 -477
- package/tests/core/principle-compiler.test.ts +0 -350
- package/tests/core/principle-injection.test.ts +0 -223
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +0 -193
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +0 -350
- package/tests/core/principle-internalization/lifecycle-routing-policy.test.ts +0 -212
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +0 -56
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +0 -189
- package/tests/core/principle-training-state.test.ts +0 -939
- package/tests/core/principle-tree-ledger-adapter.test.ts +0 -253
- package/tests/core/principle-tree-ledger.test.ts +0 -423
- package/tests/core/profile.test.ts +0 -56
- package/tests/core/promotion-gate.test.ts +0 -561
- package/tests/core/queue-purge.test.ts +0 -337
- package/tests/core/reflection-context.test.ts +0 -342
- package/tests/core/regression-v1-9-1.test.ts +0 -266
- package/tests/core/replay-engine.test.ts +0 -165
- package/tests/core/risk-calculator.test.ts +0 -168
- package/tests/core/rule-host-adversarial-output.test.ts +0 -242
- package/tests/core/rule-host-autocorrect-vm.test.ts +0 -163
- package/tests/core/rule-host-helpers.test.ts +0 -120
- package/tests/core/rule-host-resource-bounds.test.ts +0 -231
- package/tests/core/rule-host-sqlite-source.test.ts +0 -720
- package/tests/core/rule-host-unhealthy-visibility.test.ts +0 -261
- package/tests/core/rule-host-validation.test.ts +0 -315
- package/tests/core/rule-implementation-runtime.test.ts +0 -49
- package/tests/core/session-tracker.test.ts +0 -191
- package/tests/core/surface-guard.test.ts +0 -338
- package/tests/core/template-generator.test.ts +0 -101
- package/tests/core/trajectory.test.ts +0 -427
- package/tests/core/workflow-funnel-loader.test.ts +0 -1028
- package/tests/core/workspace-context-factory.test.ts +0 -18
- package/tests/core/workspace-context.test.ts +0 -187
- package/tests/core/workspace-guidance-migrator.test.ts +0 -248
- package/tests/core-anti-growth.test.ts +0 -182
- package/tests/evolution-worker-quarantine.test.ts +0 -400
- package/tests/evolution-worker-slimming.test.ts +0 -380
- package/tests/fixtures/legacy-queue-v1.json +0 -74
- package/tests/fixtures/production-compatibility.test.ts +0 -147
- package/tests/fixtures/production-mock-generator.ts +0 -282
- package/tests/globalSetup.ts +0 -38
- package/tests/hook-workspace-nextaction-contract.test.ts +0 -50
- package/tests/hooks/confirm-first-removal.test.ts +0 -188
- package/tests/hooks/gate-auto-correct-shadow.test.ts +0 -309
- package/tests/hooks/gate-auto-correct.test.ts +0 -664
- package/tests/hooks/gate-block-helper-profile.test.ts +0 -186
- package/tests/hooks/gate-no-path-write-tool.test.ts +0 -171
- package/tests/hooks/gate-rule-host-pipeline.test.ts +0 -230
- package/tests/hooks/gate-rule-host-real-pipeline.test.ts +0 -190
- package/tests/hooks/lifecycle.test.ts +0 -248
- package/tests/hooks/message-sanitize.test.ts +0 -244
- package/tests/hooks/pain-emission-characterization.test.ts +0 -420
- package/tests/hooks/pain.test.ts +0 -795
- package/tests/hooks/prompt-characterization.test.ts +0 -476
- package/tests/hooks/prompt-diet.test.ts +0 -335
- package/tests/hooks/prompt-size-guard.test.ts +0 -319
- package/tests/hooks/raw-observation-adapter.test.ts +0 -312
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +0 -895
- package/tests/hooks/single-gate-pain-admission.test.ts +0 -258
- package/tests/hooks/subagent.test.ts +0 -469
- package/tests/hooks/trajectory-collector.test.ts +0 -269
- package/tests/hooks/trajectory-evidence.test.ts +0 -280
- package/tests/hooks/triage-adapter.test.ts +0 -331
- package/tests/hygiene-tracker.test.ts +0 -77
- package/tests/index.test.ts +0 -142
- package/tests/integration/auto-entry-gate.test.ts +0 -256
- package/tests/integration/gate-real-io.e2e.test.ts +0 -248
- package/tests/integration/m8-legacy-paths.test.ts +0 -63
- package/tests/integration/mvp-surface-registry-guard.test.ts +0 -536
- package/tests/integration/pain-id-chain-e2e.test.ts +0 -313
- package/tests/integration/principle-compiler-e2e.test.ts +0 -403
- package/tests/integration/principle-lifecycle.e2e.test.ts +0 -198
- package/tests/integration/runtime-v2-pain-guard.test.ts +0 -125
- package/tests/integration/trajectory-lifecycle.e2e.test.ts +0 -523
- package/tests/internalization-auto-consumer-gate.test.ts +0 -158
- package/tests/internalization-auto-consumer-service.test.ts +0 -219
- package/tests/plugin-config-resolution-cutover.test.ts +0 -359
- package/tests/queue/async-lock.test.ts +0 -200
- package/tests/runtime-v2-discovery-guard.test.ts +0 -153
- package/tests/scripts/validate-live-path.test.ts +0 -286
- package/tests/service/central-database.test.ts +0 -457
- package/tests/service/correction-observer-service.test.ts +0 -505
- package/tests/service/evolution-worker.compilation-backfill.test.ts +0 -203
- package/tests/service/evolution-worker.correction-observer.test.ts +0 -50
- package/tests/service/evolution-worker.queue.test.ts +0 -296
- package/tests/service/evolution-worker.timeout.test.ts +0 -233
- package/tests/service/keyword-optimization-service.test.ts +0 -121
- package/tests/service/phase3-input-filter.test.ts +0 -289
- package/tests/service/queue-io.test.ts +0 -168
- package/tests/service/queue-migration.test.ts +0 -147
- package/tests/service/runtime-summary-service.test.ts +0 -1100
- package/tests/service/workflow-watchdog.test.ts +0 -281
- package/tests/task-compliance.test.ts +0 -166
- package/tests/test-utils.ts +0 -48
- package/tests/utils/file-lock.test.ts +0 -409
- package/tests/utils/hashing.test.ts +0 -32
- package/tests/utils/hook-workspace-resolver.test.ts +0 -524
- package/tests/utils/io.test.ts +0 -39
- package/tests/utils/retry.test.ts +0 -327
- package/tests/utils/session-key.test.ts +0 -52
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -61
- package/vitest.unit.config.ts +0 -12
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Promote Implementation Command — CLI `/pd-promote-impl`
|
|
3
|
+
* ========================================================
|
|
4
|
+
*
|
|
5
|
+
* PURPOSE: Manually promote a candidate implementation to active status
|
|
6
|
+
* after replay evaluation review.
|
|
7
|
+
*
|
|
8
|
+
* FLOW:
|
|
9
|
+
* 1. List candidates with replay reports
|
|
10
|
+
* 2. Show replay report summary for selected candidate
|
|
11
|
+
* 3. Ask for confirmation
|
|
12
|
+
* 4. On confirm: transition candidate->active, demote previous active->disabled
|
|
13
|
+
*
|
|
14
|
+
* VALIDATION:
|
|
15
|
+
* - Candidate must have at least one replay report with 'pass' decision
|
|
16
|
+
* - Only candidate -> active is valid for promotion
|
|
17
|
+
* - NOTE (PRI-230): The legacy replay generation path has been retired.
|
|
18
|
+
* This command is temporarily unavailable for implementations without
|
|
19
|
+
* pre-existing replay reports until a Runtime V2 replay entry is wired.
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'fs';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import { ReplayEngine, formatReplayReport } from '../core/replay-engine.js';
|
|
24
|
+
import { refreshPrincipleLifecycle } from '../core/principle-internalization/lifecycle-refresh.js';
|
|
25
|
+
import { findActiveImplementation, loadLedger, transitionImplementationState, updateImplementation, } from '../core/principle-tree-ledger.js';
|
|
26
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
27
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
28
|
+
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
29
|
+
import { withLock } from '../utils/file-lock.js';
|
|
30
|
+
import { atomicWriteFileSync } from '../utils/io.js';
|
|
31
|
+
function getAllImplementations(stateDir) {
|
|
32
|
+
const ledger = loadLedger(stateDir);
|
|
33
|
+
return Object.values(ledger.tree.implementations);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Type predicate: true if impl has lifecycleState of 'candidate' or 'disabled'.
|
|
37
|
+
* The ledger adds lifecycleState at runtime beyond what's in the manifest interface.
|
|
38
|
+
*/
|
|
39
|
+
function isCandidateOrDisabled(impl) {
|
|
40
|
+
return impl.lifecycleState === 'candidate' || impl.lifecycleState === 'disabled';
|
|
41
|
+
}
|
|
42
|
+
function _handleListCandidates(stateDir, isZh) {
|
|
43
|
+
const engine = new ReplayEngine('', stateDir);
|
|
44
|
+
const allImpls = getAllImplementations(stateDir);
|
|
45
|
+
const candidates = allImpls.filter(isCandidateOrDisabled);
|
|
46
|
+
if (candidates.length === 0) {
|
|
47
|
+
return {
|
|
48
|
+
text: isZh
|
|
49
|
+
? '\nℹ️ 未找到候选实现。\n\n用法: /pd-promote-impl list'
|
|
50
|
+
: '\nℹ️ No candidate implementations found.\n\nUsage: /pd-promote-impl list',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
let output = isZh ? '\n📋 候选实现列表\n' : '\n📋 Candidate Implementations\n';
|
|
54
|
+
output += `${'='.repeat(50)}\n`;
|
|
55
|
+
for (const impl of candidates) {
|
|
56
|
+
const hasPass = engine.hasPassingReport(impl.id);
|
|
57
|
+
const passBadge = hasPass
|
|
58
|
+
? isZh ? '✅ 有通过报告' : '✅ Has pass report'
|
|
59
|
+
: isZh ? '❌ 无通过报告' : '❌ No pass report';
|
|
60
|
+
output += ` ${impl.id}\n`;
|
|
61
|
+
output += ` Rule: ${impl.ruleId} | Version: ${impl.version}\n`;
|
|
62
|
+
output += ` Replay: ${passBadge}\n\n`;
|
|
63
|
+
}
|
|
64
|
+
return { text: output };
|
|
65
|
+
}
|
|
66
|
+
function _handleShowReport(stateDir, implId, isZh) {
|
|
67
|
+
const engine = new ReplayEngine('', stateDir);
|
|
68
|
+
const report = engine.getLatestReport(implId);
|
|
69
|
+
if (!report) {
|
|
70
|
+
return {
|
|
71
|
+
text: isZh
|
|
72
|
+
? `❌ 实现 ${implId} 没有回放报告。`
|
|
73
|
+
: `❌ No replay report found for implementation ${implId}.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return { text: formatReplayReport(report) };
|
|
77
|
+
}
|
|
78
|
+
function _handlePromoteImpl(options) {
|
|
79
|
+
const { workspaceDir, stateDir, implId, isZh } = options;
|
|
80
|
+
const engine = new ReplayEngine('', stateDir);
|
|
81
|
+
const allImpls = getAllImplementations(stateDir);
|
|
82
|
+
const candidate = allImpls.find((i) => i.id === implId);
|
|
83
|
+
if (!candidate) {
|
|
84
|
+
return {
|
|
85
|
+
text: isZh
|
|
86
|
+
? `❌ 未找到实现: ${implId}`
|
|
87
|
+
: `❌ Implementation not found: ${implId}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
const currentState = candidate.lifecycleState || 'candidate';
|
|
91
|
+
if (currentState !== 'candidate' && currentState !== 'disabled') {
|
|
92
|
+
return {
|
|
93
|
+
text: isZh
|
|
94
|
+
? `❌ 只能晋升 candidate 或 disabled 状态的实现。当前: ${currentState}`
|
|
95
|
+
: `❌ Can only promote 'candidate' or 'disabled' implementations. Current: ${currentState}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (!engine.hasPassingReport(implId)) {
|
|
99
|
+
return {
|
|
100
|
+
text: isZh
|
|
101
|
+
? `❌ 实现 ${implId} 没有通过的回放报告,晋升被拒绝。\n\nLegacy replay 生成路径已在 PRI-230 退役,当前无可用的 replay 证据生成入口。该命令暂不可用于没有既有 replay 报告的实现。`
|
|
102
|
+
: `❌ Implementation ${implId} has no passing replay report. Promotion rejected.\n\nThe legacy replay generation path was retired in PRI-230; no replay evidence generation entry is currently available. This command is temporarily unavailable for implementations without pre-existing replay reports.`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const report = engine.getLatestReport(implId);
|
|
106
|
+
let output = '';
|
|
107
|
+
if (report) {
|
|
108
|
+
output = `${formatReplayReport(report)}\n`;
|
|
109
|
+
}
|
|
110
|
+
if (currentState === 'disabled') {
|
|
111
|
+
transitionImplementationState(stateDir, implId, 'active');
|
|
112
|
+
updateImplementation(stateDir, implId, {
|
|
113
|
+
disabledAt: undefined,
|
|
114
|
+
disabledBy: undefined,
|
|
115
|
+
disabledReason: undefined,
|
|
116
|
+
});
|
|
117
|
+
try {
|
|
118
|
+
refreshPrincipleLifecycle(workspaceDir, stateDir);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.warn('[promote-impl] Lifecycle refresh failed (re-enable):', err instanceof Error ? err.stack : err);
|
|
122
|
+
}
|
|
123
|
+
output += isZh
|
|
124
|
+
? `\n✅ 实现已重新启用: ${implId}\n 状态: disabled -> active`
|
|
125
|
+
: `\n✅ Implementation re-enabled: ${implId}\n State: disabled -> active`;
|
|
126
|
+
return { text: output };
|
|
127
|
+
}
|
|
128
|
+
const activeForRule = findActiveImplementation(stateDir, candidate.ruleId);
|
|
129
|
+
if (activeForRule) {
|
|
130
|
+
updateImplementation(stateDir, implId, {
|
|
131
|
+
previousActive: activeForRule.id,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
transitionImplementationState(stateDir, implId, 'active');
|
|
135
|
+
if (activeForRule) {
|
|
136
|
+
transitionImplementationState(stateDir, activeForRule.id, 'disabled');
|
|
137
|
+
output += isZh
|
|
138
|
+
? `\n上一个活跃实现已禁用: ${activeForRule.id}\n 状态: active -> disabled`
|
|
139
|
+
: `\nPrevious active implementation disabled: ${activeForRule.id}\n State: active -> disabled`;
|
|
140
|
+
}
|
|
141
|
+
const eventsDir = path.join(stateDir, 'principles', 'implementations', implId, 'events');
|
|
142
|
+
if (!fs.existsSync(eventsDir)) {
|
|
143
|
+
fs.mkdirSync(eventsDir, { recursive: true });
|
|
144
|
+
}
|
|
145
|
+
const eventPath = path.join(eventsDir, 'promotion.json');
|
|
146
|
+
const promotionEvent = {
|
|
147
|
+
eventType: 'promotion',
|
|
148
|
+
implementationId: implId,
|
|
149
|
+
ruleId: candidate.ruleId,
|
|
150
|
+
fromState: 'candidate',
|
|
151
|
+
toState: 'active',
|
|
152
|
+
previousActive: activeForRule?.id ?? null,
|
|
153
|
+
replayReportId: report
|
|
154
|
+
? report.generatedAt.replace(/[:.]/g, '-')
|
|
155
|
+
: null,
|
|
156
|
+
promotedAt: new Date().toISOString(),
|
|
157
|
+
};
|
|
158
|
+
withLock(eventPath, () => {
|
|
159
|
+
atomicWriteFileSync(eventPath, JSON.stringify(promotionEvent, null, 2));
|
|
160
|
+
});
|
|
161
|
+
try {
|
|
162
|
+
refreshPrincipleLifecycle(workspaceDir, stateDir);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.warn('[promote-impl] Lifecycle refresh failed (promotion):', err instanceof Error ? err.stack : err);
|
|
166
|
+
}
|
|
167
|
+
output += isZh
|
|
168
|
+
? `\n\n✅ 实现已晋升: ${implId}\n 状态: candidate -> active`
|
|
169
|
+
: `\n\n✅ Implementation promoted: ${implId}\n State: candidate -> active`;
|
|
170
|
+
return { text: output };
|
|
171
|
+
}
|
|
172
|
+
export function handlePromoteImplCommand(ctx) {
|
|
173
|
+
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'promote-impl');
|
|
174
|
+
const { stateDir } = WorkspaceContext.fromHookContext({ ...ctx, workspaceDir });
|
|
175
|
+
const lang = ctx.config?.language || 'en';
|
|
176
|
+
const isZh = lang === 'zh';
|
|
177
|
+
const args = normalizeCommandArgs(ctx.args).trim().split(/\s+/);
|
|
178
|
+
const subcommand = args[0] || '';
|
|
179
|
+
const implId = args[1] || '';
|
|
180
|
+
if (subcommand === 'list' || subcommand === '') {
|
|
181
|
+
return _handleListCandidates(stateDir, isZh);
|
|
182
|
+
}
|
|
183
|
+
if (subcommand === 'show') {
|
|
184
|
+
if (!implId) {
|
|
185
|
+
return {
|
|
186
|
+
text: isZh
|
|
187
|
+
? '请指定要查看的实现ID: /pd-promote-impl show <implId>'
|
|
188
|
+
: 'Please specify an implementation ID: /pd-promote-impl show <implId>',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return _handleShowReport(stateDir, implId, isZh);
|
|
192
|
+
}
|
|
193
|
+
return _handlePromoteImpl({ workspaceDir, stateDir, implId: subcommand, isZh });
|
|
194
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rollback Implementation Command — CLI `/pd-rollback-impl`
|
|
3
|
+
* ==========================================================
|
|
4
|
+
*
|
|
5
|
+
* PURPOSE: Revert the current active implementation and restore the previous one.
|
|
6
|
+
*
|
|
7
|
+
* FLOW:
|
|
8
|
+
* 1. List active implementations
|
|
9
|
+
* 2. On confirm: current -> disabled, previous -> active
|
|
10
|
+
*
|
|
11
|
+
* SAFETY:
|
|
12
|
+
* - If no previous active: current -> disabled (degrades to hard-boundary gates)
|
|
13
|
+
* - Rollback records persisted with full audit trail
|
|
14
|
+
*/
|
|
15
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
16
|
+
/**
|
|
17
|
+
* Handle the /pd-rollback-impl command.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* /pd-rollback-impl list - List active implementations
|
|
21
|
+
* /pd-rollback-impl <implId> - Rollback current active
|
|
22
|
+
* /pd-rollback-impl <implId> --reason "<reason>" - Rollback with reason
|
|
23
|
+
*/
|
|
24
|
+
export declare function handleRollbackImplCommand(ctx: PluginCommandContext): PluginCommandResult;
|
|
25
|
+
/**
|
|
26
|
+
* Handle natural language rollback request.
|
|
27
|
+
* Detects phrases like "回滚这个规则实现", "rollback this implementation".
|
|
28
|
+
*/
|
|
29
|
+
export declare function handleNaturalLanguageRollbackImpl(workspaceDir: string, sessionId: string | undefined, reason: string): {
|
|
30
|
+
success: boolean;
|
|
31
|
+
message: string;
|
|
32
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rollback Implementation Command — CLI `/pd-rollback-impl`
|
|
3
|
+
* ==========================================================
|
|
4
|
+
*
|
|
5
|
+
* PURPOSE: Revert the current active implementation and restore the previous one.
|
|
6
|
+
*
|
|
7
|
+
* FLOW:
|
|
8
|
+
* 1. List active implementations
|
|
9
|
+
* 2. On confirm: current -> disabled, previous -> active
|
|
10
|
+
*
|
|
11
|
+
* SAFETY:
|
|
12
|
+
* - If no previous active: current -> disabled (degrades to hard-boundary gates)
|
|
13
|
+
* - Rollback records persisted with full audit trail
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import { withLock } from '../utils/file-lock.js';
|
|
18
|
+
import { atomicWriteFileSync } from '../utils/io.js';
|
|
19
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
20
|
+
import { refreshPrincipleLifecycle } from '../core/principle-internalization/lifecycle-refresh.js';
|
|
21
|
+
import { loadLedger, transitionImplementationState, } from '../core/principle-tree-ledger.js';
|
|
22
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
23
|
+
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
24
|
+
/**
|
|
25
|
+
* Get all implementations from the ledger.
|
|
26
|
+
*/
|
|
27
|
+
function getAllImplementations(stateDir) {
|
|
28
|
+
const ledger = loadLedger(stateDir);
|
|
29
|
+
return Object.values(ledger.tree.implementations);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle the /pd-rollback-impl command.
|
|
33
|
+
*
|
|
34
|
+
* Usage:
|
|
35
|
+
* /pd-rollback-impl list - List active implementations
|
|
36
|
+
* /pd-rollback-impl <implId> - Rollback current active
|
|
37
|
+
* /pd-rollback-impl <implId> --reason "<reason>" - Rollback with reason
|
|
38
|
+
*/
|
|
39
|
+
export function handleRollbackImplCommand(ctx) {
|
|
40
|
+
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'rollback-impl');
|
|
41
|
+
const { stateDir } = WorkspaceContext.fromHookContext({ ...ctx, workspaceDir });
|
|
42
|
+
const lang = ctx.config?.language || 'en';
|
|
43
|
+
const isZh = lang === 'zh';
|
|
44
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
45
|
+
// Parse args
|
|
46
|
+
const subcommand = args.split(/\s+/)[0] || '';
|
|
47
|
+
const implId = subcommand === 'list' ? '' : subcommand;
|
|
48
|
+
const reasonMatch = (/--reason\s+"([^"]+)"/.exec(args)) || (/--reason\s+(\S+)/.exec(args));
|
|
49
|
+
const reason = reasonMatch ? reasonMatch[1] : null;
|
|
50
|
+
// List active
|
|
51
|
+
if (subcommand === 'list' || subcommand === '') {
|
|
52
|
+
return _handleListActiveRollback(stateDir, isZh);
|
|
53
|
+
}
|
|
54
|
+
return _handleRollbackImpl(workspaceDir, stateDir, implId, reason, isZh, ctx.sessionId);
|
|
55
|
+
}
|
|
56
|
+
function _handleListActiveRollback(stateDir, isZh) {
|
|
57
|
+
const allImpls = getAllImplementations(stateDir);
|
|
58
|
+
const activeImpls = allImpls.filter((impl) => impl.lifecycleState === 'active');
|
|
59
|
+
if (activeImpls.length === 0) {
|
|
60
|
+
return {
|
|
61
|
+
text: isZh
|
|
62
|
+
? '\n\u2139\ufe0f \u6ca1\u6709\u6d3b\u8dc3\u5b9e\u73b0\u53ef\u56de\u6eda\u3002'
|
|
63
|
+
: '\n\u2139\ufe0f No active implementations to rollback.',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
let output = isZh ? '\n\ud83d\udccb \u53ef\u56de\u6eda\u6d3b\u8dc3\u5b9e\u73b0\n' : '\n\ud83d\udccb Active Implementations Available for Rollback\n';
|
|
67
|
+
output += `${'='.repeat(50)}\n`;
|
|
68
|
+
for (const impl of activeImpls) {
|
|
69
|
+
const hasPrevious = impl.previousActive ? '\u2705' : '\u26a0\ufe0f \u65e0\u524d\u4e00\u4e2a';
|
|
70
|
+
output += ` ${impl.id}\n`;
|
|
71
|
+
output += ` Rule: ${impl.ruleId} | Version: ${impl.version}\n`;
|
|
72
|
+
output += ` Has previous: ${hasPrevious}\n`;
|
|
73
|
+
if (impl.previousActive) {
|
|
74
|
+
output += ` Previous: ${impl.previousActive}\n`;
|
|
75
|
+
}
|
|
76
|
+
output += '\n';
|
|
77
|
+
}
|
|
78
|
+
output += isZh
|
|
79
|
+
? '\u7528\u6cd5: /pd-rollback-impl <implId> --reason "\u539f\u56e0"'
|
|
80
|
+
: 'Usage: /pd-rollback-impl <implId> --reason "reason"';
|
|
81
|
+
return { text: output };
|
|
82
|
+
}
|
|
83
|
+
function _handleRollbackImpl(workspaceDir, stateDir, implId, reason, isZh, sessionId) {
|
|
84
|
+
const allImpls = getAllImplementations(stateDir);
|
|
85
|
+
const currentActive = allImpls.find((i) => i.id === implId);
|
|
86
|
+
if (!currentActive) {
|
|
87
|
+
return {
|
|
88
|
+
text: isZh
|
|
89
|
+
? `\u274c \u672a\u627e\u5230\u5b9e\u73b0: ${implId}`
|
|
90
|
+
: `\u274c Implementation not found: ${implId}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const currentState = currentActive.lifecycleState;
|
|
94
|
+
if (currentState !== 'active') {
|
|
95
|
+
return {
|
|
96
|
+
text: isZh
|
|
97
|
+
? `\u274c \u5b9e\u73b0 ${implId} \u5f53\u524d\u72b6\u6001: ${currentState}\n\u53ea\u80fd\u56de\u6eda\u6d3b\u8dc3\u5b9e\u73b0\u3002`
|
|
98
|
+
: `\u274c Implementation ${implId} is in state: ${currentState}\nCan only rollback active implementations.`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const previousActiveId = currentActive.previousActive;
|
|
102
|
+
const reasonText = reason || (isZh ? '\u7528\u6237\u624b\u52a8\u56de\u6eda' : 'User manual rollback');
|
|
103
|
+
// Step 1: Current active -> disabled
|
|
104
|
+
transitionImplementationState(stateDir, implId, 'disabled');
|
|
105
|
+
let restoredMessage;
|
|
106
|
+
if (previousActiveId && allImpls.some((i) => i.id === previousActiveId)) {
|
|
107
|
+
// Step 2: Restore previous active -> active
|
|
108
|
+
transitionImplementationState(stateDir, previousActiveId, 'active');
|
|
109
|
+
restoredMessage = isZh
|
|
110
|
+
? `\n \u5df2\u6062\u590d\u524d\u4e00\u4e2a\u6d3b\u8dc3\u5b9e\u73b0: ${previousActiveId}\n \u72b6\u6001: disabled -> active`
|
|
111
|
+
: `\n Restored previous active implementation: ${previousActiveId}\n State: disabled -> active`;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// No previous active — degrade to hard-boundary gates (per Phase 12 D-08)
|
|
115
|
+
restoredMessage = isZh
|
|
116
|
+
? `\n \u26a0\ufe0f \u6ca1\u6709\u524d\u4e00\u4e2a\u6d3b\u8dc3\u5b9e\u73b0\uff0c\u8be5\u89c4\u5219\u6ca1\u6709\u6d3b\u8dc3\u5b9e\u73b0\u3002`
|
|
117
|
+
+ `\n GFI\u3001Progressive Gate\u7b49\u786c\u56fa\u62b1\u95e8\u4ecd\u7136\u6b63\u5e38\u8fd0\u884c\u3002`
|
|
118
|
+
: `\n \u26a0\ufe0f No previous active implementation. Rule has no active code implementation.`
|
|
119
|
+
+ ` Existing hard-boundary gates (GFI, Progressive Gate) continue functioning normally.`;
|
|
120
|
+
}
|
|
121
|
+
// Store rollback record
|
|
122
|
+
const rollbackDir = path.join(stateDir, 'principles', 'implementations', implId, 'rollbacks');
|
|
123
|
+
if (!fs.existsSync(rollbackDir)) {
|
|
124
|
+
fs.mkdirSync(rollbackDir, { recursive: true });
|
|
125
|
+
}
|
|
126
|
+
const rollbackRecord = {
|
|
127
|
+
rolledBackBy: sessionId || 'manual',
|
|
128
|
+
rolledBackAt: new Date().toISOString(),
|
|
129
|
+
reason: reasonText,
|
|
130
|
+
previousImplementationId: previousActiveId || null,
|
|
131
|
+
restoredImplementationId: previousActiveId && allImpls.some((i) => i.id === previousActiveId)
|
|
132
|
+
? previousActiveId
|
|
133
|
+
: null,
|
|
134
|
+
rolledBackImplId: implId,
|
|
135
|
+
};
|
|
136
|
+
const rollbackTimestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
137
|
+
const rollbackPath = path.join(rollbackDir, `${rollbackTimestamp}.json`);
|
|
138
|
+
withLock(rollbackPath, () => {
|
|
139
|
+
atomicWriteFileSync(rollbackPath, JSON.stringify(rollbackRecord, null, 2));
|
|
140
|
+
});
|
|
141
|
+
try {
|
|
142
|
+
refreshPrincipleLifecycle(workspaceDir, stateDir);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
console.warn('[rollback-impl] Lifecycle refresh failed:', err instanceof Error ? err.stack : err);
|
|
146
|
+
}
|
|
147
|
+
let output = isZh
|
|
148
|
+
? `\n\u2705 \u56de\u6eda\u5b8c\u6210: ${implId}\n \u72b6\u6001: active -> disabled\n \u539f\u56e0: ${reasonText}`
|
|
149
|
+
: `\n\u2705 Rollback complete: ${implId}\n State: active -> disabled\n Reason: ${reasonText}`;
|
|
150
|
+
output += restoredMessage;
|
|
151
|
+
return { text: output };
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Handle natural language rollback request.
|
|
155
|
+
* Detects phrases like "回滚这个规则实现", "rollback this implementation".
|
|
156
|
+
*/
|
|
157
|
+
export function handleNaturalLanguageRollbackImpl(workspaceDir, sessionId, reason) {
|
|
158
|
+
const isZh = (/[\u4e00-\u9fff]/.exec(reason)) || false;
|
|
159
|
+
const { stateDir } = WorkspaceContext.fromHookContext({ workspaceDir });
|
|
160
|
+
if (!sessionId) {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
message: isZh ? '\u65e0\u6cd5\u8bc6\u522b\u5f53\u524d\u4f1a\u8bdd' : 'Session not found',
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// Natural language entry: get last active implementation
|
|
167
|
+
const allImpls = getAllImplementations(stateDir);
|
|
168
|
+
const lastActive = allImpls.find((i) => i.lifecycleState === 'active');
|
|
169
|
+
if (!lastActive) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
message: isZh ? '\u5f53\u524d\u6ca1\u6709\u6d3b\u8dc3\u5b9e\u73b0' : 'No active implementations',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Would be called via the hook — return the impl ID for the hook to route
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
message: `${lastActive.id}|${reason}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
3
|
+
/**
|
|
4
|
+
* Handles the /pd-rollback command
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* /pd-rollback <event-id> - Rollback a specific empathy event by ID
|
|
8
|
+
* /pd-rollback last - Rollback the last empathy event in current session
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleRollbackCommand(ctx: PluginCommandContext): PluginCommandResult;
|
|
11
|
+
/**
|
|
12
|
+
* Handle natural language rollback request
|
|
13
|
+
* Called from prompt hook when user says things like "撤销刚才的惩罚"
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleNaturalLanguageRollback(wctx: WorkspaceContext, sessionId: string | undefined, reason: string): {
|
|
16
|
+
success: boolean;
|
|
17
|
+
score: number;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
@@ -1,34 +1,21 @@
|
|
|
1
1
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
2
|
import { resetFriction } from '../core/session-tracker.js';
|
|
3
|
-
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
3
|
import { normalizeCommandArgs } from '../utils/io.js';
|
|
5
4
|
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Extended context interface that includes sessionId injected by the plugin framework.
|
|
9
|
-
* PluginCommandContext does not include sessionId in its type definition.
|
|
10
|
-
*/
|
|
11
|
-
interface SessionAwareCommandContext extends PluginCommandContext {
|
|
12
|
-
sessionId: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
5
|
/**
|
|
16
6
|
* Handles the /pd-rollback command
|
|
17
|
-
*
|
|
7
|
+
*
|
|
18
8
|
* Usage:
|
|
19
9
|
* /pd-rollback <event-id> - Rollback a specific empathy event by ID
|
|
20
10
|
* /pd-rollback last - Rollback the last empathy event in current session
|
|
21
11
|
*/
|
|
22
|
-
export function handleRollbackCommand(ctx
|
|
12
|
+
export function handleRollbackCommand(ctx) {
|
|
23
13
|
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'rollback');
|
|
24
|
-
|
|
25
14
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
26
|
-
const lang =
|
|
15
|
+
const lang = ctx.config?.language || 'en';
|
|
27
16
|
const isZh = lang === 'zh';
|
|
28
|
-
const { sessionId } = ctx
|
|
29
|
-
|
|
17
|
+
const { sessionId } = ctx;
|
|
30
18
|
const args = normalizeCommandArgs(ctx.args).trim();
|
|
31
|
-
|
|
32
19
|
if (!args) {
|
|
33
20
|
return {
|
|
34
21
|
text: isZh
|
|
@@ -44,7 +31,6 @@ Usage:
|
|
|
44
31
|
/pd-rollback last - Rollback the last event in current session`
|
|
45
32
|
};
|
|
46
33
|
}
|
|
47
|
-
|
|
48
34
|
if (!sessionId) {
|
|
49
35
|
return {
|
|
50
36
|
text: isZh
|
|
@@ -52,12 +38,7 @@ Usage:
|
|
|
52
38
|
: `❌ Session ID not found. Use this command in a chat session.`
|
|
53
39
|
};
|
|
54
40
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
let eventId: string | null;
|
|
59
|
-
|
|
60
|
-
|
|
41
|
+
let eventId;
|
|
61
42
|
if (args === 'last') {
|
|
62
43
|
// Find the last empathy event in current session
|
|
63
44
|
eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
|
|
@@ -68,19 +49,13 @@ Usage:
|
|
|
68
49
|
: `❌ No empathy events found in current session to rollback.`
|
|
69
50
|
};
|
|
70
51
|
}
|
|
71
|
-
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
72
54
|
// Use the provided event ID
|
|
73
55
|
eventId = args;
|
|
74
56
|
}
|
|
75
|
-
|
|
76
57
|
// Perform rollback
|
|
77
|
-
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
|
|
78
|
-
eventId,
|
|
79
|
-
sessionId,
|
|
80
|
-
isZh ? '用户手动回滚' : 'User manual rollback',
|
|
81
|
-
'user_command'
|
|
82
|
-
);
|
|
83
|
-
|
|
58
|
+
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(eventId, sessionId, isZh ? '用户手动回滚' : 'User manual rollback', 'user_command');
|
|
84
59
|
if (rolledBackScore === 0) {
|
|
85
60
|
return {
|
|
86
61
|
text: isZh
|
|
@@ -88,13 +63,11 @@ Usage:
|
|
|
88
63
|
: `❌ Failed to rollback event "${eventId}". Event may not exist or was deduped.`
|
|
89
64
|
};
|
|
90
65
|
}
|
|
91
|
-
|
|
92
66
|
// Reduce the GFI by the rolled back score
|
|
93
67
|
resetFriction(sessionId, workspaceDir, {
|
|
94
68
|
source: 'user_empathy',
|
|
95
69
|
amount: rolledBackScore,
|
|
96
70
|
});
|
|
97
|
-
|
|
98
71
|
return {
|
|
99
72
|
text: isZh
|
|
100
73
|
? `✅ 已回滚情绪事件
|
|
@@ -109,18 +82,12 @@ Usage:
|
|
|
109
82
|
💡 Hint: Session friction has been reset.`
|
|
110
83
|
};
|
|
111
84
|
}
|
|
112
|
-
|
|
113
85
|
/**
|
|
114
86
|
* Handle natural language rollback request
|
|
115
87
|
* Called from prompt hook when user says things like "撤销刚才的惩罚"
|
|
116
88
|
*/
|
|
117
|
-
export function handleNaturalLanguageRollback(
|
|
118
|
-
wctx: WorkspaceContext,
|
|
119
|
-
sessionId: string | undefined,
|
|
120
|
-
reason: string
|
|
121
|
-
): { success: boolean; score: number; message: string } {
|
|
89
|
+
export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
|
|
122
90
|
const isZh = wctx.config.get('language') === 'zh';
|
|
123
|
-
|
|
124
91
|
if (!sessionId) {
|
|
125
92
|
return {
|
|
126
93
|
success: false,
|
|
@@ -128,7 +95,6 @@ export function handleNaturalLanguageRollback(
|
|
|
128
95
|
message: isZh ? '无法识别当前会话' : 'Session not found'
|
|
129
96
|
};
|
|
130
97
|
}
|
|
131
|
-
|
|
132
98
|
const eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
|
|
133
99
|
if (!eventId) {
|
|
134
100
|
return {
|
|
@@ -137,14 +103,7 @@ export function handleNaturalLanguageRollback(
|
|
|
137
103
|
message: isZh ? '当前会话没有可回滚的情绪事件' : 'No empathy events to rollback'
|
|
138
104
|
};
|
|
139
105
|
}
|
|
140
|
-
|
|
141
|
-
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
|
|
142
|
-
eventId,
|
|
143
|
-
sessionId,
|
|
144
|
-
reason,
|
|
145
|
-
'natural_language'
|
|
146
|
-
);
|
|
147
|
-
|
|
106
|
+
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(eventId, sessionId, reason, 'natural_language');
|
|
148
107
|
if (rolledBackScore === 0) {
|
|
149
108
|
return {
|
|
150
109
|
success: false,
|
|
@@ -152,13 +111,11 @@ export function handleNaturalLanguageRollback(
|
|
|
152
111
|
message: isZh ? '回滚失败,事件可能不存在' : 'Rollback failed, event may not exist'
|
|
153
112
|
};
|
|
154
113
|
}
|
|
155
|
-
|
|
156
114
|
// Reduce only the empathy slice instead of wiping the whole session GFI.
|
|
157
115
|
resetFriction(sessionId, wctx.workspaceDir, {
|
|
158
116
|
source: 'user_empathy',
|
|
159
117
|
amount: rolledBackScore,
|
|
160
118
|
});
|
|
161
|
-
|
|
162
119
|
return {
|
|
163
120
|
success: true,
|
|
164
121
|
score: rolledBackScore,
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
|
+
import { normalizeCommandArgs } from '../utils/io.js';
|
|
3
|
+
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
4
|
+
function isZh(ctx) {
|
|
5
|
+
return String(ctx.config?.language || 'en').startsWith('zh');
|
|
6
|
+
}
|
|
7
|
+
export function handleSamplesCommand(ctx) {
|
|
8
|
+
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'samples');
|
|
9
|
+
const zh = isZh(ctx);
|
|
10
|
+
const args = normalizeCommandArgs(ctx.args).trim();
|
|
11
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
12
|
+
if (args.startsWith('review ')) {
|
|
13
|
+
const [, decision = '', sampleId = '', ...noteParts] = args.split(/\s+/);
|
|
14
|
+
if (decision !== 'approve' && decision !== 'reject') {
|
|
15
|
+
return {
|
|
16
|
+
text: zh
|
|
17
|
+
? '无效的审核动作。请使用 `review approve <sample-id> [note]` 或 `review reject <sample-id> [note]`。'
|
|
18
|
+
: 'Invalid review action. Use `review approve <sample-id> [note]` or `review reject <sample-id> [note]`.',
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (!sampleId) {
|
|
22
|
+
return {
|
|
23
|
+
text: zh
|
|
24
|
+
? '缺少 sample-id。'
|
|
25
|
+
: 'Missing sample-id.',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const normalizedDecision = decision === 'approve' ? 'approved' : 'rejected';
|
|
29
|
+
const note = noteParts.join(' ').trim();
|
|
30
|
+
let record;
|
|
31
|
+
try {
|
|
32
|
+
record = wctx.trajectory.reviewCorrectionSample(sampleId, normalizedDecision, note);
|
|
33
|
+
/* eslint-disable @typescript-eslint/no-unused-vars -- Reason: error handling only - returning failure response */
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
text: zh
|
|
38
|
+
? `审核样本失败:${sampleId}`
|
|
39
|
+
: `Failed to review sample: ${sampleId}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
text: zh
|
|
44
|
+
? `样本 ${record.sampleId} 已标记为 ${record.reviewStatus}。`
|
|
45
|
+
: `Sample ${record.sampleId} marked as ${record.reviewStatus}.`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const samples = wctx.trajectory.listCorrectionSamples('pending');
|
|
49
|
+
if (samples.length === 0) {
|
|
50
|
+
return { text: zh ? '当前没有待审核纠错样本。' : 'No pending correction samples.' };
|
|
51
|
+
}
|
|
52
|
+
const lines = samples.map((sample) => `- ${sample.sampleId} | session=${sample.sessionId} | score=${sample.qualityScore}`);
|
|
53
|
+
return {
|
|
54
|
+
text: zh
|
|
55
|
+
? `待审核纠错样本:\n${lines.join('\n')}`
|
|
56
|
+
: `Pending correction samples:\n${lines.join('\n')}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
|
|
2
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
3
|
+
export function handleInitStrategy(ctx) {
|
|
4
|
+
const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'strategy');
|
|
5
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
6
|
+
const okrDir = wctx.resolve('OKR_DIR').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
7
|
+
const focusPath = wctx.resolve('CURRENT_FOCUS').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
8
|
+
const userContextPath = wctx.resolve('USER_CONTEXT').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
9
|
+
return {
|
|
10
|
+
text: `🎯 **Strategy Initialization**\n\n` +
|
|
11
|
+
`The Agent will now conduct a deep interview to establish your project's vision and strategic OKRs.\n\n` +
|
|
12
|
+
`**Instructions for Agent:** Read \`${okrDir}/\` for existing context. ` +
|
|
13
|
+
`Generate \`${focusPath}\` with the top 1-3 strategic focus areas based on the user interview. ` +
|
|
14
|
+
`Then update \`${userContextPath}\` with key user preferences discovered.`,
|
|
15
|
+
};
|
|
16
|
+
}
|