principles-disciple 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADVANCED_CONFIG_ZH.md +97 -0
- package/AGENT_INSTALL.md +173 -0
- package/AGENT_INSTALL_EN.md +173 -0
- package/INSTALL.md +256 -0
- package/SKILL.md +63 -0
- package/docs/COMMAND_REFERENCE.md +76 -0
- package/docs/COMMAND_REFERENCE_EN.md +79 -0
- package/esbuild.config.js +75 -0
- package/openclaw.plugin.json +6 -1
- package/package.json +13 -15
- package/scripts/build-web.mjs +46 -0
- package/scripts/install-dependencies.cjs +47 -0
- package/scripts/sync-plugin.mjs +802 -0
- package/scripts/verify-build.mjs +109 -0
- package/src/agents/nocturnal-dreamer.md +152 -0
- package/src/agents/nocturnal-philosopher.md +138 -0
- package/src/agents/nocturnal-reflector.md +126 -0
- package/src/agents/nocturnal-scribe.md +164 -0
- package/src/commands/capabilities.ts +85 -0
- package/{dist/commands/context.js → src/commands/context.ts} +78 -38
- package/src/commands/evolution-status.ts +146 -0
- package/src/commands/export.ts +111 -0
- package/src/commands/focus.ts +533 -0
- package/src/commands/nocturnal-review.ts +311 -0
- package/src/commands/nocturnal-rollout.ts +763 -0
- package/src/commands/nocturnal-train.ts +1002 -0
- package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
- package/src/commands/principle-rollback.ts +27 -0
- package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
- package/src/commands/samples.ts +60 -0
- package/src/commands/strategy.ts +38 -0
- package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
- package/src/commands/workflow-debug.ts +128 -0
- package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
- package/src/config/errors.ts +163 -0
- package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
- package/src/constants/diagnostician.ts +66 -0
- package/src/constants/tools.ts +62 -0
- package/src/core/adaptive-thresholds.ts +476 -0
- package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
- package/{dist/core/config.js → src/core/config.ts} +158 -46
- package/src/core/control-ui-db.ts +435 -0
- package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
- package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
- package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
- package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
- package/src/core/empathy-keyword-matcher.ts +327 -0
- package/src/core/empathy-types.ts +218 -0
- package/src/core/event-log.ts +544 -0
- package/src/core/evolution-engine.ts +612 -0
- package/src/core/evolution-logger.ts +353 -0
- package/src/core/evolution-migration.ts +77 -0
- package/src/core/evolution-reducer.ts +731 -0
- package/src/core/evolution-types.ts +456 -0
- package/src/core/external-training-contract.ts +527 -0
- package/src/core/focus-history.ts +1458 -0
- package/src/core/hygiene/tracker.ts +117 -0
- package/{dist/core/init.js → src/core/init.ts} +39 -26
- package/src/core/local-worker-routing.ts +617 -0
- package/{dist/core/migration.js → src/core/migration.ts} +18 -11
- package/src/core/model-deployment-registry.ts +722 -0
- package/src/core/model-training-registry.ts +813 -0
- package/src/core/nocturnal-arbiter.ts +706 -0
- package/src/core/nocturnal-candidate-scoring.ts +392 -0
- package/src/core/nocturnal-compliance.ts +1075 -0
- package/src/core/nocturnal-dataset.ts +668 -0
- package/src/core/nocturnal-executability.ts +428 -0
- package/src/core/nocturnal-export.ts +390 -0
- package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
- package/src/core/nocturnal-trajectory-extractor.ts +484 -0
- package/src/core/nocturnal-trinity.ts +1384 -0
- package/src/core/pain.ts +122 -0
- package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
- package/{dist/core/paths.js → src/core/paths.ts} +13 -4
- package/src/core/principle-training-state.ts +450 -0
- package/src/core/profile.ts +226 -0
- package/src/core/promotion-gate.ts +822 -0
- package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
- package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +185 -63
- package/src/core/shadow-observation-registry.ts +534 -0
- package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
- package/src/core/thinking-models.ts +217 -0
- package/src/core/training-program.ts +630 -0
- package/src/core/trajectory-types.ts +243 -0
- package/src/core/trajectory.ts +1673 -0
- package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
- package/src/hooks/bash-risk.ts +171 -0
- package/src/hooks/edit-verification.ts +295 -0
- package/src/hooks/gate-block-helper.ts +160 -0
- package/src/hooks/gate.ts +210 -0
- package/src/hooks/gfi-gate.ts +177 -0
- package/src/hooks/lifecycle.ts +326 -0
- package/{dist/hooks/llm.js → src/hooks/llm.ts} +166 -139
- package/src/hooks/message-sanitize.ts +45 -0
- package/src/hooks/pain.ts +384 -0
- package/src/hooks/progressive-trust-gate.ts +174 -0
- package/src/hooks/prompt.ts +920 -0
- package/src/hooks/subagent.ts +207 -0
- package/src/hooks/thinking-checkpoint.ts +73 -0
- package/src/hooks/trajectory-collector.ts +290 -0
- package/src/http/principles-console-route.ts +716 -0
- package/src/i18n/commands.ts +117 -0
- package/src/index.ts +694 -0
- package/src/service/central-database.ts +831 -0
- package/src/service/control-ui-query-service.ts +888 -0
- package/src/service/evolution-query-service.ts +405 -0
- package/src/service/evolution-worker.ts +1646 -0
- package/src/service/health-query-service.ts +836 -0
- package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +263 -36
- package/src/service/nocturnal-service.ts +1015 -0
- package/src/service/nocturnal-target-selector.ts +532 -0
- package/src/service/phase3-input-filter.ts +237 -0
- package/src/service/runtime-summary-service.ts +757 -0
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +603 -0
- package/src/service/subagent-workflow/index.ts +51 -0
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
- package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
- package/src/service/subagent-workflow/types.ts +378 -0
- package/src/service/subagent-workflow/workflow-store.ts +328 -0
- package/src/service/trajectory-service.ts +15 -0
- package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
- package/src/tools/deep-reflect.ts +349 -0
- package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
- package/src/types/event-types.ts +453 -0
- package/src/types/hygiene-types.ts +31 -0
- package/src/types/principle-tree-schema.ts +244 -0
- package/src/types/runtime-summary.ts +49 -0
- package/src/types.ts +74 -0
- package/src/utils/file-lock.ts +391 -0
- package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
- package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
- package/src/utils/io.ts +110 -0
- package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
- package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
- package/src/utils/subagent-probe.ts +94 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
- package/templates/pain_settings.json +2 -1
- package/tests/README.md +120 -0
- package/tests/build-artifacts.test.ts +111 -0
- package/tests/commands/evolution-status.test.ts +222 -0
- package/tests/commands/evolver.test.ts +22 -0
- package/tests/commands/export.test.ts +78 -0
- package/tests/commands/nocturnal-review.test.ts +448 -0
- package/tests/commands/nocturnal-train.test.ts +97 -0
- package/tests/commands/pain.test.ts +108 -0
- package/tests/commands/samples.test.ts +65 -0
- package/tests/commands/strategy.test.ts +34 -0
- package/tests/commands/thinking-os.test.ts +88 -0
- package/tests/core/adaptive-thresholds.test.ts +261 -0
- package/tests/core/config-service.test.ts +89 -0
- package/tests/core/config.test.ts +90 -0
- package/tests/core/control-ui-db.test.ts +75 -0
- package/tests/core/core-template-guidance.test.ts +21 -0
- package/tests/core/detection-funnel.test.ts +63 -0
- package/tests/core/detection-service.test.ts +50 -0
- package/tests/core/dictionary-service.test.ts +116 -0
- package/tests/core/dictionary.test.ts +168 -0
- package/tests/core/empathy-keyword-matcher.test.ts +209 -0
- package/tests/core/event-log.test.ts +181 -0
- package/tests/core/evolution-e2e.test.ts +58 -0
- package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
- package/tests/core/evolution-engine.test.ts +562 -0
- package/tests/core/evolution-logger.test.ts +148 -0
- package/tests/core/evolution-migration.test.ts +50 -0
- package/tests/core/evolution-paths.test.ts +21 -0
- package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
- package/tests/core/evolution-reducer.test.ts +180 -0
- package/tests/core/evolution-types-loop.test.ts +48 -0
- package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
- package/tests/core/external-training-contract.test.ts +463 -0
- package/tests/core/focus-history.test.ts +682 -0
- package/tests/core/init-flatten.test.ts +69 -0
- package/tests/core/init-refactor.test.ts +87 -0
- package/tests/core/init-v1.3.test.ts +46 -0
- package/tests/core/init.test.ts +190 -0
- package/tests/core/local-worker-routing.test.ts +757 -0
- package/tests/core/migration.test.ts +84 -0
- package/tests/core/model-deployment-registry.test.ts +845 -0
- package/tests/core/model-training-registry.test.ts +889 -0
- package/tests/core/nocturnal-arbiter.test.ts +494 -0
- package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
- package/tests/core/nocturnal-compliance.test.ts +646 -0
- package/tests/core/nocturnal-dataset.test.ts +892 -0
- package/tests/core/nocturnal-executability.test.ts +357 -0
- package/tests/core/nocturnal-export.test.ts +462 -0
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
- package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
- package/tests/core/nocturnal-trinity.test.ts +953 -0
- package/tests/core/pain.test.ts +33 -0
- package/tests/core/path-resolver.test.ts +57 -0
- package/tests/core/paths-refactor.test.ts +42 -0
- package/tests/core/phase7-rollout-integration.test.ts +477 -0
- package/tests/core/principle-training-state.test.ts +712 -0
- package/tests/core/profile.test.ts +56 -0
- package/tests/core/promotion-gate.test.ts +556 -0
- package/tests/core/risk-calculator.test.ts +168 -0
- package/tests/core/session-tracker.test.ts +191 -0
- package/tests/core/training-program.test.ts +472 -0
- package/tests/core/trajectory.test.ts +265 -0
- package/tests/core/workspace-context-factory.test.ts +18 -0
- package/tests/core/workspace-context.test.ts +134 -0
- package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
- package/tests/fixtures/production-compatibility.test.ts +147 -0
- package/tests/fixtures/production-mock-generator.ts +282 -0
- package/tests/hooks/bash-risk-integration.test.ts +137 -0
- package/tests/hooks/bash-risk.test.ts +81 -0
- package/tests/hooks/edit-verification.test.ts +678 -0
- package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
- package/tests/hooks/gate-edit-verification.test.ts +435 -0
- package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
- package/tests/hooks/gate.test.ts +271 -0
- package/tests/hooks/gfi-gate-unit.test.ts +422 -0
- package/tests/hooks/gfi-gate.test.ts +669 -0
- package/tests/hooks/lifecycle.test.ts +248 -0
- package/tests/hooks/llm.test.ts +308 -0
- package/tests/hooks/message-sanitize.test.ts +36 -0
- package/tests/hooks/pain.test.ts +141 -0
- package/tests/hooks/progressive-trust-gate.test.ts +277 -0
- package/tests/hooks/prompt.test.ts +1411 -0
- package/tests/hooks/subagent.test.ts +467 -0
- package/tests/hooks/thinking-gate.test.ts +313 -0
- package/tests/http/principles-console-route.test.ts +140 -0
- package/tests/hygiene-tracker.test.ts +77 -0
- package/tests/index.integration.test.ts +179 -0
- package/tests/index.shadow-routing.integration.test.ts +140 -0
- package/tests/index.test.ts +9 -0
- package/tests/integration/empathy-workflow-integration.test.ts +627 -0
- package/tests/service/control-ui-query-service.test.ts +121 -0
- package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
- package/tests/service/evolution-worker.test.ts +585 -0
- package/tests/service/nocturnal-runtime.test.ts +470 -0
- package/tests/service/nocturnal-service.test.ts +577 -0
- package/tests/service/nocturnal-target-selector.test.ts +615 -0
- package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
- package/tests/service/phase3-input-filter.test.ts +289 -0
- package/tests/service/runtime-summary-service.test.ts +919 -0
- package/tests/task-compliance.test.ts +166 -0
- package/tests/test-utils.ts +48 -0
- package/tests/tools/critique-prompt.test.ts +260 -0
- package/tests/tools/deep-reflect.test.ts +232 -0
- package/tests/tools/model-index.test.ts +246 -0
- package/tests/ui/app.test.tsx +114 -0
- package/tests/utils/file-lock.test.ts +407 -0
- package/tests/utils/hashing.test.ts +32 -0
- package/tests/utils/io.test.ts +39 -0
- package/tests/utils/nlp.test.ts +53 -0
- package/tests/utils/plugin-logger.test.ts +156 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/ui/src/App.tsx +45 -0
- package/ui/src/api.ts +216 -0
- package/ui/src/charts.tsx +586 -0
- package/ui/src/components/ErrorState.tsx +6 -0
- package/ui/src/components/Loading.tsx +13 -0
- package/ui/src/components/ProtectedRoute.tsx +12 -0
- package/ui/src/components/Shell.tsx +91 -0
- package/ui/src/components/WorkspaceConfig.tsx +146 -0
- package/ui/src/components/index.ts +5 -0
- package/ui/src/context/auth.tsx +80 -0
- package/ui/src/context/theme.tsx +66 -0
- package/ui/src/hooks/useAutoRefresh.ts +39 -0
- package/ui/src/i18n/ui.ts +363 -0
- package/ui/src/main.tsx +16 -0
- package/ui/src/pages/EvolutionPage.tsx +352 -0
- package/ui/src/pages/FeedbackPage.tsx +140 -0
- package/ui/src/pages/GateMonitorPage.tsx +136 -0
- package/ui/src/pages/LoginPage.tsx +88 -0
- package/ui/src/pages/OverviewPage.tsx +238 -0
- package/ui/src/pages/SamplesPage.tsx +174 -0
- package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
- package/ui/src/styles.css +1661 -0
- package/ui/src/types.ts +368 -0
- package/ui/src/utils/format.ts +15 -0
- package/vitest.config.ts +23 -0
- package/dist/commands/capabilities.d.ts +0 -3
- package/dist/commands/capabilities.js +0 -73
- package/dist/commands/context.d.ts +0 -5
- package/dist/commands/evolution-status.d.ts +0 -4
- package/dist/commands/evolution-status.js +0 -117
- package/dist/commands/evolver.d.ts +0 -9
- package/dist/commands/evolver.js +0 -26
- package/dist/commands/export.d.ts +0 -2
- package/dist/commands/export.js +0 -98
- package/dist/commands/focus.d.ts +0 -14
- package/dist/commands/focus.js +0 -457
- package/dist/commands/nocturnal-review.d.ts +0 -24
- package/dist/commands/nocturnal-review.js +0 -265
- package/dist/commands/nocturnal-rollout.d.ts +0 -27
- package/dist/commands/nocturnal-rollout.js +0 -671
- package/dist/commands/nocturnal-train.d.ts +0 -25
- package/dist/commands/nocturnal-train.js +0 -919
- package/dist/commands/pain.d.ts +0 -5
- package/dist/commands/principle-rollback.d.ts +0 -4
- package/dist/commands/principle-rollback.js +0 -22
- package/dist/commands/rollback.d.ts +0 -19
- package/dist/commands/samples.d.ts +0 -2
- package/dist/commands/samples.js +0 -55
- package/dist/commands/strategy.d.ts +0 -3
- package/dist/commands/strategy.js +0 -29
- package/dist/commands/thinking-os.d.ts +0 -2
- package/dist/config/defaults/runtime.d.ts +0 -40
- package/dist/config/errors.d.ts +0 -84
- package/dist/config/errors.js +0 -94
- package/dist/config/index.js +0 -7
- package/dist/constants/diagnostician.d.ts +0 -12
- package/dist/constants/diagnostician.js +0 -56
- package/dist/constants/tools.d.ts +0 -17
- package/dist/constants/tools.js +0 -54
- package/dist/core/adaptive-thresholds.d.ts +0 -186
- package/dist/core/adaptive-thresholds.js +0 -300
- package/dist/core/config-service.d.ts +0 -15
- package/dist/core/config.d.ts +0 -127
- package/dist/core/control-ui-db.d.ts +0 -95
- package/dist/core/control-ui-db.js +0 -292
- package/dist/core/detection-funnel.d.ts +0 -33
- package/dist/core/detection-service.d.ts +0 -15
- package/dist/core/dictionary-service.d.ts +0 -15
- package/dist/core/dictionary.d.ts +0 -38
- package/dist/core/event-log.d.ts +0 -82
- package/dist/core/event-log.js +0 -463
- package/dist/core/evolution-engine.d.ts +0 -118
- package/dist/core/evolution-engine.js +0 -464
- package/dist/core/evolution-logger.d.ts +0 -137
- package/dist/core/evolution-logger.js +0 -256
- package/dist/core/evolution-migration.d.ts +0 -5
- package/dist/core/evolution-migration.js +0 -65
- package/dist/core/evolution-reducer.d.ts +0 -98
- package/dist/core/evolution-reducer.js +0 -465
- package/dist/core/evolution-types.d.ts +0 -287
- package/dist/core/evolution-types.js +0 -78
- package/dist/core/external-training-contract.d.ts +0 -276
- package/dist/core/external-training-contract.js +0 -269
- package/dist/core/focus-history.d.ts +0 -210
- package/dist/core/focus-history.js +0 -1185
- package/dist/core/hygiene/tracker.d.ts +0 -22
- package/dist/core/hygiene/tracker.js +0 -106
- package/dist/core/init.d.ts +0 -12
- package/dist/core/local-worker-routing.d.ts +0 -175
- package/dist/core/local-worker-routing.js +0 -525
- package/dist/core/migration.d.ts +0 -6
- package/dist/core/model-deployment-registry.d.ts +0 -218
- package/dist/core/model-deployment-registry.js +0 -503
- package/dist/core/model-training-registry.d.ts +0 -295
- package/dist/core/model-training-registry.js +0 -475
- package/dist/core/nocturnal-arbiter.d.ts +0 -159
- package/dist/core/nocturnal-arbiter.js +0 -534
- package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
- package/dist/core/nocturnal-candidate-scoring.js +0 -266
- package/dist/core/nocturnal-compliance.d.ts +0 -175
- package/dist/core/nocturnal-compliance.js +0 -824
- package/dist/core/nocturnal-dataset.d.ts +0 -224
- package/dist/core/nocturnal-dataset.js +0 -443
- package/dist/core/nocturnal-executability.d.ts +0 -85
- package/dist/core/nocturnal-executability.js +0 -331
- package/dist/core/nocturnal-export.d.ts +0 -124
- package/dist/core/nocturnal-export.js +0 -275
- package/dist/core/nocturnal-paths.d.ts +0 -124
- package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
- package/dist/core/nocturnal-trajectory-extractor.js +0 -307
- package/dist/core/nocturnal-trinity.d.ts +0 -311
- package/dist/core/nocturnal-trinity.js +0 -880
- package/dist/core/pain.d.ts +0 -4
- package/dist/core/pain.js +0 -70
- package/dist/core/path-resolver.d.ts +0 -46
- package/dist/core/paths.d.ts +0 -65
- package/dist/core/principle-training-state.d.ts +0 -121
- package/dist/core/principle-training-state.js +0 -321
- package/dist/core/profile.d.ts +0 -62
- package/dist/core/profile.js +0 -210
- package/dist/core/promotion-gate.d.ts +0 -238
- package/dist/core/promotion-gate.js +0 -529
- package/dist/core/risk-calculator.d.ts +0 -22
- package/dist/core/session-tracker.d.ts +0 -99
- package/dist/core/shadow-observation-registry.d.ts +0 -217
- package/dist/core/shadow-observation-registry.js +0 -308
- package/dist/core/system-logger.d.ts +0 -8
- package/dist/core/thinking-models.d.ts +0 -38
- package/dist/core/thinking-models.js +0 -170
- package/dist/core/training-program.d.ts +0 -233
- package/dist/core/training-program.js +0 -433
- package/dist/core/trajectory.d.ts +0 -411
- package/dist/core/trajectory.js +0 -1307
- package/dist/core/workspace-context.d.ts +0 -71
- package/dist/hooks/bash-risk.d.ts +0 -57
- package/dist/hooks/bash-risk.js +0 -137
- package/dist/hooks/edit-verification.d.ts +0 -62
- package/dist/hooks/edit-verification.js +0 -256
- package/dist/hooks/gate-block-helper.d.ts +0 -44
- package/dist/hooks/gate-block-helper.js +0 -119
- package/dist/hooks/gate.d.ts +0 -24
- package/dist/hooks/gate.js +0 -173
- package/dist/hooks/gfi-gate.d.ts +0 -40
- package/dist/hooks/gfi-gate.js +0 -113
- package/dist/hooks/lifecycle.d.ts +0 -5
- package/dist/hooks/lifecycle.js +0 -284
- package/dist/hooks/llm.d.ts +0 -12
- package/dist/hooks/message-sanitize.d.ts +0 -3
- package/dist/hooks/message-sanitize.js +0 -37
- package/dist/hooks/pain.d.ts +0 -5
- package/dist/hooks/pain.js +0 -301
- package/dist/hooks/progressive-trust-gate.d.ts +0 -51
- package/dist/hooks/progressive-trust-gate.js +0 -89
- package/dist/hooks/prompt.d.ts +0 -47
- package/dist/hooks/prompt.js +0 -884
- package/dist/hooks/subagent.d.ts +0 -10
- package/dist/hooks/subagent.js +0 -387
- package/dist/hooks/thinking-checkpoint.d.ts +0 -37
- package/dist/hooks/thinking-checkpoint.js +0 -51
- package/dist/hooks/trajectory-collector.d.ts +0 -32
- package/dist/hooks/trajectory-collector.js +0 -256
- package/dist/http/principles-console-route.d.ts +0 -9
- package/dist/http/principles-console-route.js +0 -567
- package/dist/i18n/commands.d.ts +0 -26
- package/dist/i18n/commands.js +0 -116
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -581
- package/dist/service/central-database.d.ts +0 -104
- package/dist/service/central-database.js +0 -649
- package/dist/service/control-ui-query-service.d.ts +0 -221
- package/dist/service/control-ui-query-service.js +0 -543
- package/dist/service/empathy-observer-manager.d.ts +0 -52
- package/dist/service/empathy-observer-manager.js +0 -229
- package/dist/service/evolution-query-service.d.ts +0 -155
- package/dist/service/evolution-query-service.js +0 -258
- package/dist/service/evolution-worker.d.ts +0 -101
- package/dist/service/evolution-worker.js +0 -974
- package/dist/service/nocturnal-runtime.d.ts +0 -183
- package/dist/service/nocturnal-service.d.ts +0 -163
- package/dist/service/nocturnal-service.js +0 -787
- package/dist/service/nocturnal-target-selector.d.ts +0 -145
- package/dist/service/nocturnal-target-selector.js +0 -315
- package/dist/service/phase3-input-filter.d.ts +0 -73
- package/dist/service/phase3-input-filter.js +0 -172
- package/dist/service/runtime-summary-service.d.ts +0 -122
- package/dist/service/runtime-summary-service.js +0 -485
- package/dist/service/trajectory-service.d.ts +0 -2
- package/dist/service/trajectory-service.js +0 -15
- package/dist/tools/critique-prompt.d.ts +0 -14
- package/dist/tools/deep-reflect.d.ts +0 -39
- package/dist/tools/deep-reflect.js +0 -350
- package/dist/tools/model-index.d.ts +0 -9
- package/dist/types/event-types.d.ts +0 -306
- package/dist/types/event-types.js +0 -106
- package/dist/types/hygiene-types.d.ts +0 -20
- package/dist/types/hygiene-types.js +0 -12
- package/dist/types/runtime-summary.d.ts +0 -47
- package/dist/types/runtime-summary.js +0 -1
- package/dist/types.d.ts +0 -50
- package/dist/types.js +0 -22
- package/dist/utils/file-lock.d.ts +0 -71
- package/dist/utils/file-lock.js +0 -309
- package/dist/utils/glob-match.d.ts +0 -28
- package/dist/utils/hashing.d.ts +0 -9
- package/dist/utils/io.d.ts +0 -6
- package/dist/utils/io.js +0 -106
- package/dist/utils/nlp.d.ts +0 -9
- package/dist/utils/plugin-logger.d.ts +0 -39
- package/dist/utils/subagent-probe.d.ts +0 -34
- package/dist/utils/subagent-probe.js +0 -81
|
@@ -1,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,52 +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
|
-
}) => Promise<unknown>;
|
|
17
|
-
getSessionMessages: (params: {
|
|
18
|
-
sessionKey: string;
|
|
19
|
-
limit?: number;
|
|
20
|
-
}) => Promise<{
|
|
21
|
-
messages: unknown[];
|
|
22
|
-
assistantTexts?: string[];
|
|
23
|
-
}>;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
logger: PluginLogger;
|
|
27
|
-
}
|
|
28
|
-
export declare class EmpathyObserverManager {
|
|
29
|
-
private static instance;
|
|
30
|
-
private sessionLocks;
|
|
31
|
-
private constructor();
|
|
32
|
-
static getInstance(): EmpathyObserverManager;
|
|
33
|
-
/**
|
|
34
|
-
* Probe whether the subagent runtime is actually functional.
|
|
35
|
-
* api.runtime.subagent always exists (it's a Proxy), but in embedded mode
|
|
36
|
-
* every method throws "only available during a gateway request".
|
|
37
|
-
* We cache the result to avoid repeated probing.
|
|
38
|
-
*/
|
|
39
|
-
private subagentAvailableCache;
|
|
40
|
-
private isSubagentAvailable;
|
|
41
|
-
shouldTrigger(api: EmpathyObserverApi | null | undefined, sessionId: string): boolean;
|
|
42
|
-
spawn(api: EmpathyObserverApi | null | undefined, sessionId: string, userMessage: string): Promise<string | null>;
|
|
43
|
-
reap(api: EmpathyObserverApi | null | undefined, targetSessionKey: string, workspaceDir: string): Promise<void>;
|
|
44
|
-
private isObserverSession;
|
|
45
|
-
private extractParentSessionId;
|
|
46
|
-
private parseJsonPayload;
|
|
47
|
-
private extractAssistantText;
|
|
48
|
-
private scoreFromSeverity;
|
|
49
|
-
private normalizeSeverity;
|
|
50
|
-
private normalizeConfidence;
|
|
51
|
-
}
|
|
52
|
-
export declare const empathyObserverManager: EmpathyObserverManager;
|