principles-disciple 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADVANCED_CONFIG_ZH.md +97 -0
- package/AGENT_INSTALL.md +173 -0
- package/AGENT_INSTALL_EN.md +173 -0
- package/INSTALL.md +256 -0
- package/SKILL.md +63 -0
- package/docs/COMMAND_REFERENCE.md +76 -0
- package/docs/COMMAND_REFERENCE_EN.md +79 -0
- package/esbuild.config.js +75 -0
- package/openclaw.plugin.json +6 -1
- package/package.json +13 -15
- package/scripts/build-web.mjs +46 -0
- package/scripts/install-dependencies.cjs +47 -0
- package/scripts/sync-plugin.mjs +802 -0
- package/scripts/verify-build.mjs +109 -0
- package/src/agents/nocturnal-dreamer.md +152 -0
- package/src/agents/nocturnal-philosopher.md +138 -0
- package/src/agents/nocturnal-reflector.md +126 -0
- package/src/agents/nocturnal-scribe.md +164 -0
- package/src/commands/capabilities.ts +85 -0
- package/{dist/commands/context.js → src/commands/context.ts} +78 -38
- package/src/commands/evolution-status.ts +146 -0
- package/src/commands/export.ts +111 -0
- package/src/commands/focus.ts +533 -0
- package/src/commands/nocturnal-review.ts +311 -0
- package/src/commands/nocturnal-rollout.ts +763 -0
- package/src/commands/nocturnal-train.ts +1002 -0
- package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
- package/src/commands/principle-rollback.ts +27 -0
- package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
- package/src/commands/samples.ts +60 -0
- package/src/commands/strategy.ts +38 -0
- package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
- package/src/commands/workflow-debug.ts +128 -0
- package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
- package/src/config/errors.ts +163 -0
- package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
- package/src/constants/diagnostician.ts +66 -0
- package/src/constants/tools.ts +62 -0
- package/src/core/adaptive-thresholds.ts +476 -0
- package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
- package/{dist/core/config.js → src/core/config.ts} +158 -46
- package/src/core/control-ui-db.ts +435 -0
- package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
- package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
- package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
- package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
- package/src/core/empathy-keyword-matcher.ts +327 -0
- package/src/core/empathy-types.ts +218 -0
- package/src/core/event-log.ts +544 -0
- package/src/core/evolution-engine.ts +612 -0
- package/src/core/evolution-logger.ts +353 -0
- package/src/core/evolution-migration.ts +77 -0
- package/src/core/evolution-reducer.ts +731 -0
- package/src/core/evolution-types.ts +456 -0
- package/src/core/external-training-contract.ts +527 -0
- package/src/core/focus-history.ts +1458 -0
- package/src/core/hygiene/tracker.ts +117 -0
- package/{dist/core/init.js → src/core/init.ts} +39 -26
- package/src/core/local-worker-routing.ts +617 -0
- package/{dist/core/migration.js → src/core/migration.ts} +18 -11
- package/src/core/model-deployment-registry.ts +722 -0
- package/src/core/model-training-registry.ts +813 -0
- package/src/core/nocturnal-arbiter.ts +706 -0
- package/src/core/nocturnal-candidate-scoring.ts +392 -0
- package/src/core/nocturnal-compliance.ts +1075 -0
- package/src/core/nocturnal-dataset.ts +668 -0
- package/src/core/nocturnal-executability.ts +428 -0
- package/src/core/nocturnal-export.ts +390 -0
- package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
- package/src/core/nocturnal-trajectory-extractor.ts +484 -0
- package/src/core/nocturnal-trinity.ts +1384 -0
- package/src/core/pain.ts +122 -0
- package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
- package/{dist/core/paths.js → src/core/paths.ts} +13 -4
- package/src/core/principle-training-state.ts +450 -0
- package/src/core/profile.ts +226 -0
- package/src/core/promotion-gate.ts +822 -0
- package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
- package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +185 -63
- package/src/core/shadow-observation-registry.ts +534 -0
- package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
- package/src/core/thinking-models.ts +217 -0
- package/src/core/training-program.ts +630 -0
- package/src/core/trajectory-types.ts +243 -0
- package/src/core/trajectory.ts +1673 -0
- package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
- package/src/hooks/bash-risk.ts +171 -0
- package/src/hooks/edit-verification.ts +295 -0
- package/src/hooks/gate-block-helper.ts +160 -0
- package/src/hooks/gate.ts +210 -0
- package/src/hooks/gfi-gate.ts +177 -0
- package/src/hooks/lifecycle.ts +326 -0
- package/{dist/hooks/llm.js → src/hooks/llm.ts} +166 -139
- package/src/hooks/message-sanitize.ts +45 -0
- package/src/hooks/pain.ts +384 -0
- package/src/hooks/progressive-trust-gate.ts +174 -0
- package/src/hooks/prompt.ts +920 -0
- package/src/hooks/subagent.ts +207 -0
- package/src/hooks/thinking-checkpoint.ts +73 -0
- package/src/hooks/trajectory-collector.ts +290 -0
- package/src/http/principles-console-route.ts +716 -0
- package/src/i18n/commands.ts +117 -0
- package/src/index.ts +694 -0
- package/src/service/central-database.ts +831 -0
- package/src/service/control-ui-query-service.ts +888 -0
- package/src/service/evolution-query-service.ts +405 -0
- package/src/service/evolution-worker.ts +1646 -0
- package/src/service/health-query-service.ts +836 -0
- package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +263 -36
- package/src/service/nocturnal-service.ts +1015 -0
- package/src/service/nocturnal-target-selector.ts +532 -0
- package/src/service/phase3-input-filter.ts +237 -0
- package/src/service/runtime-summary-service.ts +757 -0
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +603 -0
- package/src/service/subagent-workflow/index.ts +51 -0
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
- package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
- package/src/service/subagent-workflow/types.ts +378 -0
- package/src/service/subagent-workflow/workflow-store.ts +328 -0
- package/src/service/trajectory-service.ts +15 -0
- package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
- package/src/tools/deep-reflect.ts +349 -0
- package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
- package/src/types/event-types.ts +453 -0
- package/src/types/hygiene-types.ts +31 -0
- package/src/types/principle-tree-schema.ts +244 -0
- package/src/types/runtime-summary.ts +49 -0
- package/src/types.ts +74 -0
- package/src/utils/file-lock.ts +391 -0
- package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
- package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
- package/src/utils/io.ts +110 -0
- package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
- package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
- package/src/utils/subagent-probe.ts +94 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
- package/templates/pain_settings.json +2 -1
- package/tests/README.md +120 -0
- package/tests/build-artifacts.test.ts +111 -0
- package/tests/commands/evolution-status.test.ts +222 -0
- package/tests/commands/evolver.test.ts +22 -0
- package/tests/commands/export.test.ts +78 -0
- package/tests/commands/nocturnal-review.test.ts +448 -0
- package/tests/commands/nocturnal-train.test.ts +97 -0
- package/tests/commands/pain.test.ts +108 -0
- package/tests/commands/samples.test.ts +65 -0
- package/tests/commands/strategy.test.ts +34 -0
- package/tests/commands/thinking-os.test.ts +88 -0
- package/tests/core/adaptive-thresholds.test.ts +261 -0
- package/tests/core/config-service.test.ts +89 -0
- package/tests/core/config.test.ts +90 -0
- package/tests/core/control-ui-db.test.ts +75 -0
- package/tests/core/core-template-guidance.test.ts +21 -0
- package/tests/core/detection-funnel.test.ts +63 -0
- package/tests/core/detection-service.test.ts +50 -0
- package/tests/core/dictionary-service.test.ts +116 -0
- package/tests/core/dictionary.test.ts +168 -0
- package/tests/core/empathy-keyword-matcher.test.ts +209 -0
- package/tests/core/event-log.test.ts +181 -0
- package/tests/core/evolution-e2e.test.ts +58 -0
- package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
- package/tests/core/evolution-engine.test.ts +562 -0
- package/tests/core/evolution-logger.test.ts +148 -0
- package/tests/core/evolution-migration.test.ts +50 -0
- package/tests/core/evolution-paths.test.ts +21 -0
- package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
- package/tests/core/evolution-reducer.test.ts +180 -0
- package/tests/core/evolution-types-loop.test.ts +48 -0
- package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
- package/tests/core/external-training-contract.test.ts +463 -0
- package/tests/core/focus-history.test.ts +682 -0
- package/tests/core/init-flatten.test.ts +69 -0
- package/tests/core/init-refactor.test.ts +87 -0
- package/tests/core/init-v1.3.test.ts +46 -0
- package/tests/core/init.test.ts +190 -0
- package/tests/core/local-worker-routing.test.ts +757 -0
- package/tests/core/migration.test.ts +84 -0
- package/tests/core/model-deployment-registry.test.ts +845 -0
- package/tests/core/model-training-registry.test.ts +889 -0
- package/tests/core/nocturnal-arbiter.test.ts +494 -0
- package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
- package/tests/core/nocturnal-compliance.test.ts +646 -0
- package/tests/core/nocturnal-dataset.test.ts +892 -0
- package/tests/core/nocturnal-executability.test.ts +357 -0
- package/tests/core/nocturnal-export.test.ts +462 -0
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
- package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
- package/tests/core/nocturnal-trinity.test.ts +953 -0
- package/tests/core/pain.test.ts +33 -0
- package/tests/core/path-resolver.test.ts +57 -0
- package/tests/core/paths-refactor.test.ts +42 -0
- package/tests/core/phase7-rollout-integration.test.ts +477 -0
- package/tests/core/principle-training-state.test.ts +712 -0
- package/tests/core/profile.test.ts +56 -0
- package/tests/core/promotion-gate.test.ts +556 -0
- package/tests/core/risk-calculator.test.ts +168 -0
- package/tests/core/session-tracker.test.ts +191 -0
- package/tests/core/training-program.test.ts +472 -0
- package/tests/core/trajectory.test.ts +265 -0
- package/tests/core/workspace-context-factory.test.ts +18 -0
- package/tests/core/workspace-context.test.ts +134 -0
- package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
- package/tests/fixtures/production-compatibility.test.ts +147 -0
- package/tests/fixtures/production-mock-generator.ts +282 -0
- package/tests/hooks/bash-risk-integration.test.ts +137 -0
- package/tests/hooks/bash-risk.test.ts +81 -0
- package/tests/hooks/edit-verification.test.ts +678 -0
- package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
- package/tests/hooks/gate-edit-verification.test.ts +435 -0
- package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
- package/tests/hooks/gate.test.ts +271 -0
- package/tests/hooks/gfi-gate-unit.test.ts +422 -0
- package/tests/hooks/gfi-gate.test.ts +669 -0
- package/tests/hooks/lifecycle.test.ts +248 -0
- package/tests/hooks/llm.test.ts +308 -0
- package/tests/hooks/message-sanitize.test.ts +36 -0
- package/tests/hooks/pain.test.ts +141 -0
- package/tests/hooks/progressive-trust-gate.test.ts +277 -0
- package/tests/hooks/prompt.test.ts +1411 -0
- package/tests/hooks/subagent.test.ts +467 -0
- package/tests/hooks/thinking-gate.test.ts +313 -0
- package/tests/http/principles-console-route.test.ts +140 -0
- package/tests/hygiene-tracker.test.ts +77 -0
- package/tests/index.integration.test.ts +179 -0
- package/tests/index.shadow-routing.integration.test.ts +140 -0
- package/tests/index.test.ts +9 -0
- package/tests/integration/empathy-workflow-integration.test.ts +627 -0
- package/tests/service/control-ui-query-service.test.ts +121 -0
- package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
- package/tests/service/evolution-worker.test.ts +585 -0
- package/tests/service/nocturnal-runtime.test.ts +470 -0
- package/tests/service/nocturnal-service.test.ts +577 -0
- package/tests/service/nocturnal-target-selector.test.ts +615 -0
- package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
- package/tests/service/phase3-input-filter.test.ts +289 -0
- package/tests/service/runtime-summary-service.test.ts +919 -0
- package/tests/task-compliance.test.ts +166 -0
- package/tests/test-utils.ts +48 -0
- package/tests/tools/critique-prompt.test.ts +260 -0
- package/tests/tools/deep-reflect.test.ts +232 -0
- package/tests/tools/model-index.test.ts +246 -0
- package/tests/ui/app.test.tsx +114 -0
- package/tests/utils/file-lock.test.ts +407 -0
- package/tests/utils/hashing.test.ts +32 -0
- package/tests/utils/io.test.ts +39 -0
- package/tests/utils/nlp.test.ts +53 -0
- package/tests/utils/plugin-logger.test.ts +156 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/ui/src/App.tsx +45 -0
- package/ui/src/api.ts +216 -0
- package/ui/src/charts.tsx +586 -0
- package/ui/src/components/ErrorState.tsx +6 -0
- package/ui/src/components/Loading.tsx +13 -0
- package/ui/src/components/ProtectedRoute.tsx +12 -0
- package/ui/src/components/Shell.tsx +91 -0
- package/ui/src/components/WorkspaceConfig.tsx +146 -0
- package/ui/src/components/index.ts +5 -0
- package/ui/src/context/auth.tsx +80 -0
- package/ui/src/context/theme.tsx +66 -0
- package/ui/src/hooks/useAutoRefresh.ts +39 -0
- package/ui/src/i18n/ui.ts +363 -0
- package/ui/src/main.tsx +16 -0
- package/ui/src/pages/EvolutionPage.tsx +352 -0
- package/ui/src/pages/FeedbackPage.tsx +140 -0
- package/ui/src/pages/GateMonitorPage.tsx +136 -0
- package/ui/src/pages/LoginPage.tsx +88 -0
- package/ui/src/pages/OverviewPage.tsx +238 -0
- package/ui/src/pages/SamplesPage.tsx +174 -0
- package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
- package/ui/src/styles.css +1661 -0
- package/ui/src/types.ts +368 -0
- package/ui/src/utils/format.ts +15 -0
- package/vitest.config.ts +23 -0
- package/dist/commands/capabilities.d.ts +0 -3
- package/dist/commands/capabilities.js +0 -73
- package/dist/commands/context.d.ts +0 -5
- package/dist/commands/evolution-status.d.ts +0 -4
- package/dist/commands/evolution-status.js +0 -117
- package/dist/commands/evolver.d.ts +0 -9
- package/dist/commands/evolver.js +0 -26
- package/dist/commands/export.d.ts +0 -2
- package/dist/commands/export.js +0 -98
- package/dist/commands/focus.d.ts +0 -14
- package/dist/commands/focus.js +0 -457
- package/dist/commands/nocturnal-review.d.ts +0 -24
- package/dist/commands/nocturnal-review.js +0 -265
- package/dist/commands/nocturnal-rollout.d.ts +0 -27
- package/dist/commands/nocturnal-rollout.js +0 -671
- package/dist/commands/nocturnal-train.d.ts +0 -25
- package/dist/commands/nocturnal-train.js +0 -919
- package/dist/commands/pain.d.ts +0 -5
- package/dist/commands/principle-rollback.d.ts +0 -4
- package/dist/commands/principle-rollback.js +0 -22
- package/dist/commands/rollback.d.ts +0 -19
- package/dist/commands/samples.d.ts +0 -2
- package/dist/commands/samples.js +0 -55
- package/dist/commands/strategy.d.ts +0 -3
- package/dist/commands/strategy.js +0 -29
- package/dist/commands/thinking-os.d.ts +0 -2
- package/dist/config/defaults/runtime.d.ts +0 -40
- package/dist/config/errors.d.ts +0 -84
- package/dist/config/errors.js +0 -94
- package/dist/config/index.js +0 -7
- package/dist/constants/diagnostician.d.ts +0 -12
- package/dist/constants/diagnostician.js +0 -56
- package/dist/constants/tools.d.ts +0 -17
- package/dist/constants/tools.js +0 -54
- package/dist/core/adaptive-thresholds.d.ts +0 -186
- package/dist/core/adaptive-thresholds.js +0 -300
- package/dist/core/config-service.d.ts +0 -15
- package/dist/core/config.d.ts +0 -127
- package/dist/core/control-ui-db.d.ts +0 -95
- package/dist/core/control-ui-db.js +0 -292
- package/dist/core/detection-funnel.d.ts +0 -33
- package/dist/core/detection-service.d.ts +0 -15
- package/dist/core/dictionary-service.d.ts +0 -15
- package/dist/core/dictionary.d.ts +0 -38
- package/dist/core/event-log.d.ts +0 -82
- package/dist/core/event-log.js +0 -463
- package/dist/core/evolution-engine.d.ts +0 -118
- package/dist/core/evolution-engine.js +0 -464
- package/dist/core/evolution-logger.d.ts +0 -137
- package/dist/core/evolution-logger.js +0 -256
- package/dist/core/evolution-migration.d.ts +0 -5
- package/dist/core/evolution-migration.js +0 -65
- package/dist/core/evolution-reducer.d.ts +0 -98
- package/dist/core/evolution-reducer.js +0 -465
- package/dist/core/evolution-types.d.ts +0 -287
- package/dist/core/evolution-types.js +0 -78
- package/dist/core/external-training-contract.d.ts +0 -276
- package/dist/core/external-training-contract.js +0 -269
- package/dist/core/focus-history.d.ts +0 -210
- package/dist/core/focus-history.js +0 -1185
- package/dist/core/hygiene/tracker.d.ts +0 -22
- package/dist/core/hygiene/tracker.js +0 -106
- package/dist/core/init.d.ts +0 -12
- package/dist/core/local-worker-routing.d.ts +0 -175
- package/dist/core/local-worker-routing.js +0 -525
- package/dist/core/migration.d.ts +0 -6
- package/dist/core/model-deployment-registry.d.ts +0 -218
- package/dist/core/model-deployment-registry.js +0 -503
- package/dist/core/model-training-registry.d.ts +0 -295
- package/dist/core/model-training-registry.js +0 -475
- package/dist/core/nocturnal-arbiter.d.ts +0 -159
- package/dist/core/nocturnal-arbiter.js +0 -534
- package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
- package/dist/core/nocturnal-candidate-scoring.js +0 -266
- package/dist/core/nocturnal-compliance.d.ts +0 -175
- package/dist/core/nocturnal-compliance.js +0 -824
- package/dist/core/nocturnal-dataset.d.ts +0 -224
- package/dist/core/nocturnal-dataset.js +0 -443
- package/dist/core/nocturnal-executability.d.ts +0 -85
- package/dist/core/nocturnal-executability.js +0 -331
- package/dist/core/nocturnal-export.d.ts +0 -124
- package/dist/core/nocturnal-export.js +0 -275
- package/dist/core/nocturnal-paths.d.ts +0 -124
- package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
- package/dist/core/nocturnal-trajectory-extractor.js +0 -307
- package/dist/core/nocturnal-trinity.d.ts +0 -311
- package/dist/core/nocturnal-trinity.js +0 -880
- package/dist/core/pain.d.ts +0 -4
- package/dist/core/pain.js +0 -70
- package/dist/core/path-resolver.d.ts +0 -46
- package/dist/core/paths.d.ts +0 -65
- package/dist/core/principle-training-state.d.ts +0 -121
- package/dist/core/principle-training-state.js +0 -321
- package/dist/core/profile.d.ts +0 -62
- package/dist/core/profile.js +0 -210
- package/dist/core/promotion-gate.d.ts +0 -238
- package/dist/core/promotion-gate.js +0 -529
- package/dist/core/risk-calculator.d.ts +0 -22
- package/dist/core/session-tracker.d.ts +0 -99
- package/dist/core/shadow-observation-registry.d.ts +0 -217
- package/dist/core/shadow-observation-registry.js +0 -308
- package/dist/core/system-logger.d.ts +0 -8
- package/dist/core/thinking-models.d.ts +0 -38
- package/dist/core/thinking-models.js +0 -170
- package/dist/core/training-program.d.ts +0 -233
- package/dist/core/training-program.js +0 -433
- package/dist/core/trajectory.d.ts +0 -411
- package/dist/core/trajectory.js +0 -1307
- package/dist/core/workspace-context.d.ts +0 -71
- package/dist/hooks/bash-risk.d.ts +0 -57
- package/dist/hooks/bash-risk.js +0 -137
- package/dist/hooks/edit-verification.d.ts +0 -62
- package/dist/hooks/edit-verification.js +0 -256
- package/dist/hooks/gate-block-helper.d.ts +0 -44
- package/dist/hooks/gate-block-helper.js +0 -119
- package/dist/hooks/gate.d.ts +0 -24
- package/dist/hooks/gate.js +0 -173
- package/dist/hooks/gfi-gate.d.ts +0 -40
- package/dist/hooks/gfi-gate.js +0 -113
- package/dist/hooks/lifecycle.d.ts +0 -5
- package/dist/hooks/lifecycle.js +0 -284
- package/dist/hooks/llm.d.ts +0 -12
- package/dist/hooks/message-sanitize.d.ts +0 -3
- package/dist/hooks/message-sanitize.js +0 -37
- package/dist/hooks/pain.d.ts +0 -5
- package/dist/hooks/pain.js +0 -301
- package/dist/hooks/progressive-trust-gate.d.ts +0 -51
- package/dist/hooks/progressive-trust-gate.js +0 -89
- package/dist/hooks/prompt.d.ts +0 -47
- package/dist/hooks/prompt.js +0 -884
- package/dist/hooks/subagent.d.ts +0 -10
- package/dist/hooks/subagent.js +0 -387
- package/dist/hooks/thinking-checkpoint.d.ts +0 -37
- package/dist/hooks/thinking-checkpoint.js +0 -51
- package/dist/hooks/trajectory-collector.d.ts +0 -32
- package/dist/hooks/trajectory-collector.js +0 -256
- package/dist/http/principles-console-route.d.ts +0 -9
- package/dist/http/principles-console-route.js +0 -567
- package/dist/i18n/commands.d.ts +0 -26
- package/dist/i18n/commands.js +0 -116
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -581
- package/dist/service/central-database.d.ts +0 -104
- package/dist/service/central-database.js +0 -649
- package/dist/service/control-ui-query-service.d.ts +0 -221
- package/dist/service/control-ui-query-service.js +0 -543
- package/dist/service/empathy-observer-manager.d.ts +0 -52
- package/dist/service/empathy-observer-manager.js +0 -229
- package/dist/service/evolution-query-service.d.ts +0 -155
- package/dist/service/evolution-query-service.js +0 -258
- package/dist/service/evolution-worker.d.ts +0 -101
- package/dist/service/evolution-worker.js +0 -974
- package/dist/service/nocturnal-runtime.d.ts +0 -183
- package/dist/service/nocturnal-service.d.ts +0 -163
- package/dist/service/nocturnal-service.js +0 -787
- package/dist/service/nocturnal-target-selector.d.ts +0 -145
- package/dist/service/nocturnal-target-selector.js +0 -315
- package/dist/service/phase3-input-filter.d.ts +0 -73
- package/dist/service/phase3-input-filter.js +0 -172
- package/dist/service/runtime-summary-service.d.ts +0 -122
- package/dist/service/runtime-summary-service.js +0 -485
- package/dist/service/trajectory-service.d.ts +0 -2
- package/dist/service/trajectory-service.js +0 -15
- package/dist/tools/critique-prompt.d.ts +0 -14
- package/dist/tools/deep-reflect.d.ts +0 -39
- package/dist/tools/deep-reflect.js +0 -350
- package/dist/tools/model-index.d.ts +0 -9
- package/dist/types/event-types.d.ts +0 -306
- package/dist/types/event-types.js +0 -106
- package/dist/types/hygiene-types.d.ts +0 -20
- package/dist/types/hygiene-types.js +0 -12
- package/dist/types/runtime-summary.d.ts +0 -47
- package/dist/types/runtime-summary.js +0 -1
- package/dist/types.d.ts +0 -50
- package/dist/types.js +0 -22
- package/dist/utils/file-lock.d.ts +0 -71
- package/dist/utils/file-lock.js +0 -309
- package/dist/utils/glob-match.d.ts +0 -28
- package/dist/utils/hashing.d.ts +0 -9
- package/dist/utils/io.d.ts +0 -6
- package/dist/utils/io.js +0 -106
- package/dist/utils/nlp.d.ts +0 -9
- package/dist/utils/plugin-logger.d.ts +0 -39
- package/dist/utils/subagent-probe.d.ts +0 -34
- package/dist/utils/subagent-probe.js +0 -81
|
@@ -1,32 +1,39 @@
|
|
|
1
|
-
import { resetFriction, getSession } from '../core/session-tracker.js';
|
|
1
|
+
import { trackFriction, resetFriction, getSession } from '../core/session-tracker.js';
|
|
2
2
|
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
3
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
|
+
import type { EmpathyEventStats } from '../types/event-types.js';
|
|
5
|
+
|
|
3
6
|
/**
|
|
4
7
|
* Creates a visual progress bar (e.g., [██████░░░░])
|
|
5
8
|
*/
|
|
6
|
-
function createProgressBar(value, max, length = 10) {
|
|
9
|
+
function createProgressBar(value: number, max: number, length: number = 10): string {
|
|
7
10
|
const filledLength = Math.round((value / max) * length);
|
|
8
11
|
const emptyLength = length - filledLength;
|
|
9
12
|
return `[${'█'.repeat(filledLength)}${'░'.repeat(emptyLength)}]`;
|
|
10
13
|
}
|
|
14
|
+
|
|
11
15
|
/**
|
|
12
16
|
* Creates a mini bar for daily trends
|
|
13
17
|
*/
|
|
14
|
-
function createMiniBar(count, max, length = 6) {
|
|
18
|
+
function createMiniBar(count: number, max: number, length: number = 6): string {
|
|
15
19
|
const filledLength = Math.round((count / max) * length);
|
|
16
20
|
return '█'.repeat(filledLength) + '░'.repeat(length - filledLength);
|
|
17
21
|
}
|
|
22
|
+
|
|
18
23
|
/**
|
|
19
24
|
* Format empathy stats for display
|
|
20
25
|
*/
|
|
21
|
-
function formatEmpathyCard(stats, range, isZh) {
|
|
26
|
+
function formatEmpathyCard(stats: EmpathyEventStats, range: string, isZh: boolean): string {
|
|
22
27
|
if (stats.totalEvents === 0 && stats.dedupedCount === 0) {
|
|
23
28
|
return isZh
|
|
24
29
|
? `🫀 **情绪事件统计** (${range})\n 暂无数据`
|
|
25
30
|
: `🫀 **Empathy Events** (${range})\n No data available`;
|
|
26
31
|
}
|
|
27
|
-
|
|
32
|
+
|
|
33
|
+
const lines: string[] = [];
|
|
28
34
|
lines.push(isZh ? `🫀 **情绪事件统计** (${range})` : `🫀 **Empathy Events** (${range})`);
|
|
29
35
|
lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
36
|
+
|
|
30
37
|
// Total events
|
|
31
38
|
const totalLabel = isZh ? '📊 总事件' : '📊 Total Events';
|
|
32
39
|
lines.push(`${totalLabel}: ${stats.totalEvents} 次`);
|
|
@@ -34,6 +41,7 @@ function formatEmpathyCard(stats, range, isZh) {
|
|
|
34
41
|
lines.push(` ├─ 😠 moderate: ${stats.bySeverity.moderate} 次 (${stats.scoreBySeverity.moderate}分)`);
|
|
35
42
|
lines.push(` └─ 😡 severe: ${stats.bySeverity.severe} 次 (${stats.scoreBySeverity.severe}分)`);
|
|
36
43
|
lines.push('');
|
|
44
|
+
|
|
37
45
|
// Dedupe hit rate
|
|
38
46
|
const dedupeRate = (stats.dedupeHitRate * 100).toFixed(0);
|
|
39
47
|
const dedupeLabel = isZh ? '🔄 去重命中率' : '🔄 Dedupe Hit Rate';
|
|
@@ -42,12 +50,14 @@ function formatEmpathyCard(stats, range, isZh) {
|
|
|
42
50
|
lines.push(isZh ? ' ↳ 避免了重复惩罚' : ' ↳ Prevented duplicate penalties');
|
|
43
51
|
}
|
|
44
52
|
lines.push('');
|
|
53
|
+
|
|
45
54
|
// Rollback info
|
|
46
55
|
if (stats.rollbackCount > 0) {
|
|
47
56
|
const rollbackLabel = isZh ? '↩️ 已回滚' : '↩️ Rolled Back';
|
|
48
57
|
lines.push(`${rollbackLabel}: ${stats.rollbackCount} 次 (${stats.rolledBackScore}分)`);
|
|
49
58
|
lines.push('');
|
|
50
59
|
}
|
|
60
|
+
|
|
51
61
|
// Daily trend
|
|
52
62
|
if (stats.dailyTrend.length > 1) {
|
|
53
63
|
const trendLabel = isZh ? '📈 趋势 (按天)' : '📈 Trend (by day)';
|
|
@@ -59,28 +69,35 @@ function formatEmpathyCard(stats, range, isZh) {
|
|
|
59
69
|
lines.push(` ${dateStr}: ${bar} ${day.count}次`);
|
|
60
70
|
}
|
|
61
71
|
}
|
|
72
|
+
|
|
62
73
|
// Detection mode distribution
|
|
63
74
|
if (stats.byDetectionMode.structured > 0 || stats.byDetectionMode.legacy_tag > 0) {
|
|
64
75
|
lines.push('');
|
|
65
76
|
const modeLabel = isZh ? '🔍 检测模式' : '🔍 Detection Mode';
|
|
66
77
|
lines.push(`${modeLabel}: 结构化 ${stats.byDetectionMode.structured} | 标签 ${stats.byDetectionMode.legacy_tag}`);
|
|
67
78
|
}
|
|
79
|
+
|
|
68
80
|
return lines.join('\n');
|
|
69
81
|
}
|
|
82
|
+
|
|
70
83
|
/**
|
|
71
84
|
* Handles the /pd-status command
|
|
72
85
|
*/
|
|
73
|
-
export function handlePainCommand(ctx) {
|
|
74
|
-
const workspaceDir = ctx.config?.workspaceDir || process.cwd();
|
|
86
|
+
export function handlePainCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
87
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
88
|
+
|
|
75
89
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
76
|
-
const lang = ctx.config?.language || 'en';
|
|
90
|
+
const lang = (ctx.config?.language as string) || 'en';
|
|
77
91
|
const isZh = lang === 'zh';
|
|
78
|
-
const sessionId = ctx.sessionId;
|
|
92
|
+
const sessionId = (ctx as any).sessionId;
|
|
93
|
+
|
|
79
94
|
const args = (ctx.args || '').trim();
|
|
95
|
+
|
|
80
96
|
// Handle empathy subcommand
|
|
81
97
|
if (args.startsWith('empathy')) {
|
|
82
98
|
return handleEmpathySubcommand(wctx, args, sessionId, isZh);
|
|
83
99
|
}
|
|
100
|
+
|
|
84
101
|
if (args === 'reset') {
|
|
85
102
|
if (sessionId) {
|
|
86
103
|
resetFriction(sessionId);
|
|
@@ -88,6 +105,7 @@ export function handlePainCommand(ctx) {
|
|
|
88
105
|
}
|
|
89
106
|
return { text: isZh ? `❌ 无法识别当前会话。` : `❌ Session ID not found. Use /pd-status reset in a chat session.` };
|
|
90
107
|
}
|
|
108
|
+
|
|
91
109
|
if (args === 'data') {
|
|
92
110
|
const stats = wctx.trajectory.getDataStats();
|
|
93
111
|
return {
|
|
@@ -96,33 +114,31 @@ export function handlePainCommand(ctx) {
|
|
|
96
114
|
: `Trajectory Data Status\n- DB: ${stats.dbPath}\n- assistant turns: ${stats.assistantTurns}\n- user turns: ${stats.userTurns}\n- tool calls: ${stats.toolCalls}\n- pain events: ${stats.painEvents}\n- pending samples: ${stats.pendingSamples}\n- approved samples: ${stats.approvedSamples}\n- blob bytes: ${stats.blobBytes}\n- last ingest: ${stats.lastIngestAt ?? 'none'}`
|
|
97
115
|
};
|
|
98
116
|
}
|
|
117
|
+
|
|
99
118
|
// Default: Show status
|
|
100
119
|
const session = sessionId ? getSession(sessionId) : undefined;
|
|
101
120
|
const gfi = session ? session.currentGfi : 0;
|
|
102
121
|
const dictionary = wctx.dictionary;
|
|
103
122
|
const stats = dictionary.getStats();
|
|
123
|
+
|
|
104
124
|
const gfiBar = createProgressBar(gfi, 100, 15);
|
|
125
|
+
|
|
105
126
|
// Determine Mental Mode (aligned with prompt.ts logic)
|
|
106
127
|
let mentalMode = '';
|
|
107
128
|
if (isZh) {
|
|
108
|
-
if (gfi >= 70)
|
|
109
|
-
|
|
110
|
-
else
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
else {
|
|
116
|
-
if (gfi >= 70)
|
|
117
|
-
mentalMode = '🚑 HUMBLE_RECOVERY';
|
|
118
|
-
else if (gfi >= 40)
|
|
119
|
-
mentalMode = '🤝 CONCILIATORY';
|
|
120
|
-
else
|
|
121
|
-
mentalMode = '⚡ EFFICIENT';
|
|
129
|
+
if (gfi >= 70) mentalMode = '🚑 救赎模式 (HUMBLE_RECOVERY)';
|
|
130
|
+
else if (gfi >= 40) mentalMode = '🤝 安抚模式 (CONCILIATORY)';
|
|
131
|
+
else mentalMode = '⚡ 高效模式 (EFFICIENT)';
|
|
132
|
+
} else {
|
|
133
|
+
if (gfi >= 70) mentalMode = '🚑 HUMBLE_RECOVERY';
|
|
134
|
+
else if (gfi >= 40) mentalMode = '🤝 CONCILIATORY';
|
|
135
|
+
else mentalMode = '⚡ EFFICIENT';
|
|
122
136
|
}
|
|
137
|
+
|
|
123
138
|
// Determine health status based on GFI
|
|
124
139
|
let healthLabel = 'Healthy';
|
|
125
140
|
let suggestionText = '';
|
|
141
|
+
|
|
126
142
|
if (isZh) {
|
|
127
143
|
if (gfi > 80) {
|
|
128
144
|
healthLabel = '极度疲劳 🔴';
|
|
@@ -132,14 +148,10 @@ export function handlePainCommand(ctx) {
|
|
|
132
148
|
2. 让 AI 调用 \`deep_reflect\` 工具进行深度反思。
|
|
133
149
|
3. 如果当前上下文太乱,考虑使用 \`/clear\` 开启新会话。`;
|
|
134
150
|
}
|
|
135
|
-
else if (gfi > 50)
|
|
136
|
-
|
|
137
|
-
else
|
|
138
|
-
|
|
139
|
-
else
|
|
140
|
-
healthLabel = '运转良好 🟢';
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
151
|
+
else if (gfi > 50) healthLabel = '遇到阻力 🟡';
|
|
152
|
+
else if (gfi > 20) healthLabel = '轻微受挫 🟢';
|
|
153
|
+
else healthLabel = '运转良好 🟢';
|
|
154
|
+
} else {
|
|
143
155
|
if (gfi > 80) {
|
|
144
156
|
healthLabel = 'Critical 🔴';
|
|
145
157
|
suggestionText = `
|
|
@@ -148,13 +160,11 @@ export function handlePainCommand(ctx) {
|
|
|
148
160
|
2. Ask the AI to use the \`deep_reflect\` tool.
|
|
149
161
|
4. Consider starting a new session with \`/clear\`.`;
|
|
150
162
|
}
|
|
151
|
-
else if (gfi > 50)
|
|
152
|
-
|
|
153
|
-
else
|
|
154
|
-
healthLabel = 'Minor Issues 🟢';
|
|
155
|
-
else
|
|
156
|
-
healthLabel = 'Healthy 🟢';
|
|
163
|
+
else if (gfi > 50) healthLabel = 'High Friction 🟡';
|
|
164
|
+
else if (gfi > 20) healthLabel = 'Minor Issues 🟢';
|
|
165
|
+
else healthLabel = 'Healthy 🟢';
|
|
157
166
|
}
|
|
167
|
+
|
|
158
168
|
// Get session empathy stats for inline display
|
|
159
169
|
const sessionEmpathy = sessionId ? wctx.eventLog.getEmpathyStats('session', sessionId) : null;
|
|
160
170
|
let empathyInline = '';
|
|
@@ -163,6 +173,7 @@ export function handlePainCommand(ctx) {
|
|
|
163
173
|
? `\n🫀 **情绪事件 (当前会话)**: ${sessionEmpathy.totalEvents} 次 (${sessionEmpathy.totalPenaltyScore}分)`
|
|
164
174
|
: `\n🫀 **Empathy Events (Session)**: ${sessionEmpathy.totalEvents} (${sessionEmpathy.totalPenaltyScore}pts)`;
|
|
165
175
|
}
|
|
176
|
+
|
|
166
177
|
if (isZh) {
|
|
167
178
|
let text = `📊 **Principles Disciple - 系统健康度监控**\n`;
|
|
168
179
|
text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
@@ -173,15 +184,14 @@ export function handlePainCommand(ctx) {
|
|
|
173
184
|
text += `\n\n🧠 **痛苦进化词典**: 已吸收 ${stats.totalRules} 条规则\n`;
|
|
174
185
|
text += ` ↳ 累计帮您拦截了 ${stats.totalHits} 次无效操作\n`;
|
|
175
186
|
text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
187
|
+
|
|
176
188
|
if (suggestionText) {
|
|
177
189
|
text += suggestionText;
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
190
|
+
} else {
|
|
180
191
|
text += `*💡 提示: 使用 \`/pd-status empathy\` 查看详细情绪事件统计。*`;
|
|
181
192
|
}
|
|
182
193
|
return { text };
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
194
|
+
} else {
|
|
185
195
|
let text = `📊 **Principles Disciple - System Health Monitor**\n`;
|
|
186
196
|
text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
187
197
|
text += `💊 **Current Friction (GFI)**: ${gfiBar} ${gfi}/100\n`;
|
|
@@ -191,30 +201,35 @@ export function handlePainCommand(ctx) {
|
|
|
191
201
|
text += `\n\n🧠 **Evolution Dictionary**: ${stats.totalRules} active rules\n`;
|
|
192
202
|
text += ` ↳ Successfully blocked ${stats.totalHits} invalid operations\n`;
|
|
193
203
|
text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
204
|
+
|
|
194
205
|
if (suggestionText) {
|
|
195
206
|
text += suggestionText;
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
207
|
+
} else {
|
|
198
208
|
text += `*💡 Hint: Use \`/pd-status empathy\` to view detailed empathy event statistics.*`;
|
|
199
209
|
}
|
|
200
210
|
return { text };
|
|
201
211
|
}
|
|
202
212
|
}
|
|
213
|
+
|
|
203
214
|
/**
|
|
204
215
|
* Handle /pd-status empathy subcommand
|
|
205
216
|
*/
|
|
206
|
-
function handleEmpathySubcommand(
|
|
217
|
+
function handleEmpathySubcommand(
|
|
218
|
+
wctx: WorkspaceContext,
|
|
219
|
+
args: string,
|
|
220
|
+
sessionId: string | undefined,
|
|
221
|
+
isZh: boolean
|
|
222
|
+
): PluginCommandResult {
|
|
207
223
|
// Parse range argument
|
|
208
|
-
let range = 'today';
|
|
224
|
+
let range: 'today' | 'week' | 'session' = 'today';
|
|
209
225
|
if (args.includes('--week') || args.includes('-w')) {
|
|
210
226
|
range = 'week';
|
|
211
|
-
}
|
|
212
|
-
else if (args.includes('--session') || args.includes('-s')) {
|
|
227
|
+
} else if (args.includes('--session') || args.includes('-s')) {
|
|
213
228
|
range = 'session';
|
|
214
|
-
}
|
|
215
|
-
else if (args.includes('--today') || args.includes('-t')) {
|
|
229
|
+
} else if (args.includes('--today') || args.includes('-t')) {
|
|
216
230
|
range = 'today';
|
|
217
231
|
}
|
|
232
|
+
|
|
218
233
|
// Validate session range
|
|
219
234
|
if (range === 'session' && !sessionId) {
|
|
220
235
|
return {
|
|
@@ -223,16 +238,20 @@ function handleEmpathySubcommand(wctx, args, sessionId, isZh) {
|
|
|
223
238
|
: `❌ Session not found. Use this command in a chat session.`
|
|
224
239
|
};
|
|
225
240
|
}
|
|
241
|
+
|
|
226
242
|
const stats = wctx.eventLog.getEmpathyStats(range, sessionId);
|
|
227
243
|
const rangeLabel = isZh
|
|
228
244
|
? { today: '今天', week: '最近 7 天', session: '当前会话' }[range]
|
|
229
245
|
: { today: 'Today', week: 'Last 7 Days', session: 'Current Session' }[range];
|
|
246
|
+
|
|
230
247
|
let text = formatEmpathyCard(stats, rangeLabel, isZh);
|
|
248
|
+
|
|
231
249
|
// Add usage hint
|
|
232
250
|
if (range === 'today') {
|
|
233
251
|
text += isZh
|
|
234
252
|
? `\n\n*💡 使用 \`/pd-status empathy --week\` 查看周统计,\`--session\` 查看会话统计。*`
|
|
235
253
|
: `\n\n*💡 Use \`/pd-status empathy --week\` for weekly stats, \`--session\` for session stats.*`;
|
|
236
254
|
}
|
|
255
|
+
|
|
237
256
|
return { text };
|
|
238
257
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EvolutionReducerImpl } from '../core/evolution-reducer.js';
|
|
2
|
+
import type { PluginCommandContext } from '../openclaw-sdk.js';
|
|
3
|
+
|
|
4
|
+
export function handlePrincipleRollbackCommand(ctx: PluginCommandContext): { text: string } {
|
|
5
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
6
|
+
const argText = (ctx.args || '').trim();
|
|
7
|
+
const [principleId = '', ...reasonParts] = argText.split(/\s+/);
|
|
8
|
+
const reason = (reasonParts.join(' ') || 'manual rollback').trim();
|
|
9
|
+
const isZh = (ctx.config?.language as string)?.startsWith('zh');
|
|
10
|
+
|
|
11
|
+
if (!principleId) {
|
|
12
|
+
return { text: isZh ? '用法: /pd-principle-rollback <principleId> [reason]' : 'Usage: /pd-principle-rollback <principleId> [reason]' };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const reducer = new EvolutionReducerImpl({ workspaceDir });
|
|
16
|
+
const principle = reducer.getPrincipleById(principleId);
|
|
17
|
+
if (!principle) {
|
|
18
|
+
return { text: isZh ? `未找到原则: ${principleId}` : `Principle not found: ${principleId}` };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
reducer.rollbackPrinciple(principleId, reason);
|
|
22
|
+
return {
|
|
23
|
+
text: isZh
|
|
24
|
+
? `✅ 已回滚原则 ${principleId}\n原因: ${reason}`
|
|
25
|
+
: `✅ Rolled back principle ${principleId}\nReason: ${reason}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -1,19 +1,24 @@
|
|
|
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
5
|
/**
|
|
4
6
|
* Handles the /pd-rollback command
|
|
5
|
-
*
|
|
7
|
+
*
|
|
6
8
|
* Usage:
|
|
7
9
|
* /pd-rollback <event-id> - Rollback a specific empathy event by ID
|
|
8
10
|
* /pd-rollback last - Rollback the last empathy event in current session
|
|
9
11
|
*/
|
|
10
|
-
export function handleRollbackCommand(ctx) {
|
|
11
|
-
const workspaceDir = ctx.config?.workspaceDir || process.cwd();
|
|
12
|
+
export function handleRollbackCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
13
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
14
|
+
|
|
12
15
|
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
13
|
-
const lang = ctx.config?.language || 'en';
|
|
16
|
+
const lang = (ctx.config?.language as string) || 'en';
|
|
14
17
|
const isZh = lang === 'zh';
|
|
15
|
-
const sessionId = ctx.sessionId;
|
|
18
|
+
const sessionId = (ctx as any).sessionId;
|
|
19
|
+
|
|
16
20
|
const args = (ctx.args || '').trim();
|
|
21
|
+
|
|
17
22
|
if (!args) {
|
|
18
23
|
return {
|
|
19
24
|
text: isZh
|
|
@@ -29,6 +34,7 @@ Usage:
|
|
|
29
34
|
/pd-rollback last - Rollback the last event in current session`
|
|
30
35
|
};
|
|
31
36
|
}
|
|
37
|
+
|
|
32
38
|
if (!sessionId) {
|
|
33
39
|
return {
|
|
34
40
|
text: isZh
|
|
@@ -36,8 +42,10 @@ Usage:
|
|
|
36
42
|
: `❌ Session ID not found. Use this command in a chat session.`
|
|
37
43
|
};
|
|
38
44
|
}
|
|
39
|
-
|
|
40
|
-
let
|
|
45
|
+
|
|
46
|
+
let eventId: string | null = null;
|
|
47
|
+
let triggerMethod: 'user_command' = 'user_command';
|
|
48
|
+
|
|
41
49
|
if (args === 'last') {
|
|
42
50
|
// Find the last empathy event in current session
|
|
43
51
|
eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
|
|
@@ -48,13 +56,19 @@ Usage:
|
|
|
48
56
|
: `❌ No empathy events found in current session to rollback.`
|
|
49
57
|
};
|
|
50
58
|
}
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
59
|
+
} else {
|
|
53
60
|
// Use the provided event ID
|
|
54
61
|
eventId = args;
|
|
55
62
|
}
|
|
63
|
+
|
|
56
64
|
// Perform rollback
|
|
57
|
-
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
|
|
65
|
+
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
|
|
66
|
+
eventId,
|
|
67
|
+
sessionId,
|
|
68
|
+
isZh ? '用户手动回滚' : 'User manual rollback',
|
|
69
|
+
'user_command'
|
|
70
|
+
);
|
|
71
|
+
|
|
58
72
|
if (rolledBackScore === 0) {
|
|
59
73
|
return {
|
|
60
74
|
text: isZh
|
|
@@ -62,11 +76,13 @@ Usage:
|
|
|
62
76
|
: `❌ Failed to rollback event "${eventId}". Event may not exist or was deduped.`
|
|
63
77
|
};
|
|
64
78
|
}
|
|
79
|
+
|
|
65
80
|
// Reduce the GFI by the rolled back score
|
|
66
81
|
resetFriction(sessionId, workspaceDir, {
|
|
67
82
|
source: 'user_empathy',
|
|
68
83
|
amount: rolledBackScore,
|
|
69
84
|
});
|
|
85
|
+
|
|
70
86
|
return {
|
|
71
87
|
text: isZh
|
|
72
88
|
? `✅ 已回滚情绪事件
|
|
@@ -81,12 +97,18 @@ Usage:
|
|
|
81
97
|
💡 Hint: Session friction has been reset.`
|
|
82
98
|
};
|
|
83
99
|
}
|
|
100
|
+
|
|
84
101
|
/**
|
|
85
102
|
* Handle natural language rollback request
|
|
86
103
|
* Called from prompt hook when user says things like "撤销刚才的惩罚"
|
|
87
104
|
*/
|
|
88
|
-
export function handleNaturalLanguageRollback(
|
|
105
|
+
export function handleNaturalLanguageRollback(
|
|
106
|
+
wctx: WorkspaceContext,
|
|
107
|
+
sessionId: string | undefined,
|
|
108
|
+
reason: string
|
|
109
|
+
): { success: boolean; score: number; message: string } {
|
|
89
110
|
const isZh = wctx.config.get('language') === 'zh';
|
|
111
|
+
|
|
90
112
|
if (!sessionId) {
|
|
91
113
|
return {
|
|
92
114
|
success: false,
|
|
@@ -94,6 +116,7 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
|
|
|
94
116
|
message: isZh ? '无法识别当前会话' : 'Session not found'
|
|
95
117
|
};
|
|
96
118
|
}
|
|
119
|
+
|
|
97
120
|
const eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
|
|
98
121
|
if (!eventId) {
|
|
99
122
|
return {
|
|
@@ -102,7 +125,14 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
|
|
|
102
125
|
message: isZh ? '当前会话没有可回滚的情绪事件' : 'No empathy events to rollback'
|
|
103
126
|
};
|
|
104
127
|
}
|
|
105
|
-
|
|
128
|
+
|
|
129
|
+
const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
|
|
130
|
+
eventId,
|
|
131
|
+
sessionId,
|
|
132
|
+
reason,
|
|
133
|
+
'natural_language'
|
|
134
|
+
);
|
|
135
|
+
|
|
106
136
|
if (rolledBackScore === 0) {
|
|
107
137
|
return {
|
|
108
138
|
success: false,
|
|
@@ -110,11 +140,13 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
|
|
|
110
140
|
message: isZh ? '回滚失败,事件可能不存在' : 'Rollback failed, event may not exist'
|
|
111
141
|
};
|
|
112
142
|
}
|
|
143
|
+
|
|
113
144
|
// Reduce only the empathy slice instead of wiping the whole session GFI.
|
|
114
145
|
resetFriction(sessionId, wctx.workspaceDir, {
|
|
115
146
|
source: 'user_empathy',
|
|
116
147
|
amount: rolledBackScore,
|
|
117
148
|
});
|
|
149
|
+
|
|
118
150
|
return {
|
|
119
151
|
success: true,
|
|
120
152
|
score: rolledBackScore,
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
3
|
+
|
|
4
|
+
function isZh(ctx: PluginCommandContext): boolean {
|
|
5
|
+
return String(ctx.config?.language || 'en').startsWith('zh');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function handleSamplesCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
9
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
10
|
+
const zh = isZh(ctx);
|
|
11
|
+
const args = (ctx.args || '').trim();
|
|
12
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
13
|
+
|
|
14
|
+
if (args.startsWith('review ')) {
|
|
15
|
+
const [, decision = '', sampleId = '', ...noteParts] = args.split(/\s+/);
|
|
16
|
+
if (decision !== 'approve' && decision !== 'reject') {
|
|
17
|
+
return {
|
|
18
|
+
text: zh
|
|
19
|
+
? '无效的审核动作。请使用 `review approve <sample-id> [note]` 或 `review reject <sample-id> [note]`。'
|
|
20
|
+
: 'Invalid review action. Use `review approve <sample-id> [note]` or `review reject <sample-id> [note]`.',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (!sampleId) {
|
|
24
|
+
return {
|
|
25
|
+
text: zh
|
|
26
|
+
? '缺少 sample-id。'
|
|
27
|
+
: 'Missing sample-id.',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const normalizedDecision = decision === 'approve' ? 'approved' : 'rejected';
|
|
31
|
+
const note = noteParts.join(' ').trim();
|
|
32
|
+
let record;
|
|
33
|
+
try {
|
|
34
|
+
record = wctx.trajectory.reviewCorrectionSample(sampleId, normalizedDecision, note);
|
|
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
|
+
|
|
49
|
+
const samples = wctx.trajectory.listCorrectionSamples('pending');
|
|
50
|
+
if (samples.length === 0) {
|
|
51
|
+
return { text: zh ? '当前没有待审核纠错样本。' : 'No pending correction samples.' };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const lines = samples.map((sample) => `- ${sample.sampleId} | session=${sample.sessionId} | score=${sample.qualityScore}`);
|
|
55
|
+
return {
|
|
56
|
+
text: zh
|
|
57
|
+
? `待审核纠错样本:\n${lines.join('\n')}`
|
|
58
|
+
: `Pending correction samples:\n${lines.join('\n')}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
2
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
3
|
+
|
|
4
|
+
export function handleInitStrategy(ctx: PluginCommandContext): PluginCommandResult {
|
|
5
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
6
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
7
|
+
|
|
8
|
+
const okrDir = wctx.resolve('OKR_DIR').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
9
|
+
const focusPath = wctx.resolve('CURRENT_FOCUS').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
10
|
+
const userContextPath = wctx.resolve('USER_CONTEXT').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
text:
|
|
14
|
+
`🎯 **Strategy Initialization**\n\n` +
|
|
15
|
+
`The Agent will now conduct a deep interview to establish your project's vision and strategic OKRs.\n\n` +
|
|
16
|
+
`**Instructions for Agent:** Read \`${okrDir}/\` for existing context. ` +
|
|
17
|
+
`Generate \`${focusPath}\` with the top 1-3 strategic focus areas based on the user interview. ` +
|
|
18
|
+
`Then update \`${userContextPath}\` with key user preferences discovered.`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function handleManageOkr(ctx: PluginCommandContext): PluginCommandResult {
|
|
23
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
24
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
25
|
+
|
|
26
|
+
const focusPath = wctx.resolve('CURRENT_FOCUS').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
27
|
+
const weekStatePath = wctx.resolve('WEEK_STATE').replace(workspaceDir, '').replace(/^\/+/, '');
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
text:
|
|
31
|
+
`📊 **OKR Management**\n\n` +
|
|
32
|
+
`The Agent will analyze recent work and align sub-agent objectives.\n\n` +
|
|
33
|
+
`**Instructions for Agent:** Read \`${focusPath}\` and \`${weekStatePath}\`. ` +
|
|
34
|
+
`Compare them against recent session history. ` +
|
|
35
|
+
`Update OKRs as needed and output a brief alignment report. ` +
|
|
36
|
+
`If OKRs are stale (>7 days), prompt the user for a re-alignment conversation.`,
|
|
37
|
+
};
|
|
38
|
+
}
|