@evomap/evolver-core 2.0.0-beta.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/algo/antiDistill.d.ts +35 -0
- package/dist/algo/antiDistill.js +167 -0
- package/dist/algo/bans.d.ts +6 -0
- package/dist/algo/bans.js +33 -0
- package/dist/algo/candidateAssembly.d.ts +65 -0
- package/dist/algo/candidateAssembly.js +196 -0
- package/dist/algo/capabilityCandidates.d.ts +38 -0
- package/dist/algo/capabilityCandidates.js +131 -0
- package/dist/algo/confidence.d.ts +106 -0
- package/dist/algo/confidence.js +196 -0
- package/dist/algo/cycleEngine.d.ts +143 -0
- package/dist/algo/cycleEngine.js +417 -0
- package/dist/algo/cycleFailureClassifier.d.ts +52 -0
- package/dist/algo/cycleFailureClassifier.js +104 -0
- package/dist/algo/epigenetics.d.ts +14 -0
- package/dist/algo/epigenetics.js +41 -0
- package/dist/algo/evolutionEvent.d.ts +23 -0
- package/dist/algo/evolutionEvent.js +24 -0
- package/dist/algo/exploration.d.ts +34 -0
- package/dist/algo/exploration.js +55 -0
- package/dist/algo/geneHealth.d.ts +24 -0
- package/dist/algo/geneHealth.js +16 -0
- package/dist/algo/geneIntake.d.ts +37 -0
- package/dist/algo/geneIntake.js +100 -0
- package/dist/algo/genePromotion.d.ts +48 -0
- package/dist/algo/genePromotion.js +53 -0
- package/dist/algo/geneSelection.d.ts +128 -0
- package/dist/algo/geneSelection.js +222 -0
- package/dist/algo/index.d.ts +18 -0
- package/dist/algo/index.js +18 -0
- package/dist/algo/mutation.d.ts +12 -0
- package/dist/algo/mutation.js +22 -0
- package/dist/algo/orchestrator.d.ts +65 -0
- package/dist/algo/orchestrator.js +63 -0
- package/dist/algo/solidify.d.ts +43 -0
- package/dist/algo/solidify.js +63 -0
- package/dist/algo/strategyPresets.d.ts +32 -0
- package/dist/algo/strategyPresets.js +61 -0
- package/dist/assetstore/index.d.ts +8 -0
- package/dist/assetstore/index.js +8 -0
- package/dist/assetstore/learningHistory.d.ts +25 -0
- package/dist/assetstore/learningHistory.js +38 -0
- package/dist/assetstore/localJsonl.d.ts +34 -0
- package/dist/assetstore/localJsonl.js +182 -0
- package/dist/assetstore/pendingSignals.d.ts +22 -0
- package/dist/assetstore/pendingSignals.js +171 -0
- package/dist/assetstore/provenance.d.ts +39 -0
- package/dist/assetstore/provenance.js +109 -0
- package/dist/assetstore/provider.d.ts +48 -0
- package/dist/assetstore/provider.js +36 -0
- package/dist/assetstore/remoteStub.d.ts +32 -0
- package/dist/assetstore/remoteStub.js +36 -0
- package/dist/assetstore/reviewFilter.d.ts +20 -0
- package/dist/assetstore/reviewFilter.js +44 -0
- package/dist/assetstore/reviewLedger.d.ts +55 -0
- package/dist/assetstore/reviewLedger.js +121 -0
- package/dist/benchmark/antiGeneBenchmark.d.ts +79 -0
- package/dist/benchmark/antiGeneBenchmark.js +241 -0
- package/dist/benchmark/antiGeneRollout.d.ts +80 -0
- package/dist/benchmark/antiGeneRollout.js +256 -0
- package/dist/benchmark/benchmark.d.ts +32 -0
- package/dist/benchmark/benchmark.js +26 -0
- package/dist/benchmark/evolutionThesisSolver.d.ts +25 -0
- package/dist/benchmark/evolutionThesisSolver.js +41 -0
- package/dist/benchmark/index.d.ts +5 -0
- package/dist/benchmark/index.js +5 -0
- package/dist/benchmark/thesis.d.ts +85 -0
- package/dist/benchmark/thesis.js +150 -0
- package/dist/bootstrap/envFingerprint.d.ts +45 -0
- package/dist/bootstrap/envFingerprint.js +72 -0
- package/dist/bootstrap/index.d.ts +2 -0
- package/dist/bootstrap/index.js +2 -0
- package/dist/bootstrap/selfEvolve.d.ts +36 -0
- package/dist/bootstrap/selfEvolve.js +26 -0
- package/dist/cycle/cycleTimeline.d.ts +35 -0
- package/dist/cycle/cycleTimeline.js +74 -0
- package/dist/cycle/index.d.ts +2 -0
- package/dist/cycle/index.js +2 -0
- package/dist/cycle/stateMachine.d.ts +6 -0
- package/dist/cycle/stateMachine.js +25 -0
- package/dist/daemon/cycleContext.d.ts +12 -0
- package/dist/daemon/cycleContext.js +13 -0
- package/dist/daemon/drain.d.ts +11 -0
- package/dist/daemon/drain.js +16 -0
- package/dist/daemon/guards.d.ts +87 -0
- package/dist/daemon/guards.js +142 -0
- package/dist/daemon/idempotency.d.ts +11 -0
- package/dist/daemon/idempotency.js +36 -0
- package/dist/daemon/idleScheduler.d.ts +55 -0
- package/dist/daemon/idleScheduler.js +181 -0
- package/dist/daemon/index.d.ts +8 -0
- package/dist/daemon/index.js +8 -0
- package/dist/daemon/stepRunner.d.ts +12 -0
- package/dist/daemon/stepRunner.js +31 -0
- package/dist/daemon/unhandledRejectionWindow.d.ts +21 -0
- package/dist/daemon/unhandledRejectionWindow.js +52 -0
- package/dist/daemon/watchdog.d.ts +11 -0
- package/dist/daemon/watchdog.js +14 -0
- package/dist/events/eventSchema.d.ts +132 -0
- package/dist/events/eventSchema.js +30 -0
- package/dist/events/eventStore.d.ts +32 -0
- package/dist/events/eventStore.js +137 -0
- package/dist/events/ingest.d.ts +34 -0
- package/dist/events/ingest.js +61 -0
- package/dist/events/paths.d.ts +22 -0
- package/dist/events/paths.js +44 -0
- package/dist/events/projectors.d.ts +9 -0
- package/dist/events/projectors.js +11 -0
- package/dist/events/public.d.ts +14 -0
- package/dist/events/public.js +8 -0
- package/dist/events/replayer.d.ts +26 -0
- package/dist/events/replayer.js +67 -0
- package/dist/events/reports.d.ts +90 -0
- package/dist/events/reports.js +244 -0
- package/dist/events/retention.d.ts +70 -0
- package/dist/events/retention.js +177 -0
- package/dist/events/sink.d.ts +5 -0
- package/dist/events/sink.js +1 -0
- package/dist/exec/autoExec.d.ts +137 -0
- package/dist/exec/autoExec.js +221 -0
- package/dist/exec/autonomousCycle.d.ts +48 -0
- package/dist/exec/autonomousCycle.js +78 -0
- package/dist/exec/claudeBridge.d.ts +112 -0
- package/dist/exec/claudeBridge.js +219 -0
- package/dist/exec/index.d.ts +9 -0
- package/dist/exec/index.js +11 -0
- package/dist/exec/openPrRegistry.d.ts +60 -0
- package/dist/exec/openPrRegistry.js +130 -0
- package/dist/exec/policy/blastRadius.d.ts +31 -0
- package/dist/exec/policy/blastRadius.js +67 -0
- package/dist/exec/policy/constraints.d.ts +26 -0
- package/dist/exec/policy/constraints.js +62 -0
- package/dist/exec/policy/destructive.d.ts +45 -0
- package/dist/exec/policy/destructive.js +108 -0
- package/dist/exec/policy/failureMode.d.ts +33 -0
- package/dist/exec/policy/failureMode.js +49 -0
- package/dist/exec/policy/index.d.ts +24 -0
- package/dist/exec/policy/index.js +30 -0
- package/dist/exec/policy/protectedPaths.d.ts +17 -0
- package/dist/exec/policy/protectedPaths.js +65 -0
- package/dist/exec/policyCheck.d.ts +2 -0
- package/dist/exec/policyCheck.js +7 -0
- package/dist/exec/prompt.d.ts +34 -0
- package/dist/exec/prompt.js +108 -0
- package/dist/exec/proofOfWork.d.ts +9 -0
- package/dist/exec/proofOfWork.js +11 -0
- package/dist/exec/runnerRegistry.d.ts +123 -0
- package/dist/exec/runnerRegistry.js +237 -0
- package/dist/exec/selfPr.d.ts +83 -0
- package/dist/exec/selfPr.js +104 -0
- package/dist/exec/selfPrObfuscation.d.ts +21 -0
- package/dist/exec/selfPrObfuscation.js +85 -0
- package/dist/hooks/hooks.d.ts +117 -0
- package/dist/hooks/hooks.js +89 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hub/assetCallLog.d.ts +43 -0
- package/dist/hub/assetCallLog.js +72 -0
- package/dist/hub/bindings.d.ts +28 -0
- package/dist/hub/bindings.js +90 -0
- package/dist/hub/capability.d.ts +278 -0
- package/dist/hub/capability.js +1 -0
- package/dist/hub/conversationDistiller.d.ts +88 -0
- package/dist/hub/conversationDistiller.js +264 -0
- package/dist/hub/fake.d.ts +45 -0
- package/dist/hub/fake.js +69 -0
- package/dist/hub/hubReview.d.ts +91 -0
- package/dist/hub/hubReview.js +106 -0
- package/dist/hub/index.d.ts +10 -0
- package/dist/hub/index.js +10 -0
- package/dist/hub/ingest.d.ts +15 -0
- package/dist/hub/ingest.js +15 -0
- package/dist/hub/questionGenerator.d.ts +59 -0
- package/dist/hub/questionGenerator.js +406 -0
- package/dist/hub/reuseDecision.d.ts +87 -0
- package/dist/hub/reuseDecision.js +127 -0
- package/dist/hub/sanitize.d.ts +52 -0
- package/dist/hub/sanitize.js +321 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +27 -0
- package/dist/mailbox/catalog.d.ts +17 -0
- package/dist/mailbox/catalog.js +53 -0
- package/dist/mailbox/daemon.d.ts +48 -0
- package/dist/mailbox/daemon.js +61 -0
- package/dist/mailbox/dispatch.d.ts +46 -0
- package/dist/mailbox/dispatch.js +62 -0
- package/dist/mailbox/envelope.d.ts +43 -0
- package/dist/mailbox/envelope.js +52 -0
- package/dist/mailbox/index.d.ts +8 -0
- package/dist/mailbox/index.js +8 -0
- package/dist/mailbox/ipcServer.d.ts +46 -0
- package/dist/mailbox/ipcServer.js +168 -0
- package/dist/mailbox/requestReply.d.ts +40 -0
- package/dist/mailbox/requestReply.js +77 -0
- package/dist/mailbox/store.d.ts +74 -0
- package/dist/mailbox/store.js +308 -0
- package/dist/mailbox/wake.d.ts +45 -0
- package/dist/mailbox/wake.js +60 -0
- package/dist/material/boundary.d.ts +7 -0
- package/dist/material/boundary.js +14 -0
- package/dist/material/consumer.d.ts +21 -0
- package/dist/material/consumer.js +52 -0
- package/dist/material/emit.d.ts +55 -0
- package/dist/material/emit.js +52 -0
- package/dist/material/factory.d.ts +27 -0
- package/dist/material/factory.js +25 -0
- package/dist/material/index.d.ts +8 -0
- package/dist/material/index.js +8 -0
- package/dist/material/materialStore.d.ts +24 -0
- package/dist/material/materialStore.js +76 -0
- package/dist/material/sampling.d.ts +21 -0
- package/dist/material/sampling.js +39 -0
- package/dist/material/sources.d.ts +25 -0
- package/dist/material/sources.js +33 -0
- package/dist/material/watermark.d.ts +21 -0
- package/dist/material/watermark.js +76 -0
- package/dist/observers/cursorRewriteObserver.d.ts +46 -0
- package/dist/observers/cursorRewriteObserver.js +103 -0
- package/dist/observers/distillObserver.d.ts +31 -0
- package/dist/observers/distillObserver.js +93 -0
- package/dist/observers/index.d.ts +5 -0
- package/dist/observers/index.js +5 -0
- package/dist/observers/observerBus.d.ts +44 -0
- package/dist/observers/observerBus.js +73 -0
- package/dist/observers/reflectionObserver.d.ts +31 -0
- package/dist/observers/reflectionObserver.js +124 -0
- package/dist/observers/valueDigestObserver.d.ts +50 -0
- package/dist/observers/valueDigestObserver.js +70 -0
- package/dist/ops/cleanup.d.ts +23 -0
- package/dist/ops/cleanup.js +68 -0
- package/dist/ops/health.d.ts +37 -0
- package/dist/ops/health.js +96 -0
- package/dist/ops/index.d.ts +7 -0
- package/dist/ops/index.js +7 -0
- package/dist/ops/recall.d.ts +65 -0
- package/dist/ops/recall.js +152 -0
- package/dist/ops/reuseOutcomes.d.ts +68 -0
- package/dist/ops/reuseOutcomes.js +126 -0
- package/dist/ops/savingsCore.d.ts +47 -0
- package/dist/ops/savingsCore.js +112 -0
- package/dist/ops/selfUpdate.d.ts +106 -0
- package/dist/ops/selfUpdate.js +294 -0
- package/dist/ops/valueLedger.d.ts +205 -0
- package/dist/ops/valueLedger.js +238 -0
- package/dist/ops/valueOutreach.d.ts +70 -0
- package/dist/ops/valueOutreach.js +244 -0
- package/dist/personality/drift.d.ts +45 -0
- package/dist/personality/drift.js +106 -0
- package/dist/personality/events.d.ts +25 -0
- package/dist/personality/events.js +37 -0
- package/dist/personality/evolveOps.d.ts +20 -0
- package/dist/personality/evolveOps.js +93 -0
- package/dist/personality/index.d.ts +11 -0
- package/dist/personality/index.js +11 -0
- package/dist/personality/mutate.d.ts +21 -0
- package/dist/personality/mutate.js +39 -0
- package/dist/personality/pivot.d.ts +23 -0
- package/dist/personality/pivot.js +22 -0
- package/dist/personality/prompt.d.ts +6 -0
- package/dist/personality/prompt.js +62 -0
- package/dist/personality/riskGate.d.ts +42 -0
- package/dist/personality/riskGate.js +80 -0
- package/dist/personality/schema.d.ts +255 -0
- package/dist/personality/schema.js +119 -0
- package/dist/personality/select.d.ts +46 -0
- package/dist/personality/select.js +71 -0
- package/dist/personality/stats.d.ts +46 -0
- package/dist/personality/stats.js +82 -0
- package/dist/personality/store.d.ts +35 -0
- package/dist/personality/store.js +92 -0
- package/dist/schema/common.d.ts +28 -0
- package/dist/schema/common.js +17 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/material.d.ts +201 -0
- package/dist/schema/material.js +50 -0
- package/dist/schema/problem.d.ts +160 -0
- package/dist/schema/problem.js +45 -0
- package/dist/schema/proofOfWork.d.ts +97 -0
- package/dist/schema/proofOfWork.js +9 -0
- package/dist/schema/signal.d.ts +41 -0
- package/dist/schema/signal.js +19 -0
- package/dist/shadow/index.d.ts +6 -0
- package/dist/shadow/index.js +6 -0
- package/dist/shadow/jsonlSink.d.ts +17 -0
- package/dist/shadow/jsonlSink.js +27 -0
- package/dist/shadow/redact.d.ts +11 -0
- package/dist/shadow/redact.js +18 -0
- package/dist/shadow/shadowHub.d.ts +12 -0
- package/dist/shadow/shadowHub.js +42 -0
- package/dist/shadow/shadowMailbox.d.ts +17 -0
- package/dist/shadow/shadowMailbox.js +25 -0
- package/dist/shadow/shadowStore.d.ts +18 -0
- package/dist/shadow/shadowStore.js +55 -0
- package/dist/shadow/sink.d.ts +37 -0
- package/dist/shadow/sink.js +18 -0
- package/dist/signals/cycleHistoryFromEvents.d.ts +11 -0
- package/dist/signals/cycleHistoryFromEvents.js +96 -0
- package/dist/signals/expand.d.ts +34 -0
- package/dist/signals/expand.js +125 -0
- package/dist/signals/extractor.d.ts +25 -0
- package/dist/signals/extractor.js +57 -0
- package/dist/signals/index.d.ts +6 -0
- package/dist/signals/index.js +6 -0
- package/dist/signals/metaSignals.d.ts +57 -0
- package/dist/signals/metaSignals.js +158 -0
- package/dist/signals/signalGate.d.ts +15 -0
- package/dist/signals/signalGate.js +40 -0
- package/dist/signals/traceSignals.d.ts +44 -0
- package/dist/signals/traceSignals.js +123 -0
- package/dist/signatures/classifier.d.ts +16 -0
- package/dist/signatures/classifier.js +29 -0
- package/dist/signatures/index.d.ts +2 -0
- package/dist/signatures/index.js +2 -0
- package/dist/signatures/signatures.d.ts +22 -0
- package/dist/signatures/signatures.js +42 -0
- package/dist/strategy/experiment.d.ts +48 -0
- package/dist/strategy/experiment.js +63 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/strategyPoint.d.ts +30 -0
- package/dist/strategy/strategyPoint.js +23 -0
- package/dist/trace/index.d.ts +2 -0
- package/dist/trace/index.js +2 -0
- package/dist/trace/trajectory.d.ts +82 -0
- package/dist/trace/trajectory.js +117 -0
- package/dist/trace/trajectoryExport.d.ts +237 -0
- package/dist/trace/trajectoryExport.js +1818 -0
- package/dist/trigger/budget.d.ts +16 -0
- package/dist/trigger/budget.js +20 -0
- package/dist/trigger/engine.d.ts +12 -0
- package/dist/trigger/engine.js +23 -0
- package/dist/trigger/index.d.ts +6 -0
- package/dist/trigger/index.js +6 -0
- package/dist/trigger/problemBuilder.d.ts +24 -0
- package/dist/trigger/problemBuilder.js +32 -0
- package/dist/trigger/trigger.d.ts +22 -0
- package/dist/trigger/trigger.js +27 -0
- package/dist/trigger/valueModel.d.ts +26 -0
- package/dist/trigger/valueModel.js +25 -0
- package/dist/trigger/wfq.d.ts +13 -0
- package/dist/trigger/wfq.js +25 -0
- package/dist/util/fileLock.d.ts +24 -0
- package/dist/util/fileLock.js +227 -0
- package/dist/util/index.d.ts +2 -0
- package/dist/util/index.js +2 -0
- package/dist/util/version.d.ts +12 -0
- package/dist/util/version.js +51 -0
- package/dist/verify/index.d.ts +4 -0
- package/dist/verify/index.js +4 -0
- package/dist/verify/rollback.d.ts +22 -0
- package/dist/verify/rollback.js +33 -0
- package/dist/verify/sandboxRunner.d.ts +39 -0
- package/dist/verify/sandboxRunner.js +116 -0
- package/dist/verify/sandboxedValidation.d.ts +35 -0
- package/dist/verify/sandboxedValidation.js +56 -0
- package/dist/verify/validation.d.ts +41 -0
- package/dist/verify/validation.js +85 -0
- package/dist/wire/canonicalize.golden.d.ts +23 -0
- package/dist/wire/canonicalize.golden.js +46 -0
- package/dist/wire/geneHints.d.ts +64 -0
- package/dist/wire/geneHints.js +100 -0
- package/dist/wire/index.d.ts +91 -0
- package/dist/wire/index.js +3 -0
- package/dist/wire/schemaGate.d.ts +11 -0
- package/dist/wire/schemaGate.js +49 -0
- package/dist/workflow/dsl.d.ts +54 -0
- package/dist/workflow/dsl.js +15 -0
- package/dist/workflow/engine.d.ts +30 -0
- package/dist/workflow/engine.js +94 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.js +2 -0
- package/package.json +29 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* PersonalityState = 可进化人格 (v1 src/gep/personality.js 的 v2 端口).
|
|
4
|
+
*
|
|
5
|
+
* 五维行为向量, 各 0..1, 决定进化"风格"而非"内容":
|
|
6
|
+
* - rigor 严谨度: 越高越保守/协议优先, 是高危变异的准入前提
|
|
7
|
+
* - creativity 创造性: 越高越倾向 innovate/explore, 跳出局部最优
|
|
8
|
+
* - verbosity 啰嗦度: 影响产物叙述密度 (纯 prompt 提示, 不改逻辑)
|
|
9
|
+
* - risk_tolerance 风险容忍: 越高越敢冒险, 但会被风险闸压制
|
|
10
|
+
* - obedience 服从度: 越高越贴合协议/用户指令
|
|
11
|
+
*
|
|
12
|
+
* 三条用途 (v2 必须保留语义, 见 riskGate.ts / prompt.ts / (PR-2) selection):
|
|
13
|
+
* 1. 注入每轮 GEP prompt, 决定进化风格 (prompt.ts)
|
|
14
|
+
* 2. 变异风险闸: high-risk/innovate 变异只在 rigor≥0.6 且 risk_tolerance≤0.5 放行 (riskGate.ts)
|
|
15
|
+
* 3. 自然选择 + 小步变异自调参, 成功强化/失败淘汰, 全程进事件流可审计 (PR-2)
|
|
16
|
+
*/
|
|
17
|
+
/** 五维行为轴 (顺序固定 — personalityKey / 遍历依赖它). */
|
|
18
|
+
export declare const PERSONALITY_AXES: readonly ["rigor", "creativity", "verbosity", "risk_tolerance", "obedience"];
|
|
19
|
+
export type PersonalityAxis = (typeof PERSONALITY_AXES)[number];
|
|
20
|
+
/** 保守默认: 协议优先、安全、低风险 (v1 defaultPersonalityState 原值). */
|
|
21
|
+
export declare const DEFAULT_PERSONALITY: Readonly<{
|
|
22
|
+
rigor: 0.7;
|
|
23
|
+
creativity: 0.35;
|
|
24
|
+
verbosity: 0.25;
|
|
25
|
+
risk_tolerance: 0.4;
|
|
26
|
+
obedience: 0.85;
|
|
27
|
+
}>;
|
|
28
|
+
/** 五维人格状态. type 判别标签保留 (v1/事件流互认). */
|
|
29
|
+
export declare const personalityState: z.ZodObject<{
|
|
30
|
+
type: z.ZodDefault<z.ZodLiteral<"PersonalityState">>;
|
|
31
|
+
rigor: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
creativity: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
verbosity: z.ZodDefault<z.ZodNumber>;
|
|
34
|
+
risk_tolerance: z.ZodDefault<z.ZodNumber>;
|
|
35
|
+
obedience: z.ZodDefault<z.ZodNumber>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
type: "PersonalityState";
|
|
38
|
+
rigor: number;
|
|
39
|
+
creativity: number;
|
|
40
|
+
verbosity: number;
|
|
41
|
+
risk_tolerance: number;
|
|
42
|
+
obedience: number;
|
|
43
|
+
}, {
|
|
44
|
+
type?: "PersonalityState" | undefined;
|
|
45
|
+
rigor?: number | undefined;
|
|
46
|
+
creativity?: number | undefined;
|
|
47
|
+
verbosity?: number | undefined;
|
|
48
|
+
risk_tolerance?: number | undefined;
|
|
49
|
+
obedience?: number | undefined;
|
|
50
|
+
}>;
|
|
51
|
+
export type PersonalityState = z.infer<typeof personalityState>;
|
|
52
|
+
/**
|
|
53
|
+
* 宽松输入形状: 允许省略 type、缺轴、越界值 —— 凡是会经 normalizePersonalityState 的公共入口都收这个,
|
|
54
|
+
* 由 normalize 夹成合法 PersonalityState. 这样调用方可以直接传 DEFAULT_PERSONALITY 或部分覆盖对象.
|
|
55
|
+
*/
|
|
56
|
+
export type PersonalityStateInput = Partial<Record<PersonalityAxis, number>> & {
|
|
57
|
+
type?: string;
|
|
58
|
+
};
|
|
59
|
+
/** 一个人格键的运行统计 (自然选择的适应度原料; PR-2 回写). */
|
|
60
|
+
export declare const personalityStats: z.ZodObject<{
|
|
61
|
+
success: z.ZodDefault<z.ZodNumber>;
|
|
62
|
+
fail: z.ZodDefault<z.ZodNumber>;
|
|
63
|
+
/** 增量均值; n 为纳入均值的样本数. */
|
|
64
|
+
avgScore: z.ZodDefault<z.ZodNumber>;
|
|
65
|
+
n: z.ZodDefault<z.ZodNumber>;
|
|
66
|
+
updatedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
success: number;
|
|
69
|
+
n: number;
|
|
70
|
+
updatedAt: string | null;
|
|
71
|
+
avgScore: number;
|
|
72
|
+
fail: number;
|
|
73
|
+
}, {
|
|
74
|
+
success?: number | undefined;
|
|
75
|
+
n?: number | undefined;
|
|
76
|
+
updatedAt?: string | null | undefined;
|
|
77
|
+
avgScore?: number | undefined;
|
|
78
|
+
fail?: number | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
export type PersonalityStats = z.infer<typeof personalityStats>;
|
|
81
|
+
/** 单条人格变更历史 (可审计; 也镜像进事件流). */
|
|
82
|
+
export declare const personalityHistoryEntry: z.ZodObject<{
|
|
83
|
+
at: z.ZodString;
|
|
84
|
+
key: z.ZodString;
|
|
85
|
+
outcome: z.ZodString;
|
|
86
|
+
score: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
|
|
87
|
+
notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
88
|
+
}, "strip", z.ZodTypeAny, {
|
|
89
|
+
at: string;
|
|
90
|
+
score: number | null;
|
|
91
|
+
outcome: string;
|
|
92
|
+
key: string;
|
|
93
|
+
notes: string | null;
|
|
94
|
+
}, {
|
|
95
|
+
at: string;
|
|
96
|
+
outcome: string;
|
|
97
|
+
key: string;
|
|
98
|
+
score?: number | null | undefined;
|
|
99
|
+
notes?: string | null | undefined;
|
|
100
|
+
}>;
|
|
101
|
+
export type PersonalityHistoryEntry = z.infer<typeof personalityHistoryEntry>;
|
|
102
|
+
/** 持久化模型: 当前人格 + 各键统计 + 变更历史 (v1 loadPersonalityModel 的 v2 形状). */
|
|
103
|
+
export declare const personalityModel: z.ZodObject<{
|
|
104
|
+
version: z.ZodDefault<z.ZodLiteral<1>>;
|
|
105
|
+
current: z.ZodDefault<z.ZodObject<{
|
|
106
|
+
type: z.ZodDefault<z.ZodLiteral<"PersonalityState">>;
|
|
107
|
+
rigor: z.ZodDefault<z.ZodNumber>;
|
|
108
|
+
creativity: z.ZodDefault<z.ZodNumber>;
|
|
109
|
+
verbosity: z.ZodDefault<z.ZodNumber>;
|
|
110
|
+
risk_tolerance: z.ZodDefault<z.ZodNumber>;
|
|
111
|
+
obedience: z.ZodDefault<z.ZodNumber>;
|
|
112
|
+
}, "strip", z.ZodTypeAny, {
|
|
113
|
+
type: "PersonalityState";
|
|
114
|
+
rigor: number;
|
|
115
|
+
creativity: number;
|
|
116
|
+
verbosity: number;
|
|
117
|
+
risk_tolerance: number;
|
|
118
|
+
obedience: number;
|
|
119
|
+
}, {
|
|
120
|
+
type?: "PersonalityState" | undefined;
|
|
121
|
+
rigor?: number | undefined;
|
|
122
|
+
creativity?: number | undefined;
|
|
123
|
+
verbosity?: number | undefined;
|
|
124
|
+
risk_tolerance?: number | undefined;
|
|
125
|
+
obedience?: number | undefined;
|
|
126
|
+
}>>;
|
|
127
|
+
stats: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
128
|
+
success: z.ZodDefault<z.ZodNumber>;
|
|
129
|
+
fail: z.ZodDefault<z.ZodNumber>;
|
|
130
|
+
/** 增量均值; n 为纳入均值的样本数. */
|
|
131
|
+
avgScore: z.ZodDefault<z.ZodNumber>;
|
|
132
|
+
n: z.ZodDefault<z.ZodNumber>;
|
|
133
|
+
updatedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
134
|
+
}, "strip", z.ZodTypeAny, {
|
|
135
|
+
success: number;
|
|
136
|
+
n: number;
|
|
137
|
+
updatedAt: string | null;
|
|
138
|
+
avgScore: number;
|
|
139
|
+
fail: number;
|
|
140
|
+
}, {
|
|
141
|
+
success?: number | undefined;
|
|
142
|
+
n?: number | undefined;
|
|
143
|
+
updatedAt?: string | null | undefined;
|
|
144
|
+
avgScore?: number | undefined;
|
|
145
|
+
fail?: number | undefined;
|
|
146
|
+
}>>>;
|
|
147
|
+
history: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
148
|
+
at: z.ZodString;
|
|
149
|
+
key: z.ZodString;
|
|
150
|
+
outcome: z.ZodString;
|
|
151
|
+
score: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
|
|
152
|
+
notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
153
|
+
}, "strip", z.ZodTypeAny, {
|
|
154
|
+
at: string;
|
|
155
|
+
score: number | null;
|
|
156
|
+
outcome: string;
|
|
157
|
+
key: string;
|
|
158
|
+
notes: string | null;
|
|
159
|
+
}, {
|
|
160
|
+
at: string;
|
|
161
|
+
outcome: string;
|
|
162
|
+
key: string;
|
|
163
|
+
score?: number | null | undefined;
|
|
164
|
+
notes?: string | null | undefined;
|
|
165
|
+
}>, "many">>;
|
|
166
|
+
updatedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
167
|
+
extensions: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
168
|
+
}, "strip", z.ZodTypeAny, {
|
|
169
|
+
extensions: Record<string, unknown>;
|
|
170
|
+
updatedAt: string | null;
|
|
171
|
+
version: 1;
|
|
172
|
+
current: {
|
|
173
|
+
type: "PersonalityState";
|
|
174
|
+
rigor: number;
|
|
175
|
+
creativity: number;
|
|
176
|
+
verbosity: number;
|
|
177
|
+
risk_tolerance: number;
|
|
178
|
+
obedience: number;
|
|
179
|
+
};
|
|
180
|
+
stats: Record<string, {
|
|
181
|
+
success: number;
|
|
182
|
+
n: number;
|
|
183
|
+
updatedAt: string | null;
|
|
184
|
+
avgScore: number;
|
|
185
|
+
fail: number;
|
|
186
|
+
}>;
|
|
187
|
+
history: {
|
|
188
|
+
at: string;
|
|
189
|
+
score: number | null;
|
|
190
|
+
outcome: string;
|
|
191
|
+
key: string;
|
|
192
|
+
notes: string | null;
|
|
193
|
+
}[];
|
|
194
|
+
}, {
|
|
195
|
+
extensions?: Record<string, unknown> | undefined;
|
|
196
|
+
updatedAt?: string | null | undefined;
|
|
197
|
+
version?: 1 | undefined;
|
|
198
|
+
current?: {
|
|
199
|
+
type?: "PersonalityState" | undefined;
|
|
200
|
+
rigor?: number | undefined;
|
|
201
|
+
creativity?: number | undefined;
|
|
202
|
+
verbosity?: number | undefined;
|
|
203
|
+
risk_tolerance?: number | undefined;
|
|
204
|
+
obedience?: number | undefined;
|
|
205
|
+
} | undefined;
|
|
206
|
+
stats?: Record<string, {
|
|
207
|
+
success?: number | undefined;
|
|
208
|
+
n?: number | undefined;
|
|
209
|
+
updatedAt?: string | null | undefined;
|
|
210
|
+
avgScore?: number | undefined;
|
|
211
|
+
fail?: number | undefined;
|
|
212
|
+
}> | undefined;
|
|
213
|
+
history?: {
|
|
214
|
+
at: string;
|
|
215
|
+
outcome: string;
|
|
216
|
+
key: string;
|
|
217
|
+
score?: number | null | undefined;
|
|
218
|
+
notes?: string | null | undefined;
|
|
219
|
+
}[] | undefined;
|
|
220
|
+
}>;
|
|
221
|
+
export type PersonalityModel = z.infer<typeof personalityModel>;
|
|
222
|
+
/** 单个变异提案 (作用于一个轴, delta 会被 applyMutations 夹取). */
|
|
223
|
+
export declare const personalityMutation: z.ZodObject<{
|
|
224
|
+
type: z.ZodDefault<z.ZodLiteral<"PersonalityMutation">>;
|
|
225
|
+
param: z.ZodEnum<["rigor", "creativity", "verbosity", "risk_tolerance", "obedience"]>;
|
|
226
|
+
delta: z.ZodNumber;
|
|
227
|
+
reason: z.ZodDefault<z.ZodString>;
|
|
228
|
+
}, "strip", z.ZodTypeAny, {
|
|
229
|
+
type: "PersonalityMutation";
|
|
230
|
+
reason: string;
|
|
231
|
+
param: "rigor" | "creativity" | "verbosity" | "risk_tolerance" | "obedience";
|
|
232
|
+
delta: number;
|
|
233
|
+
}, {
|
|
234
|
+
param: "rigor" | "creativity" | "verbosity" | "risk_tolerance" | "obedience";
|
|
235
|
+
delta: number;
|
|
236
|
+
type?: "PersonalityMutation" | undefined;
|
|
237
|
+
reason?: string | undefined;
|
|
238
|
+
}>;
|
|
239
|
+
export type PersonalityMutation = z.infer<typeof personalityMutation>;
|
|
240
|
+
declare const clamp01: (x: unknown) => number;
|
|
241
|
+
/**
|
|
242
|
+
* 把任意输入夹成合法 PersonalityState (缺失/越界/非数 → 夹到 [0,1]).
|
|
243
|
+
* 注意: 与 v1 一致, 非有限值夹为 0 而非默认值 — 显式坏输入不静默"复活"成保守默认.
|
|
244
|
+
*/
|
|
245
|
+
export declare function normalizePersonalityState(state: unknown): PersonalityState;
|
|
246
|
+
/** 严格校验: type 标签对且五轴都是 [0,1] 有限数 (不做夹取, 用于信任边界). */
|
|
247
|
+
export declare function isValidPersonalityState(obj: unknown): obj is PersonalityState;
|
|
248
|
+
/**
|
|
249
|
+
* 稳定桶键: 五轴各按 0.1 步长量化后拼串. 相近人格落同一桶, 统计才能积累 (v1 personalityKey).
|
|
250
|
+
* 例: "rigor=0.7|creativity=0.4|verbosity=0.2|risk_tolerance=0.4|obedience=0.9"
|
|
251
|
+
*/
|
|
252
|
+
export declare function personalityKey(state: unknown): string;
|
|
253
|
+
/** 由 personalityKey 反解回 PersonalityState (未识别轴回落默认; 自然选择需要). */
|
|
254
|
+
export declare function parseKeyToState(key: string): PersonalityState;
|
|
255
|
+
export { clamp01 };
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { extensions } from '../schema/common.js';
|
|
3
|
+
/**
|
|
4
|
+
* PersonalityState = 可进化人格 (v1 src/gep/personality.js 的 v2 端口).
|
|
5
|
+
*
|
|
6
|
+
* 五维行为向量, 各 0..1, 决定进化"风格"而非"内容":
|
|
7
|
+
* - rigor 严谨度: 越高越保守/协议优先, 是高危变异的准入前提
|
|
8
|
+
* - creativity 创造性: 越高越倾向 innovate/explore, 跳出局部最优
|
|
9
|
+
* - verbosity 啰嗦度: 影响产物叙述密度 (纯 prompt 提示, 不改逻辑)
|
|
10
|
+
* - risk_tolerance 风险容忍: 越高越敢冒险, 但会被风险闸压制
|
|
11
|
+
* - obedience 服从度: 越高越贴合协议/用户指令
|
|
12
|
+
*
|
|
13
|
+
* 三条用途 (v2 必须保留语义, 见 riskGate.ts / prompt.ts / (PR-2) selection):
|
|
14
|
+
* 1. 注入每轮 GEP prompt, 决定进化风格 (prompt.ts)
|
|
15
|
+
* 2. 变异风险闸: high-risk/innovate 变异只在 rigor≥0.6 且 risk_tolerance≤0.5 放行 (riskGate.ts)
|
|
16
|
+
* 3. 自然选择 + 小步变异自调参, 成功强化/失败淘汰, 全程进事件流可审计 (PR-2)
|
|
17
|
+
*/
|
|
18
|
+
/** 五维行为轴 (顺序固定 — personalityKey / 遍历依赖它). */
|
|
19
|
+
export const PERSONALITY_AXES = ['rigor', 'creativity', 'verbosity', 'risk_tolerance', 'obedience'];
|
|
20
|
+
/** 保守默认: 协议优先、安全、低风险 (v1 defaultPersonalityState 原值). */
|
|
21
|
+
export const DEFAULT_PERSONALITY = Object.freeze({
|
|
22
|
+
rigor: 0.7,
|
|
23
|
+
creativity: 0.35,
|
|
24
|
+
verbosity: 0.25,
|
|
25
|
+
risk_tolerance: 0.4,
|
|
26
|
+
obedience: 0.85,
|
|
27
|
+
});
|
|
28
|
+
const axis01 = z.number().min(0).max(1);
|
|
29
|
+
/** 五维人格状态. type 判别标签保留 (v1/事件流互认). */
|
|
30
|
+
export const personalityState = z.object({
|
|
31
|
+
type: z.literal('PersonalityState').default('PersonalityState'),
|
|
32
|
+
rigor: axis01.default(DEFAULT_PERSONALITY.rigor),
|
|
33
|
+
creativity: axis01.default(DEFAULT_PERSONALITY.creativity),
|
|
34
|
+
verbosity: axis01.default(DEFAULT_PERSONALITY.verbosity),
|
|
35
|
+
risk_tolerance: axis01.default(DEFAULT_PERSONALITY.risk_tolerance),
|
|
36
|
+
obedience: axis01.default(DEFAULT_PERSONALITY.obedience),
|
|
37
|
+
});
|
|
38
|
+
/** 一个人格键的运行统计 (自然选择的适应度原料; PR-2 回写). */
|
|
39
|
+
export const personalityStats = z.object({
|
|
40
|
+
success: z.number().int().nonnegative().default(0),
|
|
41
|
+
fail: z.number().int().nonnegative().default(0),
|
|
42
|
+
/** 增量均值; n 为纳入均值的样本数. */
|
|
43
|
+
avgScore: z.number().min(0).max(1).default(0.5),
|
|
44
|
+
n: z.number().int().nonnegative().default(0),
|
|
45
|
+
updatedAt: z.string().datetime().nullable().default(null),
|
|
46
|
+
});
|
|
47
|
+
/** 单条人格变更历史 (可审计; 也镜像进事件流). */
|
|
48
|
+
export const personalityHistoryEntry = z.object({
|
|
49
|
+
at: z.string().datetime(),
|
|
50
|
+
key: z.string(),
|
|
51
|
+
outcome: z.string(),
|
|
52
|
+
score: z.number().min(0).max(1).nullable().default(null),
|
|
53
|
+
notes: z.string().nullable().default(null),
|
|
54
|
+
});
|
|
55
|
+
/** 持久化模型: 当前人格 + 各键统计 + 变更历史 (v1 loadPersonalityModel 的 v2 形状). */
|
|
56
|
+
export const personalityModel = z.object({
|
|
57
|
+
version: z.literal(1).default(1),
|
|
58
|
+
current: personalityState.default(() => personalityState.parse({})),
|
|
59
|
+
stats: z.record(z.string(), personalityStats).default({}),
|
|
60
|
+
history: z.array(personalityHistoryEntry).default([]),
|
|
61
|
+
updatedAt: z.string().datetime().nullable().default(null),
|
|
62
|
+
extensions,
|
|
63
|
+
});
|
|
64
|
+
/** 单个变异提案 (作用于一个轴, delta 会被 applyMutations 夹取). */
|
|
65
|
+
export const personalityMutation = z.object({
|
|
66
|
+
type: z.literal('PersonalityMutation').default('PersonalityMutation'),
|
|
67
|
+
param: z.enum(PERSONALITY_AXES),
|
|
68
|
+
delta: z.number(),
|
|
69
|
+
reason: z.string().default(''),
|
|
70
|
+
});
|
|
71
|
+
const clamp01 = (x) => {
|
|
72
|
+
const n = Number(x);
|
|
73
|
+
if (!Number.isFinite(n))
|
|
74
|
+
return 0;
|
|
75
|
+
return Math.max(0, Math.min(1, n));
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* 把任意输入夹成合法 PersonalityState (缺失/越界/非数 → 夹到 [0,1]).
|
|
79
|
+
* 注意: 与 v1 一致, 非有限值夹为 0 而非默认值 — 显式坏输入不静默"复活"成保守默认.
|
|
80
|
+
*/
|
|
81
|
+
export function normalizePersonalityState(state) {
|
|
82
|
+
const s = (state && typeof state === 'object' ? state : {});
|
|
83
|
+
return {
|
|
84
|
+
type: 'PersonalityState',
|
|
85
|
+
rigor: clamp01(s['rigor']),
|
|
86
|
+
creativity: clamp01(s['creativity']),
|
|
87
|
+
verbosity: clamp01(s['verbosity']),
|
|
88
|
+
risk_tolerance: clamp01(s['risk_tolerance']),
|
|
89
|
+
obedience: clamp01(s['obedience']),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** 严格校验: type 标签对且五轴都是 [0,1] 有限数 (不做夹取, 用于信任边界). */
|
|
93
|
+
export function isValidPersonalityState(obj) {
|
|
94
|
+
return personalityState.safeParse(obj).success && obj.type === 'PersonalityState';
|
|
95
|
+
}
|
|
96
|
+
function roundToStep(x, step) {
|
|
97
|
+
if (!Number.isFinite(step) || step <= 0)
|
|
98
|
+
return x;
|
|
99
|
+
return Math.round(x / step) * step;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 稳定桶键: 五轴各按 0.1 步长量化后拼串. 相近人格落同一桶, 统计才能积累 (v1 personalityKey).
|
|
103
|
+
* 例: "rigor=0.7|creativity=0.4|verbosity=0.2|risk_tolerance=0.4|obedience=0.9"
|
|
104
|
+
*/
|
|
105
|
+
export function personalityKey(state) {
|
|
106
|
+
const s = normalizePersonalityState(state);
|
|
107
|
+
return PERSONALITY_AXES.map((k) => `${k}=${roundToStep(s[k], 0.1).toFixed(1)}`).join('|');
|
|
108
|
+
}
|
|
109
|
+
/** 由 personalityKey 反解回 PersonalityState (未识别轴回落默认; 自然选择需要). */
|
|
110
|
+
export function parseKeyToState(key) {
|
|
111
|
+
const out = { ...DEFAULT_PERSONALITY };
|
|
112
|
+
for (const part of String(key ?? '').split('|')) {
|
|
113
|
+
const [k, v] = part.split('=').map((x) => x.trim());
|
|
114
|
+
if (k && PERSONALITY_AXES.includes(k))
|
|
115
|
+
out[k] = clamp01(v);
|
|
116
|
+
}
|
|
117
|
+
return normalizePersonalityState(out);
|
|
118
|
+
}
|
|
119
|
+
export { clamp01 };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type AppliedMutation } from './mutate.js';
|
|
2
|
+
import { type TriggerCycleEvent } from './drift.js';
|
|
3
|
+
import { type PersonalityAxis, type PersonalityModel, type PersonalityState } from './schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* 每轮人格选择 (v1 selectPersonalityForRun 端口): 自然选择微调 + 规则触发变异, 全在人格向量上小步演化.
|
|
6
|
+
* 说明: v1 还消费 reflection.suggested_mutations, 那是独立子系统, 不在 evolver-core personality 范围内 —— 本端口不含.
|
|
7
|
+
*/
|
|
8
|
+
/** 单周期最多落地几条变异 (v1: 防漂移, 总量封顶 4). */
|
|
9
|
+
export declare const MAX_MUTATIONS_PER_CYCLE = 4;
|
|
10
|
+
/** 自然选择只对差异 ≥ 此阈值的轴动手 (v1). */
|
|
11
|
+
export declare const NATURAL_SELECTION_MIN_DIFF = 0.05;
|
|
12
|
+
/** 自然选择每条 nudge 的夹取幅度 (v1: ±0.1). */
|
|
13
|
+
export declare const NATURAL_SELECTION_CLIP = 0.1;
|
|
14
|
+
export interface ParamDelta {
|
|
15
|
+
param: PersonalityAxis;
|
|
16
|
+
delta: number;
|
|
17
|
+
}
|
|
18
|
+
/** 两状态间各轴差 (b-a), 按 |delta| 降序 (v1 getParamDeltas). */
|
|
19
|
+
export declare function getParamDeltas(from: PersonalityState, to: PersonalityState): ParamDelta[];
|
|
20
|
+
export interface SelectInput {
|
|
21
|
+
driftEnabled?: boolean;
|
|
22
|
+
signals?: readonly string[];
|
|
23
|
+
recentEvents?: readonly TriggerCycleEvent[];
|
|
24
|
+
}
|
|
25
|
+
export interface SelectResult {
|
|
26
|
+
model: PersonalityModel;
|
|
27
|
+
state: PersonalityState;
|
|
28
|
+
key: string;
|
|
29
|
+
known: boolean;
|
|
30
|
+
mutations: AppliedMutation[];
|
|
31
|
+
meta: {
|
|
32
|
+
bestKnownKey: string | null;
|
|
33
|
+
bestKnownScore: number | null;
|
|
34
|
+
triggered: {
|
|
35
|
+
reason: string;
|
|
36
|
+
} | null;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 纯函数: 给定 model + 上下文, 算出本轮人格 (含微调), 返回新 model + 选择结果.
|
|
41
|
+
* 不落盘 —— store-backed 包装在 applySelectForRun (见 evolveOps.ts) 里持久化.
|
|
42
|
+
* 顺序 (与 v1 一致):
|
|
43
|
+
* 1. 自然选择: 朝 best-known 桶靠拢 (最多 2 轴, 差≥0.05, 每条夹 ±0.1)
|
|
44
|
+
* 2. 触发式变异: shouldTrigger → proposeMutations → apply (总量与①合并封顶 4)
|
|
45
|
+
*/
|
|
46
|
+
export declare function selectPersonalityForRun(model: PersonalityModel, input?: SelectInput): SelectResult;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { applyPersonalityMutations } from './mutate.js';
|
|
2
|
+
import { chooseBestKnownPersonality } from './stats.js';
|
|
3
|
+
import { proposeMutations, shouldTriggerPersonalityMutation } from './drift.js';
|
|
4
|
+
import { normalizePersonalityState, parseKeyToState, personalityKey, PERSONALITY_AXES, } from './schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* 每轮人格选择 (v1 selectPersonalityForRun 端口): 自然选择微调 + 规则触发变异, 全在人格向量上小步演化.
|
|
7
|
+
* 说明: v1 还消费 reflection.suggested_mutations, 那是独立子系统, 不在 evolver-core personality 范围内 —— 本端口不含.
|
|
8
|
+
*/
|
|
9
|
+
/** 单周期最多落地几条变异 (v1: 防漂移, 总量封顶 4). */
|
|
10
|
+
export const MAX_MUTATIONS_PER_CYCLE = 4;
|
|
11
|
+
/** 自然选择只对差异 ≥ 此阈值的轴动手 (v1). */
|
|
12
|
+
export const NATURAL_SELECTION_MIN_DIFF = 0.05;
|
|
13
|
+
/** 自然选择每条 nudge 的夹取幅度 (v1: ±0.1). */
|
|
14
|
+
export const NATURAL_SELECTION_CLIP = 0.1;
|
|
15
|
+
/** 两状态间各轴差 (b-a), 按 |delta| 降序 (v1 getParamDeltas). */
|
|
16
|
+
export function getParamDeltas(from, to) {
|
|
17
|
+
const a = normalizePersonalityState(from);
|
|
18
|
+
const b = normalizePersonalityState(to);
|
|
19
|
+
return PERSONALITY_AXES
|
|
20
|
+
.map((param) => ({ param, delta: b[param] - a[param] }))
|
|
21
|
+
.sort((x, y) => Math.abs(y.delta) - Math.abs(x.delta));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 纯函数: 给定 model + 上下文, 算出本轮人格 (含微调), 返回新 model + 选择结果.
|
|
25
|
+
* 不落盘 —— store-backed 包装在 applySelectForRun (见 evolveOps.ts) 里持久化.
|
|
26
|
+
* 顺序 (与 v1 一致):
|
|
27
|
+
* 1. 自然选择: 朝 best-known 桶靠拢 (最多 2 轴, 差≥0.05, 每条夹 ±0.1)
|
|
28
|
+
* 2. 触发式变异: shouldTrigger → proposeMutations → apply (总量与①合并封顶 4)
|
|
29
|
+
*/
|
|
30
|
+
export function selectPersonalityForRun(model, input = {}) {
|
|
31
|
+
let current = normalizePersonalityState(model.current);
|
|
32
|
+
const applied = [];
|
|
33
|
+
// ① 自然选择
|
|
34
|
+
const best = chooseBestKnownPersonality(model.stats);
|
|
35
|
+
if (best) {
|
|
36
|
+
const bestState = parseKeyToState(best.key);
|
|
37
|
+
const diffs = getParamDeltas(current, bestState).filter((d) => Math.abs(d.delta) >= NATURAL_SELECTION_MIN_DIFF);
|
|
38
|
+
const muts = diffs.slice(0, 2).map((d) => ({
|
|
39
|
+
type: 'PersonalityMutation',
|
|
40
|
+
param: d.param,
|
|
41
|
+
delta: Math.max(-NATURAL_SELECTION_CLIP, Math.min(NATURAL_SELECTION_CLIP, d.delta)),
|
|
42
|
+
reason: 'natural_selection',
|
|
43
|
+
}));
|
|
44
|
+
const res = applyPersonalityMutations(current, muts);
|
|
45
|
+
current = res.state;
|
|
46
|
+
applied.push(...res.applied);
|
|
47
|
+
}
|
|
48
|
+
// ② 触发式变异 (受剩余额度约束)
|
|
49
|
+
const trig = shouldTriggerPersonalityMutation({ driftEnabled: !!input.driftEnabled, recentEvents: input.recentEvents });
|
|
50
|
+
if (trig.ok && applied.length < MAX_MUTATIONS_PER_CYCLE) {
|
|
51
|
+
const proposals = proposeMutations({ baseState: current, reason: trig.reason, driftEnabled: !!input.driftEnabled, signals: input.signals });
|
|
52
|
+
const res = applyPersonalityMutations(current, proposals);
|
|
53
|
+
current = res.state;
|
|
54
|
+
applied.push(...res.applied);
|
|
55
|
+
}
|
|
56
|
+
const key = personalityKey(current);
|
|
57
|
+
const known = Boolean(model.stats[key]);
|
|
58
|
+
const nextModel = { ...model, current };
|
|
59
|
+
return {
|
|
60
|
+
model: nextModel,
|
|
61
|
+
state: current,
|
|
62
|
+
key,
|
|
63
|
+
known,
|
|
64
|
+
mutations: applied,
|
|
65
|
+
meta: {
|
|
66
|
+
bestKnownKey: best?.key ?? null,
|
|
67
|
+
bestKnownScore: best ? best.score : null,
|
|
68
|
+
triggered: trig.ok ? { reason: trig.reason } : null,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type PersonalityModel, type PersonalityStateInput, type PersonalityStats } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 人格适应度 + 统计回写 (v1 personalityScore / chooseBestKnownPersonality / updatePersonalityStats 端口).
|
|
4
|
+
* 自然选择的"适者"由这里的分数决定; 每轮结果回写到对应人格桶, 供下一轮选择.
|
|
5
|
+
*/
|
|
6
|
+
/** 一个桶要参与"最佳已知"竞争的最小样本数 (v1: total<3 不计). */
|
|
7
|
+
export declare const MIN_SAMPLES_FOR_BEST = 3;
|
|
8
|
+
/** 样本权重饱和点 (v1: min(1, total/8)). */
|
|
9
|
+
export declare const SAMPLE_WEIGHT_FULL_AT = 8;
|
|
10
|
+
/**
|
|
11
|
+
* 桶适应度分数 (v1 personalityScore):
|
|
12
|
+
* - Laplace 平滑成功率 p = (succ+1)/(total+2) → 主导 (权重 0.75)
|
|
13
|
+
* - 质量代理 q = avgScore, 但乘 sampleWeight 惩罚小样本过度自信 (权重 0.25)
|
|
14
|
+
*/
|
|
15
|
+
export declare function personalityScore(entry: Partial<PersonalityStats> | undefined): number;
|
|
16
|
+
export interface BestKnown {
|
|
17
|
+
key: string;
|
|
18
|
+
score: number;
|
|
19
|
+
entry: PersonalityStats;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 选出"最佳已知"人格桶 (v1 chooseBestKnownPersonality): 只在样本≥MIN_SAMPLES_FOR_BEST 的桶里比 personalityScore.
|
|
23
|
+
* 没有够样本的桶 ⇒ null (选择阶段就不做自然选择微调).
|
|
24
|
+
*/
|
|
25
|
+
export declare function chooseBestKnownPersonality(stats: Record<string, PersonalityStats> | undefined): BestKnown | null;
|
|
26
|
+
export interface UpdateStatsInput {
|
|
27
|
+
/** 本轮所用人格 (缺省用 model.current). */
|
|
28
|
+
personality?: PersonalityStateInput;
|
|
29
|
+
outcome: 'success' | 'failed' | string;
|
|
30
|
+
/** 0..1 质量分 (可选). */
|
|
31
|
+
score?: number | null;
|
|
32
|
+
notes?: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface UpdateStatsResult {
|
|
35
|
+
model: PersonalityModel;
|
|
36
|
+
key: string;
|
|
37
|
+
entry: PersonalityStats;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 把一轮结果回写到对应人格桶 (v1 updatePersonalityStats 的纯函数版):
|
|
41
|
+
* - success/fail 计数 +1
|
|
42
|
+
* - avgScore 增量更新 (仅当给了 score): avg += (s-avg)/n
|
|
43
|
+
* - history 追加一条 (含 outcome/score/notes)
|
|
44
|
+
* 返回新 model (不落盘 —— 调用方用 store.save 持久化, 或 applyStatsUpdate 一步到位).
|
|
45
|
+
*/
|
|
46
|
+
export declare function updatePersonalityStats(model: PersonalityModel, input: UpdateStatsInput, at: string): UpdateStatsResult;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { clamp01, normalizePersonalityState, personalityKey, } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 人格适应度 + 统计回写 (v1 personalityScore / chooseBestKnownPersonality / updatePersonalityStats 端口).
|
|
4
|
+
* 自然选择的"适者"由这里的分数决定; 每轮结果回写到对应人格桶, 供下一轮选择.
|
|
5
|
+
*/
|
|
6
|
+
/** 一个桶要参与"最佳已知"竞争的最小样本数 (v1: total<3 不计). */
|
|
7
|
+
export const MIN_SAMPLES_FOR_BEST = 3;
|
|
8
|
+
/** 样本权重饱和点 (v1: min(1, total/8)). */
|
|
9
|
+
export const SAMPLE_WEIGHT_FULL_AT = 8;
|
|
10
|
+
/**
|
|
11
|
+
* 桶适应度分数 (v1 personalityScore):
|
|
12
|
+
* - Laplace 平滑成功率 p = (succ+1)/(total+2) → 主导 (权重 0.75)
|
|
13
|
+
* - 质量代理 q = avgScore, 但乘 sampleWeight 惩罚小样本过度自信 (权重 0.25)
|
|
14
|
+
*/
|
|
15
|
+
export function personalityScore(entry) {
|
|
16
|
+
const succ = Number(entry?.success) || 0;
|
|
17
|
+
const fail = Number(entry?.fail) || 0;
|
|
18
|
+
const total = succ + fail;
|
|
19
|
+
const p = (succ + 1) / (total + 2);
|
|
20
|
+
const sampleWeight = Math.min(1, total / SAMPLE_WEIGHT_FULL_AT);
|
|
21
|
+
const avg = entry?.avgScore;
|
|
22
|
+
const q = Number.isFinite(Number(avg)) ? clamp01(Number(avg)) : 0.5;
|
|
23
|
+
return p * 0.75 + q * 0.25 * sampleWeight;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 选出"最佳已知"人格桶 (v1 chooseBestKnownPersonality): 只在样本≥MIN_SAMPLES_FOR_BEST 的桶里比 personalityScore.
|
|
27
|
+
* 没有够样本的桶 ⇒ null (选择阶段就不做自然选择微调).
|
|
28
|
+
*/
|
|
29
|
+
export function chooseBestKnownPersonality(stats) {
|
|
30
|
+
let best = null;
|
|
31
|
+
for (const [key, entry] of Object.entries(stats ?? {})) {
|
|
32
|
+
const total = (Number(entry?.success) || 0) + (Number(entry?.fail) || 0);
|
|
33
|
+
if (total < MIN_SAMPLES_FOR_BEST)
|
|
34
|
+
continue;
|
|
35
|
+
const score = personalityScore(entry);
|
|
36
|
+
if (!best || score > best.score)
|
|
37
|
+
best = { key, score, entry };
|
|
38
|
+
}
|
|
39
|
+
return best;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 把一轮结果回写到对应人格桶 (v1 updatePersonalityStats 的纯函数版):
|
|
43
|
+
* - success/fail 计数 +1
|
|
44
|
+
* - avgScore 增量更新 (仅当给了 score): avg += (s-avg)/n
|
|
45
|
+
* - history 追加一条 (含 outcome/score/notes)
|
|
46
|
+
* 返回新 model (不落盘 —— 调用方用 store.save 持久化, 或 applyStatsUpdate 一步到位).
|
|
47
|
+
*/
|
|
48
|
+
export function updatePersonalityStats(model, input, at) {
|
|
49
|
+
const st = normalizePersonalityState(input.personality ?? model.current);
|
|
50
|
+
const key = personalityKey(st);
|
|
51
|
+
const prev = model.stats[key];
|
|
52
|
+
const entry = prev
|
|
53
|
+
? { ...prev }
|
|
54
|
+
: { success: 0, fail: 0, avgScore: 0.5, n: 0, updatedAt: null };
|
|
55
|
+
const outcome = String(input.outcome ?? '').toLowerCase();
|
|
56
|
+
if (outcome === 'success')
|
|
57
|
+
entry.success += 1;
|
|
58
|
+
else if (outcome === 'failed')
|
|
59
|
+
entry.fail += 1;
|
|
60
|
+
const sc = input.score == null ? null : (Number.isFinite(Number(input.score)) ? clamp01(Number(input.score)) : null);
|
|
61
|
+
if (sc != null) {
|
|
62
|
+
const n = entry.n + 1;
|
|
63
|
+
entry.avgScore = entry.avgScore + (sc - entry.avgScore) / n;
|
|
64
|
+
entry.n = n;
|
|
65
|
+
}
|
|
66
|
+
entry.updatedAt = at;
|
|
67
|
+
const nextStats = { ...model.stats, [key]: entry };
|
|
68
|
+
const historyEntry = {
|
|
69
|
+
at,
|
|
70
|
+
key,
|
|
71
|
+
outcome: outcome === 'success' || outcome === 'failed' ? outcome : 'unknown',
|
|
72
|
+
score: sc,
|
|
73
|
+
notes: input.notes ? String(input.notes).slice(0, 220) : null,
|
|
74
|
+
};
|
|
75
|
+
// v1 parity: 回写只动 stats + history, 不改 model.current —— current 由 select/pivot 决定, 记账不该挪它.
|
|
76
|
+
const nextModel = {
|
|
77
|
+
...model,
|
|
78
|
+
stats: nextStats,
|
|
79
|
+
history: [...model.history, historyEntry],
|
|
80
|
+
};
|
|
81
|
+
return { model: nextModel, key, entry };
|
|
82
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { personalityStatePath } from '../events/paths.js';
|
|
2
|
+
import { type PersonalityModel, type PersonalityState } from './schema.js';
|
|
3
|
+
/** history 上限 (v1 slice(-120) 同值; 防文件无界增长). */
|
|
4
|
+
export declare const HISTORY_LIMIT = 120;
|
|
5
|
+
/** 全新默认模型 (无持久文件时的种子). */
|
|
6
|
+
export declare function defaultPersonalityModel(now?: () => number): PersonalityModel;
|
|
7
|
+
export interface PersonalityStoreOptions {
|
|
8
|
+
/** 覆盖持久化路径 (测试注入; 缺省走 personalityStatePath()). */
|
|
9
|
+
path?: string;
|
|
10
|
+
/** 可注入时钟 (确定性测试). */
|
|
11
|
+
now?: () => number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 可进化人格模型的持久化 (v1 loadPersonalityModel / savePersonalityModel 端口).
|
|
15
|
+
* - load: 缺失/空/损坏文件 → 回落默认模型 (绝不抛; 人格是软状态, 读坏不该崩进化循环)
|
|
16
|
+
* - save: tmp+rename 原子替换, 跨进程 O_EXCL 锁串行化 (对齐 EventStore / localJsonl 的写法)
|
|
17
|
+
* current 恒被 normalize 到合法五维, stats/history 恒是合法形状.
|
|
18
|
+
*/
|
|
19
|
+
export declare class PersonalityStore {
|
|
20
|
+
readonly path: string;
|
|
21
|
+
private readonly lockPath;
|
|
22
|
+
private readonly now;
|
|
23
|
+
constructor(opts?: PersonalityStoreOptions);
|
|
24
|
+
/** 读模型; 任何 I/O 或校验失败都回落默认 (不抛). */
|
|
25
|
+
load(): PersonalityModel;
|
|
26
|
+
/** 原子落盘 (规范化 + history 截断 + 刷 updatedAt). 返回实际写入的模型. */
|
|
27
|
+
save(model: PersonalityModel): PersonalityModel;
|
|
28
|
+
/** 读当前人格 (便捷). */
|
|
29
|
+
currentState(): PersonalityState;
|
|
30
|
+
/** 桶键 (便捷). */
|
|
31
|
+
currentKey(): string;
|
|
32
|
+
/** 当前时间的 ISO 串 (走注入时钟) —— 供进化算子给 stats/history/事件打时间戳. */
|
|
33
|
+
nowIso(): string;
|
|
34
|
+
}
|
|
35
|
+
export { personalityStatePath };
|