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
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
import { ControlUiDatabase } from '../core/control-ui-db.js';
|
|
2
|
-
import { getThinkingModel, listThinkingModels } from '../core/thinking-models.js';
|
|
3
|
-
import { WorkspaceContext } from '../core/workspace-context.js';
|
|
4
|
-
/** Time window (in minutes) for querying principle events related to a sample */
|
|
5
|
-
const PRINCIPLE_EVENT_WINDOW_MINUTES = 10;
|
|
6
|
-
function parseJson(raw, fallback) {
|
|
7
|
-
if (!raw)
|
|
8
|
-
return fallback;
|
|
9
|
-
try {
|
|
10
|
-
return JSON.parse(raw);
|
|
11
|
-
}
|
|
12
|
-
catch {
|
|
13
|
-
return fallback;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
function roundRate(numerator, denominator) {
|
|
17
|
-
if (!denominator)
|
|
18
|
-
return 0;
|
|
19
|
-
return Number((numerator / denominator).toFixed(4));
|
|
20
|
-
}
|
|
21
|
-
function clampPageSize(input) {
|
|
22
|
-
if (!Number.isFinite(input))
|
|
23
|
-
return 20;
|
|
24
|
-
return Math.min(100, Math.max(1, Number(input)));
|
|
25
|
-
}
|
|
26
|
-
function summarizeRecommendation(model) {
|
|
27
|
-
if (model.hits === 0)
|
|
28
|
-
return 'archive';
|
|
29
|
-
if (model.failureRate > model.successRate || model.correctionRate >= 0.35 || model.painRate >= 0.3) {
|
|
30
|
-
return 'rework';
|
|
31
|
-
}
|
|
32
|
-
return 'reinforce';
|
|
33
|
-
}
|
|
34
|
-
export class ControlUiQueryService {
|
|
35
|
-
workspaceDir;
|
|
36
|
-
trajectory;
|
|
37
|
-
uiDb;
|
|
38
|
-
constructor(workspaceDir) {
|
|
39
|
-
this.workspaceDir = workspaceDir;
|
|
40
|
-
this.trajectory = WorkspaceContext.fromHookContext({ workspaceDir }).trajectory;
|
|
41
|
-
this.uiDb = new ControlUiDatabase({ workspaceDir });
|
|
42
|
-
}
|
|
43
|
-
dispose() {
|
|
44
|
-
this.uiDb.dispose();
|
|
45
|
-
}
|
|
46
|
-
getOverview(days = 30) {
|
|
47
|
-
const stats = this.trajectory.getDataStats();
|
|
48
|
-
const regressionRows = this.uiDb.all('SELECT tool_name, error_type, occurrences FROM v_error_clusters ORDER BY occurrences DESC LIMIT 5');
|
|
49
|
-
const failureStats = this.uiDb.get(`
|
|
50
|
-
SELECT
|
|
51
|
-
COALESCE(SUM(occurrences), 0) AS total_failures,
|
|
52
|
-
COALESCE(SUM(CASE WHEN occurrences > 1 THEN occurrences ELSE 0 END), 0) AS repeated_failures
|
|
53
|
-
FROM v_error_clusters
|
|
54
|
-
`) ?? { total_failures: 0, repeated_failures: 0 };
|
|
55
|
-
const correctionTotal = this.uiDb.get('SELECT COUNT(*) AS count FROM user_turns WHERE correction_detected = 1')?.count ?? 0;
|
|
56
|
-
const principleEventCount = this.uiDb.get('SELECT COUNT(*) AS count FROM principle_events')?.count ?? 0;
|
|
57
|
-
const gateBlockCount = this.uiDb.get('SELECT COUNT(*) AS count FROM gate_blocks')?.count ?? 0;
|
|
58
|
-
const taskOutcomeCount = this.uiDb.get('SELECT COUNT(*) AS count FROM task_outcomes')?.count ?? 0;
|
|
59
|
-
const sampleCounters = this.uiDb.all('SELECT review_status, total FROM v_sample_queue');
|
|
60
|
-
const samplePreview = this.uiDb.all(`
|
|
61
|
-
SELECT sample_id, session_id, quality_score, review_status, created_at
|
|
62
|
-
FROM correction_samples
|
|
63
|
-
ORDER BY created_at DESC
|
|
64
|
-
LIMIT 5
|
|
65
|
-
`);
|
|
66
|
-
const coverageRow = this.uiDb.get(`
|
|
67
|
-
SELECT
|
|
68
|
-
COUNT(DISTINCT assistant_turn_id) AS thinking_turns,
|
|
69
|
-
(SELECT COUNT(*) FROM assistant_turns) AS assistant_turns
|
|
70
|
-
FROM thinking_model_events
|
|
71
|
-
`) ?? { thinking_turns: 0, assistant_turns: 0 };
|
|
72
|
-
const effectiveCount = this.uiDb.all('SELECT events, success_windows, failure_windows, pain_windows, correction_windows FROM v_thinking_model_effectiveness')
|
|
73
|
-
.filter((row) => summarizeRecommendation({
|
|
74
|
-
hits: Number(row.events),
|
|
75
|
-
successRate: roundRate(Number(row.success_windows), Number(row.events)),
|
|
76
|
-
failureRate: roundRate(Number(row.failure_windows), Number(row.events)),
|
|
77
|
-
painRate: roundRate(Number(row.pain_windows), Number(row.events)),
|
|
78
|
-
correctionRate: roundRate(Number(row.correction_windows), Number(row.events)),
|
|
79
|
-
}) === 'reinforce').length;
|
|
80
|
-
const dailyTrend = this.uiDb.all(`
|
|
81
|
-
WITH thinking_daily AS (
|
|
82
|
-
SELECT substr(created_at, 1, 10) AS day, COUNT(DISTINCT assistant_turn_id) AS thinking_turns
|
|
83
|
-
FROM thinking_model_events
|
|
84
|
-
GROUP BY substr(created_at, 1, 10)
|
|
85
|
-
)
|
|
86
|
-
SELECT
|
|
87
|
-
dm.day AS day,
|
|
88
|
-
dm.tool_calls AS tool_calls,
|
|
89
|
-
dm.failures AS failures,
|
|
90
|
-
dm.user_corrections AS user_corrections,
|
|
91
|
-
COALESCE(td.thinking_turns, 0) AS thinking_turns
|
|
92
|
-
FROM v_daily_metrics dm
|
|
93
|
-
LEFT JOIN thinking_daily td ON td.day = dm.day
|
|
94
|
-
ORDER BY dm.day DESC
|
|
95
|
-
LIMIT ?
|
|
96
|
-
`, days).reverse();
|
|
97
|
-
const counters = Object.fromEntries(sampleCounters.map((row) => [row.review_status, Number(row.total)]));
|
|
98
|
-
const activeModels = this.uiDb.get('SELECT COUNT(DISTINCT model_id) AS count FROM thinking_model_events')?.count ?? 0;
|
|
99
|
-
return {
|
|
100
|
-
workspaceDir: this.workspaceDir,
|
|
101
|
-
generatedAt: new Date().toISOString(),
|
|
102
|
-
dataFreshness: stats.lastIngestAt,
|
|
103
|
-
dataSource: 'trajectory_db_analytics',
|
|
104
|
-
runtimeControlPlaneSource: 'pd_evolution_status',
|
|
105
|
-
summary: {
|
|
106
|
-
repeatErrorRate: roundRate(Number(failureStats.repeated_failures), Number(failureStats.total_failures)),
|
|
107
|
-
userCorrectionRate: roundRate(correctionTotal, stats.userTurns),
|
|
108
|
-
pendingSamples: stats.pendingSamples,
|
|
109
|
-
approvedSamples: stats.approvedSamples,
|
|
110
|
-
thinkingCoverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
|
|
111
|
-
painEvents: stats.painEvents,
|
|
112
|
-
principleEventCount,
|
|
113
|
-
gateBlocks: Number(gateBlockCount),
|
|
114
|
-
taskOutcomes: Number(taskOutcomeCount),
|
|
115
|
-
},
|
|
116
|
-
dailyTrend: dailyTrend.map((row) => ({
|
|
117
|
-
day: row.day,
|
|
118
|
-
toolCalls: Number(row.tool_calls),
|
|
119
|
-
failures: Number(row.failures),
|
|
120
|
-
userCorrections: Number(row.user_corrections),
|
|
121
|
-
thinkingTurns: Number(row.thinking_turns),
|
|
122
|
-
})),
|
|
123
|
-
topRegressions: regressionRows.map((row) => ({
|
|
124
|
-
toolName: row.tool_name,
|
|
125
|
-
errorType: row.error_type,
|
|
126
|
-
occurrences: Number(row.occurrences),
|
|
127
|
-
})),
|
|
128
|
-
sampleQueue: {
|
|
129
|
-
counters,
|
|
130
|
-
preview: samplePreview.map((row) => ({
|
|
131
|
-
sampleId: row.sample_id,
|
|
132
|
-
sessionId: row.session_id,
|
|
133
|
-
qualityScore: Number(row.quality_score),
|
|
134
|
-
reviewStatus: row.review_status,
|
|
135
|
-
createdAt: row.created_at,
|
|
136
|
-
})),
|
|
137
|
-
},
|
|
138
|
-
thinkingSummary: {
|
|
139
|
-
activeModels,
|
|
140
|
-
dormantModels: Math.max(0, listThinkingModels().length - activeModels),
|
|
141
|
-
effectiveModels: effectiveCount,
|
|
142
|
-
coverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
listSamples(filters = {}) {
|
|
147
|
-
const page = Math.max(1, Number(filters.page ?? 1));
|
|
148
|
-
const pageSize = clampPageSize(filters.pageSize);
|
|
149
|
-
const offset = (page - 1) * pageSize;
|
|
150
|
-
const where = [];
|
|
151
|
-
const params = [];
|
|
152
|
-
if (filters.status && filters.status !== 'all') {
|
|
153
|
-
where.push('cs.review_status = ?');
|
|
154
|
-
params.push(filters.status);
|
|
155
|
-
}
|
|
156
|
-
if (Number.isFinite(filters.qualityMin)) {
|
|
157
|
-
where.push('cs.quality_score >= ?');
|
|
158
|
-
params.push(Number(filters.qualityMin));
|
|
159
|
-
}
|
|
160
|
-
if (filters.dateFrom) {
|
|
161
|
-
where.push('cs.created_at >= ?');
|
|
162
|
-
params.push(filters.dateFrom);
|
|
163
|
-
}
|
|
164
|
-
if (filters.dateTo) {
|
|
165
|
-
where.push('cs.created_at <= ?');
|
|
166
|
-
params.push(filters.dateTo);
|
|
167
|
-
}
|
|
168
|
-
if (filters.failureMode) {
|
|
169
|
-
where.push(`
|
|
170
|
-
COALESCE(
|
|
171
|
-
(
|
|
172
|
-
SELECT COALESCE(tc.error_type, tc.tool_name)
|
|
173
|
-
FROM tool_calls tc
|
|
174
|
-
WHERE tc.session_id = cs.session_id
|
|
175
|
-
AND tc.outcome = 'failure'
|
|
176
|
-
AND tc.created_at <= ut.created_at
|
|
177
|
-
ORDER BY tc.created_at DESC
|
|
178
|
-
LIMIT 1
|
|
179
|
-
),
|
|
180
|
-
'unknown'
|
|
181
|
-
) = ?
|
|
182
|
-
`);
|
|
183
|
-
params.push(filters.failureMode);
|
|
184
|
-
}
|
|
185
|
-
const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : '';
|
|
186
|
-
const total = Number(this.uiDb.get(`
|
|
187
|
-
SELECT COUNT(*) AS count
|
|
188
|
-
FROM correction_samples cs
|
|
189
|
-
JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
|
|
190
|
-
${whereClause}
|
|
191
|
-
`, ...params)?.count ?? 0);
|
|
192
|
-
const items = this.uiDb.all(`
|
|
193
|
-
SELECT
|
|
194
|
-
cs.sample_id,
|
|
195
|
-
cs.session_id,
|
|
196
|
-
cs.review_status,
|
|
197
|
-
cs.quality_score,
|
|
198
|
-
cs.created_at,
|
|
199
|
-
cs.updated_at,
|
|
200
|
-
cs.diff_excerpt,
|
|
201
|
-
COALESCE(
|
|
202
|
-
(
|
|
203
|
-
SELECT COALESCE(tc.error_type, tc.tool_name)
|
|
204
|
-
FROM tool_calls tc
|
|
205
|
-
WHERE tc.session_id = cs.session_id
|
|
206
|
-
AND tc.outcome = 'failure'
|
|
207
|
-
AND tc.created_at <= ut.created_at
|
|
208
|
-
ORDER BY tc.created_at DESC
|
|
209
|
-
LIMIT 1
|
|
210
|
-
),
|
|
211
|
-
'unknown'
|
|
212
|
-
) AS failure_mode,
|
|
213
|
-
(
|
|
214
|
-
SELECT COUNT(*)
|
|
215
|
-
FROM thinking_model_events tme
|
|
216
|
-
JOIN assistant_turns at2 ON at2.id = cs.bad_assistant_turn_id
|
|
217
|
-
WHERE tme.session_id = cs.session_id
|
|
218
|
-
AND tme.created_at >= at2.created_at
|
|
219
|
-
AND tme.created_at <= ut.created_at
|
|
220
|
-
) AS related_thinking_count
|
|
221
|
-
FROM correction_samples cs
|
|
222
|
-
JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
|
|
223
|
-
${whereClause}
|
|
224
|
-
ORDER BY cs.created_at DESC
|
|
225
|
-
LIMIT ? OFFSET ?
|
|
226
|
-
`, ...params, pageSize, offset);
|
|
227
|
-
const counters = this.uiDb.all(`
|
|
228
|
-
SELECT review_status, COUNT(*) AS count
|
|
229
|
-
FROM correction_samples
|
|
230
|
-
GROUP BY review_status
|
|
231
|
-
`);
|
|
232
|
-
return {
|
|
233
|
-
counters: Object.fromEntries(counters.map((row) => [row.review_status, Number(row.count)])),
|
|
234
|
-
items: items.map((row) => ({
|
|
235
|
-
sampleId: row.sample_id,
|
|
236
|
-
sessionId: row.session_id,
|
|
237
|
-
reviewStatus: row.review_status,
|
|
238
|
-
qualityScore: Number(row.quality_score),
|
|
239
|
-
failureMode: row.failure_mode,
|
|
240
|
-
relatedThinkingCount: Number(row.related_thinking_count),
|
|
241
|
-
createdAt: row.created_at,
|
|
242
|
-
updatedAt: row.updated_at,
|
|
243
|
-
diffExcerpt: row.diff_excerpt,
|
|
244
|
-
})),
|
|
245
|
-
pagination: {
|
|
246
|
-
page,
|
|
247
|
-
pageSize,
|
|
248
|
-
total,
|
|
249
|
-
totalPages: total === 0 ? 0 : Math.ceil(total / pageSize),
|
|
250
|
-
},
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
getSampleDetail(sampleId) {
|
|
254
|
-
const row = this.uiDb.get(`
|
|
255
|
-
SELECT
|
|
256
|
-
cs.sample_id,
|
|
257
|
-
cs.session_id,
|
|
258
|
-
cs.review_status,
|
|
259
|
-
cs.quality_score,
|
|
260
|
-
cs.created_at,
|
|
261
|
-
cs.updated_at,
|
|
262
|
-
cs.recovery_tool_span_json,
|
|
263
|
-
cs.principle_ids_json,
|
|
264
|
-
at.id AS bad_turn_id,
|
|
265
|
-
at.raw_text AS bad_raw_text,
|
|
266
|
-
at.blob_ref AS bad_blob_ref,
|
|
267
|
-
at.sanitized_text AS bad_sanitized_text,
|
|
268
|
-
at.created_at AS bad_created_at,
|
|
269
|
-
ut.id AS user_turn_id,
|
|
270
|
-
ut.raw_text AS user_raw_text,
|
|
271
|
-
ut.blob_ref AS user_blob_ref,
|
|
272
|
-
ut.correction_cue AS user_correction_cue,
|
|
273
|
-
ut.created_at AS user_created_at
|
|
274
|
-
FROM correction_samples cs
|
|
275
|
-
JOIN assistant_turns at ON at.id = cs.bad_assistant_turn_id
|
|
276
|
-
JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
|
|
277
|
-
WHERE cs.sample_id = ?
|
|
278
|
-
`, sampleId);
|
|
279
|
-
if (!row)
|
|
280
|
-
return null;
|
|
281
|
-
const reviewHistory = this.uiDb.all(`
|
|
282
|
-
SELECT review_status, note, created_at
|
|
283
|
-
FROM sample_reviews
|
|
284
|
-
WHERE sample_id = ?
|
|
285
|
-
ORDER BY created_at DESC
|
|
286
|
-
`, sampleId);
|
|
287
|
-
const relatedThinkingHits = this.uiDb.all(`
|
|
288
|
-
SELECT id, model_id, matched_pattern, scenario_json, created_at, trigger_excerpt
|
|
289
|
-
FROM thinking_model_events
|
|
290
|
-
WHERE session_id = ?
|
|
291
|
-
AND created_at >= ?
|
|
292
|
-
AND created_at <= ?
|
|
293
|
-
ORDER BY created_at DESC
|
|
294
|
-
LIMIT 20
|
|
295
|
-
`, row.session_id, row.bad_created_at, row.user_created_at);
|
|
296
|
-
const relatedPrinciples = this.uiDb.all(`
|
|
297
|
-
SELECT principle_id, event_type, created_at
|
|
298
|
-
FROM principle_events
|
|
299
|
-
WHERE created_at >= ?
|
|
300
|
-
AND created_at <= datetime(?, '+' || ? || ' minutes')
|
|
301
|
-
ORDER BY created_at DESC
|
|
302
|
-
LIMIT 20
|
|
303
|
-
`, row.bad_created_at, row.user_created_at, PRINCIPLE_EVENT_WINDOW_MINUTES);
|
|
304
|
-
const seededPrincipleIds = parseJson(row.principle_ids_json, []).map((principleId) => ({
|
|
305
|
-
principleId,
|
|
306
|
-
eventType: 'seeded_from_sample',
|
|
307
|
-
createdAt: row.created_at,
|
|
308
|
-
}));
|
|
309
|
-
return {
|
|
310
|
-
sampleId: row.sample_id,
|
|
311
|
-
sessionId: row.session_id,
|
|
312
|
-
reviewStatus: row.review_status,
|
|
313
|
-
qualityScore: Number(row.quality_score),
|
|
314
|
-
createdAt: row.created_at,
|
|
315
|
-
updatedAt: row.updated_at,
|
|
316
|
-
badAttempt: {
|
|
317
|
-
assistantTurnId: Number(row.bad_turn_id),
|
|
318
|
-
rawText: this.uiDb.restoreRawText(row.bad_raw_text, row.bad_blob_ref),
|
|
319
|
-
sanitizedText: row.bad_sanitized_text,
|
|
320
|
-
createdAt: row.bad_created_at,
|
|
321
|
-
},
|
|
322
|
-
userCorrection: {
|
|
323
|
-
userTurnId: Number(row.user_turn_id),
|
|
324
|
-
rawText: this.uiDb.restoreRawText(row.user_raw_text, row.user_blob_ref),
|
|
325
|
-
correctionCue: row.user_correction_cue,
|
|
326
|
-
createdAt: row.user_created_at,
|
|
327
|
-
},
|
|
328
|
-
recoveryToolSpan: parseJson(row.recovery_tool_span_json, []),
|
|
329
|
-
relatedPrinciples: [
|
|
330
|
-
...seededPrincipleIds,
|
|
331
|
-
...relatedPrinciples.map((item) => ({
|
|
332
|
-
principleId: item.principle_id,
|
|
333
|
-
eventType: item.event_type,
|
|
334
|
-
createdAt: item.created_at,
|
|
335
|
-
})),
|
|
336
|
-
],
|
|
337
|
-
relatedThinkingHits: relatedThinkingHits.map((item) => ({
|
|
338
|
-
id: Number(item.id),
|
|
339
|
-
modelId: item.model_id,
|
|
340
|
-
modelName: getThinkingModel(item.model_id)?.name ?? item.model_id,
|
|
341
|
-
matchedPattern: item.matched_pattern,
|
|
342
|
-
scenarios: parseJson(item.scenario_json, []),
|
|
343
|
-
createdAt: item.created_at,
|
|
344
|
-
triggerExcerpt: item.trigger_excerpt,
|
|
345
|
-
})),
|
|
346
|
-
reviewHistory: reviewHistory.map((item) => ({
|
|
347
|
-
reviewStatus: item.review_status,
|
|
348
|
-
note: item.note,
|
|
349
|
-
createdAt: item.created_at,
|
|
350
|
-
})),
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
reviewSample(sampleId, decision, note) {
|
|
354
|
-
return this.trajectory.reviewCorrectionSample(sampleId, decision, note);
|
|
355
|
-
}
|
|
356
|
-
exportCorrections(mode) {
|
|
357
|
-
return this.trajectory.exportCorrections({ mode, approvedOnly: true });
|
|
358
|
-
}
|
|
359
|
-
getThinkingOverview() {
|
|
360
|
-
const topModels = this.loadThinkingModelSummaries();
|
|
361
|
-
const knownModels = listThinkingModels();
|
|
362
|
-
const activeIds = new Set(topModels.filter((model) => model.hits > 0).map((model) => model.modelId));
|
|
363
|
-
const dormantModels = knownModels
|
|
364
|
-
.filter((model) => !activeIds.has(model.id))
|
|
365
|
-
.map((model) => ({
|
|
366
|
-
modelId: model.id,
|
|
367
|
-
name: model.name,
|
|
368
|
-
description: model.description,
|
|
369
|
-
}));
|
|
370
|
-
const coverageRow = this.uiDb.get(`
|
|
371
|
-
SELECT
|
|
372
|
-
COUNT(DISTINCT assistant_turn_id) AS thinking_turns,
|
|
373
|
-
(SELECT COUNT(*) FROM assistant_turns) AS assistant_turns
|
|
374
|
-
FROM thinking_model_events
|
|
375
|
-
`) ?? { thinking_turns: 0, assistant_turns: 0 };
|
|
376
|
-
const coverageTrend = this.uiDb.all(`
|
|
377
|
-
WITH assistant_daily AS (
|
|
378
|
-
SELECT substr(created_at, 1, 10) AS day, COUNT(*) AS assistant_turns
|
|
379
|
-
FROM assistant_turns
|
|
380
|
-
GROUP BY substr(created_at, 1, 10)
|
|
381
|
-
),
|
|
382
|
-
thinking_daily AS (
|
|
383
|
-
SELECT substr(created_at, 1, 10) AS day, COUNT(DISTINCT assistant_turn_id) AS thinking_turns
|
|
384
|
-
FROM thinking_model_events
|
|
385
|
-
GROUP BY substr(created_at, 1, 10)
|
|
386
|
-
)
|
|
387
|
-
SELECT
|
|
388
|
-
assistant_daily.day AS day,
|
|
389
|
-
assistant_daily.assistant_turns AS assistant_turns,
|
|
390
|
-
COALESCE(thinking_daily.thinking_turns, 0) AS thinking_turns
|
|
391
|
-
FROM assistant_daily
|
|
392
|
-
LEFT JOIN thinking_daily ON thinking_daily.day = assistant_daily.day
|
|
393
|
-
ORDER BY assistant_daily.day ASC
|
|
394
|
-
`);
|
|
395
|
-
const scenarioMatrix = this.uiDb.all('SELECT model_id, scenario, hits FROM v_thinking_model_scenarios ORDER BY hits DESC, model_id ASC');
|
|
396
|
-
return {
|
|
397
|
-
summary: {
|
|
398
|
-
totalModels: knownModels.length,
|
|
399
|
-
activeModels: activeIds.size,
|
|
400
|
-
dormantModels: dormantModels.length,
|
|
401
|
-
effectiveModels: topModels.filter((model) => model.recommendation === 'reinforce').length,
|
|
402
|
-
coverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
|
|
403
|
-
},
|
|
404
|
-
topModels,
|
|
405
|
-
dormantModels,
|
|
406
|
-
effectiveModels: topModels.filter((model) => model.recommendation === 'reinforce'),
|
|
407
|
-
scenarioMatrix: scenarioMatrix.map((row) => ({
|
|
408
|
-
modelId: row.model_id,
|
|
409
|
-
modelName: getThinkingModel(row.model_id)?.name ?? row.model_id,
|
|
410
|
-
scenario: row.scenario,
|
|
411
|
-
hits: Number(row.hits),
|
|
412
|
-
})),
|
|
413
|
-
coverageTrend: coverageTrend.map((row) => ({
|
|
414
|
-
day: row.day,
|
|
415
|
-
assistantTurns: Number(row.assistant_turns),
|
|
416
|
-
thinkingTurns: Number(row.thinking_turns),
|
|
417
|
-
coverageRate: roundRate(Number(row.thinking_turns), Number(row.assistant_turns)),
|
|
418
|
-
})),
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
getThinkingModelDetail(modelId) {
|
|
422
|
-
if (!getThinkingModel(modelId)) {
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
const summary = this.loadThinkingModelSummaries().find((item) => item.modelId === modelId) ?? {
|
|
426
|
-
modelId,
|
|
427
|
-
name: getThinkingModel(modelId)?.name ?? modelId,
|
|
428
|
-
description: getThinkingModel(modelId)?.description ?? 'Unknown thinking model.',
|
|
429
|
-
hits: 0,
|
|
430
|
-
coverageRate: 0,
|
|
431
|
-
successRate: 0,
|
|
432
|
-
failureRate: 0,
|
|
433
|
-
painRate: 0,
|
|
434
|
-
correctionRate: 0,
|
|
435
|
-
correctionSampleRate: 0,
|
|
436
|
-
commonScenarios: [],
|
|
437
|
-
recommendation: 'archive',
|
|
438
|
-
};
|
|
439
|
-
const usageTrend = this.uiDb.all(`
|
|
440
|
-
SELECT day, hits
|
|
441
|
-
FROM v_thinking_model_daily_trend
|
|
442
|
-
WHERE model_id = ?
|
|
443
|
-
ORDER BY day ASC
|
|
444
|
-
`, modelId);
|
|
445
|
-
const scenarioDistribution = this.uiDb.all(`
|
|
446
|
-
SELECT scenario, hits
|
|
447
|
-
FROM v_thinking_model_scenarios
|
|
448
|
-
WHERE model_id = ?
|
|
449
|
-
ORDER BY hits DESC, scenario ASC
|
|
450
|
-
`, modelId);
|
|
451
|
-
const effect = this.uiDb.get('SELECT * FROM v_thinking_model_effectiveness WHERE model_id = ?', modelId) ?? {
|
|
452
|
-
events: 0,
|
|
453
|
-
success_windows: 0,
|
|
454
|
-
failure_windows: 0,
|
|
455
|
-
pain_windows: 0,
|
|
456
|
-
correction_windows: 0,
|
|
457
|
-
correction_sample_windows: 0,
|
|
458
|
-
};
|
|
459
|
-
const recentEvents = this.uiDb.all(`
|
|
460
|
-
SELECT id, created_at, matched_pattern, scenario_json, trigger_excerpt,
|
|
461
|
-
tool_context_json, pain_context_json, principle_context_json
|
|
462
|
-
FROM thinking_model_events
|
|
463
|
-
WHERE model_id = ?
|
|
464
|
-
ORDER BY created_at DESC
|
|
465
|
-
LIMIT 20
|
|
466
|
-
`, modelId);
|
|
467
|
-
return {
|
|
468
|
-
modelMeta: {
|
|
469
|
-
modelId: summary.modelId,
|
|
470
|
-
name: summary.name,
|
|
471
|
-
description: summary.description,
|
|
472
|
-
hits: summary.hits,
|
|
473
|
-
coverageRate: summary.coverageRate,
|
|
474
|
-
recommendation: summary.recommendation,
|
|
475
|
-
},
|
|
476
|
-
usageTrend: usageTrend.map((row) => ({
|
|
477
|
-
day: row.day,
|
|
478
|
-
hits: Number(row.hits),
|
|
479
|
-
})),
|
|
480
|
-
scenarioDistribution: scenarioDistribution.map((row) => ({
|
|
481
|
-
scenario: row.scenario,
|
|
482
|
-
hits: Number(row.hits),
|
|
483
|
-
})),
|
|
484
|
-
outcomeStats: {
|
|
485
|
-
events: Number(effect.events),
|
|
486
|
-
successRate: roundRate(Number(effect.success_windows), Number(effect.events)),
|
|
487
|
-
failureRate: roundRate(Number(effect.failure_windows), Number(effect.events)),
|
|
488
|
-
painRate: roundRate(Number(effect.pain_windows), Number(effect.events)),
|
|
489
|
-
correctionRate: roundRate(Number(effect.correction_windows), Number(effect.events)),
|
|
490
|
-
correctionSampleRate: roundRate(Number(effect.correction_sample_windows), Number(effect.events)),
|
|
491
|
-
},
|
|
492
|
-
recentEvents: recentEvents.map((row) => ({
|
|
493
|
-
id: Number(row.id),
|
|
494
|
-
createdAt: row.created_at,
|
|
495
|
-
matchedPattern: row.matched_pattern,
|
|
496
|
-
scenarios: parseJson(row.scenario_json, []),
|
|
497
|
-
triggerExcerpt: row.trigger_excerpt,
|
|
498
|
-
toolContext: parseJson(row.tool_context_json, []),
|
|
499
|
-
painContext: parseJson(row.pain_context_json, []),
|
|
500
|
-
principleContext: parseJson(row.principle_context_json, []),
|
|
501
|
-
})),
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
loadThinkingModelSummaries() {
|
|
505
|
-
const knownModels = listThinkingModels();
|
|
506
|
-
const usageRows = new Map(this.uiDb.all('SELECT model_id, hits, coverage_rate FROM v_thinking_model_usage').map((row) => [row.model_id, row]));
|
|
507
|
-
const effectRows = new Map(this.uiDb.all('SELECT * FROM v_thinking_model_effectiveness').map((row) => [row.model_id, row]));
|
|
508
|
-
const scenarioRows = this.uiDb.all('SELECT model_id, scenario, hits FROM v_thinking_model_scenarios ORDER BY hits DESC');
|
|
509
|
-
return knownModels.map((model) => {
|
|
510
|
-
const usage = usageRows.get(model.id);
|
|
511
|
-
const effect = effectRows.get(model.id);
|
|
512
|
-
const events = Number(effect?.events ?? usage?.hits ?? 0);
|
|
513
|
-
const successRate = roundRate(Number(effect?.success_windows ?? 0), events);
|
|
514
|
-
const failureRate = roundRate(Number(effect?.failure_windows ?? 0), events);
|
|
515
|
-
const painRate = roundRate(Number(effect?.pain_windows ?? 0), events);
|
|
516
|
-
const correctionRate = roundRate(Number(effect?.correction_windows ?? 0), events);
|
|
517
|
-
const correctionSampleRate = roundRate(Number(effect?.correction_sample_windows ?? 0), events);
|
|
518
|
-
return {
|
|
519
|
-
modelId: model.id,
|
|
520
|
-
name: model.name,
|
|
521
|
-
description: model.description,
|
|
522
|
-
hits: Number(usage?.hits ?? 0),
|
|
523
|
-
coverageRate: Number(usage?.coverage_rate ?? 0),
|
|
524
|
-
successRate,
|
|
525
|
-
failureRate,
|
|
526
|
-
painRate,
|
|
527
|
-
correctionRate,
|
|
528
|
-
correctionSampleRate,
|
|
529
|
-
commonScenarios: scenarioRows
|
|
530
|
-
.filter((row) => row.model_id === model.id)
|
|
531
|
-
.slice(0, 3)
|
|
532
|
-
.map((row) => row.scenario),
|
|
533
|
-
recommendation: summarizeRecommendation({
|
|
534
|
-
hits: Number(usage?.hits ?? 0),
|
|
535
|
-
successRate,
|
|
536
|
-
failureRate,
|
|
537
|
-
painRate,
|
|
538
|
-
correctionRate,
|
|
539
|
-
}),
|
|
540
|
-
};
|
|
541
|
-
}).sort((left, right) => right.hits - left.hits || left.modelId.localeCompare(right.modelId));
|
|
542
|
-
}
|
|
543
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { PluginLogger } from '../openclaw-sdk.js';
|
|
2
|
-
export interface EmpathyObserverApi {
|
|
3
|
-
config?: {
|
|
4
|
-
empathy_engine?: {
|
|
5
|
-
enabled?: boolean;
|
|
6
|
-
};
|
|
7
|
-
};
|
|
8
|
-
runtime: {
|
|
9
|
-
subagent: {
|
|
10
|
-
run: (params: {
|
|
11
|
-
sessionKey: string;
|
|
12
|
-
message: string;
|
|
13
|
-
lane?: string;
|
|
14
|
-
deliver?: boolean;
|
|
15
|
-
idempotencyKey?: string;
|
|
16
|
-
expectsCompletionMessage?: boolean;
|
|
17
|
-
}) => Promise<unknown>;
|
|
18
|
-
waitForRun: (params: {
|
|
19
|
-
runId: string;
|
|
20
|
-
timeoutMs?: number;
|
|
21
|
-
}) => Promise<{
|
|
22
|
-
status: 'ok' | 'error' | 'timeout';
|
|
23
|
-
error?: string;
|
|
24
|
-
}>;
|
|
25
|
-
getSessionMessages: (params: {
|
|
26
|
-
sessionKey: string;
|
|
27
|
-
limit?: number;
|
|
28
|
-
}) => Promise<{
|
|
29
|
-
messages: unknown[];
|
|
30
|
-
assistantTexts?: string[];
|
|
31
|
-
}>;
|
|
32
|
-
deleteSession: (params: {
|
|
33
|
-
sessionKey: string;
|
|
34
|
-
deleteTranscript?: boolean;
|
|
35
|
-
}) => Promise<void>;
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
logger: PluginLogger;
|
|
39
|
-
}
|
|
40
|
-
export declare class EmpathyObserverManager {
|
|
41
|
-
private static instance;
|
|
42
|
-
private sessionLocks;
|
|
43
|
-
private activeRuns;
|
|
44
|
-
private completedSessions;
|
|
45
|
-
private constructor();
|
|
46
|
-
static getInstance(): EmpathyObserverManager;
|
|
47
|
-
/**
|
|
48
|
-
* Build a safe session key for empathy observer
|
|
49
|
-
* Format: agent:main:subagent:empathy-obs-{safeParentSessionId}-{timestamp}
|
|
50
|
-
*/
|
|
51
|
-
buildEmpathyObserverSessionKey(parentSessionId: string): string;
|
|
52
|
-
/**
|
|
53
|
-
* Check if a session key is an empathy observer session
|
|
54
|
-
*/
|
|
55
|
-
isObserverSession(sessionKey: string): boolean;
|
|
56
|
-
private markCompleted;
|
|
57
|
-
private isCompleted;
|
|
58
|
-
private isActive;
|
|
59
|
-
private getActiveMetadata;
|
|
60
|
-
shouldTrigger(api: EmpathyObserverApi | null | undefined, sessionId: string): boolean;
|
|
61
|
-
spawn(api: EmpathyObserverApi | null | undefined, sessionId: string, userMessage: string, workspaceDir?: string): Promise<string | null>;
|
|
62
|
-
/**
|
|
63
|
-
* Main回收链路: 使用 waitForRun 驱动回收
|
|
64
|
-
* 仅在 ok 时回收; timeout/exception 保留 session 由 fallback 处理
|
|
65
|
-
*/
|
|
66
|
-
private finalizeRun;
|
|
67
|
-
/**
|
|
68
|
-
* 统一回收入口: reap + deleteSession + 清理状态
|
|
69
|
-
*/
|
|
70
|
-
private reapBySession;
|
|
71
|
-
/**
|
|
72
|
-
* Fallback回收: 由 subagent_ended 触发
|
|
73
|
-
* 仅在主链路未处理时执行补救回收
|
|
74
|
-
*/
|
|
75
|
-
reap(api: EmpathyObserverApi | null | undefined, targetSessionKey: string, workspaceDir?: string): Promise<void>;
|
|
76
|
-
private cleanupState;
|
|
77
|
-
/**
|
|
78
|
-
* Extract parent session ID from observer session key
|
|
79
|
-
*/
|
|
80
|
-
extractParentSessionId(sessionKey: string): string | null;
|
|
81
|
-
private parseJsonPayload;
|
|
82
|
-
private extractAssistantText;
|
|
83
|
-
private scoreFromSeverity;
|
|
84
|
-
private normalizeSeverity;
|
|
85
|
-
private normalizeConfidence;
|
|
86
|
-
}
|
|
87
|
-
export declare const empathyObserverManager: EmpathyObserverManager;
|
|
88
|
-
export declare function isEmpathyObserverSession(sessionKey: string): boolean;
|