principles-disciple 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ADVANCED_CONFIG_ZH.md +97 -0
- package/AGENT_INSTALL.md +173 -0
- package/AGENT_INSTALL_EN.md +173 -0
- package/INSTALL.md +256 -0
- package/SKILL.md +63 -0
- package/docs/COMMAND_REFERENCE.md +76 -0
- package/docs/COMMAND_REFERENCE_EN.md +79 -0
- package/esbuild.config.js +75 -0
- package/openclaw.plugin.json +6 -1
- package/package.json +13 -15
- package/scripts/build-web.mjs +46 -0
- package/scripts/install-dependencies.cjs +47 -0
- package/scripts/sync-plugin.mjs +802 -0
- package/scripts/verify-build.mjs +109 -0
- package/src/agents/nocturnal-dreamer.md +152 -0
- package/src/agents/nocturnal-philosopher.md +138 -0
- package/src/agents/nocturnal-reflector.md +126 -0
- package/src/agents/nocturnal-scribe.md +164 -0
- package/src/commands/capabilities.ts +85 -0
- package/{dist/commands/context.js → src/commands/context.ts} +78 -38
- package/src/commands/evolution-status.ts +146 -0
- package/src/commands/export.ts +111 -0
- package/src/commands/focus.ts +533 -0
- package/src/commands/nocturnal-review.ts +311 -0
- package/src/commands/nocturnal-rollout.ts +763 -0
- package/src/commands/nocturnal-train.ts +1002 -0
- package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
- package/src/commands/principle-rollback.ts +27 -0
- package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
- package/src/commands/samples.ts +60 -0
- package/src/commands/strategy.ts +38 -0
- package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
- package/src/commands/workflow-debug.ts +128 -0
- package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
- package/src/config/errors.ts +163 -0
- package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
- package/src/constants/diagnostician.ts +66 -0
- package/src/constants/tools.ts +62 -0
- package/src/core/adaptive-thresholds.ts +476 -0
- package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
- package/{dist/core/config.js → src/core/config.ts} +158 -46
- package/src/core/control-ui-db.ts +435 -0
- package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
- package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
- package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
- package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
- package/src/core/empathy-keyword-matcher.ts +327 -0
- package/src/core/empathy-types.ts +218 -0
- package/src/core/event-log.ts +544 -0
- package/src/core/evolution-engine.ts +612 -0
- package/src/core/evolution-logger.ts +353 -0
- package/src/core/evolution-migration.ts +77 -0
- package/src/core/evolution-reducer.ts +731 -0
- package/src/core/evolution-types.ts +456 -0
- package/src/core/external-training-contract.ts +527 -0
- package/src/core/focus-history.ts +1458 -0
- package/src/core/hygiene/tracker.ts +117 -0
- package/{dist/core/init.js → src/core/init.ts} +39 -26
- package/src/core/local-worker-routing.ts +617 -0
- package/{dist/core/migration.js → src/core/migration.ts} +18 -11
- package/src/core/model-deployment-registry.ts +722 -0
- package/src/core/model-training-registry.ts +813 -0
- package/src/core/nocturnal-arbiter.ts +706 -0
- package/src/core/nocturnal-candidate-scoring.ts +392 -0
- package/src/core/nocturnal-compliance.ts +1075 -0
- package/src/core/nocturnal-dataset.ts +668 -0
- package/src/core/nocturnal-executability.ts +428 -0
- package/src/core/nocturnal-export.ts +390 -0
- package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
- package/src/core/nocturnal-trajectory-extractor.ts +484 -0
- package/src/core/nocturnal-trinity.ts +1384 -0
- package/src/core/pain.ts +122 -0
- package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
- package/{dist/core/paths.js → src/core/paths.ts} +13 -4
- package/src/core/principle-training-state.ts +450 -0
- package/src/core/profile.ts +226 -0
- package/src/core/promotion-gate.ts +822 -0
- package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
- package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +185 -63
- package/src/core/shadow-observation-registry.ts +534 -0
- package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
- package/src/core/thinking-models.ts +217 -0
- package/src/core/training-program.ts +630 -0
- package/src/core/trajectory-types.ts +243 -0
- package/src/core/trajectory.ts +1673 -0
- package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
- package/src/hooks/bash-risk.ts +171 -0
- package/src/hooks/edit-verification.ts +295 -0
- package/src/hooks/gate-block-helper.ts +160 -0
- package/src/hooks/gate.ts +210 -0
- package/src/hooks/gfi-gate.ts +177 -0
- package/src/hooks/lifecycle.ts +326 -0
- package/{dist/hooks/llm.js → src/hooks/llm.ts} +166 -139
- package/src/hooks/message-sanitize.ts +45 -0
- package/src/hooks/pain.ts +384 -0
- package/src/hooks/progressive-trust-gate.ts +174 -0
- package/src/hooks/prompt.ts +920 -0
- package/src/hooks/subagent.ts +207 -0
- package/src/hooks/thinking-checkpoint.ts +73 -0
- package/src/hooks/trajectory-collector.ts +290 -0
- package/src/http/principles-console-route.ts +716 -0
- package/src/i18n/commands.ts +117 -0
- package/src/index.ts +694 -0
- package/src/service/central-database.ts +831 -0
- package/src/service/control-ui-query-service.ts +888 -0
- package/src/service/evolution-query-service.ts +405 -0
- package/src/service/evolution-worker.ts +1646 -0
- package/src/service/health-query-service.ts +836 -0
- package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +263 -36
- package/src/service/nocturnal-service.ts +1015 -0
- package/src/service/nocturnal-target-selector.ts +532 -0
- package/src/service/phase3-input-filter.ts +237 -0
- package/src/service/runtime-summary-service.ts +757 -0
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +603 -0
- package/src/service/subagent-workflow/index.ts +51 -0
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
- package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
- package/src/service/subagent-workflow/types.ts +378 -0
- package/src/service/subagent-workflow/workflow-store.ts +328 -0
- package/src/service/trajectory-service.ts +15 -0
- package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
- package/src/tools/deep-reflect.ts +349 -0
- package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
- package/src/types/event-types.ts +453 -0
- package/src/types/hygiene-types.ts +31 -0
- package/src/types/principle-tree-schema.ts +244 -0
- package/src/types/runtime-summary.ts +49 -0
- package/src/types.ts +74 -0
- package/src/utils/file-lock.ts +391 -0
- package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
- package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
- package/src/utils/io.ts +110 -0
- package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
- package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
- package/src/utils/subagent-probe.ts +94 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
- package/templates/pain_settings.json +2 -1
- package/tests/README.md +120 -0
- package/tests/build-artifacts.test.ts +111 -0
- package/tests/commands/evolution-status.test.ts +222 -0
- package/tests/commands/evolver.test.ts +22 -0
- package/tests/commands/export.test.ts +78 -0
- package/tests/commands/nocturnal-review.test.ts +448 -0
- package/tests/commands/nocturnal-train.test.ts +97 -0
- package/tests/commands/pain.test.ts +108 -0
- package/tests/commands/samples.test.ts +65 -0
- package/tests/commands/strategy.test.ts +34 -0
- package/tests/commands/thinking-os.test.ts +88 -0
- package/tests/core/adaptive-thresholds.test.ts +261 -0
- package/tests/core/config-service.test.ts +89 -0
- package/tests/core/config.test.ts +90 -0
- package/tests/core/control-ui-db.test.ts +75 -0
- package/tests/core/core-template-guidance.test.ts +21 -0
- package/tests/core/detection-funnel.test.ts +63 -0
- package/tests/core/detection-service.test.ts +50 -0
- package/tests/core/dictionary-service.test.ts +116 -0
- package/tests/core/dictionary.test.ts +168 -0
- package/tests/core/empathy-keyword-matcher.test.ts +209 -0
- package/tests/core/event-log.test.ts +181 -0
- package/tests/core/evolution-e2e.test.ts +58 -0
- package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
- package/tests/core/evolution-engine.test.ts +562 -0
- package/tests/core/evolution-logger.test.ts +148 -0
- package/tests/core/evolution-migration.test.ts +50 -0
- package/tests/core/evolution-paths.test.ts +21 -0
- package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
- package/tests/core/evolution-reducer.test.ts +180 -0
- package/tests/core/evolution-types-loop.test.ts +48 -0
- package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
- package/tests/core/external-training-contract.test.ts +463 -0
- package/tests/core/focus-history.test.ts +682 -0
- package/tests/core/init-flatten.test.ts +69 -0
- package/tests/core/init-refactor.test.ts +87 -0
- package/tests/core/init-v1.3.test.ts +46 -0
- package/tests/core/init.test.ts +190 -0
- package/tests/core/local-worker-routing.test.ts +757 -0
- package/tests/core/migration.test.ts +84 -0
- package/tests/core/model-deployment-registry.test.ts +845 -0
- package/tests/core/model-training-registry.test.ts +889 -0
- package/tests/core/nocturnal-arbiter.test.ts +494 -0
- package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
- package/tests/core/nocturnal-compliance.test.ts +646 -0
- package/tests/core/nocturnal-dataset.test.ts +892 -0
- package/tests/core/nocturnal-executability.test.ts +357 -0
- package/tests/core/nocturnal-export.test.ts +462 -0
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
- package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
- package/tests/core/nocturnal-trinity.test.ts +953 -0
- package/tests/core/pain.test.ts +33 -0
- package/tests/core/path-resolver.test.ts +57 -0
- package/tests/core/paths-refactor.test.ts +42 -0
- package/tests/core/phase7-rollout-integration.test.ts +477 -0
- package/tests/core/principle-training-state.test.ts +712 -0
- package/tests/core/profile.test.ts +56 -0
- package/tests/core/promotion-gate.test.ts +556 -0
- package/tests/core/risk-calculator.test.ts +168 -0
- package/tests/core/session-tracker.test.ts +191 -0
- package/tests/core/training-program.test.ts +472 -0
- package/tests/core/trajectory.test.ts +265 -0
- package/tests/core/workspace-context-factory.test.ts +18 -0
- package/tests/core/workspace-context.test.ts +134 -0
- package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
- package/tests/fixtures/production-compatibility.test.ts +147 -0
- package/tests/fixtures/production-mock-generator.ts +282 -0
- package/tests/hooks/bash-risk-integration.test.ts +137 -0
- package/tests/hooks/bash-risk.test.ts +81 -0
- package/tests/hooks/edit-verification.test.ts +678 -0
- package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
- package/tests/hooks/gate-edit-verification.test.ts +435 -0
- package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
- package/tests/hooks/gate.test.ts +271 -0
- package/tests/hooks/gfi-gate-unit.test.ts +422 -0
- package/tests/hooks/gfi-gate.test.ts +669 -0
- package/tests/hooks/lifecycle.test.ts +248 -0
- package/tests/hooks/llm.test.ts +308 -0
- package/tests/hooks/message-sanitize.test.ts +36 -0
- package/tests/hooks/pain.test.ts +141 -0
- package/tests/hooks/progressive-trust-gate.test.ts +277 -0
- package/tests/hooks/prompt.test.ts +1411 -0
- package/tests/hooks/subagent.test.ts +467 -0
- package/tests/hooks/thinking-gate.test.ts +313 -0
- package/tests/http/principles-console-route.test.ts +140 -0
- package/tests/hygiene-tracker.test.ts +77 -0
- package/tests/index.integration.test.ts +179 -0
- package/tests/index.shadow-routing.integration.test.ts +140 -0
- package/tests/index.test.ts +9 -0
- package/tests/integration/empathy-workflow-integration.test.ts +627 -0
- package/tests/service/control-ui-query-service.test.ts +121 -0
- package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
- package/tests/service/evolution-worker.test.ts +585 -0
- package/tests/service/nocturnal-runtime.test.ts +470 -0
- package/tests/service/nocturnal-service.test.ts +577 -0
- package/tests/service/nocturnal-target-selector.test.ts +615 -0
- package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
- package/tests/service/phase3-input-filter.test.ts +289 -0
- package/tests/service/runtime-summary-service.test.ts +919 -0
- package/tests/task-compliance.test.ts +166 -0
- package/tests/test-utils.ts +48 -0
- package/tests/tools/critique-prompt.test.ts +260 -0
- package/tests/tools/deep-reflect.test.ts +232 -0
- package/tests/tools/model-index.test.ts +246 -0
- package/tests/ui/app.test.tsx +114 -0
- package/tests/utils/file-lock.test.ts +407 -0
- package/tests/utils/hashing.test.ts +32 -0
- package/tests/utils/io.test.ts +39 -0
- package/tests/utils/nlp.test.ts +53 -0
- package/tests/utils/plugin-logger.test.ts +156 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/ui/src/App.tsx +45 -0
- package/ui/src/api.ts +216 -0
- package/ui/src/charts.tsx +586 -0
- package/ui/src/components/ErrorState.tsx +6 -0
- package/ui/src/components/Loading.tsx +13 -0
- package/ui/src/components/ProtectedRoute.tsx +12 -0
- package/ui/src/components/Shell.tsx +91 -0
- package/ui/src/components/WorkspaceConfig.tsx +146 -0
- package/ui/src/components/index.ts +5 -0
- package/ui/src/context/auth.tsx +80 -0
- package/ui/src/context/theme.tsx +66 -0
- package/ui/src/hooks/useAutoRefresh.ts +39 -0
- package/ui/src/i18n/ui.ts +363 -0
- package/ui/src/main.tsx +16 -0
- package/ui/src/pages/EvolutionPage.tsx +352 -0
- package/ui/src/pages/FeedbackPage.tsx +140 -0
- package/ui/src/pages/GateMonitorPage.tsx +136 -0
- package/ui/src/pages/LoginPage.tsx +88 -0
- package/ui/src/pages/OverviewPage.tsx +238 -0
- package/ui/src/pages/SamplesPage.tsx +174 -0
- package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
- package/ui/src/styles.css +1661 -0
- package/ui/src/types.ts +368 -0
- package/ui/src/utils/format.ts +15 -0
- package/vitest.config.ts +23 -0
- package/dist/commands/capabilities.d.ts +0 -3
- package/dist/commands/capabilities.js +0 -73
- package/dist/commands/context.d.ts +0 -5
- package/dist/commands/evolution-status.d.ts +0 -4
- package/dist/commands/evolution-status.js +0 -117
- package/dist/commands/evolver.d.ts +0 -9
- package/dist/commands/evolver.js +0 -26
- package/dist/commands/export.d.ts +0 -2
- package/dist/commands/export.js +0 -98
- package/dist/commands/focus.d.ts +0 -14
- package/dist/commands/focus.js +0 -457
- package/dist/commands/nocturnal-review.d.ts +0 -24
- package/dist/commands/nocturnal-review.js +0 -265
- package/dist/commands/nocturnal-rollout.d.ts +0 -27
- package/dist/commands/nocturnal-rollout.js +0 -671
- package/dist/commands/nocturnal-train.d.ts +0 -25
- package/dist/commands/nocturnal-train.js +0 -919
- package/dist/commands/pain.d.ts +0 -5
- package/dist/commands/principle-rollback.d.ts +0 -4
- package/dist/commands/principle-rollback.js +0 -22
- package/dist/commands/rollback.d.ts +0 -19
- package/dist/commands/samples.d.ts +0 -2
- package/dist/commands/samples.js +0 -55
- package/dist/commands/strategy.d.ts +0 -3
- package/dist/commands/strategy.js +0 -29
- package/dist/commands/thinking-os.d.ts +0 -2
- package/dist/config/defaults/runtime.d.ts +0 -40
- package/dist/config/errors.d.ts +0 -84
- package/dist/config/errors.js +0 -94
- package/dist/config/index.js +0 -7
- package/dist/constants/diagnostician.d.ts +0 -12
- package/dist/constants/diagnostician.js +0 -56
- package/dist/constants/tools.d.ts +0 -17
- package/dist/constants/tools.js +0 -54
- package/dist/core/adaptive-thresholds.d.ts +0 -186
- package/dist/core/adaptive-thresholds.js +0 -300
- package/dist/core/config-service.d.ts +0 -15
- package/dist/core/config.d.ts +0 -127
- package/dist/core/control-ui-db.d.ts +0 -95
- package/dist/core/control-ui-db.js +0 -292
- package/dist/core/detection-funnel.d.ts +0 -33
- package/dist/core/detection-service.d.ts +0 -15
- package/dist/core/dictionary-service.d.ts +0 -15
- package/dist/core/dictionary.d.ts +0 -38
- package/dist/core/event-log.d.ts +0 -82
- package/dist/core/event-log.js +0 -463
- package/dist/core/evolution-engine.d.ts +0 -118
- package/dist/core/evolution-engine.js +0 -464
- package/dist/core/evolution-logger.d.ts +0 -137
- package/dist/core/evolution-logger.js +0 -256
- package/dist/core/evolution-migration.d.ts +0 -5
- package/dist/core/evolution-migration.js +0 -65
- package/dist/core/evolution-reducer.d.ts +0 -98
- package/dist/core/evolution-reducer.js +0 -465
- package/dist/core/evolution-types.d.ts +0 -287
- package/dist/core/evolution-types.js +0 -78
- package/dist/core/external-training-contract.d.ts +0 -276
- package/dist/core/external-training-contract.js +0 -269
- package/dist/core/focus-history.d.ts +0 -210
- package/dist/core/focus-history.js +0 -1185
- package/dist/core/hygiene/tracker.d.ts +0 -22
- package/dist/core/hygiene/tracker.js +0 -106
- package/dist/core/init.d.ts +0 -12
- package/dist/core/local-worker-routing.d.ts +0 -175
- package/dist/core/local-worker-routing.js +0 -525
- package/dist/core/migration.d.ts +0 -6
- package/dist/core/model-deployment-registry.d.ts +0 -218
- package/dist/core/model-deployment-registry.js +0 -503
- package/dist/core/model-training-registry.d.ts +0 -295
- package/dist/core/model-training-registry.js +0 -475
- package/dist/core/nocturnal-arbiter.d.ts +0 -159
- package/dist/core/nocturnal-arbiter.js +0 -534
- package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
- package/dist/core/nocturnal-candidate-scoring.js +0 -266
- package/dist/core/nocturnal-compliance.d.ts +0 -175
- package/dist/core/nocturnal-compliance.js +0 -824
- package/dist/core/nocturnal-dataset.d.ts +0 -224
- package/dist/core/nocturnal-dataset.js +0 -443
- package/dist/core/nocturnal-executability.d.ts +0 -85
- package/dist/core/nocturnal-executability.js +0 -331
- package/dist/core/nocturnal-export.d.ts +0 -124
- package/dist/core/nocturnal-export.js +0 -275
- package/dist/core/nocturnal-paths.d.ts +0 -124
- package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
- package/dist/core/nocturnal-trajectory-extractor.js +0 -307
- package/dist/core/nocturnal-trinity.d.ts +0 -311
- package/dist/core/nocturnal-trinity.js +0 -880
- package/dist/core/pain.d.ts +0 -4
- package/dist/core/pain.js +0 -70
- package/dist/core/path-resolver.d.ts +0 -46
- package/dist/core/paths.d.ts +0 -65
- package/dist/core/principle-training-state.d.ts +0 -121
- package/dist/core/principle-training-state.js +0 -321
- package/dist/core/profile.d.ts +0 -62
- package/dist/core/profile.js +0 -210
- package/dist/core/promotion-gate.d.ts +0 -238
- package/dist/core/promotion-gate.js +0 -529
- package/dist/core/risk-calculator.d.ts +0 -22
- package/dist/core/session-tracker.d.ts +0 -99
- package/dist/core/shadow-observation-registry.d.ts +0 -217
- package/dist/core/shadow-observation-registry.js +0 -308
- package/dist/core/system-logger.d.ts +0 -8
- package/dist/core/thinking-models.d.ts +0 -38
- package/dist/core/thinking-models.js +0 -170
- package/dist/core/training-program.d.ts +0 -233
- package/dist/core/training-program.js +0 -433
- package/dist/core/trajectory.d.ts +0 -411
- package/dist/core/trajectory.js +0 -1307
- package/dist/core/workspace-context.d.ts +0 -71
- package/dist/hooks/bash-risk.d.ts +0 -57
- package/dist/hooks/bash-risk.js +0 -137
- package/dist/hooks/edit-verification.d.ts +0 -62
- package/dist/hooks/edit-verification.js +0 -256
- package/dist/hooks/gate-block-helper.d.ts +0 -44
- package/dist/hooks/gate-block-helper.js +0 -119
- package/dist/hooks/gate.d.ts +0 -24
- package/dist/hooks/gate.js +0 -173
- package/dist/hooks/gfi-gate.d.ts +0 -40
- package/dist/hooks/gfi-gate.js +0 -113
- package/dist/hooks/lifecycle.d.ts +0 -5
- package/dist/hooks/lifecycle.js +0 -284
- package/dist/hooks/llm.d.ts +0 -12
- package/dist/hooks/message-sanitize.d.ts +0 -3
- package/dist/hooks/message-sanitize.js +0 -37
- package/dist/hooks/pain.d.ts +0 -5
- package/dist/hooks/pain.js +0 -301
- package/dist/hooks/progressive-trust-gate.d.ts +0 -51
- package/dist/hooks/progressive-trust-gate.js +0 -89
- package/dist/hooks/prompt.d.ts +0 -47
- package/dist/hooks/prompt.js +0 -884
- package/dist/hooks/subagent.d.ts +0 -10
- package/dist/hooks/subagent.js +0 -387
- package/dist/hooks/thinking-checkpoint.d.ts +0 -37
- package/dist/hooks/thinking-checkpoint.js +0 -51
- package/dist/hooks/trajectory-collector.d.ts +0 -32
- package/dist/hooks/trajectory-collector.js +0 -256
- package/dist/http/principles-console-route.d.ts +0 -9
- package/dist/http/principles-console-route.js +0 -567
- package/dist/i18n/commands.d.ts +0 -26
- package/dist/i18n/commands.js +0 -116
- package/dist/index.d.ts +0 -7
- package/dist/index.js +0 -581
- package/dist/service/central-database.d.ts +0 -104
- package/dist/service/central-database.js +0 -649
- package/dist/service/control-ui-query-service.d.ts +0 -221
- package/dist/service/control-ui-query-service.js +0 -543
- package/dist/service/empathy-observer-manager.d.ts +0 -52
- package/dist/service/empathy-observer-manager.js +0 -229
- package/dist/service/evolution-query-service.d.ts +0 -155
- package/dist/service/evolution-query-service.js +0 -258
- package/dist/service/evolution-worker.d.ts +0 -101
- package/dist/service/evolution-worker.js +0 -974
- package/dist/service/nocturnal-runtime.d.ts +0 -183
- package/dist/service/nocturnal-service.d.ts +0 -163
- package/dist/service/nocturnal-service.js +0 -787
- package/dist/service/nocturnal-target-selector.d.ts +0 -145
- package/dist/service/nocturnal-target-selector.js +0 -315
- package/dist/service/phase3-input-filter.d.ts +0 -73
- package/dist/service/phase3-input-filter.js +0 -172
- package/dist/service/runtime-summary-service.d.ts +0 -122
- package/dist/service/runtime-summary-service.js +0 -485
- package/dist/service/trajectory-service.d.ts +0 -2
- package/dist/service/trajectory-service.js +0 -15
- package/dist/tools/critique-prompt.d.ts +0 -14
- package/dist/tools/deep-reflect.d.ts +0 -39
- package/dist/tools/deep-reflect.js +0 -350
- package/dist/tools/model-index.d.ts +0 -9
- package/dist/types/event-types.d.ts +0 -306
- package/dist/types/event-types.js +0 -106
- package/dist/types/hygiene-types.d.ts +0 -20
- package/dist/types/hygiene-types.js +0 -12
- package/dist/types/runtime-summary.d.ts +0 -47
- package/dist/types/runtime-summary.js +0 -1
- package/dist/types.d.ts +0 -50
- package/dist/types.js +0 -22
- package/dist/utils/file-lock.d.ts +0 -71
- package/dist/utils/file-lock.js +0 -309
- package/dist/utils/glob-match.d.ts +0 -28
- package/dist/utils/hashing.d.ts +0 -9
- package/dist/utils/io.d.ts +0 -6
- package/dist/utils/io.js +0 -106
- package/dist/utils/nlp.d.ts +0 -9
- package/dist/utils/plugin-logger.d.ts +0 -39
- package/dist/utils/subagent-probe.d.ts +0 -34
- package/dist/utils/subagent-probe.js +0 -81
package/src/core/pain.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { serializeKvLines, parseKvLines } from '../utils/io.js';
|
|
4
|
+
import { resolvePdPath } from './paths.js';
|
|
5
|
+
import { ConfigService } from './config-service.js';
|
|
6
|
+
|
|
7
|
+
export function computePainScore(rc: number, isSpiral: boolean, missingTestCommand: boolean, softScore: number, projectDir?: string): number {
|
|
8
|
+
let score = Math.max(0, softScore || 0);
|
|
9
|
+
|
|
10
|
+
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
11
|
+
const config = stateDir ? ConfigService.get(stateDir) : null;
|
|
12
|
+
const scoreSettings = config ? config.get('scores') : {
|
|
13
|
+
exit_code_penalty: 70,
|
|
14
|
+
spiral_penalty: 40,
|
|
15
|
+
missing_test_command_penalty: 30
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
if (rc !== 0) {
|
|
19
|
+
score += scoreSettings.exit_code_penalty;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (isSpiral) {
|
|
23
|
+
score += scoreSettings.spiral_penalty;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (missingTestCommand) {
|
|
27
|
+
score += scoreSettings.missing_test_command_penalty;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return Math.min(100, score);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function painSeverityLabel(painScore: number, isSpiral: boolean = false, projectDir?: string): string {
|
|
34
|
+
if (isSpiral) {
|
|
35
|
+
return "critical";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
39
|
+
const config = stateDir ? ConfigService.get(stateDir) : null;
|
|
40
|
+
const thresholds = config ? config.get('severity_thresholds') : {
|
|
41
|
+
high: 70,
|
|
42
|
+
medium: 40,
|
|
43
|
+
low: 20
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
if (painScore >= thresholds.high) {
|
|
47
|
+
return "high";
|
|
48
|
+
} else if (painScore >= thresholds.medium) {
|
|
49
|
+
return "medium";
|
|
50
|
+
} else if (painScore >= thresholds.low) {
|
|
51
|
+
return "low";
|
|
52
|
+
} else {
|
|
53
|
+
return "info";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function writePainFlag(projectDir: string, painData: Record<string, string>): void {
|
|
58
|
+
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
59
|
+
const dir = path.dirname(painFlagPath);
|
|
60
|
+
if (!fs.existsSync(dir)) {
|
|
61
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
62
|
+
}
|
|
63
|
+
fs.writeFileSync(painFlagPath, serializeKvLines(painData), "utf-8");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function readPainFlagData(projectDir: string): Record<string, string> {
|
|
67
|
+
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
68
|
+
try {
|
|
69
|
+
if (!fs.existsSync(painFlagPath)) {
|
|
70
|
+
return {};
|
|
71
|
+
}
|
|
72
|
+
const content = fs.readFileSync(painFlagPath, "utf-8");
|
|
73
|
+
return parseKvLines(content);
|
|
74
|
+
} catch (e) {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Track principle value metrics when a pain signal is written.
|
|
81
|
+
* This is observation-only — it does NOT affect the pain flag write flow.
|
|
82
|
+
* If any principle matches the pain signal, its painPreventedCount is incremented.
|
|
83
|
+
* Errors are silently ignored to avoid disrupting the pain pipeline.
|
|
84
|
+
*/
|
|
85
|
+
export function trackPrincipleValue(
|
|
86
|
+
workspaceDir: string,
|
|
87
|
+
painData: { reason?: string; source?: string; score?: string },
|
|
88
|
+
getActivePrinciples: () => Array<{
|
|
89
|
+
id: string;
|
|
90
|
+
trigger: string;
|
|
91
|
+
valueMetrics?: { painPreventedCount: number; lastPainPreventedAt?: string; calculatedAt: string };
|
|
92
|
+
}>,
|
|
93
|
+
updatePrincipleMetrics: (id: string, metrics: { painPreventedCount: number; lastPainPreventedAt: string; calculatedAt: string }) => void,
|
|
94
|
+
): void {
|
|
95
|
+
try {
|
|
96
|
+
const activePrinciples = getActivePrinciples();
|
|
97
|
+
if (!activePrinciples.length) return;
|
|
98
|
+
|
|
99
|
+
const painText = `${painData.reason || ''} ${painData.source || ''}`.toLowerCase();
|
|
100
|
+
const now = new Date().toISOString();
|
|
101
|
+
|
|
102
|
+
for (const principle of activePrinciples) {
|
|
103
|
+
const triggerPattern = principle.trigger?.toLowerCase();
|
|
104
|
+
if (!triggerPattern) continue;
|
|
105
|
+
|
|
106
|
+
// Simple keyword match — if any word from the trigger appears in the pain text
|
|
107
|
+
const triggerWords = triggerPattern.split(/[\s|\\.+*?()[\]{}^$-]+/).filter((w) => w.length > 2);
|
|
108
|
+
const matchCount = triggerWords.filter((word) => painText.includes(word)).length;
|
|
109
|
+
|
|
110
|
+
if (matchCount >= 2 || (triggerWords.length <= 3 && matchCount >= 1)) {
|
|
111
|
+
const currentMetrics = principle.valueMetrics ?? { painPreventedCount: 0, calculatedAt: now };
|
|
112
|
+
updatePrincipleMetrics(principle.id, {
|
|
113
|
+
painPreventedCount: currentMetrics.painPreventedCount + 1,
|
|
114
|
+
lastPainPreventedAt: now,
|
|
115
|
+
calculatedAt: now,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} catch {
|
|
120
|
+
// Observation only — never disrupt the pain pipeline
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import * as os from 'os';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
|
+
import type { OpenClawPluginApi } from '../openclaw-sdk.js';
|
|
4
5
|
import { PathResolutionError } from '../config/index.js';
|
|
6
|
+
|
|
7
|
+
export interface PathResolverOptions {
|
|
8
|
+
workspaceDir?: string;
|
|
9
|
+
normalizeWorkspace?: boolean;
|
|
10
|
+
logger?: {
|
|
11
|
+
debug?: (msg: string) => void;
|
|
12
|
+
info?: (msg: string) => void;
|
|
13
|
+
warn?: (msg: string) => void;
|
|
14
|
+
error?: (msg: string) => void;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
5
18
|
const DEFAULT_WORKSPACE_SUBPATH = '.openclaw/workspace';
|
|
19
|
+
|
|
6
20
|
export const PD_ENV_VARS = {
|
|
7
21
|
WORKSPACE_DIR: 'PD_WORKSPACE_DIR',
|
|
8
22
|
STATE_DIR: 'PD_STATE_DIR',
|
|
9
23
|
DEBUG: 'DEBUG',
|
|
10
|
-
};
|
|
11
|
-
|
|
24
|
+
} as const;
|
|
25
|
+
|
|
26
|
+
export const PD_ENV_DESCRIPTIONS: Record<keyof typeof PD_ENV_VARS, { desc: string; example: string }> = {
|
|
12
27
|
WORKSPACE_DIR: {
|
|
13
28
|
desc: 'Override the default workspace directory',
|
|
14
29
|
example: 'PD_WORKSPACE_DIR=/home/user/my-workspace',
|
|
@@ -22,34 +37,47 @@ export const PD_ENV_DESCRIPTIONS = {
|
|
|
22
37
|
example: 'DEBUG=true',
|
|
23
38
|
},
|
|
24
39
|
};
|
|
25
|
-
|
|
40
|
+
|
|
41
|
+
export function printEnvVarHelp(): void {
|
|
26
42
|
console.log('\n📁 Principles Disciple - Environment Variables\n');
|
|
27
43
|
console.log('You can customize directory paths using environment variables:\n');
|
|
44
|
+
|
|
28
45
|
for (const [key, varName] of Object.entries(PD_ENV_VARS)) {
|
|
29
|
-
const info = PD_ENV_DESCRIPTIONS[key];
|
|
46
|
+
const info = PD_ENV_DESCRIPTIONS[key as keyof typeof PD_ENV_VARS];
|
|
30
47
|
console.log(` ${varName}`);
|
|
31
48
|
console.log(` Description: ${info.desc}`);
|
|
32
49
|
console.log(` Example: ${info.example}`);
|
|
33
50
|
console.log();
|
|
34
51
|
}
|
|
52
|
+
|
|
35
53
|
console.log('💡 Tips:');
|
|
36
54
|
console.log(' - These can be set in your shell profile (~/.bashrc, ~/.zshrc)');
|
|
37
55
|
console.log(' - Or passed when starting OpenClaw gateway');
|
|
38
56
|
console.log(' - Example: PD_WORKSPACE_DIR=/custom/path openclaw-gateway start\n');
|
|
39
57
|
}
|
|
58
|
+
|
|
59
|
+
export interface PDConfig {
|
|
60
|
+
workspace?: string;
|
|
61
|
+
state?: string;
|
|
62
|
+
debug?: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
40
65
|
const PD_CONFIG_FILE = 'principles-disciple.json';
|
|
41
66
|
const PD_CONFIG_LOCATIONS = [
|
|
42
67
|
path.join(process.cwd(), PD_CONFIG_FILE),
|
|
43
68
|
path.join(os.homedir(), '.openclaw', PD_CONFIG_FILE),
|
|
44
69
|
path.join(os.homedir(), '.principles', PD_CONFIG_FILE),
|
|
45
70
|
];
|
|
46
|
-
|
|
71
|
+
|
|
72
|
+
function isWindowsPath(inputPath: string): boolean {
|
|
47
73
|
return /^[A-Za-z]:[\\/]/.test(inputPath) || inputPath.startsWith('\\\\');
|
|
48
74
|
}
|
|
49
|
-
|
|
75
|
+
|
|
76
|
+
function isPosixAbsolutePath(inputPath: string): boolean {
|
|
50
77
|
return inputPath.startsWith('/');
|
|
51
78
|
}
|
|
52
|
-
|
|
79
|
+
|
|
80
|
+
function getPathApi(inputPath: string): typeof path.posix | typeof path.win32 | typeof path {
|
|
53
81
|
if (isWindowsPath(inputPath)) {
|
|
54
82
|
return path.win32;
|
|
55
83
|
}
|
|
@@ -58,7 +86,8 @@ function getPathApi(inputPath) {
|
|
|
58
86
|
}
|
|
59
87
|
return path;
|
|
60
88
|
}
|
|
61
|
-
|
|
89
|
+
|
|
90
|
+
function findConfigFile(): string | null {
|
|
62
91
|
for (const loc of PD_CONFIG_LOCATIONS) {
|
|
63
92
|
if (fs.existsSync(loc)) {
|
|
64
93
|
return loc;
|
|
@@ -66,30 +95,36 @@ function findConfigFile() {
|
|
|
66
95
|
}
|
|
67
96
|
return null;
|
|
68
97
|
}
|
|
69
|
-
|
|
98
|
+
|
|
99
|
+
/* eslint-disable no-console */
|
|
100
|
+
function loadConfigFromFile(): PDConfig | null {
|
|
70
101
|
const configPath = findConfigFile();
|
|
71
102
|
if (!configPath) {
|
|
72
103
|
return null;
|
|
73
104
|
}
|
|
105
|
+
|
|
74
106
|
try {
|
|
75
107
|
const content = fs.readFileSync(configPath, 'utf8');
|
|
76
108
|
const config = JSON.parse(content);
|
|
77
109
|
console.log(`[PD:PathResolver] Loaded config from: ${configPath}`);
|
|
78
110
|
return config;
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
111
|
+
} catch (e) {
|
|
81
112
|
console.warn(`[PD:PathResolver] Failed to load config from ${configPath}: ${String(e)}`);
|
|
82
113
|
return null;
|
|
83
114
|
}
|
|
84
115
|
}
|
|
116
|
+
/* eslint-enable no-console */
|
|
117
|
+
|
|
85
118
|
export class PathResolver {
|
|
86
|
-
static extensionRoot = null;
|
|
87
|
-
workspaceDir = null;
|
|
88
|
-
stateDir = null;
|
|
89
|
-
logger;
|
|
90
|
-
normalizeWorkspace;
|
|
91
|
-
initialized = false;
|
|
92
|
-
|
|
119
|
+
private static extensionRoot: string | null = null;
|
|
120
|
+
private workspaceDir: string | null = null;
|
|
121
|
+
private stateDir: string | null = null;
|
|
122
|
+
private readonly logger?: PathResolverOptions['logger'];
|
|
123
|
+
private readonly normalizeWorkspace: boolean;
|
|
124
|
+
private initialized = false;
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
static setExtensionRoot(extensionRootPath: string): void {
|
|
93
128
|
if (!extensionRootPath || !extensionRootPath.trim()) {
|
|
94
129
|
return;
|
|
95
130
|
}
|
|
@@ -97,12 +132,15 @@ export class PathResolver {
|
|
|
97
132
|
const pathApi = getPathApi(trimmed);
|
|
98
133
|
PathResolver.extensionRoot = pathApi.normalize(trimmed);
|
|
99
134
|
}
|
|
100
|
-
|
|
135
|
+
|
|
136
|
+
static getExtensionRoot(): string | null {
|
|
101
137
|
return PathResolver.extensionRoot;
|
|
102
138
|
}
|
|
103
|
-
|
|
139
|
+
|
|
140
|
+
constructor(options: PathResolverOptions = {}) {
|
|
104
141
|
this.logger = options.logger;
|
|
105
142
|
this.normalizeWorkspace = options.normalizeWorkspace ?? true;
|
|
143
|
+
|
|
106
144
|
if (options.workspaceDir) {
|
|
107
145
|
const original = options.workspaceDir;
|
|
108
146
|
const normalized = this.normalizeWorkspace ? this.normalizePath(original) : original;
|
|
@@ -113,53 +151,64 @@ export class PathResolver {
|
|
|
113
151
|
this.initialized = true;
|
|
114
152
|
}
|
|
115
153
|
}
|
|
116
|
-
|
|
154
|
+
|
|
155
|
+
private log(level: 'debug' | 'info' | 'warn' | 'error', msg: string): void {
|
|
117
156
|
const prefix = '[PD:PathResolver]';
|
|
118
157
|
const fullMsg = `${prefix} ${msg}`;
|
|
158
|
+
|
|
119
159
|
if (process.env.DEBUG === 'true') {
|
|
120
|
-
|
|
160
|
+
this.logger?.debug?.(fullMsg);
|
|
121
161
|
}
|
|
162
|
+
|
|
122
163
|
switch (level) {
|
|
123
164
|
case 'debug':
|
|
124
165
|
this.logger?.debug?.(fullMsg);
|
|
125
166
|
break;
|
|
126
167
|
case 'info':
|
|
127
|
-
this.logger?.info?.(fullMsg)
|
|
168
|
+
this.logger?.info?.(fullMsg);
|
|
128
169
|
break;
|
|
129
170
|
case 'warn':
|
|
130
|
-
this.logger?.warn?.(fullMsg)
|
|
171
|
+
this.logger?.warn?.(fullMsg);
|
|
131
172
|
break;
|
|
132
173
|
case 'error':
|
|
133
|
-
this.logger?.error?.(fullMsg)
|
|
174
|
+
this.logger?.error?.(fullMsg);
|
|
134
175
|
break;
|
|
135
176
|
}
|
|
136
177
|
}
|
|
137
|
-
|
|
178
|
+
|
|
179
|
+
private detectWorkspaceDir(): string {
|
|
138
180
|
const envWorkspace = process.env.PD_WORKSPACE_DIR;
|
|
139
181
|
if (envWorkspace && envWorkspace.trim()) {
|
|
140
182
|
this.log('info', `Using workspace from PD_WORKSPACE_DIR: ${envWorkspace}`);
|
|
141
183
|
return envWorkspace.trim();
|
|
142
184
|
}
|
|
185
|
+
|
|
143
186
|
const envOpenclaw = process.env.OPENCLAW_WORKSPACE;
|
|
144
187
|
if (envOpenclaw && envOpenclaw.trim()) {
|
|
145
188
|
this.log('info', `Using workspace from OPENCLAW_WORKSPACE: ${envOpenclaw}`);
|
|
146
189
|
return envOpenclaw.trim();
|
|
147
190
|
}
|
|
191
|
+
|
|
148
192
|
const fileConfig = loadConfigFromFile();
|
|
149
193
|
if (fileConfig?.workspace) {
|
|
150
194
|
this.log('info', `Using workspace from config file: ${fileConfig.workspace}`);
|
|
151
195
|
return fileConfig.workspace;
|
|
152
196
|
}
|
|
197
|
+
|
|
153
198
|
const homeDir = os.homedir();
|
|
154
199
|
const defaultWorkspace = path.join(homeDir, DEFAULT_WORKSPACE_SUBPATH);
|
|
155
200
|
this.log('info', `Using default workspace: ${defaultWorkspace}`);
|
|
201
|
+
|
|
156
202
|
return defaultWorkspace;
|
|
157
203
|
}
|
|
158
|
-
|
|
204
|
+
|
|
205
|
+
private normalizePath(inputPath: string): string {
|
|
159
206
|
const pathApi = getPathApi(inputPath);
|
|
160
207
|
let normalized = pathApi === path ? path.resolve(inputPath) : pathApi.normalize(inputPath);
|
|
208
|
+
|
|
161
209
|
if (this.normalizeWorkspace) {
|
|
162
210
|
const problematicSuffixes = ['/memory', '/docs', '\\memory', '\\docs'];
|
|
211
|
+
|
|
163
212
|
for (const suffix of problematicSuffixes) {
|
|
164
213
|
if (normalized.endsWith(suffix)) {
|
|
165
214
|
const parent = pathApi.dirname(normalized);
|
|
@@ -169,38 +218,49 @@ export class PathResolver {
|
|
|
169
218
|
}
|
|
170
219
|
}
|
|
171
220
|
}
|
|
221
|
+
|
|
172
222
|
return normalized;
|
|
173
223
|
}
|
|
174
|
-
|
|
224
|
+
|
|
225
|
+
normalizeWorkspacePath(inputPath: string): string {
|
|
175
226
|
return this.normalizePath(inputPath);
|
|
176
227
|
}
|
|
177
|
-
|
|
228
|
+
|
|
229
|
+
getWorkspaceDir(): string {
|
|
178
230
|
if (this.initialized && this.workspaceDir) {
|
|
179
231
|
return this.workspaceDir;
|
|
180
232
|
}
|
|
233
|
+
|
|
181
234
|
let dir = this.detectWorkspaceDir();
|
|
235
|
+
|
|
182
236
|
if (this.normalizeWorkspace) {
|
|
183
237
|
const originalDir = dir;
|
|
184
238
|
dir = this.normalizePath(dir);
|
|
239
|
+
|
|
185
240
|
if (originalDir !== dir) {
|
|
186
241
|
this.log('info', `Workspace path normalized: ${originalDir} -> ${dir}`);
|
|
187
242
|
}
|
|
188
243
|
}
|
|
244
|
+
|
|
189
245
|
this.workspaceDir = dir;
|
|
190
246
|
this.initialized = true;
|
|
191
247
|
this.log('debug', `Final workspace directory: ${this.workspaceDir}`);
|
|
248
|
+
|
|
192
249
|
return this.workspaceDir;
|
|
193
250
|
}
|
|
194
|
-
|
|
251
|
+
|
|
252
|
+
getStateDir(): string {
|
|
195
253
|
if (this.stateDir) {
|
|
196
254
|
return this.stateDir;
|
|
197
255
|
}
|
|
256
|
+
|
|
198
257
|
const envStateDir = process.env.PD_STATE_DIR;
|
|
199
258
|
if (envStateDir && envStateDir.trim()) {
|
|
200
259
|
this.stateDir = envStateDir.trim();
|
|
201
260
|
this.log('info', `Using state directory from PD_STATE_DIR: ${this.stateDir}`);
|
|
202
261
|
return this.stateDir;
|
|
203
262
|
}
|
|
263
|
+
|
|
204
264
|
// If workspaceDir was explicitly provided via constructor, use workspace-based state dir
|
|
205
265
|
// This ensures tests and programmatic usage don't get polluted by global config
|
|
206
266
|
if (this.initialized && this.workspaceDir) {
|
|
@@ -209,19 +269,23 @@ export class PathResolver {
|
|
|
209
269
|
this.log('debug', `Using workspace-based state directory: ${this.stateDir}`);
|
|
210
270
|
return this.stateDir;
|
|
211
271
|
}
|
|
272
|
+
|
|
212
273
|
const fileConfig = loadConfigFromFile();
|
|
213
274
|
if (fileConfig?.state) {
|
|
214
275
|
this.stateDir = fileConfig.state;
|
|
215
276
|
this.log('info', `Using state directory from config file: ${this.stateDir}`);
|
|
216
277
|
return this.stateDir;
|
|
217
278
|
}
|
|
279
|
+
|
|
218
280
|
const workspaceDir = this.getWorkspaceDir();
|
|
219
281
|
const pathApi = getPathApi(workspaceDir);
|
|
220
282
|
this.stateDir = pathApi.join(workspaceDir, '.state');
|
|
221
283
|
this.log('debug', `Computed state directory: ${this.stateDir}`);
|
|
284
|
+
|
|
222
285
|
return this.stateDir;
|
|
223
286
|
}
|
|
224
|
-
|
|
287
|
+
|
|
288
|
+
resolve(key: string): string {
|
|
225
289
|
const workspace = this.getWorkspaceDir();
|
|
226
290
|
const state = this.getStateDir();
|
|
227
291
|
const workspacePath = getPathApi(workspace);
|
|
@@ -233,7 +297,8 @@ export class PathResolver {
|
|
|
233
297
|
const evolutionWorker = fs.existsSync(extensionSrc)
|
|
234
298
|
? extensionPath.join(extensionSrc, 'service', 'evolution-worker.ts')
|
|
235
299
|
: extensionPath.join(extensionDist, 'service', 'evolution-worker.js');
|
|
236
|
-
|
|
300
|
+
|
|
301
|
+
const pathMap: Record<string, string> = {
|
|
237
302
|
'PROFILE': workspacePath.join(workspace, '.principles', 'PROFILE.json'),
|
|
238
303
|
'PRINCIPLES': workspacePath.join(workspace, '.principles', 'PRINCIPLES.md'),
|
|
239
304
|
'THINKING_OS': workspacePath.join(workspace, '.principles', 'THINKING_OS.md'),
|
|
@@ -269,51 +334,107 @@ export class PathResolver {
|
|
|
269
334
|
'PRINCIPLE_BLACKLIST': workspacePath.join(state, 'principle_blacklist.json'),
|
|
270
335
|
'MEMORY': memory,
|
|
271
336
|
};
|
|
337
|
+
|
|
272
338
|
const resolved = pathMap[key];
|
|
273
339
|
if (!resolved) {
|
|
274
340
|
this.log('warn', `Unknown path key: ${key}`);
|
|
275
341
|
throw new PathResolutionError(key);
|
|
276
342
|
}
|
|
343
|
+
|
|
277
344
|
this.log('debug', `Resolved path for '${key}': ${resolved}`);
|
|
345
|
+
|
|
278
346
|
return resolved;
|
|
279
347
|
}
|
|
280
|
-
|
|
348
|
+
|
|
349
|
+
ensureStateDir(): void {
|
|
281
350
|
const stateDir = this.getStateDir();
|
|
351
|
+
|
|
282
352
|
if (!fs.existsSync(stateDir)) {
|
|
283
353
|
this.log('info', `Creating state directory: ${stateDir}`);
|
|
284
354
|
fs.mkdirSync(stateDir, { recursive: true });
|
|
285
355
|
}
|
|
286
356
|
}
|
|
287
|
-
|
|
357
|
+
|
|
358
|
+
static createFromHookContext(ctx: any): PathResolver {
|
|
288
359
|
const resolver = new PathResolver();
|
|
360
|
+
|
|
289
361
|
if (ctx?.workspaceDir) {
|
|
290
362
|
let workspaceDir = ctx.workspaceDir;
|
|
363
|
+
|
|
291
364
|
if (resolver.normalizeWorkspace) {
|
|
292
365
|
workspaceDir = resolver.normalizePath(workspaceDir);
|
|
293
366
|
}
|
|
367
|
+
|
|
294
368
|
resolver.workspaceDir = workspaceDir;
|
|
295
369
|
resolver.initialized = true;
|
|
296
370
|
resolver.log('info', `Created from hook context with workspace: ${workspaceDir}`);
|
|
297
371
|
}
|
|
372
|
+
|
|
298
373
|
if (ctx?.stateDir) {
|
|
299
374
|
resolver.stateDir = ctx.stateDir;
|
|
300
375
|
}
|
|
376
|
+
|
|
301
377
|
return resolver;
|
|
302
378
|
}
|
|
303
379
|
}
|
|
304
|
-
|
|
305
|
-
|
|
380
|
+
|
|
381
|
+
export function createDefaultConfig(targetPath?: string): string {
|
|
382
|
+
const defaultConfig: PDConfig = {
|
|
306
383
|
workspace: path.join(os.homedir(), '.openclaw', 'workspace'),
|
|
307
384
|
state: path.join(os.homedir(), '.openclaw', 'workspace', '.state'),
|
|
308
385
|
debug: false,
|
|
309
386
|
};
|
|
387
|
+
|
|
310
388
|
const target = targetPath || path.join(os.homedir(), '.openclaw', PD_CONFIG_FILE);
|
|
311
389
|
const dir = path.dirname(target);
|
|
390
|
+
|
|
312
391
|
if (!fs.existsSync(dir)) {
|
|
313
392
|
fs.mkdirSync(dir, { recursive: true });
|
|
314
393
|
}
|
|
394
|
+
|
|
315
395
|
fs.writeFileSync(target, JSON.stringify(defaultConfig, null, 2), 'utf8');
|
|
396
|
+
|
|
316
397
|
console.log(`✅ Created default config at: ${target}`);
|
|
317
398
|
console.log(` You can edit this file to customize paths.`);
|
|
399
|
+
|
|
318
400
|
return target;
|
|
319
401
|
}
|
|
402
|
+
|
|
403
|
+
// ── OpenClaw API Workspace Resolution ────────────────────────────
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Resolve workspace directory via OpenClaw's official API.
|
|
407
|
+
*
|
|
408
|
+
* Replaces the removed `api.workspaceDir` field.
|
|
409
|
+
*
|
|
410
|
+
* Priority: api.runtime.agent.resolveAgentWorkspaceDir(agentId)
|
|
411
|
+
* → PathResolver.getWorkspaceDir() (PD env vars, config file, default)
|
|
412
|
+
*
|
|
413
|
+
* @param api - Plugin API instance
|
|
414
|
+
* @param agentId - Agent ID (defaults to 'main' if not provided)
|
|
415
|
+
* @returns Resolved workspace directory, or `undefined` if all resolution paths fail
|
|
416
|
+
*/
|
|
417
|
+
export function resolveWorkspaceDirFromApi(
|
|
418
|
+
api: OpenClawPluginApi | undefined,
|
|
419
|
+
agentId?: string,
|
|
420
|
+
): string | undefined {
|
|
421
|
+
if (!api) return undefined;
|
|
422
|
+
|
|
423
|
+
// 1. Official API: api.runtime.agent.resolveAgentWorkspaceDir
|
|
424
|
+
const officialAgent = (api.runtime as { agent?: { resolveAgentWorkspaceDir?: (cfg: unknown, id: string) => string } }).agent;
|
|
425
|
+
if (officialAgent?.resolveAgentWorkspaceDir) {
|
|
426
|
+
try {
|
|
427
|
+
return officialAgent.resolveAgentWorkspaceDir(api.config, agentId ?? 'main');
|
|
428
|
+
} catch {
|
|
429
|
+
// Fall through to PathResolver
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// 2. Fallback: PathResolver (PD_WORKSPACE_DIR env, config file, default)
|
|
434
|
+
try {
|
|
435
|
+
const pr = new PathResolver();
|
|
436
|
+
return pr.getWorkspaceDir();
|
|
437
|
+
} catch {
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
const posixJoin = (...parts: string[]): string => path.posix.join(...parts);
|
|
4
|
+
|
|
5
|
+
function isWindowsPath(input: string): boolean {
|
|
4
6
|
return /^[A-Za-z]:[\\/]/.test(input) || input.startsWith('\\\\');
|
|
5
7
|
}
|
|
6
|
-
|
|
8
|
+
|
|
9
|
+
function joinWorkspacePath(workspaceDir: string, relativePath: string): string {
|
|
7
10
|
if (isWindowsPath(workspaceDir)) {
|
|
8
11
|
return path.win32.join(workspaceDir, relativePath);
|
|
9
12
|
}
|
|
@@ -12,6 +15,7 @@ function joinWorkspacePath(workspaceDir, relativePath) {
|
|
|
12
15
|
}
|
|
13
16
|
return path.join(workspaceDir, relativePath);
|
|
14
17
|
}
|
|
18
|
+
|
|
15
19
|
/**
|
|
16
20
|
* Principles Disciple Directory Constants
|
|
17
21
|
* Establishing a logical separation between Identity, State, and Memory.
|
|
@@ -30,6 +34,7 @@ export const PD_DIRS = {
|
|
|
30
34
|
NOCTURNAL_MEMORY: posixJoin('.state', 'nocturnal', 'memory'),
|
|
31
35
|
NOCTURNAL_EXPORTS: posixJoin('.state', 'exports', 'orpo'),
|
|
32
36
|
};
|
|
37
|
+
|
|
33
38
|
/**
|
|
34
39
|
* Standard File Path Mappings
|
|
35
40
|
*/
|
|
@@ -40,6 +45,7 @@ export const PD_FILES = {
|
|
|
40
45
|
KERNEL: posixJoin(PD_DIRS.IDENTITY, '00-kernel.md'),
|
|
41
46
|
DECISION_POLICY: posixJoin(PD_DIRS.IDENTITY, 'DECISION_POLICY.json'),
|
|
42
47
|
MODELS_DIR: PD_DIRS.MODELS,
|
|
48
|
+
|
|
43
49
|
STATE_DIR: PD_DIRS.STATE,
|
|
44
50
|
EVOLUTION_QUEUE: posixJoin(PD_DIRS.STATE, 'evolution_queue.json'),
|
|
45
51
|
EVOLUTION_DIRECTIVE: posixJoin(PD_DIRS.STATE, 'evolution_directive.json'),
|
|
@@ -59,9 +65,11 @@ export const PD_FILES = {
|
|
|
59
65
|
NOCTURNAL_SAMPLES_DIR: PD_DIRS.NOCTURNAL_SAMPLES,
|
|
60
66
|
NOCTURNAL_MEMORY_DIR: PD_DIRS.NOCTURNAL_MEMORY,
|
|
61
67
|
NOCTURNAL_EXPORTS_DIR: PD_DIRS.NOCTURNAL_EXPORTS,
|
|
68
|
+
|
|
62
69
|
PLAN: 'PLAN.md',
|
|
63
70
|
MEMORY_MD: 'MEMORY.md',
|
|
64
71
|
HEARTBEAT: 'HEARTBEAT.md',
|
|
72
|
+
|
|
65
73
|
SYSTEM_LOG: posixJoin(PD_DIRS.LOGS, 'SYSTEM.log'),
|
|
66
74
|
REFLECTION_LOG: posixJoin(PD_DIRS.MEMORY, 'reflection-log.md'),
|
|
67
75
|
USER_CONTEXT: posixJoin(PD_DIRS.MEMORY, 'USER_CONTEXT.md'),
|
|
@@ -73,9 +81,10 @@ export const PD_FILES = {
|
|
|
73
81
|
EVOLUTION_STREAM: posixJoin(PD_DIRS.MEMORY, 'evolution.jsonl'),
|
|
74
82
|
EVOLUTION_LOCK: posixJoin(PD_DIRS.LOCKS, 'evolution'),
|
|
75
83
|
};
|
|
84
|
+
|
|
76
85
|
/**
|
|
77
86
|
* Resolves a PD file path within a given workspace.
|
|
78
87
|
*/
|
|
79
|
-
export function resolvePdPath(workspaceDir, fileKey) {
|
|
88
|
+
export function resolvePdPath(workspaceDir: string, fileKey: keyof typeof PD_FILES): string {
|
|
80
89
|
return joinWorkspacePath(workspaceDir, PD_FILES[fileKey]);
|
|
81
90
|
}
|