principles-disciple 1.127.0 → 1.129.0
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/dist/commands/archive-impl.d.ts +18 -0
- package/dist/commands/archive-impl.js +105 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.js +76 -0
- package/dist/commands/context.d.ts +5 -0
- package/{src/commands/context.ts → dist/commands/context.js} +34 -83
- package/dist/commands/disable-impl.d.ts +22 -0
- package/dist/commands/disable-impl.js +118 -0
- package/dist/commands/evolution-status.d.ts +4 -0
- package/dist/commands/evolution-status.js +187 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.js +53 -0
- package/dist/commands/focus.d.ts +14 -0
- package/dist/commands/focus.js +443 -0
- package/dist/commands/pain.d.ts +6 -0
- package/{src/commands/pain.ts → dist/commands/pain.js} +137 -188
- package/dist/commands/principle-rollback.d.ts +4 -0
- package/dist/commands/principle-rollback.js +26 -0
- package/dist/commands/promote-impl.d.ts +22 -0
- package/dist/commands/promote-impl.js +194 -0
- package/dist/commands/rollback-impl.d.ts +32 -0
- package/dist/commands/rollback-impl.js +180 -0
- package/dist/commands/rollback.d.ts +19 -0
- package/{src/commands/rollback.ts → dist/commands/rollback.js} +10 -53
- package/dist/commands/samples.d.ts +2 -0
- package/dist/commands/samples.js +58 -0
- package/dist/commands/strategy.d.ts +2 -0
- package/dist/commands/strategy.js +16 -0
- package/dist/commands/thinking-os.d.ts +2 -0
- package/{src/commands/thinking-os.ts → dist/commands/thinking-os.js} +35 -58
- package/dist/commands/workflow-debug.d.ts +6 -0
- package/{src/commands/workflow-debug.ts → dist/commands/workflow-debug.js} +13 -33
- package/dist/config/defaults/runtime.d.ts +58 -0
- package/{src/config/defaults/runtime.ts → dist/config/defaults/runtime.js} +4 -41
- package/dist/config/errors.d.ts +86 -0
- package/dist/config/errors.js +107 -0
- package/{src/config/index.ts → dist/config/index.d.ts} +1 -2
- package/dist/config/index.js +7 -0
- package/dist/constants/diagnostician.d.ts +12 -0
- package/{src/constants/diagnostician.ts → dist/constants/diagnostician.js} +0 -1
- package/dist/constants/tools.d.ts +17 -0
- package/dist/constants/tools.js +53 -0
- package/dist/core/__tests__/focus-history.test.d.ts +1 -0
- package/dist/core/__tests__/focus-history.test.js +160 -0
- package/dist/core/bootstrap-rules.d.ts +50 -0
- package/dist/core/bootstrap-rules.js +187 -0
- package/dist/core/code-implementation-storage.d.ts +71 -0
- package/dist/core/code-implementation-storage.js +139 -0
- package/dist/core/config-health.d.ts +27 -0
- package/dist/core/config-health.js +60 -0
- package/dist/core/config-service.d.ts +15 -0
- package/{src/core/config-service.ts → dist/core/config-service.js} +4 -7
- package/dist/core/config.d.ts +111 -0
- package/{src/core/config.ts → dist/core/config.js} +46 -146
- package/dist/core/control-ui-db.d.ts +106 -0
- package/dist/core/control-ui-db.js +309 -0
- package/dist/core/correction-cue-learner.d.ts +33 -0
- package/dist/core/correction-cue-learner.js +184 -0
- package/dist/core/correction-types.d.ts +3 -0
- package/dist/core/correction-types.js +1 -0
- package/dist/core/detection-funnel.d.ts +33 -0
- package/{src/core/detection-funnel.ts → dist/core/detection-funnel.js} +17 -37
- package/dist/core/detection-service.d.ts +15 -0
- package/{src/core/detection-service.ts → dist/core/detection-service.js} +4 -7
- package/dist/core/dictionary-service.d.ts +15 -0
- package/{src/core/dictionary-service.ts → dist/core/dictionary-service.js} +4 -7
- package/dist/core/dictionary.d.ts +38 -0
- package/{src/core/dictionary.ts → dist/core/dictionary.js} +33 -59
- package/dist/core/empathy-keyword-matcher.d.ts +5 -0
- package/dist/core/empathy-keyword-matcher.js +40 -0
- package/dist/core/empathy-types.d.ts +2 -0
- package/dist/core/empathy-types.js +1 -0
- package/dist/core/event-log.d.ts +90 -0
- package/dist/core/event-log.js +702 -0
- package/dist/core/evolution-engine.d.ts +119 -0
- package/dist/core/evolution-engine.js +460 -0
- package/dist/core/evolution-logger.d.ts +137 -0
- package/dist/core/evolution-logger.js +261 -0
- package/dist/core/evolution-migration.d.ts +5 -0
- package/dist/core/evolution-migration.js +65 -0
- package/dist/core/evolution-reducer.d.ts +124 -0
- package/dist/core/evolution-reducer.js +730 -0
- package/dist/core/evolution-types.d.ts +50 -0
- package/dist/core/evolution-types.js +11 -0
- package/dist/core/external-training-contract.d.ts +276 -0
- package/dist/core/external-training-contract.js +269 -0
- package/dist/core/file-store.d.ts +41 -0
- package/dist/core/file-store.js +46 -0
- package/dist/core/focus-history.d.ts +50 -0
- package/dist/core/focus-history.js +574 -0
- package/dist/core/hygiene/tracker.d.ts +22 -0
- package/dist/core/hygiene/tracker.js +110 -0
- package/dist/core/init.d.ts +30 -0
- package/{src/core/init.ts → dist/core/init.js} +87 -118
- package/dist/core/local-worker-routing.d.ts +124 -0
- package/dist/core/local-worker-routing.js +216 -0
- package/dist/core/migration.d.ts +6 -0
- package/{src/core/migration.ts → dist/core/migration.js} +10 -18
- package/dist/core/model-deployment-registry.d.ts +218 -0
- package/dist/core/model-deployment-registry.js +502 -0
- package/dist/core/model-training-registry.d.ts +295 -0
- package/dist/core/model-training-registry.js +474 -0
- package/dist/core/observability.d.ts +40 -0
- package/dist/core/observability.js +164 -0
- package/dist/core/pain-diagnostic-gate.d.ts +36 -0
- package/dist/core/pain-diagnostic-gate.js +105 -0
- package/dist/core/pain.d.ts +87 -0
- package/dist/core/pain.js +223 -0
- package/dist/core/path-resolver.d.ts +60 -0
- package/{src/core/path-resolver.ts → dist/core/path-resolver.js} +41 -131
- package/dist/core/paths.d.ts +60 -0
- package/{src/core/paths.ts → dist/core/paths.js} +4 -13
- package/dist/core/pd-config-loader.d.ts +96 -0
- package/dist/core/pd-config-loader.js +307 -0
- package/dist/core/pd-task-reconciler.d.ts +89 -0
- package/dist/core/pd-task-reconciler.js +262 -0
- package/dist/core/pd-task-service.d.ts +2 -0
- package/dist/core/pd-task-service.js +32 -0
- package/dist/core/pd-task-store.d.ts +5 -0
- package/dist/core/pd-task-store.js +62 -0
- package/dist/core/pd-task-types.d.ts +8 -0
- package/dist/core/pd-task-types.js +2 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.d.ts +1 -0
- package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.js +132 -0
- package/dist/core/principle-compiler/code-validator.d.ts +14 -0
- package/dist/core/principle-compiler/code-validator.js +86 -0
- package/dist/core/principle-compiler/compiler.d.ts +45 -0
- package/dist/core/principle-compiler/compiler.js +287 -0
- package/{src/core/principle-compiler/index.ts → dist/core/principle-compiler/index.d.ts} +0 -1
- package/dist/core/principle-compiler/index.js +10 -0
- package/dist/core/principle-compiler/ledger-registrar.d.ts +28 -0
- package/dist/core/principle-compiler/ledger-registrar.js +95 -0
- package/{src/core/principle-compiler/template-generator.ts → dist/core/principle-compiler/template-generator.d.ts} +0 -1
- package/dist/core/principle-compiler/template-generator.js +7 -0
- package/{src/core/principle-injection.ts → dist/core/principle-injection.d.ts} +1 -7
- package/dist/core/principle-injection.js +10 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.d.ts +15 -0
- package/dist/core/principle-internalization/filesystem-lifecycle-datasource.js +34 -0
- package/dist/core/principle-internalization/lifecycle-read-model.d.ts +17 -0
- package/{src/core/principle-internalization/lifecycle-read-model.ts → dist/core/principle-internalization/lifecycle-read-model.js} +2 -21
- package/dist/core/principle-internalization/lifecycle-refresh.d.ts +2 -0
- package/dist/core/principle-internalization/lifecycle-refresh.js +4 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.d.ts +28 -0
- package/dist/core/principle-internalization/principle-lifecycle-service.js +89 -0
- package/dist/core/principle-training-state.d.ts +47 -0
- package/dist/core/principle-training-state.js +113 -0
- package/dist/core/principle-tree-ledger-adapter.d.ts +32 -0
- package/dist/core/principle-tree-ledger-adapter.js +125 -0
- package/dist/core/principle-tree-ledger.d.ts +82 -0
- package/dist/core/principle-tree-ledger.js +527 -0
- package/dist/core/profile.d.ts +62 -0
- package/dist/core/profile.js +211 -0
- package/dist/core/promotion-gate.d.ts +243 -0
- package/dist/core/promotion-gate.js +554 -0
- package/dist/core/reflection/reflection-context.d.ts +31 -0
- package/dist/core/reflection/reflection-context.js +91 -0
- package/dist/core/replay-engine.d.ts +12 -0
- package/dist/core/replay-engine.js +82 -0
- package/dist/core/risk-calculator.d.ts +22 -0
- package/{src/core/risk-calculator.ts → dist/core/risk-calculator.js} +19 -49
- package/{src/core/rule-host-helpers.ts → dist/core/rule-host-helpers.d.ts} +0 -1
- package/dist/core/rule-host-helpers.js +7 -0
- package/{src/core/rule-host-types.ts → dist/core/rule-host-types.d.ts} +1 -8
- package/dist/core/rule-host-types.js +7 -0
- package/dist/core/rule-host.d.ts +86 -0
- package/dist/core/rule-host.js +311 -0
- package/dist/core/rule-implementation-runtime.d.ts +18 -0
- package/dist/core/rule-implementation-runtime.js +112 -0
- package/dist/core/runtime-v2-prompt-activation-reader.d.ts +22 -0
- package/dist/core/runtime-v2-prompt-activation-reader.js +99 -0
- package/{src/core/schema/db-types.ts → dist/core/schema/db-types.d.ts} +4 -9
- package/dist/core/schema/db-types.js +5 -0
- package/{src/core/schema/index.ts → dist/core/schema/index.d.ts} +1 -10
- package/dist/core/schema/index.js +15 -0
- package/dist/core/schema/migration-runner.d.ts +53 -0
- package/dist/core/schema/migration-runner.js +170 -0
- package/dist/core/schema/migrations/001-init-trajectory.d.ts +6 -0
- package/{src/core/schema/migrations/001-init-trajectory.ts → dist/core/schema/migrations/001-init-trajectory.js} +38 -56
- package/dist/core/schema/migrations/002-init-central.d.ts +5 -0
- package/{src/core/schema/migrations/002-init-central.ts → dist/core/schema/migrations/002-init-central.js} +27 -41
- package/dist/core/schema/migrations/003-init-workflow.d.ts +5 -0
- package/{src/core/schema/migrations/003-init-workflow.ts → dist/core/schema/migrations/003-init-workflow.js} +16 -21
- package/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +8 -0
- package/{src/core/schema/migrations/004-add-thinking-and-gfi.ts → dist/core/schema/migrations/004-add-thinking-and-gfi.js} +19 -27
- package/{src/core/schema/migrations/index.ts → dist/core/schema/migrations/index.d.ts} +1 -16
- package/dist/core/schema/migrations/index.js +27 -0
- package/dist/core/schema/schema-definitions.d.ts +46 -0
- package/{src/core/schema/schema-definitions.ts → dist/core/schema/schema-definitions.js} +242 -291
- package/dist/core/session-tracker.d.ts +119 -0
- package/{src/core/session-tracker.ts → dist/core/session-tracker.js} +96 -239
- package/dist/core/shadow-observation-registry.d.ts +217 -0
- package/dist/core/shadow-observation-registry.js +280 -0
- package/dist/core/surface-guard.d.ts +31 -0
- package/dist/core/surface-guard.js +131 -0
- package/dist/core/system-logger.d.ts +8 -0
- package/{src/core/system-logger.ts → dist/core/system-logger.js} +20 -34
- package/dist/core/thinking-models.d.ts +70 -0
- package/dist/core/thinking-models.js +300 -0
- package/dist/core/thinking-os-parser.d.ts +35 -0
- package/dist/core/thinking-os-parser.js +123 -0
- package/dist/core/trajectory-types.d.ts +220 -0
- package/dist/core/trajectory-types.js +8 -0
- package/dist/core/trajectory.d.ts +242 -0
- package/dist/core/trajectory.js +1500 -0
- package/dist/core/workflow-funnel-loader.d.ts +72 -0
- package/dist/core/workflow-funnel-loader.js +135 -0
- package/dist/core/workspace-context.d.ts +111 -0
- package/{src/core/workspace-context.ts → dist/core/workspace-context.js} +50 -105
- package/dist/core/workspace-dir-validation.d.ts +11 -0
- package/dist/core/workspace-dir-validation.js +37 -0
- package/dist/core/workspace-guidance-migrator.d.ts +12 -0
- package/{src/core/workspace-guidance-migrator.ts → dist/core/workspace-guidance-migrator.js} +21 -59
- package/dist/hooks/after-tool-call-helpers.d.ts +89 -0
- package/dist/hooks/after-tool-call-helpers.js +475 -0
- package/dist/hooks/after-tool-call-types.d.ts +86 -0
- package/dist/hooks/after-tool-call-types.js +13 -0
- package/dist/hooks/gate-block-helper.d.ts +44 -0
- package/dist/hooks/gate-block-helper.js +209 -0
- package/dist/hooks/gate.d.ts +16 -0
- package/dist/hooks/gate.js +381 -0
- package/dist/hooks/lifecycle.d.ts +5 -0
- package/dist/hooks/lifecycle.js +287 -0
- package/dist/hooks/llm.d.ts +13 -0
- package/{src/hooks/llm.ts → dist/hooks/llm.js} +63 -117
- package/dist/hooks/message-sanitize.d.ts +24 -0
- package/dist/hooks/message-sanitize.js +77 -0
- package/dist/hooks/pain.d.ts +33 -0
- package/dist/hooks/pain.js +294 -0
- package/dist/hooks/prompt.d.ts +52 -0
- package/dist/hooks/prompt.js +930 -0
- package/dist/hooks/raw-observation-adapter.d.ts +57 -0
- package/dist/hooks/raw-observation-adapter.js +170 -0
- package/dist/hooks/raw-observation-types.d.ts +62 -0
- package/dist/hooks/raw-observation-types.js +15 -0
- package/dist/hooks/subagent.d.ts +9 -0
- package/{src/hooks/subagent.ts → dist/hooks/subagent.js} +20 -60
- package/dist/hooks/trajectory-collector.d.ts +25 -0
- package/dist/hooks/trajectory-collector.js +225 -0
- package/dist/hooks/trajectory-evidence.d.ts +11 -0
- package/dist/hooks/trajectory-evidence.js +88 -0
- package/dist/hooks/triage-adapter.d.ts +58 -0
- package/{src/hooks/triage-adapter.ts → dist/hooks/triage-adapter.js} +36 -68
- package/dist/hooks/trigger-cooldown-tracker.d.ts +30 -0
- package/dist/hooks/trigger-cooldown-tracker.js +55 -0
- package/dist/i18n/commands.d.ts +26 -0
- package/dist/i18n/commands.js +96 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.js +829 -0
- package/dist/openclaw-sdk.d.ts +293 -0
- package/dist/openclaw-sdk.js +4 -0
- package/dist/service/central-database.d.ts +138 -0
- package/dist/service/central-database.js +731 -0
- package/dist/service/central-sync-service.d.ts +8 -0
- package/dist/service/central-sync-service.js +71 -0
- package/dist/service/correction-observer-service.d.ts +19 -0
- package/{src/service/correction-observer-service.ts → dist/service/correction-observer-service.js} +36 -76
- package/dist/service/evolution-dedup.d.ts +27 -0
- package/{src/service/evolution-dedup.ts → dist/service/evolution-dedup.js} +11 -31
- package/{src/service/evolution-queue-migration.ts → dist/service/evolution-queue-migration.d.ts} +15 -62
- package/dist/service/evolution-queue-migration.js +53 -0
- package/dist/service/evolution-worker.d.ts +103 -0
- package/{src/service/evolution-worker.ts → dist/service/evolution-worker.js} +169 -331
- package/dist/service/internalization-auto-consumer-service.d.ts +8 -0
- package/dist/service/internalization-auto-consumer-service.js +322 -0
- package/dist/service/keyword-optimization-service.d.ts +44 -0
- package/dist/service/keyword-optimization-service.js +137 -0
- package/dist/service/phase3-input-filter.d.ts +73 -0
- package/dist/service/phase3-input-filter.js +172 -0
- package/dist/service/queue-io.d.ts +30 -0
- package/dist/service/queue-io.js +79 -0
- package/{src/service/queue-migration.ts → dist/service/queue-migration.d.ts} +6 -45
- package/dist/service/queue-migration.js +56 -0
- package/dist/service/runtime-summary-service.d.ts +158 -0
- package/dist/service/runtime-summary-service.js +636 -0
- package/dist/service/subagent-workflow/subagent-error-utils.d.ts +8 -0
- package/{src/service/subagent-workflow/subagent-error-utils.ts → dist/service/subagent-workflow/subagent-error-utils.js} +3 -6
- package/{src/service/subagent-workflow/types.ts → dist/service/subagent-workflow/types.d.ts} +17 -80
- package/dist/service/subagent-workflow/types.js +11 -0
- package/dist/service/subagent-workflow/workflow-store.d.ts +30 -0
- package/{src/service/subagent-workflow/workflow-store.ts → dist/service/subagent-workflow/workflow-store.js} +43 -108
- package/dist/service/trajectory-service.d.ts +2 -0
- package/dist/service/trajectory-service.js +16 -0
- package/dist/service/workflow-watchdog.d.ts +23 -0
- package/dist/service/workflow-watchdog.js +103 -0
- package/dist/types/event-types.d.ts +2 -0
- package/dist/types/event-types.js +1 -0
- package/dist/types/hygiene-types.d.ts +2 -0
- package/dist/types/hygiene-types.js +1 -0
- package/{src/types/principle-tree-schema.ts → dist/types/principle-tree-schema.d.ts} +2 -25
- package/dist/types/principle-tree-schema.js +24 -0
- package/dist/types/queue.d.ts +2 -0
- package/dist/types/queue.js +1 -0
- package/dist/types/runtime-summary.d.ts +1 -0
- package/dist/types/runtime-summary.js +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js +16 -0
- package/dist/utils/file-lock.d.ts +68 -0
- package/dist/utils/file-lock.js +310 -0
- package/dist/utils/hashing.d.ts +9 -0
- package/{src/utils/hashing.ts → dist/utils/hashing.js} +4 -6
- package/dist/utils/io.d.ts +11 -0
- package/dist/utils/io.js +174 -0
- package/dist/utils/node-vm-polyfill.d.ts +9 -0
- package/{src/utils/node-vm-polyfill.ts → dist/utils/node-vm-polyfill.js} +0 -2
- package/dist/utils/retry.d.ts +210 -0
- package/dist/utils/retry.js +375 -0
- package/dist/utils/session-key.d.ts +10 -0
- package/{src/utils/session-key.ts → dist/utils/session-key.js} +5 -4
- package/dist/utils/shadow-fingerprint.d.ts +16 -0
- package/dist/utils/shadow-fingerprint.js +34 -0
- package/dist/utils/workspace-resolver.d.ts +82 -0
- package/dist/utils/workspace-resolver.js +288 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +8 -2
- package/templates/workspace/.principles/DECISION_POLICY.json +44 -0
- package/templates/workspace/.principles/PRINCIPLES.md +20 -0
- package/templates/workspace/.principles/PROFILE.json +54 -0
- package/templates/workspace/.principles/PROFILE.schema.json +56 -0
- package/templates/workspace/.principles/THINKING_OS.md +65 -0
- package/templates/workspace/.principles/THINKING_OS_ARCHIVE.md +7 -0
- package/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +9 -0
- package/templates/workspace/.principles/models/_INDEX.md +27 -0
- package/templates/workspace/.principles/models/first_principles.md +62 -0
- package/templates/workspace/.principles/models/marketing_4p.md +52 -0
- package/templates/workspace/.principles/models/porter_five.md +63 -0
- package/templates/workspace/.principles/models/swot.md +60 -0
- package/templates/workspace/.principles/models/user_story_map.md +63 -0
- package/templates/workspace/.state/WORKBOARD.json +4 -0
- package/.dependency-cruiser.json +0 -19
- package/ADVANCED_CONFIG_ZH.md +0 -93
- package/AGENT_INSTALL.md +0 -173
- package/AGENT_INSTALL_EN.md +0 -173
- package/CHANGELOG.md +0 -26
- package/INSTALL.md +0 -254
- package/SKILL.md +0 -63
- package/esbuild.config.js +0 -104
- package/src/commands/archive-impl.ts +0 -147
- package/src/commands/capabilities.ts +0 -89
- package/src/commands/disable-impl.ts +0 -159
- package/src/commands/evolution-status.ts +0 -247
- package/src/commands/export.ts +0 -59
- package/src/commands/focus.ts +0 -523
- package/src/commands/principle-rollback.ts +0 -32
- package/src/commands/promote-impl.ts +0 -254
- package/src/commands/rollback-impl.ts +0 -246
- package/src/commands/samples.ts +0 -65
- package/src/commands/strategy.ts +0 -21
- package/src/config/errors.ts +0 -180
- package/src/constants/tools.ts +0 -62
- package/src/core/AGENTS.md +0 -34
- package/src/core/__tests__/focus-history.test.ts +0 -210
- package/src/core/bootstrap-rules.ts +0 -216
- package/src/core/code-implementation-storage.ts +0 -213
- package/src/core/config-health.ts +0 -72
- package/src/core/control-ui-db.ts +0 -454
- package/src/core/correction-cue-learner.ts +0 -239
- package/src/core/correction-types.ts +0 -16
- package/src/core/empathy-keyword-matcher.ts +0 -64
- package/src/core/empathy-types.ts +0 -18
- package/src/core/event-log.ts +0 -787
- package/src/core/evolution-engine.ts +0 -613
- package/src/core/evolution-logger.ts +0 -357
- package/src/core/evolution-migration.ts +0 -77
- package/src/core/evolution-reducer.ts +0 -891
- package/src/core/evolution-types.ts +0 -110
- package/src/core/external-training-contract.ts +0 -530
- package/src/core/file-store.ts +0 -80
- package/src/core/focus-history.ts +0 -763
- package/src/core/hygiene/tracker.ts +0 -122
- package/src/core/local-worker-routing.ts +0 -337
- package/src/core/model-deployment-registry.ts +0 -724
- package/src/core/model-training-registry.ts +0 -815
- package/src/core/observability.ts +0 -242
- package/src/core/pain-diagnostic-gate.ts +0 -169
- package/src/core/pain.ts +0 -309
- package/src/core/pd-config-loader.ts +0 -400
- package/src/core/pd-task-reconciler.ts +0 -380
- package/src/core/pd-task-service.ts +0 -43
- package/src/core/pd-task-store.ts +0 -78
- package/src/core/pd-task-types.ts +0 -24
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +0 -174
- package/src/core/principle-compiler/code-validator.ts +0 -96
- package/src/core/principle-compiler/compiler.ts +0 -327
- package/src/core/principle-compiler/ledger-registrar.ts +0 -116
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +0 -42
- package/src/core/principle-internalization/lifecycle-refresh.ts +0 -11
- package/src/core/principle-internalization/principle-lifecycle-service.ts +0 -170
- package/src/core/principle-training-state.ts +0 -177
- package/src/core/principle-tree-ledger-adapter.ts +0 -145
- package/src/core/principle-tree-ledger.ts +0 -725
- package/src/core/profile.ts +0 -228
- package/src/core/promotion-gate.ts +0 -854
- package/src/core/reflection/reflection-context.ts +0 -133
- package/src/core/replay-engine.ts +0 -106
- package/src/core/rule-host.ts +0 -386
- package/src/core/rule-implementation-runtime.ts +0 -145
- package/src/core/runtime-v2-prompt-activation-reader.ts +0 -114
- package/src/core/schema/migration-runner.ts +0 -207
- package/src/core/shadow-observation-registry.ts +0 -508
- package/src/core/surface-guard.ts +0 -188
- package/src/core/thinking-models.ts +0 -377
- package/src/core/thinking-os-parser.ts +0 -165
- package/src/core/trajectory-types.ts +0 -247
- package/src/core/trajectory.ts +0 -1831
- package/src/core/workflow-funnel-loader.ts +0 -195
- package/src/core/workspace-dir-validation.ts +0 -52
- package/src/hooks/AGENTS.md +0 -31
- package/src/hooks/after-tool-call-helpers.ts +0 -601
- package/src/hooks/after-tool-call-types.ts +0 -99
- package/src/hooks/gate-block-helper.ts +0 -265
- package/src/hooks/gate.ts +0 -394
- package/src/hooks/lifecycle.ts +0 -334
- package/src/hooks/message-sanitize.ts +0 -102
- package/src/hooks/pain.ts +0 -358
- package/src/hooks/prompt.ts +0 -1102
- package/src/hooks/raw-observation-adapter.ts +0 -215
- package/src/hooks/raw-observation-types.ts +0 -77
- package/src/hooks/trajectory-collector.ts +0 -253
- package/src/hooks/trajectory-evidence.ts +0 -97
- package/src/hooks/trigger-cooldown-tracker.ts +0 -82
- package/src/i18n/commands.ts +0 -101
- package/src/index.ts +0 -939
- package/src/openclaw-sdk.ts +0 -312
- package/src/service/central-database.ts +0 -936
- package/src/service/central-sync-service.ts +0 -85
- package/src/service/internalization-auto-consumer-service.ts +0 -397
- package/src/service/keyword-optimization-service.ts +0 -169
- package/src/service/phase3-input-filter.ts +0 -237
- package/src/service/queue-io.ts +0 -108
- package/src/service/runtime-summary-service.ts +0 -990
- package/src/service/trajectory-service.ts +0 -16
- package/src/service/workflow-watchdog.ts +0 -125
- package/src/types/event-types.ts +0 -39
- package/src/types/hygiene-types.ts +0 -8
- package/src/types/queue.ts +0 -15
- package/src/types/runtime-summary.ts +0 -5
- package/src/types.ts +0 -53
- package/src/utils/file-lock.ts +0 -394
- package/src/utils/io.ts +0 -176
- package/src/utils/retry.ts +0 -573
- package/src/utils/shadow-fingerprint.ts +0 -42
- package/src/utils/workspace-resolver.ts +0 -393
- package/tests/README.md +0 -120
- package/tests/build-artifacts.test.ts +0 -55
- package/tests/commands/evolution-status.test.ts +0 -511
- package/tests/commands/export.test.ts +0 -78
- package/tests/commands/pain.test.ts +0 -287
- package/tests/commands/samples.test.ts +0 -65
- package/tests/commands/strategy.test.ts +0 -19
- package/tests/commands/thinking-os.test.ts +0 -88
- package/tests/core/bootstrap-rules.test.ts +0 -596
- package/tests/core/code-implementation-storage.test.ts +0 -300
- package/tests/core/code-validator.test.ts +0 -197
- package/tests/core/config-service.test.ts +0 -89
- package/tests/core/config.test.ts +0 -90
- package/tests/core/control-ui-db.test.ts +0 -75
- package/tests/core/core-principle-registry-drift.test.ts +0 -39
- package/tests/core/core-template-guidance.test.ts +0 -21
- package/tests/core/correction-cue-learner.test.ts +0 -345
- package/tests/core/detection-service.test.ts +0 -50
- package/tests/core/dictionary-service.test.ts +0 -116
- package/tests/core/dictionary.test.ts +0 -171
- package/tests/core/empathy-keyword-matcher.test.ts +0 -209
- package/tests/core/event-log.test.ts +0 -484
- package/tests/core/evolution-engine.test.ts +0 -610
- package/tests/core/evolution-logger.test.ts +0 -148
- package/tests/core/evolution-migration.test.ts +0 -374
- package/tests/core/evolution-paths.test.ts +0 -21
- package/tests/core/evolution-reducer.compilation-retry.test.ts +0 -189
- package/tests/core/evolution-reducer.detector-metadata.test.ts +0 -602
- package/tests/core/evolution-types-loop.test.ts +0 -48
- package/tests/core/external-training-contract.test.ts +0 -463
- package/tests/core/file-store.test.ts +0 -102
- package/tests/core/focus-history.test.ts +0 -874
- package/tests/core/init-flatten.test.ts +0 -69
- package/tests/core/init-refactor.test.ts +0 -87
- package/tests/core/init-v1.3.test.ts +0 -46
- package/tests/core/init.test.ts +0 -190
- package/tests/core/ledger-registrar.test.ts +0 -235
- package/tests/core/migration.test.ts +0 -84
- package/tests/core/model-deployment-registry.test.ts +0 -858
- package/tests/core/model-training-registry.test.ts +0 -908
- package/tests/core/observability.test.ts +0 -382
- package/tests/core/pain-diagnostic-gate.test.ts +0 -614
- package/tests/core/pain-score.property.test.ts +0 -19
- package/tests/core/pain.test.ts +0 -132
- package/tests/core/path-resolver.test.ts +0 -57
- package/tests/core/paths-refactor.test.ts +0 -20
- package/tests/core/pd-config-loader.test.ts +0 -407
- package/tests/core/pd-task-store.test.ts +0 -126
- package/tests/core/phase7-rollout-integration.test.ts +0 -477
- package/tests/core/principle-compiler.test.ts +0 -350
- package/tests/core/principle-injection.test.ts +0 -223
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +0 -193
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +0 -350
- package/tests/core/principle-internalization/lifecycle-routing-policy.test.ts +0 -212
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +0 -56
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +0 -189
- package/tests/core/principle-training-state.test.ts +0 -939
- package/tests/core/principle-tree-ledger-adapter.test.ts +0 -253
- package/tests/core/principle-tree-ledger.test.ts +0 -423
- package/tests/core/profile.test.ts +0 -56
- package/tests/core/promotion-gate.test.ts +0 -561
- package/tests/core/queue-purge.test.ts +0 -337
- package/tests/core/reflection-context.test.ts +0 -342
- package/tests/core/regression-v1-9-1.test.ts +0 -266
- package/tests/core/replay-engine.test.ts +0 -165
- package/tests/core/risk-calculator.test.ts +0 -168
- package/tests/core/rule-host-adversarial-output.test.ts +0 -242
- package/tests/core/rule-host-autocorrect-vm.test.ts +0 -163
- package/tests/core/rule-host-helpers.test.ts +0 -120
- package/tests/core/rule-host-resource-bounds.test.ts +0 -231
- package/tests/core/rule-host-sqlite-source.test.ts +0 -720
- package/tests/core/rule-host-unhealthy-visibility.test.ts +0 -261
- package/tests/core/rule-host-validation.test.ts +0 -315
- package/tests/core/rule-implementation-runtime.test.ts +0 -49
- package/tests/core/session-tracker.test.ts +0 -191
- package/tests/core/surface-guard.test.ts +0 -338
- package/tests/core/template-generator.test.ts +0 -101
- package/tests/core/trajectory.test.ts +0 -427
- package/tests/core/workflow-funnel-loader.test.ts +0 -1028
- package/tests/core/workspace-context-factory.test.ts +0 -18
- package/tests/core/workspace-context.test.ts +0 -187
- package/tests/core/workspace-guidance-migrator.test.ts +0 -248
- package/tests/core-anti-growth.test.ts +0 -182
- package/tests/evolution-worker-quarantine.test.ts +0 -400
- package/tests/evolution-worker-slimming.test.ts +0 -380
- package/tests/fixtures/legacy-queue-v1.json +0 -74
- package/tests/fixtures/production-compatibility.test.ts +0 -147
- package/tests/fixtures/production-mock-generator.ts +0 -282
- package/tests/globalSetup.ts +0 -38
- package/tests/hook-workspace-nextaction-contract.test.ts +0 -50
- package/tests/hooks/confirm-first-removal.test.ts +0 -188
- package/tests/hooks/gate-auto-correct-shadow.test.ts +0 -309
- package/tests/hooks/gate-auto-correct.test.ts +0 -664
- package/tests/hooks/gate-block-helper-profile.test.ts +0 -186
- package/tests/hooks/gate-no-path-write-tool.test.ts +0 -171
- package/tests/hooks/gate-rule-host-pipeline.test.ts +0 -230
- package/tests/hooks/gate-rule-host-real-pipeline.test.ts +0 -190
- package/tests/hooks/lifecycle.test.ts +0 -248
- package/tests/hooks/message-sanitize.test.ts +0 -244
- package/tests/hooks/pain-emission-characterization.test.ts +0 -420
- package/tests/hooks/pain.test.ts +0 -795
- package/tests/hooks/prompt-characterization.test.ts +0 -476
- package/tests/hooks/prompt-diet.test.ts +0 -335
- package/tests/hooks/prompt-size-guard.test.ts +0 -319
- package/tests/hooks/raw-observation-adapter.test.ts +0 -312
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +0 -895
- package/tests/hooks/single-gate-pain-admission.test.ts +0 -258
- package/tests/hooks/subagent.test.ts +0 -469
- package/tests/hooks/trajectory-collector.test.ts +0 -269
- package/tests/hooks/trajectory-evidence.test.ts +0 -280
- package/tests/hooks/triage-adapter.test.ts +0 -331
- package/tests/hygiene-tracker.test.ts +0 -77
- package/tests/index.test.ts +0 -142
- package/tests/integration/auto-entry-gate.test.ts +0 -256
- package/tests/integration/gate-real-io.e2e.test.ts +0 -248
- package/tests/integration/m8-legacy-paths.test.ts +0 -63
- package/tests/integration/mvp-surface-registry-guard.test.ts +0 -536
- package/tests/integration/pain-id-chain-e2e.test.ts +0 -313
- package/tests/integration/principle-compiler-e2e.test.ts +0 -403
- package/tests/integration/principle-lifecycle.e2e.test.ts +0 -198
- package/tests/integration/runtime-v2-pain-guard.test.ts +0 -125
- package/tests/integration/trajectory-lifecycle.e2e.test.ts +0 -523
- package/tests/internalization-auto-consumer-gate.test.ts +0 -158
- package/tests/internalization-auto-consumer-service.test.ts +0 -219
- package/tests/plugin-config-resolution-cutover.test.ts +0 -359
- package/tests/queue/async-lock.test.ts +0 -200
- package/tests/runtime-v2-discovery-guard.test.ts +0 -153
- package/tests/scripts/validate-live-path.test.ts +0 -286
- package/tests/service/central-database.test.ts +0 -457
- package/tests/service/correction-observer-service.test.ts +0 -505
- package/tests/service/evolution-worker.compilation-backfill.test.ts +0 -203
- package/tests/service/evolution-worker.correction-observer.test.ts +0 -50
- package/tests/service/evolution-worker.queue.test.ts +0 -296
- package/tests/service/evolution-worker.timeout.test.ts +0 -233
- package/tests/service/keyword-optimization-service.test.ts +0 -121
- package/tests/service/phase3-input-filter.test.ts +0 -289
- package/tests/service/queue-io.test.ts +0 -168
- package/tests/service/queue-migration.test.ts +0 -147
- package/tests/service/runtime-summary-service.test.ts +0 -1100
- package/tests/service/workflow-watchdog.test.ts +0 -281
- package/tests/task-compliance.test.ts +0 -166
- package/tests/test-utils.ts +0 -48
- package/tests/utils/file-lock.test.ts +0 -409
- package/tests/utils/hashing.test.ts +0 -32
- package/tests/utils/hook-workspace-resolver.test.ts +0 -524
- package/tests/utils/io.test.ts +0 -39
- package/tests/utils/retry.test.ts +0 -327
- package/tests/utils/session-key.test.ts +0 -52
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -61
- package/vitest.unit.config.ts +0 -12
package/src/core/pain.ts
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import { parseKvLines } from '../utils/io.js';
|
|
3
|
-
import { resolvePdPath } from './paths.js';
|
|
4
|
-
import { ConfigService } from './config-service.js';
|
|
5
|
-
import { SystemLogger } from './system-logger.js';
|
|
6
|
-
|
|
7
|
-
// =========================================================================
|
|
8
|
-
// Legacy Pain Flag Contract (Compatibility Only)
|
|
9
|
-
//
|
|
10
|
-
// Runtime V2 pain diagnosis does NOT write .state/.pain_flag or consume it as
|
|
11
|
-
// an entry point. New pain signals must enter through emitPainDetectedEvent() or
|
|
12
|
-
// `pd pain record`, which both route to PainSignalBridge.
|
|
13
|
-
//
|
|
14
|
-
// The readers below remain only for legacy sleep-reflection context and
|
|
15
|
-
// historical state inspection. They must not trigger the diagnostician.
|
|
16
|
-
// =========================================================================
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Required fields — every pain flag MUST have these.
|
|
20
|
-
*/
|
|
21
|
-
export interface PainFlagData {
|
|
22
|
-
/** What triggered this pain signal (e.g., tool_failure, human_intervention, intercept_extraction) */
|
|
23
|
-
source: string;
|
|
24
|
-
/** Pain score 0-100 */
|
|
25
|
-
score: string;
|
|
26
|
-
/** ISO 8601 timestamp */
|
|
27
|
-
time: string;
|
|
28
|
-
/** Human-readable reason / error description */
|
|
29
|
-
reason: string;
|
|
30
|
-
/** Session ID — identifies which conversation this happened in */
|
|
31
|
-
session_id: string;
|
|
32
|
-
/** Agent ID — identifies which agent (main, builder, diagnostician, etc.) */
|
|
33
|
-
agent_id: string;
|
|
34
|
-
/** Whether this involves risky operation ('true' / 'false') */
|
|
35
|
-
is_risky: string;
|
|
36
|
-
/** Correlation trace ID (for linking events across the pipeline) */
|
|
37
|
-
trace_id: string;
|
|
38
|
-
/** Preview of the text that triggered this pain */
|
|
39
|
-
trigger_text_preview: string;
|
|
40
|
-
/** Trajectory pain_events row ID (set by recordPainEvent) */
|
|
41
|
-
pain_event_id?: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface PainFlagContractResult {
|
|
45
|
-
status: 'missing' | 'valid' | 'invalid';
|
|
46
|
-
format: 'missing' | 'empty' | 'kv' | 'json' | 'invalid_json';
|
|
47
|
-
data: Record<string, string>;
|
|
48
|
-
missingFields: string[];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Builds legacy pain flag data for compatibility tests and historical readers.
|
|
53
|
-
* Do not use this to create new Runtime V2 diagnosis requests.
|
|
54
|
-
*/
|
|
55
|
-
export function buildPainFlag(input: {
|
|
56
|
-
source: string;
|
|
57
|
-
score: string;
|
|
58
|
-
time?: string;
|
|
59
|
-
reason: string;
|
|
60
|
-
session_id?: string;
|
|
61
|
-
agent_id?: string;
|
|
62
|
-
is_risky?: boolean;
|
|
63
|
-
trace_id?: string;
|
|
64
|
-
trigger_text_preview?: string;
|
|
65
|
-
pain_event_id?: string;
|
|
66
|
-
}): PainFlagData {
|
|
67
|
-
// Omit optional fields when not provided — prevents writing empty lines to disk
|
|
68
|
-
// which causes agent confusion (SKILL.md vs reality drift)
|
|
69
|
-
return {
|
|
70
|
-
source: input.source,
|
|
71
|
-
score: input.score,
|
|
72
|
-
time: input.time || new Date().toISOString(),
|
|
73
|
-
reason: input.reason,
|
|
74
|
-
session_id: input.session_id ?? '',
|
|
75
|
-
agent_id: input.agent_id ?? '',
|
|
76
|
-
is_risky: input.is_risky ? 'true' : 'false',
|
|
77
|
-
trace_id: input.trace_id ?? '',
|
|
78
|
-
trigger_text_preview: input.trigger_text_preview ?? '',
|
|
79
|
-
pain_event_id: input.pain_event_id,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Validates a pain flag read from disk.
|
|
85
|
-
* Returns list of missing required fields — empty string means all present.
|
|
86
|
-
*/
|
|
87
|
-
export function validatePainFlag(data: Record<string, string>): string[] {
|
|
88
|
-
const missing: string[] = [];
|
|
89
|
-
// Only source/score/time/reason are truly required — session_id/agent_id
|
|
90
|
-
// may be empty in automated contexts (heartbeat, background workers)
|
|
91
|
-
const required = ['source', 'score', 'time', 'reason'] as const;
|
|
92
|
-
for (const field of required) {
|
|
93
|
-
if (!data[field] || data[field].trim() === '') {
|
|
94
|
-
missing.push(field);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return missing;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
export function computePainScore(rc: number, isSpiral: boolean, missingTestCommand: boolean, softScore: number, projectDir?: string): number {
|
|
102
|
-
let score = Math.max(0, softScore || 0);
|
|
103
|
-
|
|
104
|
-
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
105
|
-
const config = stateDir ? ConfigService.get(stateDir) : null;
|
|
106
|
-
const scoreSettings = config ? config.get('scores') : {
|
|
107
|
-
exit_code_penalty: 70,
|
|
108
|
-
spiral_penalty: 40,
|
|
109
|
-
missing_test_command_penalty: 30
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
if (rc !== 0) {
|
|
113
|
-
score += scoreSettings.exit_code_penalty;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (isSpiral) {
|
|
117
|
-
score += scoreSettings.spiral_penalty;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (missingTestCommand) {
|
|
121
|
-
score += scoreSettings.missing_test_command_penalty;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return Math.min(100, score);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function painSeverityLabel(painScore: number, isSpiral = false, projectDir?: string): string {
|
|
128
|
-
if (isSpiral) {
|
|
129
|
-
return "critical";
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
133
|
-
const config = stateDir ? ConfigService.get(stateDir) : null;
|
|
134
|
-
const thresholds = config ? config.get('severity_thresholds') : {
|
|
135
|
-
high: 70,
|
|
136
|
-
medium: 40,
|
|
137
|
-
low: 20
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
if (painScore >= thresholds.high) {
|
|
141
|
-
return "high";
|
|
142
|
-
} else if (painScore >= thresholds.medium) {
|
|
143
|
-
return "medium";
|
|
144
|
-
} else if (painScore >= thresholds.low) {
|
|
145
|
-
return "low";
|
|
146
|
-
} else {
|
|
147
|
-
return "info";
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Converts a JSON pain flag object to KV format.
|
|
153
|
-
*/
|
|
154
|
-
function convertJsonToKv(json: Record<string, unknown>): Record<string, string> {
|
|
155
|
-
const kvData: Record<string, string> = {};
|
|
156
|
-
const fieldMap: Record<string, string> = {
|
|
157
|
-
source: 'source',
|
|
158
|
-
score: 'score',
|
|
159
|
-
time: 'time',
|
|
160
|
-
timestamp: 'time',
|
|
161
|
-
reason: 'reason',
|
|
162
|
-
session_id: 'session_id',
|
|
163
|
-
sessionId: 'session_id',
|
|
164
|
-
agent_id: 'agent_id',
|
|
165
|
-
agentId: 'agent_id',
|
|
166
|
-
is_risky: 'is_risky',
|
|
167
|
-
isRisky: 'is_risky',
|
|
168
|
-
severity: 'severity',
|
|
169
|
-
painId: 'pain_id',
|
|
170
|
-
};
|
|
171
|
-
for (const [jsonKey, kvKey] of Object.entries(fieldMap)) {
|
|
172
|
-
if (json[jsonKey] !== undefined) {
|
|
173
|
-
kvData[kvKey] = String(json[jsonKey]);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
for (const [key, value] of Object.entries(json)) {
|
|
177
|
-
if (fieldMap[key] === undefined && value !== undefined && value !== null) {
|
|
178
|
-
kvData[key] = String(value);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return kvData;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Reads and validates the legacy pain flag file.
|
|
186
|
-
*
|
|
187
|
-
* - If file doesn't exist → returns {}
|
|
188
|
-
* - If file is JSON format → converts to KV in memory only
|
|
189
|
-
* - If file is KV format → validates required fields, logs warning if missing
|
|
190
|
-
* - If file has unknown fields → silently ignores them (forward-compatible)
|
|
191
|
-
*/
|
|
192
|
-
export function readPainFlagData(projectDir: string): Record<string, string> {
|
|
193
|
-
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
194
|
-
try {
|
|
195
|
-
if (!fs.existsSync(painFlagPath)) {
|
|
196
|
-
return {};
|
|
197
|
-
}
|
|
198
|
-
const content = fs.readFileSync(painFlagPath, "utf-8").trim();
|
|
199
|
-
if (!content) {
|
|
200
|
-
return {};
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// Detect JSON format. Legacy compatibility only: parse in memory and do not
|
|
204
|
-
// rewrite .pain_flag, because Runtime V2 must not create or repair this file.
|
|
205
|
-
if (content.startsWith('{')) {
|
|
206
|
-
|
|
207
|
-
let json: Record<string, unknown>;
|
|
208
|
-
try {
|
|
209
|
-
json = JSON.parse(content);
|
|
210
|
-
} catch {
|
|
211
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_CORRUPT', 'Pain flag file contains invalid JSON');
|
|
212
|
-
return {};
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
const kvData = convertJsonToKv(json);
|
|
216
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_LEGACY_JSON_READ', `Read legacy JSON pain flag in memory (${Object.keys(json).length} fields)`);
|
|
217
|
-
return kvData;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// KV format — parse and validate
|
|
221
|
-
const data = parseKvLines(content);
|
|
222
|
-
const missing = validatePainFlag(data);
|
|
223
|
-
if (missing.length > 0) {
|
|
224
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_INCOMPLETE', `Pain flag missing required fields: ${missing.join(', ')}`);
|
|
225
|
-
}
|
|
226
|
-
return data;
|
|
227
|
-
} catch (e) {
|
|
228
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_READ_ERROR', `Failed to read pain flag: ${String(e)}`);
|
|
229
|
-
return {};
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export function readPainFlagContract(projectDir: string): PainFlagContractResult {
|
|
234
|
-
const data = readPainFlagData(projectDir);
|
|
235
|
-
|
|
236
|
-
if (Object.keys(data).length === 0) {
|
|
237
|
-
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
238
|
-
if (!fs.existsSync(painFlagPath)) {
|
|
239
|
-
return { status: 'missing', format: 'missing', data: {}, missingFields: [] };
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
const raw = fs.readFileSync(painFlagPath, 'utf-8').trim();
|
|
243
|
-
if (!raw) {
|
|
244
|
-
return { status: 'missing', format: 'empty', data: {}, missingFields: [] };
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return {
|
|
248
|
-
status: 'invalid',
|
|
249
|
-
format: raw.startsWith('{') ? 'invalid_json' : 'kv',
|
|
250
|
-
data: {},
|
|
251
|
-
missingFields: ['unparseable'],
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const missing = validatePainFlag(data);
|
|
256
|
-
return {
|
|
257
|
-
status: missing.length > 0 ? 'invalid' : 'valid',
|
|
258
|
-
format: 'kv',
|
|
259
|
-
data,
|
|
260
|
-
missingFields: missing,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Track principle value metrics when a pain signal is written.
|
|
266
|
-
* This is observation-only — it does NOT affect the pain flag write flow.
|
|
267
|
-
* If any principle matches the pain signal, its painPreventedCount is incremented.
|
|
268
|
-
* Errors are silently ignored to avoid disrupting the pain pipeline.
|
|
269
|
-
*/
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
export function trackPrincipleValue(
|
|
273
|
-
workspaceDir: string,
|
|
274
|
-
painData: { reason?: string; source?: string; score?: string },
|
|
275
|
-
getActivePrinciples: () => {
|
|
276
|
-
id: string;
|
|
277
|
-
trigger: string;
|
|
278
|
-
valueMetrics?: { painPreventedCount: number; lastPainPreventedAt?: string; calculatedAt: string };
|
|
279
|
-
}[],
|
|
280
|
-
updatePrincipleMetrics: (_id: string, _metrics: { painPreventedCount: number; lastPainPreventedAt: string; calculatedAt: string }) => void,
|
|
281
|
-
): void {
|
|
282
|
-
try {
|
|
283
|
-
const activePrinciples = getActivePrinciples();
|
|
284
|
-
if (!activePrinciples.length) return;
|
|
285
|
-
|
|
286
|
-
const painText = `${painData.reason || ''} ${painData.source || ''}`.toLowerCase();
|
|
287
|
-
const now = new Date().toISOString();
|
|
288
|
-
|
|
289
|
-
for (const principle of activePrinciples) {
|
|
290
|
-
const triggerPattern = principle.trigger?.toLowerCase();
|
|
291
|
-
if (!triggerPattern) continue;
|
|
292
|
-
|
|
293
|
-
// Simple keyword match — if any word from the trigger appears in the pain text
|
|
294
|
-
const triggerWords = triggerPattern.split(/[\s|\\.+*?()[\]{}^$-]+/).filter((w) => w.length > 2);
|
|
295
|
-
const matchCount = triggerWords.filter((word) => painText.includes(word)).length;
|
|
296
|
-
|
|
297
|
-
if (matchCount >= 2 || (triggerWords.length <= 3 && matchCount >= 1)) {
|
|
298
|
-
const currentMetrics = principle.valueMetrics ?? { painPreventedCount: 0, calculatedAt: now };
|
|
299
|
-
updatePrincipleMetrics(principle.id, {
|
|
300
|
-
painPreventedCount: currentMetrics.painPreventedCount + 1,
|
|
301
|
-
lastPainPreventedAt: now,
|
|
302
|
-
calculatedAt: now,
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
} catch {
|
|
307
|
-
// Observation only — never disrupt the pain pipeline
|
|
308
|
-
}
|
|
309
|
-
}
|
|
@@ -1,400 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PD Config Loader (Plugin I/O boundary) — PRI-307
|
|
3
|
-
*
|
|
4
|
-
* Reads `.pd/config.yaml`, validates via core, computes effective config.
|
|
5
|
-
* Replaces the old `.pd/feature-flags.yaml` and `.state/workflows.yaml` reading
|
|
6
|
-
* for plugin production paths.
|
|
7
|
-
*
|
|
8
|
-
* ADR-0016: PD owns exactly one user config file.
|
|
9
|
-
* - Missing config → defaults with nextAction
|
|
10
|
-
* - Malformed config → fail loud with errors and nextAction
|
|
11
|
-
* - No secrets in output
|
|
12
|
-
* - Observer disabled → no start / no noisy log cycling
|
|
13
|
-
* - Observer enabled + missing setup → structured needs_setup + nextAction
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import * as fs from 'fs';
|
|
17
|
-
import * as path from 'path';
|
|
18
|
-
import yaml from 'js-yaml';
|
|
19
|
-
import {
|
|
20
|
-
validatePdConfig,
|
|
21
|
-
computeEffectivePdConfig,
|
|
22
|
-
computeFeatureFlagsFromConfig,
|
|
23
|
-
INTERNAL_AGENT_NAMES,
|
|
24
|
-
} from '@principles/core/runtime-v2';
|
|
25
|
-
import type {
|
|
26
|
-
EffectivePdConfig,
|
|
27
|
-
PdConfigValidationResult,
|
|
28
|
-
InternalAgentName,
|
|
29
|
-
} from '@principles/core/runtime-v2';
|
|
30
|
-
|
|
31
|
-
// ── Constants ────────────────────────────────────────────────────────────────
|
|
32
|
-
|
|
33
|
-
export const PD_CONFIG_DIR = '.pd';
|
|
34
|
-
export const PD_CONFIG_FILENAME = 'config.yaml';
|
|
35
|
-
|
|
36
|
-
// ── Types ────────────────────────────────────────────────────────────────────
|
|
37
|
-
|
|
38
|
-
export type ObserverReadiness = 'disabled' | 'needs_setup' | 'ready' | 'not_ready' | 'config_malformed';
|
|
39
|
-
|
|
40
|
-
export interface ObserverConfigResult {
|
|
41
|
-
/** Whether the observer feature is enabled in config */
|
|
42
|
-
enabled: boolean;
|
|
43
|
-
/** Observer readiness state */
|
|
44
|
-
readiness: ObserverReadiness;
|
|
45
|
-
/** Config source: 'defaults' | 'user_config' | 'malformed' */
|
|
46
|
-
source: string;
|
|
47
|
-
/** Reason for current state */
|
|
48
|
-
reason: string;
|
|
49
|
-
/** What the user should do next */
|
|
50
|
-
nextAction: string;
|
|
51
|
-
/** The runtime profile ID for this observer, if configured */
|
|
52
|
-
runtimeProfileId: string | null;
|
|
53
|
-
/** The runtime profile type, if configured */
|
|
54
|
-
runtimeProfileType: string | null;
|
|
55
|
-
/** The apiKeyEnv for the runtime profile, if applicable */
|
|
56
|
-
apiKeyEnv: string | null;
|
|
57
|
-
/** Whether the apiKeyEnv is present in process.env */
|
|
58
|
-
apiKeyPresent: boolean;
|
|
59
|
-
/** Provider name from runtime profile */
|
|
60
|
-
provider: string | null;
|
|
61
|
-
/** Model name from runtime profile */
|
|
62
|
-
model: string | null;
|
|
63
|
-
/** Timeout from runtime profile */
|
|
64
|
-
timeoutMs: number | null;
|
|
65
|
-
/** Base URL from runtime profile */
|
|
66
|
-
baseUrl: string | null;
|
|
67
|
-
/** Config validation errors (only present when readiness=config_malformed) */
|
|
68
|
-
configErrors?: Array<{ path: string; reason: string; nextAction: string }>;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface PluginConfigLoadResult {
|
|
72
|
-
ok: boolean;
|
|
73
|
-
effective: EffectivePdConfig;
|
|
74
|
-
source: 'defaults' | 'user_config' | 'malformed';
|
|
75
|
-
configPath: string;
|
|
76
|
-
warnings: string[];
|
|
77
|
-
errors: Array<{ path: string; reason: string; nextAction: string }>;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ── Config Path ──────────────────────────────────────────────────────────────
|
|
81
|
-
|
|
82
|
-
export function getPdConfigPath(workspaceDir: string): string {
|
|
83
|
-
return path.join(workspaceDir, PD_CONFIG_DIR, PD_CONFIG_FILENAME);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// ── Load PD Config ───────────────────────────────────────────────────────────
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Load and validate `.pd/config.yaml` from the workspace.
|
|
90
|
-
* Never throws on malformed input. Always provides a usable fallback.
|
|
91
|
-
*/
|
|
92
|
-
export function loadPdConfigForPlugin(workspaceDir: string): PluginConfigLoadResult {
|
|
93
|
-
const configPath = getPdConfigPath(workspaceDir);
|
|
94
|
-
|
|
95
|
-
// 1) Config file missing → use defaults
|
|
96
|
-
if (!fs.existsSync(configPath)) {
|
|
97
|
-
const effective = computeEffectivePdConfig(null);
|
|
98
|
-
return {
|
|
99
|
-
ok: true,
|
|
100
|
-
effective,
|
|
101
|
-
source: 'defaults',
|
|
102
|
-
configPath,
|
|
103
|
-
warnings: effective.warnings,
|
|
104
|
-
errors: [],
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// 2) Read the file
|
|
109
|
-
let raw: string;
|
|
110
|
-
try {
|
|
111
|
-
raw = fs.readFileSync(configPath, 'utf8');
|
|
112
|
-
} catch (err) {
|
|
113
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
114
|
-
const effective = computeEffectivePdConfig(null);
|
|
115
|
-
return {
|
|
116
|
-
ok: false,
|
|
117
|
-
effective,
|
|
118
|
-
source: 'malformed',
|
|
119
|
-
configPath,
|
|
120
|
-
warnings: [],
|
|
121
|
-
errors: [{ path: '', reason: `Failed to read .pd/config.yaml: ${message}`, nextAction: 'Check file permissions for .pd/config.yaml' }],
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// 3) Parse YAML — treat as unknown (ERR-001)
|
|
126
|
-
let parsed: unknown;
|
|
127
|
-
try {
|
|
128
|
-
parsed = yaml.load(raw, { schema: yaml.JSON_SCHEMA });
|
|
129
|
-
} catch (err) {
|
|
130
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
131
|
-
const effective = computeEffectivePdConfig(null);
|
|
132
|
-
return {
|
|
133
|
-
ok: false,
|
|
134
|
-
effective,
|
|
135
|
-
source: 'malformed',
|
|
136
|
-
configPath,
|
|
137
|
-
warnings: [],
|
|
138
|
-
errors: [{ path: '', reason: `YAML parse error in .pd/config.yaml: ${message}`, nextAction: 'Fix YAML syntax in .pd/config.yaml' }],
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// 4) Validate via core (ERR-001, ERR-005: no `as` bypasses)
|
|
143
|
-
const validationResult: PdConfigValidationResult = validatePdConfig(parsed);
|
|
144
|
-
|
|
145
|
-
if (!validationResult.ok) {
|
|
146
|
-
const effective = computeEffectivePdConfig(null);
|
|
147
|
-
return {
|
|
148
|
-
ok: false,
|
|
149
|
-
effective,
|
|
150
|
-
source: 'malformed',
|
|
151
|
-
configPath,
|
|
152
|
-
warnings: [],
|
|
153
|
-
errors: validationResult.errors.map(e => ({
|
|
154
|
-
path: e.path,
|
|
155
|
-
reason: e.reason,
|
|
156
|
-
nextAction: e.nextAction,
|
|
157
|
-
})),
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// 5) Compute effective config
|
|
162
|
-
const effective = computeEffectivePdConfig(validationResult.value);
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
ok: true,
|
|
166
|
-
effective,
|
|
167
|
-
source: 'user_config',
|
|
168
|
-
configPath,
|
|
169
|
-
warnings: effective.warnings,
|
|
170
|
-
errors: [],
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// ── Feature Flag from Config ─────────────────────────────────────────────────
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Get a single feature flag's enabled state from .pd/config.yaml.
|
|
178
|
-
* Replaces the old `loadFeatureFlagFromWorkspace` which read .pd/feature-flags.yaml.
|
|
179
|
-
*/
|
|
180
|
-
export function loadFeatureFlagFromConfig(
|
|
181
|
-
workspaceDir: string,
|
|
182
|
-
flagId: string,
|
|
183
|
-
logger?: { warn?: (msg: string) => void; info?: (msg: string) => void },
|
|
184
|
-
): { enabled: boolean; source: string } {
|
|
185
|
-
const result = loadPdConfigForPlugin(workspaceDir);
|
|
186
|
-
const flags = computeFeatureFlagsFromConfig(result.effective);
|
|
187
|
-
const flag = flags.flags[flagId];
|
|
188
|
-
|
|
189
|
-
if (!result.ok) {
|
|
190
|
-
logger?.warn?.(`[PD:Config] Config validation failed: ${result.errors.map(e => e.reason).join('; ')} — using defaults`);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return {
|
|
194
|
-
enabled: flag?.enabled ?? false,
|
|
195
|
-
source: result.source,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// ── Observer Config Resolution ───────────────────────────────────────────────
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Resolve observer configuration from .pd/config.yaml.
|
|
203
|
-
*
|
|
204
|
-
* Returns structured state:
|
|
205
|
-
* - config_malformed: config file is invalid — no guessing, fail loud
|
|
206
|
-
* - disabled: observer feature flag is off OR agent.enabled=false → no start, no noisy logs
|
|
207
|
-
* - needs_setup: observer enabled but runtime profile missing, API key not set, or unsupported profile type
|
|
208
|
-
* - ready: observer enabled and fully configured (pi-ai with key present)
|
|
209
|
-
* - not_ready: observer enabled, API key present, but runtime availability unknown
|
|
210
|
-
*/
|
|
211
|
-
export function resolveObserverConfig(
|
|
212
|
-
workspaceDir: string,
|
|
213
|
-
observerFlagId: string,
|
|
214
|
-
observerAgentName: string,
|
|
215
|
-
_logger?: { warn?: (msg: string) => void; info?: (msg: string) => void; debug?: (msg: string) => void },
|
|
216
|
-
): ObserverConfigResult {
|
|
217
|
-
const result = loadPdConfigForPlugin(workspaceDir);
|
|
218
|
-
|
|
219
|
-
// 0) Malformed config → fail loud, do NOT swallow as "disabled"
|
|
220
|
-
if (!result.ok) {
|
|
221
|
-
return {
|
|
222
|
-
enabled: false,
|
|
223
|
-
readiness: 'config_malformed',
|
|
224
|
-
source: 'malformed',
|
|
225
|
-
reason: `Config validation failed: ${result.errors.map(e => e.reason).join('; ')}`,
|
|
226
|
-
nextAction: result.errors[0]?.nextAction ?? 'Fix .pd/config.yaml and retry',
|
|
227
|
-
runtimeProfileId: null,
|
|
228
|
-
runtimeProfileType: null,
|
|
229
|
-
apiKeyEnv: null,
|
|
230
|
-
apiKeyPresent: false,
|
|
231
|
-
provider: null,
|
|
232
|
-
model: null,
|
|
233
|
-
timeoutMs: null,
|
|
234
|
-
baseUrl: null,
|
|
235
|
-
configErrors: result.errors,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const config = result.effective.config;
|
|
240
|
-
|
|
241
|
-
// 1) Check if the observer feature flag is enabled
|
|
242
|
-
const featureFlag = config.features[observerFlagId];
|
|
243
|
-
if (!featureFlag || !featureFlag.enabled) {
|
|
244
|
-
return {
|
|
245
|
-
enabled: false,
|
|
246
|
-
readiness: 'disabled',
|
|
247
|
-
source: result.source,
|
|
248
|
-
reason: `${observerFlagId} is disabled in .pd/config.yaml`,
|
|
249
|
-
nextAction: `Set features.${observerFlagId}.enabled=true in .pd/config.yaml to enable`,
|
|
250
|
-
runtimeProfileId: null,
|
|
251
|
-
runtimeProfileType: null,
|
|
252
|
-
apiKeyEnv: null,
|
|
253
|
-
apiKeyPresent: false,
|
|
254
|
-
provider: null,
|
|
255
|
-
model: null,
|
|
256
|
-
timeoutMs: null,
|
|
257
|
-
baseUrl: null,
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// 2) Check if the agent itself is enabled (feature flag ≠ agent.enabled)
|
|
262
|
-
const knownNames: readonly string[] = INTERNAL_AGENT_NAMES;
|
|
263
|
-
if (!knownNames.includes(observerAgentName)) {
|
|
264
|
-
return {
|
|
265
|
-
enabled: false,
|
|
266
|
-
readiness: 'needs_setup',
|
|
267
|
-
source: result.source,
|
|
268
|
-
reason: `Unknown agent name '${observerAgentName}'`,
|
|
269
|
-
nextAction: `Use one of the known agent names: ${INTERNAL_AGENT_NAMES.join(', ')}`,
|
|
270
|
-
runtimeProfileId: null,
|
|
271
|
-
runtimeProfileType: null,
|
|
272
|
-
apiKeyEnv: null,
|
|
273
|
-
apiKeyPresent: false,
|
|
274
|
-
provider: null,
|
|
275
|
-
model: null,
|
|
276
|
-
timeoutMs: null,
|
|
277
|
-
baseUrl: null,
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
const agentKey = observerAgentName as InternalAgentName;
|
|
281
|
-
const agentConfig = config.internalAgents.agents[agentKey];
|
|
282
|
-
|
|
283
|
-
// Feature flag on but agent.enabled=false → disabled (not enabled)
|
|
284
|
-
if (!agentConfig || !agentConfig.enabled) {
|
|
285
|
-
return {
|
|
286
|
-
enabled: false,
|
|
287
|
-
readiness: 'disabled',
|
|
288
|
-
source: result.source,
|
|
289
|
-
reason: `${observerFlagId} feature flag is enabled but internalAgents.agents.${observerAgentName}.enabled is false`,
|
|
290
|
-
nextAction: `Set internalAgents.agents.${observerAgentName}.enabled=true in .pd/config.yaml, or disable features.${observerFlagId}`,
|
|
291
|
-
runtimeProfileId: null,
|
|
292
|
-
runtimeProfileType: null,
|
|
293
|
-
apiKeyEnv: null,
|
|
294
|
-
apiKeyPresent: false,
|
|
295
|
-
provider: null,
|
|
296
|
-
model: null,
|
|
297
|
-
timeoutMs: null,
|
|
298
|
-
baseUrl: null,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// 3) Find the agent's runtime profile
|
|
303
|
-
const runtimeProfileId = agentConfig.runtimeProfile ?? config.internalAgents.defaultRuntime;
|
|
304
|
-
const profile = config.runtimeProfiles[runtimeProfileId];
|
|
305
|
-
|
|
306
|
-
if (!profile) {
|
|
307
|
-
return {
|
|
308
|
-
enabled: true,
|
|
309
|
-
readiness: 'needs_setup',
|
|
310
|
-
source: result.source,
|
|
311
|
-
reason: `Runtime profile '${runtimeProfileId}' not found in .pd/config.yaml`,
|
|
312
|
-
nextAction: `Add runtime profile '${runtimeProfileId}' to .pd/config.yaml runtimeProfiles`,
|
|
313
|
-
runtimeProfileId,
|
|
314
|
-
runtimeProfileType: null,
|
|
315
|
-
apiKeyEnv: null,
|
|
316
|
-
apiKeyPresent: false,
|
|
317
|
-
provider: null,
|
|
318
|
-
model: null,
|
|
319
|
-
timeoutMs: null,
|
|
320
|
-
baseUrl: null,
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// 4) For pi-ai profiles, check API key
|
|
325
|
-
if (profile.type === 'pi-ai') {
|
|
326
|
-
const apiKeyEnv = profile.apiKeyEnv ?? null;
|
|
327
|
-
const apiKeyPresent = !!apiKeyEnv && Object.prototype.hasOwnProperty.call(process.env, apiKeyEnv) && !!process.env[apiKeyEnv];
|
|
328
|
-
|
|
329
|
-
if (!apiKeyEnv) {
|
|
330
|
-
return {
|
|
331
|
-
enabled: true,
|
|
332
|
-
readiness: 'needs_setup',
|
|
333
|
-
source: result.source,
|
|
334
|
-
reason: `pi-ai profile '${runtimeProfileId}' missing apiKeyEnv`,
|
|
335
|
-
nextAction: `Add apiKeyEnv to runtime profile '${runtimeProfileId}' in .pd/config.yaml`,
|
|
336
|
-
runtimeProfileId,
|
|
337
|
-
runtimeProfileType: profile.type,
|
|
338
|
-
apiKeyEnv: null,
|
|
339
|
-
apiKeyPresent: false,
|
|
340
|
-
provider: profile.provider ?? null,
|
|
341
|
-
model: profile.model ?? null,
|
|
342
|
-
timeoutMs: profile.timeoutMs ?? null,
|
|
343
|
-
baseUrl: profile.baseUrl ?? null,
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (!apiKeyPresent) {
|
|
348
|
-
return {
|
|
349
|
-
enabled: true,
|
|
350
|
-
readiness: 'needs_setup',
|
|
351
|
-
source: result.source,
|
|
352
|
-
reason: `Environment variable '${apiKeyEnv}' is not set or empty`,
|
|
353
|
-
nextAction: `Set the environment variable '${apiKeyEnv}' with a valid API key`,
|
|
354
|
-
runtimeProfileId,
|
|
355
|
-
runtimeProfileType: profile.type,
|
|
356
|
-
apiKeyEnv,
|
|
357
|
-
apiKeyPresent: false,
|
|
358
|
-
provider: profile.provider ?? null,
|
|
359
|
-
model: profile.model ?? null,
|
|
360
|
-
timeoutMs: profile.timeoutMs ?? null,
|
|
361
|
-
baseUrl: profile.baseUrl ?? null,
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// pi-ai with key present — runtime availability unknown without actual probe
|
|
366
|
-
return {
|
|
367
|
-
enabled: true,
|
|
368
|
-
readiness: 'not_ready',
|
|
369
|
-
source: result.source,
|
|
370
|
-
reason: `pi-ai profile configured with apiKeyEnv='${apiKeyEnv}' (key present); runtime availability unknown`,
|
|
371
|
-
nextAction: 'Run pd runtime probe to verify end-to-end connectivity',
|
|
372
|
-
runtimeProfileId,
|
|
373
|
-
runtimeProfileType: profile.type,
|
|
374
|
-
apiKeyEnv,
|
|
375
|
-
apiKeyPresent: true,
|
|
376
|
-
provider: profile.provider ?? null,
|
|
377
|
-
model: profile.model ?? null,
|
|
378
|
-
timeoutMs: profile.timeoutMs ?? null,
|
|
379
|
-
baseUrl: profile.baseUrl ?? null,
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
// 5) OpenClaw profile — CorrectionObserver does NOT support OpenClaw runtime
|
|
384
|
-
// Mark as needs_setup with nextAction to configure a pi-ai profile
|
|
385
|
-
return {
|
|
386
|
-
enabled: true,
|
|
387
|
-
readiness: 'needs_setup',
|
|
388
|
-
source: result.source,
|
|
389
|
-
reason: `OpenClaw profile '${runtimeProfileId}' is not supported for observer runtime. Observers require a pi-ai profile with an API key.`,
|
|
390
|
-
nextAction: `Configure a pi-ai runtime profile for ${observerAgentName} in .pd/config.yaml (e.g., add a pi-ai profile with provider, model, and apiKeyEnv)`,
|
|
391
|
-
runtimeProfileId,
|
|
392
|
-
runtimeProfileType: profile.type,
|
|
393
|
-
apiKeyEnv: null,
|
|
394
|
-
apiKeyPresent: false,
|
|
395
|
-
provider: profile.provider ?? null,
|
|
396
|
-
model: profile.model ?? null,
|
|
397
|
-
timeoutMs: null,
|
|
398
|
-
baseUrl: null,
|
|
399
|
-
};
|
|
400
|
-
}
|