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
package/dist/hooks/subagent.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { PluginHookSubagentEndedEvent, PluginHookSubagentContext } from '../openclaw-sdk.js';
|
|
2
|
-
import { type EmpathyObserverApi } from '../service/empathy-observer-manager.js';
|
|
3
|
-
type SubagentEndedHookContext = PluginHookSubagentContext & {
|
|
4
|
-
api?: EmpathyObserverApi;
|
|
5
|
-
workspaceDir?: string;
|
|
6
|
-
sessionId?: string;
|
|
7
|
-
agentId?: string;
|
|
8
|
-
};
|
|
9
|
-
export declare function handleSubagentEnded(event: PluginHookSubagentEndedEvent, ctx: SubagentEndedHookContext): Promise<void>;
|
|
10
|
-
export {};
|
package/dist/hooks/subagent.js
DELETED
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import { writePainFlag } from '../core/pain.js';
|
|
3
|
-
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
4
|
-
import { empathyObserverManager } from '../service/empathy-observer-manager.js';
|
|
5
|
-
import { acquireQueueLock } from '../service/evolution-worker.js';
|
|
6
|
-
import { recordEvolutionSuccess } from '../core/evolution-engine.js';
|
|
7
|
-
const COMPLETION_RETRY_DELAY_MS = 250;
|
|
8
|
-
const COMPLETION_MAX_RETRIES = 3;
|
|
9
|
-
const COMPLETION_RETRY_TTL_MS = 60 * 60 * 1000; // 1 hour TTL for retry entries
|
|
10
|
-
const TASK_OUTCOME_RETRY_DELAY_MS = 250;
|
|
11
|
-
const TASK_OUTCOME_MAX_RETRIES = 3;
|
|
12
|
-
const DIAGNOSTICIAN_SESSION_PREFIX = 'agent:diagnostician:';
|
|
13
|
-
const completionRetryCounts = new Map();
|
|
14
|
-
// Cleanup expired retry entries periodically
|
|
15
|
-
function cleanupExpiredRetryEntries() {
|
|
16
|
-
const now = Date.now();
|
|
17
|
-
for (const [key, value] of completionRetryCounts.entries()) {
|
|
18
|
-
if (now > value.expires) {
|
|
19
|
-
completionRetryCounts.delete(key);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function emitSubagentPainEvent(wctx, payload, logger) {
|
|
24
|
-
try {
|
|
25
|
-
wctx.evolutionReducer.emitSync({
|
|
26
|
-
ts: new Date().toISOString(),
|
|
27
|
-
type: 'pain_detected',
|
|
28
|
-
data: {
|
|
29
|
-
painId: `pain_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,
|
|
30
|
-
painType: 'subagent_error',
|
|
31
|
-
source: payload.source,
|
|
32
|
-
reason: payload.reason,
|
|
33
|
-
score: payload.score,
|
|
34
|
-
sessionId: payload.sessionId,
|
|
35
|
-
agentId: payload.agentId,
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
catch (e) {
|
|
40
|
-
logger.warn(`[PD:Subagent] failed to emit evolution event: ${String(e)}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function isDiagnosticianSession(targetSessionKey) {
|
|
44
|
-
return typeof targetSessionKey === 'string' && targetSessionKey.startsWith(DIAGNOSTICIAN_SESSION_PREFIX);
|
|
45
|
-
}
|
|
46
|
-
function extractAgentIdFromSessionKey(sessionKey) {
|
|
47
|
-
// sessionKey format: "agent:{agentId}:{type}:{uuid}" or "agent:{agentId}:{uuid}"
|
|
48
|
-
if (!sessionKey)
|
|
49
|
-
return undefined;
|
|
50
|
-
const match = sessionKey.match(/^agent:([^:]+):/);
|
|
51
|
-
return match ? match[1] : undefined;
|
|
52
|
-
}
|
|
53
|
-
function cleanupPainFlagForTask(wctx, completedTaskId, queue, logger) {
|
|
54
|
-
const painFlagPath = wctx.resolve('PAIN_FLAG');
|
|
55
|
-
try {
|
|
56
|
-
const painData = fs.readFileSync(painFlagPath, 'utf8');
|
|
57
|
-
const taskIdMatch = painData.match(/^task_id:\s*(.+)$/m);
|
|
58
|
-
const painTaskId = taskIdMatch?.[1]?.trim();
|
|
59
|
-
const hasQueuedStatus = painData.includes('status: queued');
|
|
60
|
-
const hasRemainingActiveTasks = queue.some((task) => task?.status === 'pending' || task?.status === 'in_progress');
|
|
61
|
-
if (!hasQueuedStatus)
|
|
62
|
-
return;
|
|
63
|
-
if (painTaskId) {
|
|
64
|
-
if (painTaskId === completedTaskId) {
|
|
65
|
-
fs.unlinkSync(painFlagPath);
|
|
66
|
-
}
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
// Legacy fallback: only clear an untagged queued pain flag when there are
|
|
70
|
-
// no active queue entries left. This avoids unrelated diagnostician runs
|
|
71
|
-
// from deleting a queued flag that belongs to another task.
|
|
72
|
-
if (!hasRemainingActiveTasks) {
|
|
73
|
-
fs.unlinkSync(painFlagPath);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch (e) {
|
|
77
|
-
if (e.code === 'ENOENT')
|
|
78
|
-
return; // File doesn't exist, nothing to clean up
|
|
79
|
-
logger.error(`[PD:Subagent] Failed to cleanup pain flag: ${String(e)}`);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function getCompletionRetryKey(workspaceDir, targetSessionKey) {
|
|
83
|
-
return `${workspaceDir}::${targetSessionKey}`;
|
|
84
|
-
}
|
|
85
|
-
function scheduleCompletionRetry(event, ctx, attempt) {
|
|
86
|
-
const workspaceDir = ctx.workspaceDir;
|
|
87
|
-
const targetSessionKey = event.targetSessionKey;
|
|
88
|
-
if (!workspaceDir || !targetSessionKey || attempt >= COMPLETION_MAX_RETRIES) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
cleanupExpiredRetryEntries();
|
|
92
|
-
const retryKey = getCompletionRetryKey(workspaceDir, targetSessionKey);
|
|
93
|
-
completionRetryCounts.set(retryKey, {
|
|
94
|
-
count: attempt + 1,
|
|
95
|
-
expires: Date.now() + COMPLETION_RETRY_TTL_MS
|
|
96
|
-
});
|
|
97
|
-
setTimeout(() => {
|
|
98
|
-
void handleSubagentEnded(event, ctx).finally(() => {
|
|
99
|
-
const entry = completionRetryCounts.get(retryKey);
|
|
100
|
-
if (!entry || entry.count <= attempt + 1) {
|
|
101
|
-
completionRetryCounts.delete(retryKey);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}, COMPLETION_RETRY_DELAY_MS);
|
|
105
|
-
}
|
|
106
|
-
function scheduleTaskOutcomeRetry(wctx, payload, attempt, logger) {
|
|
107
|
-
if (attempt > TASK_OUTCOME_MAX_RETRIES) {
|
|
108
|
-
logger.error(`[PD:Subagent] Failed to persist task outcome after ${TASK_OUTCOME_MAX_RETRIES} retries: ${payload.taskId}`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
setTimeout(() => {
|
|
112
|
-
try {
|
|
113
|
-
wctx.trajectory?.recordTaskOutcome?.(payload);
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
logger.warn(`[PD:Subagent] Retrying task outcome persistence for ${payload.taskId}: ${String(error)}`);
|
|
117
|
-
scheduleTaskOutcomeRetry(wctx, payload, attempt + 1, logger);
|
|
118
|
-
}
|
|
119
|
-
}, TASK_OUTCOME_RETRY_DELAY_MS);
|
|
120
|
-
}
|
|
121
|
-
export async function handleSubagentEnded(event, ctx) {
|
|
122
|
-
const { outcome, targetSessionKey } = event;
|
|
123
|
-
const workspaceDir = ctx.workspaceDir;
|
|
124
|
-
if (!workspaceDir)
|
|
125
|
-
return;
|
|
126
|
-
const wctx = WorkspaceContext.fromHookContext(ctx);
|
|
127
|
-
const logger = ctx.api?.logger ?? console;
|
|
128
|
-
if (targetSessionKey?.startsWith('empathy_obs:')) {
|
|
129
|
-
await empathyObserverManager.reap(ctx.api, targetSessionKey, workspaceDir);
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const config = wctx.config;
|
|
133
|
-
// ── Outcome-based EP and Pain Signal handling ──
|
|
134
|
-
// OpenClaw v2026.3.23 fixes: timeout may be false positive (fast-finishing workers)
|
|
135
|
-
// Only penalize actual errors, not timeout/killed/reset
|
|
136
|
-
if (outcome === 'error') {
|
|
137
|
-
// Only actual errors trigger penalty
|
|
138
|
-
const scoreSettings = config.get('scores');
|
|
139
|
-
const score = scoreSettings.subagent_error_penalty;
|
|
140
|
-
const reason = `Subagent session ${targetSessionKey} ended with error`;
|
|
141
|
-
writePainFlag(workspaceDir, {
|
|
142
|
-
source: `subagent_error`,
|
|
143
|
-
score: String(score),
|
|
144
|
-
time: new Date().toISOString(),
|
|
145
|
-
reason,
|
|
146
|
-
is_risky: 'true',
|
|
147
|
-
session_id: ctx.sessionId || '',
|
|
148
|
-
agent_id: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey) || '',
|
|
149
|
-
});
|
|
150
|
-
emitSubagentPainEvent(wctx, {
|
|
151
|
-
source: `subagent_error`,
|
|
152
|
-
reason,
|
|
153
|
-
score,
|
|
154
|
-
sessionId: ctx.sessionId,
|
|
155
|
-
agentId: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey),
|
|
156
|
-
}, logger);
|
|
157
|
-
}
|
|
158
|
-
if (outcome === 'timeout') {
|
|
159
|
-
// OpenClaw v2026.3.23 fix: timeout may be false positive
|
|
160
|
-
// Fast-finishing workers are no longer incorrectly reported as timed out
|
|
161
|
-
// Do not penalize - the task may have actually succeeded
|
|
162
|
-
logger.warn(`[PD:Subagent] Session ${targetSessionKey} timed out - not penalizing (OpenClaw fix applied)`);
|
|
163
|
-
}
|
|
164
|
-
if (outcome === 'killed' || outcome === 'reset') {
|
|
165
|
-
// User-initiated termination or system reset - not an agent failure
|
|
166
|
-
logger.info(`[PD:Subagent] Session ${targetSessionKey} ended with ${outcome} - no penalty (user/system action)`);
|
|
167
|
-
}
|
|
168
|
-
if (outcome === 'ok' || outcome === 'deleted') {
|
|
169
|
-
recordEvolutionSuccess(workspaceDir, 'subagent', {
|
|
170
|
-
sessionId: ctx.sessionId,
|
|
171
|
-
reason: 'subagent_success',
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
if ((outcome !== 'ok' && outcome !== 'deleted') || !isDiagnosticianSession(targetSessionKey)) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
const queuePath = wctx.resolve('EVOLUTION_QUEUE');
|
|
178
|
-
if (!fs.existsSync(queuePath))
|
|
179
|
-
return;
|
|
180
|
-
const retryKey = getCompletionRetryKey(workspaceDir, targetSessionKey);
|
|
181
|
-
const retryEntry = completionRetryCounts.get(retryKey);
|
|
182
|
-
const attempt = retryEntry?.count || 0;
|
|
183
|
-
let releaseLock = null;
|
|
184
|
-
try {
|
|
185
|
-
releaseLock = await acquireQueueLock(queuePath, logger);
|
|
186
|
-
const queue = JSON.parse(fs.readFileSync(queuePath, 'utf8'));
|
|
187
|
-
let completedTaskId = null;
|
|
188
|
-
// Improved matching logic: support both direct session key match and HEARTBEAT placeholder match
|
|
189
|
-
// This fixes task_outcomes being empty for HEARTBEAT-triggered diagnostician runs
|
|
190
|
-
const matchedTask = queue.find((task) => {
|
|
191
|
-
// V2: Skip non-pain_diagnosis tasks - they don't use HEARTBEAT completion flow
|
|
192
|
-
// pain_diagnosis: routed through subagent completion matcher (this block)
|
|
193
|
-
// sleep_reflection: handled by nocturnal service (separate flow, no HEARTBEAT)
|
|
194
|
-
// model_eval: handled separately (no HEARTBEAT completion)
|
|
195
|
-
if (task?.taskKind !== 'pain_diagnosis' && task?.taskKind !== undefined)
|
|
196
|
-
return false;
|
|
197
|
-
const taskSessionKey = task?.assigned_session_key;
|
|
198
|
-
// 1. Exact match: direct session key assignment
|
|
199
|
-
if (typeof taskSessionKey === 'string' && taskSessionKey === targetSessionKey) {
|
|
200
|
-
return true;
|
|
201
|
-
}
|
|
202
|
-
// 2. HEARTBEAT placeholder match: for diagnostician sessions
|
|
203
|
-
// Tasks started via HEARTBEAT have placeholder like "heartbeat:diagnostician:{taskId}"
|
|
204
|
-
if (isDiagnosticianSession(targetSessionKey)) {
|
|
205
|
-
// Match tasks with HEARTBEAT placeholder
|
|
206
|
-
if (typeof taskSessionKey === 'string' && taskSessionKey.startsWith('heartbeat:diagnostician')) {
|
|
207
|
-
return true;
|
|
208
|
-
}
|
|
209
|
-
// Backward compatibility: match tasks with no assigned_session_key (legacy behavior)
|
|
210
|
-
// Only match tasks started within 2 hours to avoid stale task matching
|
|
211
|
-
if (taskSessionKey === undefined || taskSessionKey === null) {
|
|
212
|
-
const taskStartedAt = task?.started_at ? new Date(task.started_at).getTime() : 0;
|
|
213
|
-
const taskAge = taskStartedAt > 0 ? Date.now() - taskStartedAt : Infinity;
|
|
214
|
-
const LEGACY_FALLBACK_MAX_AGE_MS = 2 * 60 * 60 * 1000; // 2 hours
|
|
215
|
-
if (taskAge < LEGACY_FALLBACK_MAX_AGE_MS) {
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return false;
|
|
221
|
-
});
|
|
222
|
-
if (matchedTask) {
|
|
223
|
-
// Enhanced observability: log match type for debugging
|
|
224
|
-
const matchType = matchedTask.assigned_session_key === targetSessionKey
|
|
225
|
-
? 'exact'
|
|
226
|
-
: matchedTask.assigned_session_key?.startsWith('heartbeat:diagnostician')
|
|
227
|
-
? 'heartbeat_placeholder'
|
|
228
|
-
: 'legacy_fallback';
|
|
229
|
-
logger.info(`[PD:Subagent] Matched session ${targetSessionKey} to task ${matchedTask.id} (match_type: ${matchType})`);
|
|
230
|
-
matchedTask.status = 'completed';
|
|
231
|
-
matchedTask.completed_at = new Date().toISOString();
|
|
232
|
-
delete matchedTask.assigned_session_key;
|
|
233
|
-
completedTaskId = matchedTask.id;
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
logger.warn(`[PD:Subagent] No in-progress evolution task matched subagent session ${targetSessionKey}`);
|
|
237
|
-
}
|
|
238
|
-
let taskOutcomePayload = null;
|
|
239
|
-
if (completedTaskId) {
|
|
240
|
-
fs.writeFileSync(queuePath, JSON.stringify(queue, null, 2), 'utf8');
|
|
241
|
-
cleanupPainFlagForTask(wctx, completedTaskId, queue, logger);
|
|
242
|
-
taskOutcomePayload = {
|
|
243
|
-
sessionId: targetSessionKey,
|
|
244
|
-
taskId: completedTaskId,
|
|
245
|
-
outcome,
|
|
246
|
-
summary: `Diagnostician session ${targetSessionKey} completed evolution task ${completedTaskId}.`,
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
if (taskOutcomePayload) {
|
|
250
|
-
try {
|
|
251
|
-
wctx.trajectory?.recordTaskOutcome?.(taskOutcomePayload);
|
|
252
|
-
}
|
|
253
|
-
catch (error) {
|
|
254
|
-
logger.warn(`[PD:Subagent] Failed to persist task outcome for ${taskOutcomePayload.taskId}: ${String(error)}`);
|
|
255
|
-
scheduleTaskOutcomeRetry(wctx, taskOutcomePayload, 1, logger);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Read diagnostician output and create principle with generalized pattern
|
|
259
|
-
if (completedTaskId && ctx.api?.runtime?.subagent) {
|
|
260
|
-
try {
|
|
261
|
-
const messages = await ctx.api?.runtime?.subagent?.getSessionMessages?.({
|
|
262
|
-
sessionKey: targetSessionKey,
|
|
263
|
-
limit: 50
|
|
264
|
-
});
|
|
265
|
-
const assistantText = extractAssistantText(messages);
|
|
266
|
-
const report = parseDiagnosticianReport(assistantText);
|
|
267
|
-
if (report?.principle) {
|
|
268
|
-
// Principles default to 'manual_only' evaluability unless detector metadata
|
|
269
|
-
// is explicitly provided. Only deterministic / weak_heuristic evaluability
|
|
270
|
-
// can enter automatic nocturnal targeting.
|
|
271
|
-
const evaluability = report.principle.evaluability;
|
|
272
|
-
// Only pass detector metadata if ALL required fields are present and valid.
|
|
273
|
-
// Incomplete metadata → 'manual_only' — the principle stays prompt-only.
|
|
274
|
-
// Defense in depth: also validate in reducer, but subagent should not pass
|
|
275
|
-
// malformed data in the first place.
|
|
276
|
-
const rawMeta = report.principle.detector_metadata;
|
|
277
|
-
// Require confidence (valid enum) + ALL THREE signal arrays non-empty.
|
|
278
|
-
// toolSequenceHints is optional (may be empty or absent).
|
|
279
|
-
const VALID_CONFIDENCE = ['high', 'medium', 'low'];
|
|
280
|
-
const hasValidConfidence = typeof rawMeta?.confidence === 'string' &&
|
|
281
|
-
VALID_CONFIDENCE.includes(rawMeta.confidence);
|
|
282
|
-
const signalArrays = [
|
|
283
|
-
rawMeta?.applicabilityTags,
|
|
284
|
-
rawMeta?.positiveSignals,
|
|
285
|
-
rawMeta?.negativeSignals,
|
|
286
|
-
];
|
|
287
|
-
const allSignalsNonEmpty = signalArrays.every((arr) => Array.isArray(arr) && arr.length > 0 && arr.every((s) => typeof s === 'string' && s.length > 0));
|
|
288
|
-
const hasCompleteMetadata = hasValidConfidence && allSignalsNonEmpty;
|
|
289
|
-
const detectorMetadata = hasCompleteMetadata && rawMeta.confidence
|
|
290
|
-
? {
|
|
291
|
-
applicabilityTags: rawMeta.applicabilityTags ?? [],
|
|
292
|
-
positiveSignals: rawMeta.positiveSignals ?? [],
|
|
293
|
-
negativeSignals: rawMeta.negativeSignals ?? [],
|
|
294
|
-
toolSequenceHints: rawMeta.toolSequenceHints ?? [],
|
|
295
|
-
confidence: rawMeta.confidence,
|
|
296
|
-
}
|
|
297
|
-
: undefined;
|
|
298
|
-
const principleId = wctx.evolutionReducer.createPrincipleFromDiagnosis({
|
|
299
|
-
painId: matchedTask?.id || completedTaskId,
|
|
300
|
-
painType: 'tool_failure', // Default, could be extracted from task
|
|
301
|
-
triggerPattern: report.principle.trigger_pattern,
|
|
302
|
-
action: report.principle.action,
|
|
303
|
-
source: matchedTask?.source || 'diagnostician',
|
|
304
|
-
evaluability,
|
|
305
|
-
detectorMetadata,
|
|
306
|
-
});
|
|
307
|
-
if (principleId) {
|
|
308
|
-
logger.warn(`[PD:Subagent] Created principle ${principleId} from diagnostician analysis for task ${completedTaskId}`);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch (e) {
|
|
313
|
-
logger.warn(`[PD:Subagent] Failed to read diagnostician output: ${String(e)}`);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
catch (e) {
|
|
318
|
-
logger.error(`[PD:Subagent] Failed to update evolution queue: ${String(e)}`);
|
|
319
|
-
scheduleCompletionRetry(event, ctx, attempt);
|
|
320
|
-
}
|
|
321
|
-
finally {
|
|
322
|
-
releaseLock?.();
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Extract text content from assistant messages
|
|
327
|
-
*/
|
|
328
|
-
function extractAssistantText(messages) {
|
|
329
|
-
if (!messages || !Array.isArray(messages))
|
|
330
|
-
return '';
|
|
331
|
-
const texts = [];
|
|
332
|
-
for (const msg of messages) {
|
|
333
|
-
if (msg?.role !== 'assistant')
|
|
334
|
-
continue;
|
|
335
|
-
const content = msg?.content;
|
|
336
|
-
if (Array.isArray(content)) {
|
|
337
|
-
for (const block of content) {
|
|
338
|
-
if (block?.type === 'text' && typeof block.text === 'string') {
|
|
339
|
-
texts.push(block.text);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
else if (typeof content === 'string') {
|
|
344
|
-
texts.push(content);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return texts.join('\n');
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Parse diagnostician JSON report from text
|
|
351
|
-
*/
|
|
352
|
-
function parseDiagnosticianReport(text) {
|
|
353
|
-
// Try to find JSON in markdown code block
|
|
354
|
-
const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/);
|
|
355
|
-
if (jsonMatch) {
|
|
356
|
-
try {
|
|
357
|
-
const parsed = JSON.parse(jsonMatch[1]);
|
|
358
|
-
// Support both direct principle and nested phases.principle_extraction structure
|
|
359
|
-
if (parsed?.principle) {
|
|
360
|
-
return { principle: parsed.principle };
|
|
361
|
-
}
|
|
362
|
-
if (parsed?.phases?.principle_extraction?.principle) {
|
|
363
|
-
return { principle: parsed.phases.principle_extraction.principle };
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
// Fall through to return null
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
// Try to find raw JSON object
|
|
371
|
-
const objectMatch = text.match(/\{[\s\S]*"principle"[\s\S]*\}/);
|
|
372
|
-
if (objectMatch) {
|
|
373
|
-
try {
|
|
374
|
-
const parsed = JSON.parse(objectMatch[0]);
|
|
375
|
-
if (parsed?.principle) {
|
|
376
|
-
return { principle: parsed.principle };
|
|
377
|
-
}
|
|
378
|
-
if (parsed?.phases?.principle_extraction?.principle) {
|
|
379
|
-
return { principle: parsed.phases.principle_extraction.principle };
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
catch {
|
|
383
|
-
// Fall through to return null
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
return null;
|
|
387
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thinking Checkpoint Module
|
|
3
|
-
*
|
|
4
|
-
* Enforces P-10 deep reflection requirement for high-risk tool operations.
|
|
5
|
-
*
|
|
6
|
-
* **Responsibilities:**
|
|
7
|
-
* - Check if high-risk tools have recent deep thinking (T-01 through T-10)
|
|
8
|
-
* - Block high-risk operations without preceding deep reflection
|
|
9
|
-
* - Configurable time window for thinking validity (default 5 minutes)
|
|
10
|
-
* - Provide clear guidance on required action (deep_reflect tool usage)
|
|
11
|
-
*
|
|
12
|
-
* **Configuration:**
|
|
13
|
-
* - Thinking checkpoint settings from profile.thinking_checkpoint
|
|
14
|
-
* - Window duration for thinking validity
|
|
15
|
-
* - High-risk tool list
|
|
16
|
-
*/
|
|
17
|
-
import type { PluginHookBeforeToolCallEvent, PluginHookBeforeToolCallResult } from '../openclaw-sdk.js';
|
|
18
|
-
export interface ThinkingCheckpointConfig {
|
|
19
|
-
enabled?: boolean;
|
|
20
|
-
window_ms?: number;
|
|
21
|
-
high_risk_tools?: string[];
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Checks if a tool call requires a recent deep thinking checkpoint.
|
|
25
|
-
*
|
|
26
|
-
* This enforces P-10 (Thinking OS Checkpoint) - high-risk operations must
|
|
27
|
-
* be preceded by deep reflection within the configured time window.
|
|
28
|
-
*
|
|
29
|
-
* @param event - The before_tool_call event
|
|
30
|
-
* @param config - Thinking checkpoint configuration from profile
|
|
31
|
-
* @param sessionId - Current session ID
|
|
32
|
-
* @param logger - Optional logger for info messages
|
|
33
|
-
* @returns Block result if thinking required, undefined otherwise
|
|
34
|
-
*/
|
|
35
|
-
export declare function checkThinkingCheckpoint(event: PluginHookBeforeToolCallEvent, config: ThinkingCheckpointConfig, sessionId: string | undefined, logger?: {
|
|
36
|
-
info?: (message: string) => void;
|
|
37
|
-
}): PluginHookBeforeToolCallResult | undefined;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Thinking Checkpoint Module
|
|
3
|
-
*
|
|
4
|
-
* Enforces P-10 deep reflection requirement for high-risk tool operations.
|
|
5
|
-
*
|
|
6
|
-
* **Responsibilities:**
|
|
7
|
-
* - Check if high-risk tools have recent deep thinking (T-01 through T-10)
|
|
8
|
-
* - Block high-risk operations without preceding deep reflection
|
|
9
|
-
* - Configurable time window for thinking validity (default 5 minutes)
|
|
10
|
-
* - Provide clear guidance on required action (deep_reflect tool usage)
|
|
11
|
-
*
|
|
12
|
-
* **Configuration:**
|
|
13
|
-
* - Thinking checkpoint settings from profile.thinking_checkpoint
|
|
14
|
-
* - Window duration for thinking validity
|
|
15
|
-
* - High-risk tool list
|
|
16
|
-
*/
|
|
17
|
-
import { hasRecentThinking } from '../core/session-tracker.js';
|
|
18
|
-
import { THINKING_CHECKPOINT_WINDOW_MS, THINKING_CHECKPOINT_DEFAULT_HIGH_RISK_TOOLS } from '../config/index.js';
|
|
19
|
-
/**
|
|
20
|
-
* Checks if a tool call requires a recent deep thinking checkpoint.
|
|
21
|
-
*
|
|
22
|
-
* This enforces P-10 (Thinking OS Checkpoint) - high-risk operations must
|
|
23
|
-
* be preceded by deep reflection within the configured time window.
|
|
24
|
-
*
|
|
25
|
-
* @param event - The before_tool_call event
|
|
26
|
-
* @param config - Thinking checkpoint configuration from profile
|
|
27
|
-
* @param sessionId - Current session ID
|
|
28
|
-
* @param logger - Optional logger for info messages
|
|
29
|
-
* @returns Block result if thinking required, undefined otherwise
|
|
30
|
-
*/
|
|
31
|
-
export function checkThinkingCheckpoint(event, config, sessionId, logger) {
|
|
32
|
-
const enabled = config.enabled ?? false;
|
|
33
|
-
const windowMs = config.window_ms ?? THINKING_CHECKPOINT_WINDOW_MS;
|
|
34
|
-
const highRiskTools = config.high_risk_tools ?? [...THINKING_CHECKPOINT_DEFAULT_HIGH_RISK_TOOLS];
|
|
35
|
-
if (!enabled || !sessionId) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
const isHighRisk = highRiskTools.includes(event.toolName);
|
|
39
|
-
if (!isHighRisk) {
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
const hasThinking = hasRecentThinking(sessionId, windowMs);
|
|
43
|
-
if (!hasThinking) {
|
|
44
|
-
logger?.info?.(`[PD:THINKING_GATE] High-risk tool "${event.toolName}" called without recent deep thinking`);
|
|
45
|
-
return {
|
|
46
|
-
block: true,
|
|
47
|
-
blockReason: `[Thinking OS Checkpoint] 高风险操作 "${event.toolName}" 需要先进行深度思考。\n\n请先使用 deep_reflect 工具分析当前情况,然后再尝试此操作。\n\n这是强制性检查点,目的是确保决策质量。\n\n提示:调用 deep_reflect 后,${Math.round(windowMs / 60000)}分钟内的操作将自动放行。\n\n可在PROFILE.json中设置 thinking_checkpoint.enabled: false 来禁用此检查。`,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Trajectory Collector - 行为进化引擎 Phase 0 数据收集
|
|
3
|
-
*
|
|
4
|
-
* 收集工具调用和 LLM 输出到 memory/trajectories/ 目录
|
|
5
|
-
* 用于分析工具使用模式、识别原则应用案例、评估行为质量
|
|
6
|
-
*/
|
|
7
|
-
import type { PluginHookAfterToolCallEvent, PluginHookToolContext, PluginHookLlmOutputEvent, PluginHookAgentContext, PluginHookBeforeMessageWriteEvent } from '../openclaw-sdk.js';
|
|
8
|
-
/**
|
|
9
|
-
* 工具调用完成后的处理
|
|
10
|
-
* 记录:工具名、参数、结果、错误、执行时间
|
|
11
|
-
*/
|
|
12
|
-
export declare function handleAfterToolCall(event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext & {
|
|
13
|
-
workspaceDir?: string;
|
|
14
|
-
}): void;
|
|
15
|
-
/**
|
|
16
|
-
* LLM 输出处理
|
|
17
|
-
* 记录:provider、model、输出长度、token 使用量
|
|
18
|
-
*/
|
|
19
|
-
export declare function handleLlmOutput(event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext & {
|
|
20
|
-
workspaceDir?: string;
|
|
21
|
-
}): void;
|
|
22
|
-
/**
|
|
23
|
-
* 消息写入前的处理
|
|
24
|
-
* 记录:用户/助手消息内容
|
|
25
|
-
*/
|
|
26
|
-
export declare function handleBeforeMessageWrite(event: PluginHookBeforeMessageWriteEvent, ctx: PluginHookAgentContext & {
|
|
27
|
-
workspaceDir?: string;
|
|
28
|
-
}): void;
|
|
29
|
-
/**
|
|
30
|
-
* 轨迹汇总统计(供 cron 任务调用)
|
|
31
|
-
*/
|
|
32
|
-
export declare function computeTrajectoryStats(workspaceDir: string): object;
|