principles-disciple 1.126.0 → 1.128.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 -93
- 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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { resolvePdPath, PD_FILES } from './paths.js';
|
|
4
|
-
|
|
5
4
|
/**
|
|
6
5
|
* System Logger for Principles Disciple
|
|
7
6
|
*
|
|
@@ -12,76 +11,67 @@ import { resolvePdPath, PD_FILES } from './paths.js';
|
|
|
12
11
|
* Automatically rotates to a new file at midnight.
|
|
13
12
|
* Old log files are automatically cleaned up based on retention policy.
|
|
14
13
|
*/
|
|
15
|
-
|
|
16
14
|
// Cache for current log file path, invalidated when date changes
|
|
17
|
-
let cachedLogFile
|
|
18
|
-
let cachedLogDate
|
|
19
|
-
|
|
15
|
+
let cachedLogFile;
|
|
16
|
+
let cachedLogDate;
|
|
20
17
|
/**
|
|
21
18
|
* Log retention: delete SYSTEM logs older than this many days.
|
|
22
19
|
* Set to 0 to disable cleanup.
|
|
23
20
|
*/
|
|
24
21
|
const LOG_RETENTION_DAYS = 7;
|
|
25
|
-
|
|
26
22
|
/**
|
|
27
23
|
* Get the system log file path for a given date.
|
|
28
24
|
* Format: memory/logs/SYSTEM_YYYY-MM-DD.log
|
|
29
25
|
*/
|
|
30
|
-
function getSystemLogPath(workspaceDir
|
|
26
|
+
function getSystemLogPath(workspaceDir, date) {
|
|
31
27
|
const dateStr = date.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
32
28
|
const logDir = path.dirname(resolvePdPath(workspaceDir, 'SYSTEM_LOG'));
|
|
33
29
|
const baseName = path.basename(PD_FILES.SYSTEM_LOG, '.log');
|
|
34
30
|
return path.join(logDir, `${baseName}_${dateStr}.log`);
|
|
35
31
|
}
|
|
36
|
-
|
|
37
32
|
/**
|
|
38
33
|
* Get today's date string (YYYY-MM-DD).
|
|
39
34
|
*/
|
|
40
|
-
function getTodayStr()
|
|
35
|
+
function getTodayStr() {
|
|
41
36
|
return new Date().toISOString().slice(0, 10);
|
|
42
37
|
}
|
|
43
|
-
|
|
44
38
|
/**
|
|
45
39
|
* Clean up old SYSTEM log files, keeping only LOG_RETENTION_DAYS.
|
|
46
40
|
* Called automatically on first log write of each day.
|
|
47
41
|
*/
|
|
48
|
-
function cleanupOldLogs(workspaceDir
|
|
49
|
-
if (LOG_RETENTION_DAYS <= 0)
|
|
50
|
-
|
|
42
|
+
function cleanupOldLogs(workspaceDir) {
|
|
43
|
+
if (LOG_RETENTION_DAYS <= 0)
|
|
44
|
+
return;
|
|
51
45
|
try {
|
|
52
46
|
const logDir = path.dirname(resolvePdPath(workspaceDir, 'SYSTEM_LOG'));
|
|
53
47
|
const baseName = path.basename(PD_FILES.SYSTEM_LOG, '.log');
|
|
54
48
|
const prefix = `${baseName}_`;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
if (!fs.existsSync(logDir))
|
|
50
|
+
return;
|
|
58
51
|
const cutoffMs = Date.now() - LOG_RETENTION_DAYS * 24 * 60 * 60 * 1000;
|
|
59
52
|
const files = fs.readdirSync(logDir);
|
|
60
|
-
|
|
61
53
|
for (const file of files) {
|
|
62
|
-
if (!file.startsWith(prefix) || !file.endsWith('.log'))
|
|
63
|
-
|
|
54
|
+
if (!file.startsWith(prefix) || !file.endsWith('.log'))
|
|
55
|
+
continue;
|
|
64
56
|
const filePath = path.join(logDir, file);
|
|
65
57
|
const stat = fs.statSync(filePath);
|
|
66
58
|
if (stat.mtimeMs < cutoffMs) {
|
|
67
59
|
fs.unlinkSync(filePath);
|
|
68
60
|
}
|
|
69
61
|
}
|
|
70
|
-
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
71
64
|
// Silently fail cleanup - don't crash logging for cleanup failures
|
|
72
65
|
}
|
|
73
66
|
}
|
|
74
|
-
|
|
75
67
|
// Track if cleanup has run today
|
|
76
|
-
let lastCleanupDate
|
|
77
|
-
|
|
68
|
+
let lastCleanupDate;
|
|
78
69
|
export const SystemLogger = {
|
|
79
|
-
log(workspaceDir
|
|
80
|
-
if (!workspaceDir)
|
|
81
|
-
|
|
70
|
+
log(workspaceDir, eventType, message) {
|
|
71
|
+
if (!workspaceDir)
|
|
72
|
+
return;
|
|
82
73
|
try {
|
|
83
74
|
const today = getTodayStr();
|
|
84
|
-
|
|
85
75
|
// Check if date changed - invalidate cache and run cleanup
|
|
86
76
|
if (cachedLogDate !== today) {
|
|
87
77
|
cachedLogDate = today;
|
|
@@ -92,7 +82,6 @@ export const SystemLogger = {
|
|
|
92
82
|
cleanupOldLogs(workspaceDir);
|
|
93
83
|
}
|
|
94
84
|
}
|
|
95
|
-
|
|
96
85
|
// Get or create log file path
|
|
97
86
|
if (!cachedLogFile) {
|
|
98
87
|
cachedLogFile = getSystemLogPath(workspaceDir, new Date());
|
|
@@ -101,26 +90,23 @@ export const SystemLogger = {
|
|
|
101
90
|
fs.mkdirSync(logDir, { recursive: true });
|
|
102
91
|
}
|
|
103
92
|
}
|
|
104
|
-
|
|
105
93
|
const timestamp = new Date().toISOString();
|
|
106
|
-
|
|
107
94
|
// Format: [YYYY-MM-DDTHH:mm:ss.sssZ] [EVENT_TYPE] Message
|
|
108
95
|
const logEntry = `[${timestamp}] [${eventType.padEnd(15)}] ${message}\n`;
|
|
109
|
-
|
|
110
96
|
// Use fire-and-forget async append to prevent blocking
|
|
111
97
|
fs.appendFile(cachedLogFile, logEntry, 'utf8', (_err) => {
|
|
112
98
|
// Silently drop errors (e.g. disk full) to not crash the gateway
|
|
113
99
|
});
|
|
114
|
-
}
|
|
100
|
+
}
|
|
101
|
+
catch (e) { // eslint-disable-line @typescript-eslint/no-unused-vars -- Reason: intentionally unused - silently fail if we can't setup the log
|
|
115
102
|
// Silently fail if we can't setup the log
|
|
116
103
|
}
|
|
117
104
|
},
|
|
118
|
-
|
|
119
105
|
/**
|
|
120
106
|
* Force refresh of the cached log file path.
|
|
121
107
|
* Call this at midnight or when the date changes to ensure proper rotation.
|
|
122
108
|
*/
|
|
123
|
-
refreshCache()
|
|
109
|
+
refreshCache() {
|
|
124
110
|
cachedLogDate = undefined;
|
|
125
111
|
cachedLogFile = undefined;
|
|
126
112
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking Models — Detection Engine
|
|
3
|
+
*
|
|
4
|
+
* Core principle metadata (id, name, description) comes from the
|
|
5
|
+
* Core Principle Registry in @principles/core/runtime-v2.
|
|
6
|
+
* Detection patterns are carefully tuned regexes that match AI output text.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* Core Principle Registry (authority) → id, name, description
|
|
10
|
+
* BUILTIN_PATTERNS (engine) → detection regexes per model id
|
|
11
|
+
* THINKING_MODELS (merged) → full definitions with patterns
|
|
12
|
+
*/
|
|
13
|
+
export interface ThinkingModelDefinition {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
antiPattern?: string;
|
|
18
|
+
patterns: RegExp[];
|
|
19
|
+
baselineScenarios: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ThinkingModelMatch {
|
|
22
|
+
modelId: string;
|
|
23
|
+
matchedPattern: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ThinkingScenarioContext {
|
|
26
|
+
recentToolCalls?: {
|
|
27
|
+
toolName: string;
|
|
28
|
+
outcome: 'success' | 'failure' | 'blocked';
|
|
29
|
+
errorType?: string | null;
|
|
30
|
+
}[];
|
|
31
|
+
recentPainEvents?: {
|
|
32
|
+
source: string;
|
|
33
|
+
score: number;
|
|
34
|
+
}[];
|
|
35
|
+
recentGateBlocks?: {
|
|
36
|
+
toolName: string;
|
|
37
|
+
reason: string;
|
|
38
|
+
}[];
|
|
39
|
+
recentUserCorrections?: {
|
|
40
|
+
correctionCue?: string | null;
|
|
41
|
+
}[];
|
|
42
|
+
recentPrincipleEvents?: {
|
|
43
|
+
eventType: string;
|
|
44
|
+
principleId?: string | null;
|
|
45
|
+
}[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Load thinking model definitions dynamically from THINKING_OS.md.
|
|
49
|
+
* Falls back to built-in definitions if parsing fails.
|
|
50
|
+
*
|
|
51
|
+
* @param workspaceDir Optional. If provided, loads from that workspace's THINKING_OS.md.
|
|
52
|
+
*/
|
|
53
|
+
export declare function listThinkingModels(workspaceDir?: string): ThinkingModelDefinition[];
|
|
54
|
+
/**
|
|
55
|
+
* Clear the cached model definitions.
|
|
56
|
+
* Call this when THINKING_OS.md changes.
|
|
57
|
+
*/
|
|
58
|
+
export declare function clearThinkingModelCache(): void;
|
|
59
|
+
export declare function getThinkingModel(modelId: string, workspaceDir?: string): ThinkingModelDefinition | undefined;
|
|
60
|
+
export declare function detectThinkingModelMatches(text: string, workspaceDir?: string): ThinkingModelMatch[];
|
|
61
|
+
/**
|
|
62
|
+
* Get all model definitions for display purposes (no patterns).
|
|
63
|
+
*/
|
|
64
|
+
export declare function getThinkingModelDefinitions(workspaceDir?: string): {
|
|
65
|
+
modelId: string;
|
|
66
|
+
name: string;
|
|
67
|
+
description: string;
|
|
68
|
+
antiPattern?: string;
|
|
69
|
+
}[];
|
|
70
|
+
export declare function deriveThinkingScenarios(modelId: string, context: ThinkingScenarioContext): string[];
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking Models — Detection Engine
|
|
3
|
+
*
|
|
4
|
+
* Core principle metadata (id, name, description) comes from the
|
|
5
|
+
* Core Principle Registry in @principles/core/runtime-v2.
|
|
6
|
+
* Detection patterns are carefully tuned regexes that match AI output text.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* Core Principle Registry (authority) → id, name, description
|
|
10
|
+
* BUILTIN_PATTERNS (engine) → detection regexes per model id
|
|
11
|
+
* THINKING_MODELS (merged) → full definitions with patterns
|
|
12
|
+
*/
|
|
13
|
+
import { loadThinkingOsFromWorkspace, generateDetectionPatterns } from './thinking-os-parser.js';
|
|
14
|
+
import { CORE_PRINCIPLES } from '@principles/core/runtime-v2';
|
|
15
|
+
const BUILTIN_PATTERNS = [
|
|
16
|
+
{
|
|
17
|
+
id: 'T-01',
|
|
18
|
+
patterns: [
|
|
19
|
+
// Thinking process language (AI reasoning output)
|
|
20
|
+
/let me (first )?(understand|map|outline|survey|review the (structure|architecture|dependencies))/i,
|
|
21
|
+
/before (changing|editing|touching) anything/i,
|
|
22
|
+
/让我先(梳理|理解|看看|盘点).*(结构|架构|依赖|全貌)/i,
|
|
23
|
+
/在执行任何.*/i,
|
|
24
|
+
// Decision directive language (nocturnal artifact betterDecision)
|
|
25
|
+
/review (the |)(docs|architecture|structure|requirements|constraints|dependencies|authorization)/i,
|
|
26
|
+
/read (the |)(docs|architecture|requirements|constraints|logs?|error|stack)/i,
|
|
27
|
+
/check (the |)(docs|architecture|source|authorization|requirements|error)/i,
|
|
28
|
+
/understand (the |)(structure|architecture|requirements|constraints|full (context|picture))/i,
|
|
29
|
+
/first (to|and|,) (verify|check|review|read|understand|confirm|diagnose)/i,
|
|
30
|
+
/(verify|check|review|read|confirm) .+ first/i,
|
|
31
|
+
],
|
|
32
|
+
baselineScenarios: ['exploration', 'discovery'],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'T-02',
|
|
36
|
+
patterns: [
|
|
37
|
+
// Thinking process language
|
|
38
|
+
/(type|test|contract|schema|interface) (constraint|requirement|check|validation)/i,
|
|
39
|
+
/(必须|需要).*(遵守|符合|满足).*(类型|测试|契约|接口|规范)/i,
|
|
40
|
+
// Decision directive language
|
|
41
|
+
/(trust|follow|respect|adhere to|meet) (the |)(constraint|requirement|contract|interface|specification|schema|type)/i,
|
|
42
|
+
/(check|verify|validate|ensure) (the |)(constraint|requirement|contract|interface|specification|type|schema)/i,
|
|
43
|
+
],
|
|
44
|
+
baselineScenarios: ['constraint-check', 'contract-verification'],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'T-03',
|
|
48
|
+
patterns: [
|
|
49
|
+
// Thinking process language
|
|
50
|
+
/based on (the |this )?(evidence|logs?|output|error|stack trace|test result)/i,
|
|
51
|
+
/let me (check|verify|confirm|read|look at) (the |)(actual|source|code|file|log)/i,
|
|
52
|
+
/根据(日志|证据|输出|报错|堆栈|测试结果)/i,
|
|
53
|
+
// Decision directive language (evidence-based decision)
|
|
54
|
+
/(verify|check|confirm) (the |)(error|error code|error message|actual|evidence|logs?|output|stack)/i,
|
|
55
|
+
/(error|failure) (logs?|output|stack trace|message|code) (before|then)/i,
|
|
56
|
+
/(look at|read) (the |)(error|logs?|output|stack|actual|evidence|file|code)/i,
|
|
57
|
+
],
|
|
58
|
+
baselineScenarios: ['evidence-gathering', 'verification'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'T-04',
|
|
62
|
+
patterns: [
|
|
63
|
+
// Thinking process language
|
|
64
|
+
/this (is|would be) (irreversible|destructive|permanent|not easily undone)/i,
|
|
65
|
+
/(reversible|can be undone|safely roll back)/i,
|
|
66
|
+
/(不可逆|破坏性|无法回滚|可以回滚|安全撤销)/i,
|
|
67
|
+
// Decision directive language
|
|
68
|
+
/(irreversible|destructive|permanent|high impact) (action|change|operation)/i,
|
|
69
|
+
/(must be|need to be|should be) (reviewed|confirmed|verified|checked) (first|before)/i,
|
|
70
|
+
/(get|obtain|ask for) (confirmation|authorization|approval|permission) (first|before)/i,
|
|
71
|
+
],
|
|
72
|
+
baselineScenarios: ['risk-management', 'reversibility'],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'T-05',
|
|
76
|
+
patterns: [
|
|
77
|
+
// Thinking process language
|
|
78
|
+
/we (must|should) (not|never|avoid|prevent|ensure we don't)/i,
|
|
79
|
+
/(critical|important) (not to|that we don't|to avoid)/i,
|
|
80
|
+
/(绝不能|必须避免|不可|禁止|确保不会)/i,
|
|
81
|
+
// Decision directive language
|
|
82
|
+
/(must|should|need to) (not |never |avoid )?(check|verify|review|read|confirm|ask)/i,
|
|
83
|
+
/(safety|safe) (check|gate|checklist|guard)/i,
|
|
84
|
+
],
|
|
85
|
+
baselineScenarios: ['guardrails', 'safety-rails'],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 'T-06',
|
|
89
|
+
patterns: [
|
|
90
|
+
// Thinking process language
|
|
91
|
+
/(simpl(er|est|ify)|minimal|straightforward|lean) (approach|solution|fix|implementation)/i,
|
|
92
|
+
/(simple is better|keep it simple|no need to over)/i,
|
|
93
|
+
/(最简|更简单|精简|没必要过度设计)/i,
|
|
94
|
+
// Decision directive language
|
|
95
|
+
/(minimal|smallest|narrowest) (change|modification|impact|approach)/i,
|
|
96
|
+
/(only|just) (change|modify|touch|edit|affect) (the |what)/i,
|
|
97
|
+
],
|
|
98
|
+
baselineScenarios: ['simplification', 'pragmatism'],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: 'T-07',
|
|
102
|
+
patterns: [
|
|
103
|
+
// Thinking process language
|
|
104
|
+
/(minimal|smallest|narrowest|least) (change|diff|modification|impact)/i,
|
|
105
|
+
/only (change|modify|touch|edit) (the |what)/i,
|
|
106
|
+
/(最小改动|最小变更|只改|只动必要部分)/i,
|
|
107
|
+
// Decision directive language
|
|
108
|
+
/(limit|narrow) (the |)(change|impact|scope|blast radius)/i,
|
|
109
|
+
],
|
|
110
|
+
baselineScenarios: ['minimal-diff', 'blast-radius-control'],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'T-08',
|
|
114
|
+
patterns: [
|
|
115
|
+
// Thinking process language
|
|
116
|
+
/this (error|failure|issue) (tells us|indicates|signals|suggests|means)/i,
|
|
117
|
+
/let me (stop|pause|step back|reconsider|rethink)/i,
|
|
118
|
+
/这个(错误|失败|问题).*(说明|意味着|提示)/i,
|
|
119
|
+
/让我(停下|暂停|退一步|重新考虑|重新审视)/i,
|
|
120
|
+
// Decision directive language
|
|
121
|
+
/(diagnose|analyze|investigate) (the |)(root |)(cause|reason|error|failure) (first|before)/i,
|
|
122
|
+
/(understand|diagnose|analyze) (the |)(error|failure|issue|problem) (first|before)/i,
|
|
123
|
+
],
|
|
124
|
+
baselineScenarios: ['reflection', 'pain-response'],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: 'T-09',
|
|
128
|
+
patterns: [
|
|
129
|
+
// Thinking process language
|
|
130
|
+
/(break|split|decompose|divide) (this |the task |it )?(into|down)/i,
|
|
131
|
+
/(step 1|first,? (we|i|let's)|phase 1)/i,
|
|
132
|
+
/(拆分|分解|分步|分阶段|第一步)/i,
|
|
133
|
+
// Decision directive language
|
|
134
|
+
/(break|split|decompose|divide) (the |)(task|problem|action) (into|into steps)/i,
|
|
135
|
+
],
|
|
136
|
+
baselineScenarios: ['decomposition', 'phased-execution'],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: 'T-10',
|
|
140
|
+
patterns: [
|
|
141
|
+
// Thinking process language
|
|
142
|
+
/let me (write|save|record|note down|document)/i,
|
|
143
|
+
/memory.*scratchpad|write.*plan\.md|write.*memory|memory.*persist/i,
|
|
144
|
+
/(让我.*写入|写入.*memory|记录.*scratchpad)/i,
|
|
145
|
+
// Decision directive language
|
|
146
|
+
/(write|save|record|note) (the |)(conclusion|decision|plan|next step) (to|in) (file|plan\.md|scratchpad)/i,
|
|
147
|
+
],
|
|
148
|
+
baselineScenarios: ['memory-persistence', 'state-externalization'],
|
|
149
|
+
},
|
|
150
|
+
];
|
|
151
|
+
const BUILTIN_PATTERN_MAP = new Map(BUILTIN_PATTERNS.map((p) => [p.id, p]));
|
|
152
|
+
// Fallback name/description lookup — delegates to Core Principle Registry
|
|
153
|
+
function getFallbackName(id) {
|
|
154
|
+
const entry = CORE_PRINCIPLES.find(p => p.id === id);
|
|
155
|
+
return entry?.name ?? id;
|
|
156
|
+
}
|
|
157
|
+
function getFallbackDescription(id) {
|
|
158
|
+
const entry = CORE_PRINCIPLES.find(p => p.id === id);
|
|
159
|
+
return entry?.statement ?? '';
|
|
160
|
+
}
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
// Runtime model definitions — merged from THINKING_OS.md + builtin patterns
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
let _cachedDefinitions = null;
|
|
165
|
+
let _cachedWorkspace = null;
|
|
166
|
+
/**
|
|
167
|
+
* Load thinking model definitions dynamically from THINKING_OS.md.
|
|
168
|
+
* Falls back to built-in definitions if parsing fails.
|
|
169
|
+
*
|
|
170
|
+
* @param workspaceDir Optional. If provided, loads from that workspace's THINKING_OS.md.
|
|
171
|
+
*/
|
|
172
|
+
export function listThinkingModels(workspaceDir) {
|
|
173
|
+
const cacheKey = workspaceDir ?? '__global__';
|
|
174
|
+
if (_cachedDefinitions && _cachedWorkspace === cacheKey) {
|
|
175
|
+
return _cachedDefinitions.slice();
|
|
176
|
+
}
|
|
177
|
+
const models = [];
|
|
178
|
+
if (workspaceDir) {
|
|
179
|
+
// Try to load from THINKING_OS.md
|
|
180
|
+
const directives = loadThinkingOsFromWorkspace(workspaceDir);
|
|
181
|
+
if (directives.length > 0) {
|
|
182
|
+
for (const dir of directives) {
|
|
183
|
+
const builtin = BUILTIN_PATTERN_MAP.get(dir.id);
|
|
184
|
+
const patterns = builtin?.patterns ?? generateDetectionPatterns(dir.trigger);
|
|
185
|
+
if (patterns.length === 0) {
|
|
186
|
+
console.warn(`[PD:thinking-models] No detection patterns for ${dir.id}: "${dir.trigger}"`);
|
|
187
|
+
}
|
|
188
|
+
models.push({
|
|
189
|
+
id: dir.id,
|
|
190
|
+
name: dir.name,
|
|
191
|
+
description: dir.must,
|
|
192
|
+
antiPattern: dir.forbidden || undefined,
|
|
193
|
+
patterns,
|
|
194
|
+
baselineScenarios: builtin?.baselineScenarios ?? [],
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
_cachedDefinitions = models;
|
|
198
|
+
_cachedWorkspace = cacheKey;
|
|
199
|
+
return models.slice();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Fallback: built-in definitions
|
|
203
|
+
for (const bp of BUILTIN_PATTERNS) {
|
|
204
|
+
models.push({
|
|
205
|
+
id: bp.id,
|
|
206
|
+
name: getFallbackName(bp.id),
|
|
207
|
+
description: getFallbackDescription(bp.id),
|
|
208
|
+
patterns: bp.patterns,
|
|
209
|
+
baselineScenarios: bp.baselineScenarios,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
_cachedDefinitions = models;
|
|
213
|
+
_cachedWorkspace = cacheKey;
|
|
214
|
+
return models.slice();
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Clear the cached model definitions.
|
|
218
|
+
* Call this when THINKING_OS.md changes.
|
|
219
|
+
*/
|
|
220
|
+
export function clearThinkingModelCache() {
|
|
221
|
+
_cachedDefinitions = null;
|
|
222
|
+
_cachedWorkspace = null;
|
|
223
|
+
}
|
|
224
|
+
export function getThinkingModel(modelId, workspaceDir) {
|
|
225
|
+
const models = listThinkingModels(workspaceDir);
|
|
226
|
+
return models.find(m => m.id === modelId);
|
|
227
|
+
}
|
|
228
|
+
export function detectThinkingModelMatches(text, workspaceDir) {
|
|
229
|
+
if (!text)
|
|
230
|
+
return [];
|
|
231
|
+
const models = listThinkingModels(workspaceDir);
|
|
232
|
+
const matches = [];
|
|
233
|
+
for (const model of models) {
|
|
234
|
+
for (const pattern of model.patterns) {
|
|
235
|
+
if (pattern.test(text)) {
|
|
236
|
+
matches.push({
|
|
237
|
+
modelId: model.id,
|
|
238
|
+
matchedPattern: pattern.source,
|
|
239
|
+
});
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return matches;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get all model definitions for display purposes (no patterns).
|
|
248
|
+
*/
|
|
249
|
+
export function getThinkingModelDefinitions(workspaceDir) {
|
|
250
|
+
return listThinkingModels(workspaceDir).map(m => ({
|
|
251
|
+
modelId: m.id,
|
|
252
|
+
name: m.id + ': ' + m.name,
|
|
253
|
+
description: m.description,
|
|
254
|
+
antiPattern: m.antiPattern,
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
export function deriveThinkingScenarios(modelId, context) {
|
|
258
|
+
const scenarios = new Set(getThinkingModel(modelId)?.baselineScenarios ?? []);
|
|
259
|
+
if ((context.recentToolCalls ?? []).some((call) => call.outcome === 'failure')) {
|
|
260
|
+
scenarios.add('after-tool-failure');
|
|
261
|
+
}
|
|
262
|
+
// after-recovery: success that follows a failure (not just any success)
|
|
263
|
+
const calls = context.recentToolCalls ?? [];
|
|
264
|
+
const hasFailure = calls.some((call) => call.outcome === 'failure');
|
|
265
|
+
const hasSuccess = calls.some((call) => call.outcome === 'success');
|
|
266
|
+
if (hasFailure && hasSuccess) {
|
|
267
|
+
scenarios.add('after-recovery');
|
|
268
|
+
}
|
|
269
|
+
if ((context.recentToolCalls ?? []).some((call) => call.outcome === 'blocked')) {
|
|
270
|
+
scenarios.add('blocked-execution');
|
|
271
|
+
}
|
|
272
|
+
if ((context.recentToolCalls ?? []).some((call) => Boolean(call.errorType))) {
|
|
273
|
+
scenarios.add('incident-response');
|
|
274
|
+
}
|
|
275
|
+
if ((context.recentPainEvents ?? []).length > 0) {
|
|
276
|
+
scenarios.add('user-friction');
|
|
277
|
+
}
|
|
278
|
+
if ((context.recentGateBlocks ?? []).length > 0) {
|
|
279
|
+
scenarios.add('gate-block');
|
|
280
|
+
}
|
|
281
|
+
if ((context.recentUserCorrections ?? []).length > 0) {
|
|
282
|
+
scenarios.add('user-correction');
|
|
283
|
+
}
|
|
284
|
+
if ((context.recentPrincipleEvents ?? []).length > 0) {
|
|
285
|
+
scenarios.add('principle-feedback');
|
|
286
|
+
}
|
|
287
|
+
if (modelId === 'T-03') {
|
|
288
|
+
scenarios.add('root-cause-analysis');
|
|
289
|
+
}
|
|
290
|
+
if (modelId === 'T-04' || modelId === 'T-05') {
|
|
291
|
+
scenarios.add('risk-review');
|
|
292
|
+
}
|
|
293
|
+
if (modelId === 'T-08') {
|
|
294
|
+
scenarios.add('reflection-loop');
|
|
295
|
+
}
|
|
296
|
+
if (modelId === 'T-09') {
|
|
297
|
+
scenarios.add('task-planning');
|
|
298
|
+
}
|
|
299
|
+
return Array.from(scenarios);
|
|
300
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking OS XML Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses THINKING_OS.md to extract directive definitions.
|
|
5
|
+
* THINKING_OS.md is the single source of truth for thinking models.
|
|
6
|
+
*
|
|
7
|
+
* XML structure:
|
|
8
|
+
* <directive id="T-01" name="MAP_BEFORE_TERRITORY">
|
|
9
|
+
* <trigger>...</trigger>
|
|
10
|
+
* <must>...</must>
|
|
11
|
+
* <forbidden>...</forbidden>
|
|
12
|
+
* </directive>
|
|
13
|
+
*/
|
|
14
|
+
export interface ThinkingOsDirective {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
trigger: string;
|
|
18
|
+
must: string;
|
|
19
|
+
forbidden: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse THINKING_OS.md content and extract all <directive> blocks.
|
|
23
|
+
* Returns empty array if no directives found.
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseThinkingOsMd(content: string): ThinkingOsDirective[];
|
|
26
|
+
/**
|
|
27
|
+
* Load THINKING_OS.md from the plugin templates for a given language.
|
|
28
|
+
* Falls back to the workspace THINKING_OS.md if it exists.
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadThinkingOsFromWorkspace(workspaceDir: string, language?: string): ThinkingOsDirective[];
|
|
31
|
+
/**
|
|
32
|
+
* Extract meaningful detection keywords from a trigger string.
|
|
33
|
+
* Returns an array of regex patterns.
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateDetectionPatterns(trigger: string): RegExp[];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thinking OS XML Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses THINKING_OS.md to extract directive definitions.
|
|
5
|
+
* THINKING_OS.md is the single source of truth for thinking models.
|
|
6
|
+
*
|
|
7
|
+
* XML structure:
|
|
8
|
+
* <directive id="T-01" name="MAP_BEFORE_TERRITORY">
|
|
9
|
+
* <trigger>...</trigger>
|
|
10
|
+
* <must>...</must>
|
|
11
|
+
* <forbidden>...</forbidden>
|
|
12
|
+
* </directive>
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { fileURLToPath } from 'url';
|
|
17
|
+
import { resolvePdPath } from './paths.js';
|
|
18
|
+
/**
|
|
19
|
+
* Extract a single XML tag's text content from a string.
|
|
20
|
+
*/
|
|
21
|
+
function extractTag(content, tagName) {
|
|
22
|
+
const regex = new RegExp(`<${tagName}>([\\s\\S]*?)</${tagName}>`, 'i');
|
|
23
|
+
const match = content.match(regex);
|
|
24
|
+
if (!match)
|
|
25
|
+
return '';
|
|
26
|
+
return match[1].trim().replace(/\s+/g, ' ');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse THINKING_OS.md content and extract all <directive> blocks.
|
|
30
|
+
* Returns empty array if no directives found.
|
|
31
|
+
*/
|
|
32
|
+
export function parseThinkingOsMd(content) {
|
|
33
|
+
const directives = [];
|
|
34
|
+
// Match all <directive ...> ... </directive> blocks
|
|
35
|
+
const directiveRegex = /<directive\s+([^>]*)>([\s\S]*?)<\/directive>/gi;
|
|
36
|
+
let _match = null;
|
|
37
|
+
while ((_match = directiveRegex.exec(content)) !== null) {
|
|
38
|
+
const [, attrs, body] = _match;
|
|
39
|
+
const idMatch = /id="([^"]+)"/i.exec(attrs);
|
|
40
|
+
const nameMatch = /name="([^"]+)"/i.exec(attrs);
|
|
41
|
+
if (!idMatch)
|
|
42
|
+
continue;
|
|
43
|
+
const directive = {
|
|
44
|
+
id: idMatch[1],
|
|
45
|
+
name: nameMatch ? nameMatch[1] : '',
|
|
46
|
+
trigger: extractTag(body, 'trigger'),
|
|
47
|
+
must: extractTag(body, 'must'),
|
|
48
|
+
forbidden: extractTag(body, 'forbidden'),
|
|
49
|
+
};
|
|
50
|
+
directives.push(directive);
|
|
51
|
+
}
|
|
52
|
+
return directives;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load THINKING_OS.md from the plugin templates for a given language.
|
|
56
|
+
* Falls back to the workspace THINKING_OS.md if it exists.
|
|
57
|
+
*/
|
|
58
|
+
export function loadThinkingOsFromWorkspace(workspaceDir, language = 'zh') {
|
|
59
|
+
// Priority 1: workspace's own THINKING_OS.md
|
|
60
|
+
const workspacePath = resolvePdPath(workspaceDir, 'THINKING_OS');
|
|
61
|
+
if (fs.existsSync(workspacePath)) {
|
|
62
|
+
try {
|
|
63
|
+
const content = fs.readFileSync(workspacePath, 'utf-8');
|
|
64
|
+
const directives = parseThinkingOsMd(content);
|
|
65
|
+
if (directives.length > 0)
|
|
66
|
+
return directives;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Fall through to template
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ES Module compatible __dirname (must be inside function for bundler)
|
|
73
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
74
|
+
// Priority 2: plugin template for the given language
|
|
75
|
+
const templatePath = path.join(path.dirname(path.dirname(path.dirname(currentDir))), 'templates', 'langs', language, 'principles', 'THINKING_OS.md');
|
|
76
|
+
if (fs.existsSync(templatePath)) {
|
|
77
|
+
try {
|
|
78
|
+
const content = fs.readFileSync(templatePath, 'utf-8');
|
|
79
|
+
return parseThinkingOsMd(content);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Fall through to zh template
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Priority 3: zh template as ultimate fallback
|
|
86
|
+
const zhPath = path.join(path.dirname(path.dirname(path.dirname(currentDir))), 'templates', 'langs', 'zh', 'principles', 'THINKING_OS.md');
|
|
87
|
+
if (fs.existsSync(zhPath)) {
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(zhPath, 'utf-8');
|
|
90
|
+
return parseThinkingOsMd(content);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract meaningful detection keywords from a trigger string.
|
|
100
|
+
* Returns an array of regex patterns.
|
|
101
|
+
*/
|
|
102
|
+
export function generateDetectionPatterns(trigger) {
|
|
103
|
+
if (!trigger)
|
|
104
|
+
return [];
|
|
105
|
+
const patterns = [];
|
|
106
|
+
// Extract Chinese phrases: 3-8 character sequences that are meaningful
|
|
107
|
+
const chinesePattern = /[\u4e00-\u9fff]{3,8}/g;
|
|
108
|
+
const chineseMatches = trigger.match(chinesePattern) ?? [];
|
|
109
|
+
for (const phrase of chineseMatches) {
|
|
110
|
+
patterns.push(phrase);
|
|
111
|
+
}
|
|
112
|
+
// Extract English words/phrases: sequences of letters
|
|
113
|
+
const englishPattern = /[a-zA-Z]{3,20}(?:\s+[a-zA-Z]{3,20}){0,3}/g;
|
|
114
|
+
const englishMatches = trigger.match(englishPattern) ?? [];
|
|
115
|
+
for (const phrase of englishMatches) {
|
|
116
|
+
const cleaned = phrase.trim();
|
|
117
|
+
if (cleaned.length >= 3) {
|
|
118
|
+
patterns.push(cleaned);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Convert to case-insensitive regexes
|
|
122
|
+
return patterns.map(p => new RegExp(p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i'));
|
|
123
|
+
}
|