principles-disciple 1.8.1 → 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 +4 -4
- package/package.json +11 -13
- 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} +175 -62
- 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} +160 -80
- 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} +235 -79
- 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/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
- 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/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
- 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 -129
- 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 -101
- 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 -13
- 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 -52
- package/dist/hooks/progressive-trust-gate.js +0 -134
- package/dist/hooks/prompt.d.ts +0 -49
- package/dist/hooks/prompt.js +0 -905
- 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 -681
- 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 -88
- package/dist/service/empathy-observer-manager.js +0 -414
- 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 -975
- package/dist/service/health-query-service.d.ts +0 -170
- package/dist/service/health-query-service.js +0 -662
- 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/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
- package/dist/service/subagent-workflow/index.d.ts +0 -4
- package/dist/service/subagent-workflow/index.js +0 -3
- package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
- package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
- package/dist/service/subagent-workflow/types.js +0 -11
- package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
- package/dist/service/subagent-workflow/workflow-store.js +0 -165
- 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
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
5
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
6
|
+
|
|
7
|
+
const TOOLS_TO_SCAN = [
|
|
8
|
+
{ name: 'rg', cmd: ['rg', '--version'] },
|
|
9
|
+
{ name: 'sg', cmd: ['sg', '--version'] },
|
|
10
|
+
{ name: 'fd', cmd: ['fd', '--version'] },
|
|
11
|
+
{ name: 'qmd', cmd: ['qmd', '--version'] },
|
|
12
|
+
{ name: 'ast-grep', cmd: ['ast-grep', '--version'] },
|
|
13
|
+
{ name: 'shellcheck', cmd: ['shellcheck', '--version'] },
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
function scanEnvironment(wctx: WorkspaceContext): any {
|
|
17
|
+
const tools: Record<string, { available: boolean; version?: string }> = {};
|
|
18
|
+
|
|
19
|
+
for (const tool of TOOLS_TO_SCAN) {
|
|
20
|
+
try {
|
|
21
|
+
const output = execSync(tool.cmd.join(' '), { stdio: ['ignore', 'pipe', 'ignore'] }).toString();
|
|
22
|
+
tools[tool.name] = {
|
|
23
|
+
available: true,
|
|
24
|
+
version: output.split('\n')[0].trim(),
|
|
25
|
+
};
|
|
26
|
+
} catch (_e) {
|
|
27
|
+
tools[tool.name] = { available: false };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const capabilities = {
|
|
32
|
+
platform: process.platform,
|
|
33
|
+
arch: process.arch,
|
|
34
|
+
node: process.version,
|
|
35
|
+
tools,
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const capsPath = wctx.resolve('SYSTEM_CAPABILITIES');
|
|
40
|
+
const capsDir = path.dirname(capsPath);
|
|
41
|
+
if (!fs.existsSync(capsDir)) {
|
|
42
|
+
fs.mkdirSync(capsDir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
fs.writeFileSync(capsPath, JSON.stringify(capabilities, null, 2), 'utf8');
|
|
45
|
+
|
|
46
|
+
return capabilities;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function handleBootstrapTools(ctx: PluginCommandContext): PluginCommandResult {
|
|
50
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
51
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const caps = scanEnvironment(wctx);
|
|
55
|
+
const toolsMap = caps.tools as Record<string, { available: boolean }>;
|
|
56
|
+
const available = Object.entries(toolsMap)
|
|
57
|
+
.filter(([, data]) => data.available)
|
|
58
|
+
.map(([name]) => `\`${name}\``)
|
|
59
|
+
.join(', ');
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
text:
|
|
63
|
+
`🔍 Environment perception complete.\n` +
|
|
64
|
+
`**Detected tools:** ${available || '(none)'}\n` +
|
|
65
|
+
`**Platform:** ${process.platform}\n` +
|
|
66
|
+
`Capabilities saved to \`.state/SYSTEM_CAPABILITIES.json\`.`,
|
|
67
|
+
};
|
|
68
|
+
} catch (err) {
|
|
69
|
+
return { text: `❌ bootstrap-tools failed: ${err instanceof Error ? err.message : String(err)}` };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function handleResearchTools(ctx: PluginCommandContext): PluginCommandResult {
|
|
74
|
+
const category = ctx.args?.trim() || "modern high-performance CLI tools for coding and architecture";
|
|
75
|
+
|
|
76
|
+
return {
|
|
77
|
+
text:
|
|
78
|
+
`🚀 **Tool Evolution Research Initiated**\n\n` +
|
|
79
|
+
`**Instructions for Agent:**\n` +
|
|
80
|
+
`1. Use \`google_web_search\` or \`web_search_exa\` to find the latest tools in the category: "${category}".\n` +
|
|
81
|
+
`2. Compare findings with current capabilities in \`.state/SYSTEM_CAPABILITIES.json\`.\n` +
|
|
82
|
+
`3. Focus on tools that improve speed (like \`rg\`, \`sg\`), documentation (like \`qmd\`), or automation.\n` +
|
|
83
|
+
`4. Output a "Tool Upgrade Proposal" with installation commands and justification.`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -1,49 +1,56 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
4
|
+
import { ContextInjectionConfig, defaultContextConfig } from '../types.js';
|
|
4
5
|
import { loadContextInjectionConfig } from '../hooks/prompt.js';
|
|
6
|
+
|
|
5
7
|
/**
|
|
6
8
|
* Get workspace directory from context
|
|
7
9
|
*/
|
|
8
|
-
function getWorkspaceDir(ctx) {
|
|
9
|
-
const workspaceDir = ctx.config?.workspaceDir || process.cwd();
|
|
10
|
+
function getWorkspaceDir(ctx: PluginCommandContext): string {
|
|
11
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
10
12
|
if (!workspaceDir) {
|
|
11
13
|
throw new Error('[PD:Context] workspaceDir is required but not provided');
|
|
12
14
|
}
|
|
13
15
|
return workspaceDir;
|
|
14
16
|
}
|
|
17
|
+
|
|
15
18
|
/**
|
|
16
19
|
* Save context injection config to PROFILE.json
|
|
17
20
|
*/
|
|
18
|
-
function saveConfig(workspaceDir, config) {
|
|
21
|
+
function saveConfig(workspaceDir: string, config: ContextInjectionConfig): boolean {
|
|
19
22
|
const profilePath = path.join(workspaceDir, '.principles', 'PROFILE.json');
|
|
23
|
+
|
|
20
24
|
try {
|
|
21
25
|
// Ensure directory exists
|
|
22
26
|
const dir = path.dirname(profilePath);
|
|
23
27
|
if (!fs.existsSync(dir)) {
|
|
24
28
|
fs.mkdirSync(dir, { recursive: true });
|
|
25
29
|
}
|
|
30
|
+
|
|
26
31
|
// Load existing profile or create new one
|
|
27
|
-
let profile = {};
|
|
32
|
+
let profile: Record<string, unknown> = {};
|
|
28
33
|
if (fs.existsSync(profilePath)) {
|
|
29
34
|
const raw = fs.readFileSync(profilePath, 'utf-8');
|
|
30
35
|
profile = JSON.parse(raw);
|
|
31
36
|
}
|
|
37
|
+
|
|
32
38
|
// Update contextInjection
|
|
33
39
|
profile.contextInjection = config;
|
|
40
|
+
|
|
34
41
|
// Write back
|
|
35
42
|
fs.writeFileSync(profilePath, JSON.stringify(profile, null, 2), 'utf-8');
|
|
36
43
|
return true;
|
|
37
|
-
}
|
|
38
|
-
catch (e) {
|
|
44
|
+
} catch (e) {
|
|
39
45
|
console.error(`[PD:Context] Failed to save config: ${String(e)}`);
|
|
40
46
|
return false;
|
|
41
47
|
}
|
|
42
48
|
}
|
|
49
|
+
|
|
43
50
|
/**
|
|
44
51
|
* Format project focus value for display
|
|
45
52
|
*/
|
|
46
|
-
function formatProjectFocus(value, isZh) {
|
|
53
|
+
function formatProjectFocus(value: 'full' | 'summary' | 'off', isZh: boolean): string {
|
|
47
54
|
const labels = {
|
|
48
55
|
full: { zh: '📦 完整', en: '📦 Full' },
|
|
49
56
|
summary: { zh: '📝 摘要', en: '📝 Summary' },
|
|
@@ -51,11 +58,13 @@ function formatProjectFocus(value, isZh) {
|
|
|
51
58
|
};
|
|
52
59
|
return labels[value][isZh ? 'zh' : 'en'];
|
|
53
60
|
}
|
|
61
|
+
|
|
54
62
|
/**
|
|
55
63
|
* Show current context injection status
|
|
56
64
|
*/
|
|
57
|
-
function showStatus(workspaceDir, isZh) {
|
|
65
|
+
function showStatus(workspaceDir: string, isZh: boolean): string {
|
|
58
66
|
const config = loadContextInjectionConfig(workspaceDir);
|
|
67
|
+
|
|
59
68
|
if (isZh) {
|
|
60
69
|
return `
|
|
61
70
|
📊 **上下文注入状态**
|
|
@@ -69,8 +78,7 @@ function showStatus(workspaceDir, isZh) {
|
|
|
69
78
|
|
|
70
79
|
💡 输入 \`/pd-context help\` 查看更多选项
|
|
71
80
|
`.trim();
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
81
|
+
} else {
|
|
74
82
|
return `
|
|
75
83
|
📊 **Context Injection Status**
|
|
76
84
|
|
|
@@ -85,75 +93,95 @@ function showStatus(workspaceDir, isZh) {
|
|
|
85
93
|
`.trim();
|
|
86
94
|
}
|
|
87
95
|
}
|
|
96
|
+
|
|
88
97
|
/**
|
|
89
98
|
* Toggle a boolean setting
|
|
90
99
|
*/
|
|
91
|
-
function toggleSetting(
|
|
100
|
+
function toggleSetting(
|
|
101
|
+
workspaceDir: string,
|
|
102
|
+
key: 'thinkingOs' | 'reflectionLog',
|
|
103
|
+
value: string,
|
|
104
|
+
isZh: boolean
|
|
105
|
+
): string {
|
|
92
106
|
const config = loadContextInjectionConfig(workspaceDir);
|
|
93
107
|
const oldValue = config[key];
|
|
108
|
+
|
|
94
109
|
if (value === 'on') {
|
|
95
110
|
config[key] = true;
|
|
96
|
-
}
|
|
97
|
-
else if (value === 'off') {
|
|
111
|
+
} else if (value === 'off') {
|
|
98
112
|
config[key] = false;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return isZh
|
|
113
|
+
} else {
|
|
114
|
+
return isZh
|
|
102
115
|
? `❌ 无效值: "${value}"。使用 "on" 或 "off"。`
|
|
103
116
|
: `❌ Invalid value: "${value}". Use "on" or "off".`;
|
|
104
117
|
}
|
|
118
|
+
|
|
105
119
|
const newValue = config[key];
|
|
106
|
-
const keyName = isZh
|
|
120
|
+
const keyName = isZh
|
|
107
121
|
? { thinkingOs: '思维模型', reflectionLog: '反思日志' }[key]
|
|
108
122
|
: key;
|
|
123
|
+
|
|
109
124
|
// No change needed
|
|
110
125
|
if (oldValue === newValue) {
|
|
111
126
|
return isZh
|
|
112
127
|
? `ℹ️ ${keyName} 已经是 ${newValue ? '开启' : '关闭'} 状态`
|
|
113
128
|
: `ℹ️ ${keyName} is already ${newValue ? 'ON' : 'OFF'}`;
|
|
114
129
|
}
|
|
130
|
+
|
|
115
131
|
if (saveConfig(workspaceDir, config)) {
|
|
116
132
|
// Verify the save by re-reading
|
|
117
133
|
const verifyConfig = loadContextInjectionConfig(workspaceDir);
|
|
118
134
|
const verifyValue = verifyConfig[key];
|
|
135
|
+
|
|
119
136
|
if (verifyValue !== newValue) {
|
|
120
137
|
return isZh
|
|
121
138
|
? `⚠️ ${keyName} 保存后验证失败,请重试`
|
|
122
139
|
: `⚠️ ${keyName} verification failed after save, please retry`;
|
|
123
140
|
}
|
|
141
|
+
|
|
124
142
|
const arrow = isZh ? '→' : '→';
|
|
125
143
|
const oldLabel = oldValue ? (isZh ? '开启' : 'ON') : (isZh ? '关闭' : 'OFF');
|
|
126
144
|
const newLabel = newValue ? (isZh ? '开启' : 'ON') : (isZh ? '关闭' : 'OFF');
|
|
145
|
+
|
|
127
146
|
return isZh
|
|
128
147
|
? `✅ ${keyName} 已更新: ${oldLabel} ${arrow} ${newLabel}\n\n💡 下次对话时生效`
|
|
129
148
|
: `✅ ${keyName} updated: ${oldLabel} ${arrow} ${newLabel}\n\n💡 Takes effect on next turn`;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
149
|
+
} else {
|
|
132
150
|
return isZh
|
|
133
151
|
? `❌ 保存配置失败`
|
|
134
152
|
: `❌ Failed to save configuration`;
|
|
135
153
|
}
|
|
136
154
|
}
|
|
155
|
+
|
|
137
156
|
/**
|
|
138
157
|
* Set project focus mode
|
|
139
158
|
*/
|
|
140
|
-
function setProjectFocus(
|
|
159
|
+
function setProjectFocus(
|
|
160
|
+
workspaceDir: string,
|
|
161
|
+
value: string,
|
|
162
|
+
isZh: boolean
|
|
163
|
+
): string {
|
|
141
164
|
const config = loadContextInjectionConfig(workspaceDir);
|
|
142
165
|
const oldValue = config.projectFocus;
|
|
143
|
-
const validModes = ['full', 'summary', 'off'];
|
|
144
|
-
|
|
166
|
+
const validModes = ['full', 'summary', 'off'] as const;
|
|
167
|
+
type FocusMode = typeof validModes[number];
|
|
168
|
+
|
|
169
|
+
if (!validModes.includes(value as FocusMode)) {
|
|
145
170
|
return isZh
|
|
146
171
|
? `❌ 无效值: "${value}"。使用 "full"、"summary" 或 "off"。`
|
|
147
172
|
: `❌ Invalid value: "${value}". Use "full", "summary", or "off".`;
|
|
148
173
|
}
|
|
149
|
-
|
|
174
|
+
|
|
175
|
+
const newValue = value as FocusMode;
|
|
150
176
|
config.projectFocus = newValue;
|
|
177
|
+
|
|
151
178
|
// No change needed
|
|
152
179
|
if (oldValue === newValue) {
|
|
153
180
|
return isZh
|
|
154
181
|
? `ℹ️ 项目上下文已经是 ${formatProjectFocus(newValue, isZh)} 状态`
|
|
155
182
|
: `ℹ️ Project context is already ${formatProjectFocus(newValue, isZh)}`;
|
|
156
183
|
}
|
|
184
|
+
|
|
157
185
|
if (saveConfig(workspaceDir, config)) {
|
|
158
186
|
// Verify the save by re-reading
|
|
159
187
|
const verifyConfig = loadContextInjectionConfig(workspaceDir);
|
|
@@ -162,22 +190,29 @@ function setProjectFocus(workspaceDir, value, isZh) {
|
|
|
162
190
|
? `⚠️ 项目上下文保存后验证失败,请重试`
|
|
163
191
|
: `⚠️ Project context verification failed after save, please retry`;
|
|
164
192
|
}
|
|
193
|
+
|
|
165
194
|
const arrow = '→';
|
|
195
|
+
|
|
166
196
|
return isZh
|
|
167
|
-
? `✅ 项目上下文已更新: ${formatProjectFocus(oldValue, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 下次对话时生效`
|
|
168
|
-
: `✅ Project context updated: ${formatProjectFocus(oldValue, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 Takes effect on next turn`;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
197
|
+
? `✅ 项目上下文已更新: ${formatProjectFocus(oldValue as FocusMode, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 下次对话时生效`
|
|
198
|
+
: `✅ Project context updated: ${formatProjectFocus(oldValue as FocusMode, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 Takes effect on next turn`;
|
|
199
|
+
} else {
|
|
171
200
|
return isZh
|
|
172
201
|
? `❌ 保存配置失败`
|
|
173
202
|
: `❌ Failed to save configuration`;
|
|
174
203
|
}
|
|
175
204
|
}
|
|
205
|
+
|
|
176
206
|
/**
|
|
177
207
|
* Apply a preset configuration
|
|
178
208
|
*/
|
|
179
|
-
function applyPreset(
|
|
180
|
-
|
|
209
|
+
function applyPreset(
|
|
210
|
+
workspaceDir: string,
|
|
211
|
+
preset: 'minimal' | 'standard' | 'full',
|
|
212
|
+
isZh: boolean
|
|
213
|
+
): string {
|
|
214
|
+
let config: ContextInjectionConfig;
|
|
215
|
+
|
|
181
216
|
switch (preset) {
|
|
182
217
|
case 'minimal':
|
|
183
218
|
config = {
|
|
@@ -204,6 +239,7 @@ function applyPreset(workspaceDir, preset, isZh) {
|
|
|
204
239
|
};
|
|
205
240
|
break;
|
|
206
241
|
}
|
|
242
|
+
|
|
207
243
|
if (saveConfig(workspaceDir, config)) {
|
|
208
244
|
const presetName = isZh
|
|
209
245
|
? { minimal: '最小模式', standard: '标准模式', full: '完整模式' }[preset]
|
|
@@ -211,17 +247,17 @@ function applyPreset(workspaceDir, preset, isZh) {
|
|
|
211
247
|
return isZh
|
|
212
248
|
? `✅ 已应用预设: ${presetName}\n\n${showStatus(workspaceDir, isZh)}`
|
|
213
249
|
: `✅ Applied preset: ${presetName}\n\n${showStatus(workspaceDir, isZh)}`;
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
250
|
+
} else {
|
|
216
251
|
return isZh
|
|
217
252
|
? `❌ 保存配置失败`
|
|
218
253
|
: `❌ Failed to save configuration`;
|
|
219
254
|
}
|
|
220
255
|
}
|
|
256
|
+
|
|
221
257
|
/**
|
|
222
258
|
* Show help message
|
|
223
259
|
*/
|
|
224
|
-
function showHelp(isZh) {
|
|
260
|
+
function showHelp(isZh: boolean): string {
|
|
225
261
|
if (isZh) {
|
|
226
262
|
return `
|
|
227
263
|
📖 **/pd-context 命令帮助**
|
|
@@ -241,8 +277,7 @@ function showHelp(isZh) {
|
|
|
241
277
|
|
|
242
278
|
**注意**: 核心原则始终注入,不可关闭。
|
|
243
279
|
`.trim();
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
280
|
+
} else {
|
|
246
281
|
return `
|
|
247
282
|
📖 **/pd-context Command Help**
|
|
248
283
|
|
|
@@ -263,17 +298,21 @@ function showHelp(isZh) {
|
|
|
263
298
|
`.trim();
|
|
264
299
|
}
|
|
265
300
|
}
|
|
301
|
+
|
|
266
302
|
/**
|
|
267
303
|
* Main command handler
|
|
268
304
|
*/
|
|
269
|
-
export function handleContextCommand(ctx) {
|
|
305
|
+
export function handleContextCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
270
306
|
const workspaceDir = getWorkspaceDir(ctx);
|
|
271
307
|
const args = (ctx.args || '').trim().split(/\s+/);
|
|
272
308
|
const subCommand = args[0]?.toLowerCase() || 'status';
|
|
273
309
|
const value = args[1]?.toLowerCase() || '';
|
|
310
|
+
|
|
274
311
|
// Detect language from context
|
|
275
|
-
const isZh = ctx.config?.language === 'zh';
|
|
276
|
-
|
|
312
|
+
const isZh = (ctx.config?.language as string) === 'zh';
|
|
313
|
+
|
|
314
|
+
let result: string;
|
|
315
|
+
|
|
277
316
|
switch (subCommand) {
|
|
278
317
|
case 'status':
|
|
279
318
|
result = showStatus(workspaceDir, isZh);
|
|
@@ -298,5 +337,6 @@ export function handleContextCommand(ctx) {
|
|
|
298
337
|
default:
|
|
299
338
|
result = showHelp(isZh);
|
|
300
339
|
}
|
|
340
|
+
|
|
301
341
|
return { text: result };
|
|
302
342
|
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { EvolutionReducerImpl } from '../core/evolution-reducer.js';
|
|
2
|
+
import { normalizeLanguage } from '../i18n/commands.js';
|
|
3
|
+
import { RuntimeSummaryService } from '../service/runtime-summary-service.js';
|
|
4
|
+
import type { PluginCommandContext } from '../openclaw-sdk.js';
|
|
5
|
+
|
|
6
|
+
function formatNumber(value: number | null): string {
|
|
7
|
+
if (value === null || Number.isNaN(value)) {
|
|
8
|
+
return '--';
|
|
9
|
+
}
|
|
10
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function formatSources(
|
|
14
|
+
sources: Array<{ source: string; score?: number }>
|
|
15
|
+
): string {
|
|
16
|
+
if (sources.length === 0) {
|
|
17
|
+
return '--';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return sources
|
|
21
|
+
.map((source) =>
|
|
22
|
+
source.score === undefined
|
|
23
|
+
? source.source
|
|
24
|
+
: `${source.source}(${formatNumber(source.score)})`
|
|
25
|
+
)
|
|
26
|
+
.join(', ');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function buildEnglishOutput(
|
|
30
|
+
workspaceDir: string,
|
|
31
|
+
sessionId: string | null,
|
|
32
|
+
warnings: string[],
|
|
33
|
+
stats: ReturnType<EvolutionReducerImpl['getStats']>,
|
|
34
|
+
summary: ReturnType<typeof RuntimeSummaryService.getSummary>
|
|
35
|
+
): string {
|
|
36
|
+
const lines: string[] = [
|
|
37
|
+
'Evolution Status',
|
|
38
|
+
'================',
|
|
39
|
+
'',
|
|
40
|
+
'Control Plane',
|
|
41
|
+
`- Session GFI: current ${formatNumber(summary.gfi.current)}, peak ${formatNumber(summary.gfi.peak)} (${summary.gfi.dataQuality})`,
|
|
42
|
+
`- GFI Sources: ${formatSources(summary.gfi.sources)}`,
|
|
43
|
+
`- Pain Flag: ${summary.pain.activeFlag ? 'active' : 'inactive'}${summary.pain.activeFlagSource ? ` (${summary.pain.activeFlagSource})` : ''}`,
|
|
44
|
+
`- Last Pain Signal: ${summary.pain.lastSignal ? `${summary.pain.lastSignal.source}${summary.pain.lastSignal.reason ? ` - ${summary.pain.lastSignal.reason}` : ''}` : '--'}`,
|
|
45
|
+
`- Gate Events: blocks ${formatNumber(summary.gate.recentBlocks)}, bypasses ${formatNumber(summary.gate.recentBypasses)} (${summary.gate.dataQuality})`,
|
|
46
|
+
'',
|
|
47
|
+
'Evolution',
|
|
48
|
+
`- Queue: pending ${summary.evolution.queue.pending}, in_progress ${summary.evolution.queue.inProgress}, completed ${summary.evolution.queue.completed} (${summary.evolution.dataQuality})`,
|
|
49
|
+
`- Legacy Directive File: ${summary.phase3.legacyDirectiveFilePresent ? 'present' : 'missing'} (compatibility-only display artifact)`,
|
|
50
|
+
`- Note: Legacy directive file is NOT a truth source for Phase 3 eligibility. Queue is the only authoritative execution truth source.`,
|
|
51
|
+
`- Active Evolution Task: ${summary.evolution.directive.taskPreview ?? '--'}`,
|
|
52
|
+
`- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'}, queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'}, eligible ${summary.phase3.evolutionEligible}, reference_only ${summary.phase3.evolutionReferenceOnly}, rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? ` (reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? ` (${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
|
|
53
|
+
`- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
|
|
54
|
+
'',
|
|
55
|
+
'Principles',
|
|
56
|
+
`- candidate principles: ${stats.candidateCount}`,
|
|
57
|
+
`- probation principles: ${stats.probationCount}`,
|
|
58
|
+
`- active principles: ${stats.activeCount}`,
|
|
59
|
+
`- deprecated principles: ${stats.deprecatedCount}`,
|
|
60
|
+
`- last promoted: ${stats.lastPromotedAt ?? 'none'}`,
|
|
61
|
+
'',
|
|
62
|
+
'Metadata',
|
|
63
|
+
`- workspace: ${workspaceDir}`,
|
|
64
|
+
`- session: ${sessionId ?? '--'} (${summary.metadata.selectedSessionReason})`,
|
|
65
|
+
`- generatedAt: ${summary.metadata.generatedAt}`,
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
if (warnings.length > 0) {
|
|
69
|
+
lines.push('', 'Warnings');
|
|
70
|
+
for (const warning of warnings) {
|
|
71
|
+
lines.push(`- ${warning}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildChineseOutput(
|
|
79
|
+
workspaceDir: string,
|
|
80
|
+
sessionId: string | null,
|
|
81
|
+
warnings: string[],
|
|
82
|
+
stats: ReturnType<EvolutionReducerImpl['getStats']>,
|
|
83
|
+
summary: ReturnType<typeof RuntimeSummaryService.getSummary>
|
|
84
|
+
): string {
|
|
85
|
+
const lines: string[] = [
|
|
86
|
+
'进化状态',
|
|
87
|
+
'================',
|
|
88
|
+
'',
|
|
89
|
+
'控制面',
|
|
90
|
+
`- 会话 GFI: 当前 ${formatNumber(summary.gfi.current)},峰值 ${formatNumber(summary.gfi.peak)}(${summary.gfi.dataQuality})`,
|
|
91
|
+
`- GFI 来源: ${formatSources(summary.gfi.sources)}`,
|
|
92
|
+
`- Pain Flag: ${summary.pain.activeFlag ? 'active' : 'inactive'}${summary.pain.activeFlagSource ? `(${summary.pain.activeFlagSource})` : ''}`,
|
|
93
|
+
`- 最近 Pain 信号: ${summary.pain.lastSignal ? `${summary.pain.lastSignal.source}${summary.pain.lastSignal.reason ? ` - ${summary.pain.lastSignal.reason}` : ''}` : '--'}`,
|
|
94
|
+
`- Gate 事件: block ${formatNumber(summary.gate.recentBlocks)},bypass ${formatNumber(summary.gate.recentBypasses)}(${summary.gate.dataQuality})`,
|
|
95
|
+
'',
|
|
96
|
+
'进化',
|
|
97
|
+
`- 队列: pending ${summary.evolution.queue.pending},in_progress ${summary.evolution.queue.inProgress},completed ${summary.evolution.queue.completed}(${summary.evolution.dataQuality})`,
|
|
98
|
+
`- Legacy Directive File: ${summary.phase3.legacyDirectiveFilePresent ? 'present' : 'missing'} (兼容仅显示产物)`,
|
|
99
|
+
`- 注:Legacy directive file 不是 Phase 3 合格性的真实源。队列是唯一权威的执行真实源。`,
|
|
100
|
+
`- Active Evolution Task: ${summary.evolution.directive.taskPreview ?? '--'}`,
|
|
101
|
+
`- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'},queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'},eligible ${summary.phase3.evolutionEligible},reference_only ${summary.phase3.evolutionReferenceOnly},rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? `(reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? `(${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
|
|
102
|
+
`- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
|
|
103
|
+
'',
|
|
104
|
+
'原则统计',
|
|
105
|
+
`- 候选原则: ${stats.candidateCount}`,
|
|
106
|
+
`- 观察期原则: ${stats.probationCount}`,
|
|
107
|
+
`- 生效原则: ${stats.activeCount}`,
|
|
108
|
+
`- 已废弃原则: ${stats.deprecatedCount}`,
|
|
109
|
+
`- 最近晋升: ${stats.lastPromotedAt ?? '无'}`,
|
|
110
|
+
'',
|
|
111
|
+
'元数据',
|
|
112
|
+
`- 工作区: ${workspaceDir}`,
|
|
113
|
+
`- Session: ${sessionId ?? '--'}(${summary.metadata.selectedSessionReason})`,
|
|
114
|
+
`- 生成时间: ${summary.metadata.generatedAt}`,
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
if (warnings.length > 0) {
|
|
118
|
+
lines.push('', '警告');
|
|
119
|
+
for (const warning of warnings) {
|
|
120
|
+
lines.push(`- ${warning}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return lines.join('\n');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function handleEvolutionStatusCommand(ctx: PluginCommandContext): { text: string } {
|
|
128
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
129
|
+
const sessionId = (ctx as { sessionId?: string | null }).sessionId ?? null;
|
|
130
|
+
const reducer = new EvolutionReducerImpl({ workspaceDir });
|
|
131
|
+
const stats = reducer.getStats();
|
|
132
|
+
const summary = RuntimeSummaryService.getSummary(workspaceDir, { sessionId });
|
|
133
|
+
const rawLang = (ctx.config?.language as string) || 'en';
|
|
134
|
+
const lang = normalizeLanguage(rawLang);
|
|
135
|
+
const warnings = summary.metadata.warnings.slice(0, 12);
|
|
136
|
+
|
|
137
|
+
if (lang === 'zh') {
|
|
138
|
+
return {
|
|
139
|
+
text: buildChineseOutput(workspaceDir, summary.metadata.sessionId, warnings, stats, summary),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
text: buildEnglishOutput(workspaceDir, summary.metadata.sessionId, warnings, stats, summary),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
2
|
+
import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
|
|
3
|
+
import { exportORPOSamples, listExports } from '../core/nocturnal-export.js';
|
|
4
|
+
|
|
5
|
+
function isZh(ctx: PluginCommandContext): boolean {
|
|
6
|
+
return String(ctx.config?.language || 'en').startsWith('zh');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function handleExportCommand(ctx: PluginCommandContext): PluginCommandResult {
|
|
10
|
+
const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
|
|
11
|
+
const zh = isZh(ctx);
|
|
12
|
+
const args = (ctx.args || '').trim();
|
|
13
|
+
const parts = args.split(/\s+/).filter(Boolean);
|
|
14
|
+
const [subcommand = 'corrections'] = parts;
|
|
15
|
+
const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
if (subcommand === 'orpo') {
|
|
19
|
+
// Nocturnal ORPO export
|
|
20
|
+
// Usage: pd-export orpo [--family=<targetModelFamily>]
|
|
21
|
+
const familyArg = parts.find((p) => p.startsWith('--family='));
|
|
22
|
+
const targetModelFamily = familyArg ? familyArg.split('=')[1] : undefined;
|
|
23
|
+
|
|
24
|
+
const result = exportORPOSamples(workspaceDir, targetModelFamily);
|
|
25
|
+
|
|
26
|
+
if (!result.success) {
|
|
27
|
+
const reasonMap: Record<string, string> = {
|
|
28
|
+
no_approved_samples: zh
|
|
29
|
+
? '没有已批准的样本'
|
|
30
|
+
: 'No approved samples',
|
|
31
|
+
family_mismatch: zh
|
|
32
|
+
? '没有找到指定模型家族的已批准样本'
|
|
33
|
+
: 'No approved samples for the specified target model family',
|
|
34
|
+
all_samples_missing_artifacts: zh
|
|
35
|
+
? '所有样本的 artifact 文件都缺失'
|
|
36
|
+
: 'All sample artifact files are missing',
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
text: zh
|
|
40
|
+
? `ORPO 导出失败: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`
|
|
41
|
+
: `ORPO export failed: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
text: zh
|
|
47
|
+
? `已导出 ORPO 决策点样本到 ${result.manifest!.exportPath},` +
|
|
48
|
+
`共 ${result.manifest!.sampleCount} 条,模型家族: ${result.manifest!.targetModelFamily},` +
|
|
49
|
+
`数据集指纹: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`
|
|
50
|
+
: `Exported ORPO decision-point samples to ${result.manifest!.exportPath}, ` +
|
|
51
|
+
`${result.manifest!.sampleCount} samples, target: ${result.manifest!.targetModelFamily}, ` +
|
|
52
|
+
`dataset fingerprint: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (subcommand === 'orpo-list') {
|
|
57
|
+
// List previous ORPO exports
|
|
58
|
+
const exports = listExports(workspaceDir);
|
|
59
|
+
if (exports.length === 0) {
|
|
60
|
+
return {
|
|
61
|
+
text: zh
|
|
62
|
+
? '没有找到 ORPO 导出记录。'
|
|
63
|
+
: 'No ORPO exports found.',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const lines = exports.slice(0, 10).map((e) =>
|
|
67
|
+
`- ${e.exportId.substring(0, 8)}... | ${e.sampleCount} samples | ${e.targetModelFamily} | ${new Date(e.createdAt).toLocaleDateString()}`
|
|
68
|
+
);
|
|
69
|
+
return {
|
|
70
|
+
text: zh
|
|
71
|
+
? `ORPO 导出记录:\n${lines.join('\n')}`
|
|
72
|
+
: `ORPO exports:\n${lines.join('\n')}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (subcommand !== 'analytics' && subcommand !== 'corrections') {
|
|
77
|
+
return {
|
|
78
|
+
text: zh
|
|
79
|
+
? '无效的导出类型。请使用 `analytics`、`corrections [--redacted]` 或 `orpo [--family=<target>]`。'
|
|
80
|
+
: 'Invalid export target. Use `analytics`, `corrections [--redacted]`, or `orpo [--family=<target>]`',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (subcommand === 'analytics') {
|
|
85
|
+
const result = wctx.trajectory.exportAnalytics();
|
|
86
|
+
return {
|
|
87
|
+
text: zh
|
|
88
|
+
? `已导出 analytics 快照到 ${result.filePath},共 ${result.count} 条聚合记录。`
|
|
89
|
+
: `Exported analytics snapshot to ${result.filePath} (${result.count} aggregated rows).`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const redacted = args.includes('--redacted');
|
|
94
|
+
const result = wctx.trajectory.exportCorrections({
|
|
95
|
+
mode: redacted ? 'redacted' : 'raw',
|
|
96
|
+
approvedOnly: true,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
text: zh
|
|
101
|
+
? `已导出纠错样本到 ${result.filePath},模式 ${result.mode},共 ${result.count} 条。`
|
|
102
|
+
: `Exported correction samples to ${result.filePath} (mode=${result.mode}, count=${result.count}).`,
|
|
103
|
+
};
|
|
104
|
+
} catch {
|
|
105
|
+
return {
|
|
106
|
+
text: zh
|
|
107
|
+
? '导出失败,请检查日志。'
|
|
108
|
+
: 'Export failed. Check logs.',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|