@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,97 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** 产出证据 (批注#19): 解锁非 coding agent, 不再"无 git 变动=没产出". */
|
|
3
|
+
export declare const proofOfWork: z.ZodObject<{
|
|
4
|
+
kind: z.ZodEnum<["git_diff", "artifact_hash", "external_receipt", "tool_call_trace"]>;
|
|
5
|
+
gitDiff: z.ZodOptional<z.ZodObject<{
|
|
6
|
+
files: z.ZodNumber;
|
|
7
|
+
lines: z.ZodNumber;
|
|
8
|
+
patchRef: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
files: number;
|
|
11
|
+
lines: number;
|
|
12
|
+
patchRef?: string | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
files: number;
|
|
15
|
+
lines: number;
|
|
16
|
+
patchRef?: string | undefined;
|
|
17
|
+
}>>;
|
|
18
|
+
artifactHash: z.ZodOptional<z.ZodObject<{
|
|
19
|
+
sha256: z.ZodString;
|
|
20
|
+
mime: z.ZodOptional<z.ZodString>;
|
|
21
|
+
size: z.ZodNumber;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
sha256: string;
|
|
24
|
+
size: number;
|
|
25
|
+
mime?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
sha256: string;
|
|
28
|
+
size: number;
|
|
29
|
+
mime?: string | undefined;
|
|
30
|
+
}>>;
|
|
31
|
+
externalReceipt: z.ZodOptional<z.ZodObject<{
|
|
32
|
+
provider: z.ZodString;
|
|
33
|
+
receiptId: z.ZodString;
|
|
34
|
+
ts: z.ZodString;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
provider: string;
|
|
37
|
+
receiptId: string;
|
|
38
|
+
ts: string;
|
|
39
|
+
}, {
|
|
40
|
+
provider: string;
|
|
41
|
+
receiptId: string;
|
|
42
|
+
ts: string;
|
|
43
|
+
}>>;
|
|
44
|
+
toolCallTrace: z.ZodOptional<z.ZodObject<{
|
|
45
|
+
calls: z.ZodNumber;
|
|
46
|
+
ref: z.ZodOptional<z.ZodString>;
|
|
47
|
+
}, "strip", z.ZodTypeAny, {
|
|
48
|
+
calls: number;
|
|
49
|
+
ref?: string | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
calls: number;
|
|
52
|
+
ref?: string | undefined;
|
|
53
|
+
}>>;
|
|
54
|
+
}, "strip", z.ZodTypeAny, {
|
|
55
|
+
kind: "git_diff" | "artifact_hash" | "external_receipt" | "tool_call_trace";
|
|
56
|
+
gitDiff?: {
|
|
57
|
+
files: number;
|
|
58
|
+
lines: number;
|
|
59
|
+
patchRef?: string | undefined;
|
|
60
|
+
} | undefined;
|
|
61
|
+
artifactHash?: {
|
|
62
|
+
sha256: string;
|
|
63
|
+
size: number;
|
|
64
|
+
mime?: string | undefined;
|
|
65
|
+
} | undefined;
|
|
66
|
+
externalReceipt?: {
|
|
67
|
+
provider: string;
|
|
68
|
+
receiptId: string;
|
|
69
|
+
ts: string;
|
|
70
|
+
} | undefined;
|
|
71
|
+
toolCallTrace?: {
|
|
72
|
+
calls: number;
|
|
73
|
+
ref?: string | undefined;
|
|
74
|
+
} | undefined;
|
|
75
|
+
}, {
|
|
76
|
+
kind: "git_diff" | "artifact_hash" | "external_receipt" | "tool_call_trace";
|
|
77
|
+
gitDiff?: {
|
|
78
|
+
files: number;
|
|
79
|
+
lines: number;
|
|
80
|
+
patchRef?: string | undefined;
|
|
81
|
+
} | undefined;
|
|
82
|
+
artifactHash?: {
|
|
83
|
+
sha256: string;
|
|
84
|
+
size: number;
|
|
85
|
+
mime?: string | undefined;
|
|
86
|
+
} | undefined;
|
|
87
|
+
externalReceipt?: {
|
|
88
|
+
provider: string;
|
|
89
|
+
receiptId: string;
|
|
90
|
+
ts: string;
|
|
91
|
+
} | undefined;
|
|
92
|
+
toolCallTrace?: {
|
|
93
|
+
calls: number;
|
|
94
|
+
ref?: string | undefined;
|
|
95
|
+
} | undefined;
|
|
96
|
+
}>;
|
|
97
|
+
export type ProofOfWork = z.infer<typeof proofOfWork>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** 产出证据 (批注#19): 解锁非 coding agent, 不再"无 git 变动=没产出". */
|
|
3
|
+
export const proofOfWork = z.object({
|
|
4
|
+
kind: z.enum(['git_diff', 'artifact_hash', 'external_receipt', 'tool_call_trace']),
|
|
5
|
+
gitDiff: z.object({ files: z.number().int(), lines: z.number().int(), patchRef: z.string().optional() }).optional(),
|
|
6
|
+
artifactHash: z.object({ sha256: z.string(), mime: z.string().optional(), size: z.number().int() }).optional(),
|
|
7
|
+
externalReceipt: z.object({ provider: z.string(), receiptId: z.string(), ts: z.string() }).optional(),
|
|
8
|
+
toolCallTrace: z.object({ calls: z.number().int(), ref: z.string().optional() }).optional(),
|
|
9
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** 三层签名·工程层 (军杰 §4.2). camelCase (内部类型, schema §0 / 硬化 A10). */
|
|
3
|
+
export declare const eventSignature: z.ZodString;
|
|
4
|
+
/** 三层签名·领域层 (军杰 §4.3), 不含 gene_id. */
|
|
5
|
+
export declare const problemSignature: z.ZodString;
|
|
6
|
+
/** 选择压. 三条腿: 结构化强 / corpus 弱 / agent 自标 (批注#13). */
|
|
7
|
+
export declare const signal: z.ZodObject<{
|
|
8
|
+
signalId: z.ZodString;
|
|
9
|
+
fromMaterial: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
10
|
+
kind: z.ZodEnum<["strong_structured", "weak_corpus", "agent_marked"]>;
|
|
11
|
+
text: z.ZodString;
|
|
12
|
+
score: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
eventSignature: z.ZodString;
|
|
14
|
+
problemSignature: z.ZodString;
|
|
15
|
+
signatureV: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
discoveredAt: z.ZodString;
|
|
17
|
+
extensions: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
18
|
+
}, "strip", z.ZodTypeAny, {
|
|
19
|
+
kind: "strong_structured" | "weak_corpus" | "agent_marked";
|
|
20
|
+
extensions: Record<string, unknown>;
|
|
21
|
+
signalId: string;
|
|
22
|
+
fromMaterial: string[];
|
|
23
|
+
text: string;
|
|
24
|
+
score: number;
|
|
25
|
+
eventSignature: string;
|
|
26
|
+
problemSignature: string;
|
|
27
|
+
signatureV: number;
|
|
28
|
+
discoveredAt: string;
|
|
29
|
+
}, {
|
|
30
|
+
kind: "strong_structured" | "weak_corpus" | "agent_marked";
|
|
31
|
+
signalId: string;
|
|
32
|
+
text: string;
|
|
33
|
+
eventSignature: string;
|
|
34
|
+
problemSignature: string;
|
|
35
|
+
discoveredAt: string;
|
|
36
|
+
extensions?: Record<string, unknown> | undefined;
|
|
37
|
+
fromMaterial?: string[] | undefined;
|
|
38
|
+
score?: number | undefined;
|
|
39
|
+
signatureV?: number | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
export type Signal = z.infer<typeof signal>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ulid, extensions } from './common.js';
|
|
3
|
+
/** 三层签名·工程层 (军杰 §4.2). camelCase (内部类型, schema §0 / 硬化 A10). */
|
|
4
|
+
export const eventSignature = z.string();
|
|
5
|
+
/** 三层签名·领域层 (军杰 §4.3), 不含 gene_id. */
|
|
6
|
+
export const problemSignature = z.string();
|
|
7
|
+
/** 选择压. 三条腿: 结构化强 / corpus 弱 / agent 自标 (批注#13). */
|
|
8
|
+
export const signal = z.object({
|
|
9
|
+
signalId: ulid,
|
|
10
|
+
fromMaterial: z.array(ulid).default([]),
|
|
11
|
+
kind: z.enum(['strong_structured', 'weak_corpus', 'agent_marked']),
|
|
12
|
+
text: z.string(),
|
|
13
|
+
score: z.number().min(0).max(1).default(0),
|
|
14
|
+
eventSignature,
|
|
15
|
+
problemSignature,
|
|
16
|
+
signatureV: z.number().int().positive().default(1),
|
|
17
|
+
discoveredAt: z.string().datetime(),
|
|
18
|
+
extensions,
|
|
19
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseShadowSink, type ShadowRecord } from './sink.js';
|
|
2
|
+
/** append-only jsonl shadow 账本(WAL-safe append). 默认不存 payload 全文(只 payloadSize, M8-5). */
|
|
3
|
+
export declare class JsonlShadowSink extends BaseShadowSink {
|
|
4
|
+
private readonly path;
|
|
5
|
+
constructor(path: string, nowFn?: () => number);
|
|
6
|
+
write(r: ShadowRecord): void;
|
|
7
|
+
readAll(): ShadowRecord[];
|
|
8
|
+
}
|
|
9
|
+
/** 完全不落账本(EVOLVER_SHADOW_TELEMETRY=off). seen/markSeen 仍维护(去重不依赖落盘). */
|
|
10
|
+
export declare class NullShadowSink extends BaseShadowSink {
|
|
11
|
+
write(): void;
|
|
12
|
+
}
|
|
13
|
+
/** 内存账本(测试). */
|
|
14
|
+
export declare class InMemoryShadowSink extends BaseShadowSink {
|
|
15
|
+
readonly records: ShadowRecord[];
|
|
16
|
+
write(r: ShadowRecord): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync, readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { BaseShadowSink } from './sink.js';
|
|
4
|
+
/** append-only jsonl shadow 账本(WAL-safe append). 默认不存 payload 全文(只 payloadSize, M8-5). */
|
|
5
|
+
export class JsonlShadowSink extends BaseShadowSink {
|
|
6
|
+
path;
|
|
7
|
+
constructor(path, nowFn) {
|
|
8
|
+
super(nowFn);
|
|
9
|
+
this.path = path;
|
|
10
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
write(r) { appendFileSync(this.path, `${JSON.stringify(r)}\n`); }
|
|
13
|
+
readAll() {
|
|
14
|
+
if (!existsSync(this.path))
|
|
15
|
+
return [];
|
|
16
|
+
return readFileSync(this.path, 'utf8').split('\n').filter(Boolean).map((l) => JSON.parse(l));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** 完全不落账本(EVOLVER_SHADOW_TELEMETRY=off). seen/markSeen 仍维护(去重不依赖落盘). */
|
|
20
|
+
export class NullShadowSink extends BaseShadowSink {
|
|
21
|
+
write() { }
|
|
22
|
+
}
|
|
23
|
+
/** 内存账本(测试). */
|
|
24
|
+
export class InMemoryShadowSink extends BaseShadowSink {
|
|
25
|
+
records = [];
|
|
26
|
+
write(r) { this.records.push(r); }
|
|
27
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ShadowSink } from './sink.js';
|
|
2
|
+
/** 脱敏(M8-5): 敏感文本(prompt/reasoning)截断 + sha256 短指纹, 不存全文. */
|
|
3
|
+
export declare function redactText(s: string, keep?: number): string;
|
|
4
|
+
export interface ShadowTelemetryEnv {
|
|
5
|
+
EVOLVER_SHADOW_TELEMETRY?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 按 env 选 shadow sink(M8-5 默认最小披露可关):
|
|
9
|
+
* EVOLVER_SHADOW_TELEMETRY=off → NullShadowSink(完全不落账本); 否则 JsonlShadowSink(只存 payloadSize 不存全文).
|
|
10
|
+
*/
|
|
11
|
+
export declare function shadowSinkFromEnv(env: ShadowTelemetryEnv, ledgerPath: string, now?: () => number): ShadowSink;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { JsonlShadowSink, NullShadowSink } from './jsonlSink.js';
|
|
3
|
+
/** 脱敏(M8-5): 敏感文本(prompt/reasoning)截断 + sha256 短指纹, 不存全文. */
|
|
4
|
+
export function redactText(s, keep = 80) {
|
|
5
|
+
if (s.length <= keep)
|
|
6
|
+
return s;
|
|
7
|
+
const h = createHash('sha256').update(s).digest('hex').slice(0, 12);
|
|
8
|
+
return `${s.slice(0, keep)}…[+${s.length - keep}chars sha:${h}]`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 按 env 选 shadow sink(M8-5 默认最小披露可关):
|
|
12
|
+
* EVOLVER_SHADOW_TELEMETRY=off → NullShadowSink(完全不落账本); 否则 JsonlShadowSink(只存 payloadSize 不存全文).
|
|
13
|
+
*/
|
|
14
|
+
export function shadowSinkFromEnv(env, ledgerPath, now) {
|
|
15
|
+
if ((env.EVOLVER_SHADOW_TELEMETRY ?? '').toLowerCase() === 'off')
|
|
16
|
+
return new NullShadowSink(now);
|
|
17
|
+
return new JsonlShadowSink(ledgerPath, now);
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HubCapability } from '../hub/capability.js';
|
|
2
|
+
import type { ShadowSink, ShadowMode } from './sink.js';
|
|
3
|
+
/**
|
|
4
|
+
* shadow 包 HubCapability(M8-1-shadow-c). shadow 下三类碰 hub 状态的动作只记录不执行:
|
|
5
|
+
* - publish → WOULD_PUBLISH, 返回**伪正常回执**(status:accepted/terminal:false), 否则 makeHubBindings
|
|
6
|
+
* 抛 PublishRejectedError 改 SyncEngine 异常/DLQ 路由污染对账(gotcha #1/#4)。
|
|
7
|
+
* - task.complete → WOULD_SETTLE(ATP 结算意图, money-safety 高敏)。
|
|
8
|
+
* - mailbox.push → WOULD_PUSH。
|
|
9
|
+
* 其余(fetch/search/mailbox.poll/ack/status/auth/capabilities)直通真 cap(只读不碰状态)。
|
|
10
|
+
* enforce 模式直接返回原 cap(零开销 pass-through, 秒级回滚)。
|
|
11
|
+
*/
|
|
12
|
+
export declare function shadowHubCapability(cap: HubCapability, sink: ShadowSink, mode: ShadowMode): HubCapability;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { computeAssetId } from '../wire/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* shadow 包 HubCapability(M8-1-shadow-c). shadow 下三类碰 hub 状态的动作只记录不执行:
|
|
4
|
+
* - publish → WOULD_PUBLISH, 返回**伪正常回执**(status:accepted/terminal:false), 否则 makeHubBindings
|
|
5
|
+
* 抛 PublishRejectedError 改 SyncEngine 异常/DLQ 路由污染对账(gotcha #1/#4)。
|
|
6
|
+
* - task.complete → WOULD_SETTLE(ATP 结算意图, money-safety 高敏)。
|
|
7
|
+
* - mailbox.push → WOULD_PUSH。
|
|
8
|
+
* 其余(fetch/search/mailbox.poll/ack/status/auth/capabilities)直通真 cap(只读不碰状态)。
|
|
9
|
+
* enforce 模式直接返回原 cap(零开销 pass-through, 秒级回滚)。
|
|
10
|
+
*/
|
|
11
|
+
export function shadowHubCapability(cap, sink, mode) {
|
|
12
|
+
if (mode === 'enforce')
|
|
13
|
+
return cap;
|
|
14
|
+
return {
|
|
15
|
+
auth: cap.auth,
|
|
16
|
+
publish: async (bundle) => {
|
|
17
|
+
const assetIds = bundle.map((a) => computeAssetId(a) ?? 'sha256:unknown');
|
|
18
|
+
for (const a of bundle)
|
|
19
|
+
sink.record({ action: 'WOULD_PUBLISH', assetId: computeAssetId(a) ?? 'sha256:unknown', assetKind: a.type, payloadSize: JSON.stringify(a).length });
|
|
20
|
+
return { receiptId: `shadow-${(assetIds[0] ?? 'x').slice(7, 19)}`, status: 'accepted', assetId: assetIds[0], assetIds, bundleId: `shadow-bundle`, terminal: false };
|
|
21
|
+
},
|
|
22
|
+
fetch: (q) => cap.fetch(q),
|
|
23
|
+
search: (q) => cap.search(q),
|
|
24
|
+
task: {
|
|
25
|
+
claim: (taskId) => cap.task.claim(taskId), // claim 只读不碰结算, 直通
|
|
26
|
+
complete: async (claimId, result) => {
|
|
27
|
+
sink.record({ action: 'WOULD_SETTLE', claimId, payloadSize: JSON.stringify(result ?? null).length });
|
|
28
|
+
return { status: 'completed' };
|
|
29
|
+
},
|
|
30
|
+
subscribe: (f) => cap.task.subscribe(f),
|
|
31
|
+
},
|
|
32
|
+
mailbox: {
|
|
33
|
+
poll: () => cap.mailbox.poll(),
|
|
34
|
+
ack: (id) => cap.mailbox.ack(id),
|
|
35
|
+
status: () => cap.mailbox.status(),
|
|
36
|
+
push: async (e) => {
|
|
37
|
+
sink.record({ action: 'WOULD_PUSH', envelopeType: e.type, payloadSize: JSON.stringify(e.payload ?? null).length });
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
...(cap.capabilities ? { capabilities: () => cap.capabilities() } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { MailboxStore } from '../mailbox/store.js';
|
|
2
|
+
import type { ShadowSink, ShadowMode } from './sink.js';
|
|
3
|
+
/**
|
|
4
|
+
* shadow 包 MailboxStore(M8-1-shadow-d). MailboxStore 含 private db, wrapper 无法结构赋值 →
|
|
5
|
+
* **继承** override complete/fail: shadow 下记 WOULD_MAILBOX_* 但 SQL no-op(消息留 in_flight, enforce 可再处理)。
|
|
6
|
+
* markProcessed/isProcessed/getProcessed 继承真写(保 Dispatcher 幂等, gotcha #3); claim/send/state 等全继承真行为。
|
|
7
|
+
*/
|
|
8
|
+
export declare class ShadowMailboxStore extends MailboxStore {
|
|
9
|
+
private readonly sink;
|
|
10
|
+
private readonly mode;
|
|
11
|
+
constructor(opts: {
|
|
12
|
+
path: string;
|
|
13
|
+
busyTimeoutMs?: number;
|
|
14
|
+
}, sink: ShadowSink, mode: ShadowMode);
|
|
15
|
+
complete(id: string, now: number): void;
|
|
16
|
+
fail(id: string, err: string, now: number, maxAttempts?: number): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { MailboxStore } from '../mailbox/store.js';
|
|
2
|
+
/**
|
|
3
|
+
* shadow 包 MailboxStore(M8-1-shadow-d). MailboxStore 含 private db, wrapper 无法结构赋值 →
|
|
4
|
+
* **继承** override complete/fail: shadow 下记 WOULD_MAILBOX_* 但 SQL no-op(消息留 in_flight, enforce 可再处理)。
|
|
5
|
+
* markProcessed/isProcessed/getProcessed 继承真写(保 Dispatcher 幂等, gotcha #3); claim/send/state 等全继承真行为。
|
|
6
|
+
*/
|
|
7
|
+
export class ShadowMailboxStore extends MailboxStore {
|
|
8
|
+
sink;
|
|
9
|
+
mode;
|
|
10
|
+
constructor(opts, sink, mode) {
|
|
11
|
+
super(opts);
|
|
12
|
+
this.sink = sink;
|
|
13
|
+
this.mode = mode;
|
|
14
|
+
}
|
|
15
|
+
complete(id, now) {
|
|
16
|
+
if (this.mode === 'enforce')
|
|
17
|
+
return super.complete(id, now);
|
|
18
|
+
this.sink.record({ action: 'WOULD_MAILBOX_COMPLETE' }); // no-op: 留 in_flight
|
|
19
|
+
}
|
|
20
|
+
fail(id, err, now, maxAttempts) {
|
|
21
|
+
if (this.mode === 'enforce')
|
|
22
|
+
return super.fail(id, err, now, maxAttempts);
|
|
23
|
+
this.sink.record({ action: 'WOULD_MAILBOX_FAIL' }); // no-op
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type AssetStoreProvider, type AssetRecord, type AssetKind, type PutResult, type SearchQuery } from '../assetstore/provider.js';
|
|
2
|
+
import type { ShadowSink, ShadowMode } from './sink.js';
|
|
3
|
+
/**
|
|
4
|
+
* shadow 包 AssetStoreProvider(M8-1-shadow-d). shadow 下 put 只记录不真写,
|
|
5
|
+
* 但维护本地镜像(+sink.markSeen)使 cycle 内 capsule_id→event 引用链(A4)可见、重复 put 返 stored:false(gotcha #2)。
|
|
6
|
+
* get/search/list 合并真 store(只读) + shadow 镜像。enforce 直通真 store。
|
|
7
|
+
*/
|
|
8
|
+
export declare class ShadowAssetStore implements AssetStoreProvider {
|
|
9
|
+
private readonly inner;
|
|
10
|
+
private readonly sink;
|
|
11
|
+
private readonly mode;
|
|
12
|
+
private readonly mirror;
|
|
13
|
+
constructor(inner: AssetStoreProvider, sink: ShadowSink, mode: ShadowMode);
|
|
14
|
+
put(asset: AssetRecord): Promise<PutResult>;
|
|
15
|
+
get(assetId: string): Promise<AssetRecord | null>;
|
|
16
|
+
search(q: SearchQuery): Promise<AssetRecord[]>;
|
|
17
|
+
list(kind?: AssetKind, limit?: number): Promise<AssetRecord[]>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { normalizeForPut } from '../assetstore/provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* shadow 包 AssetStoreProvider(M8-1-shadow-d). shadow 下 put 只记录不真写,
|
|
4
|
+
* 但维护本地镜像(+sink.markSeen)使 cycle 内 capsule_id→event 引用链(A4)可见、重复 put 返 stored:false(gotcha #2)。
|
|
5
|
+
* get/search/list 合并真 store(只读) + shadow 镜像。enforce 直通真 store。
|
|
6
|
+
*/
|
|
7
|
+
export class ShadowAssetStore {
|
|
8
|
+
inner;
|
|
9
|
+
sink;
|
|
10
|
+
mode;
|
|
11
|
+
mirror = new Map();
|
|
12
|
+
constructor(inner, sink, mode) {
|
|
13
|
+
this.inner = inner;
|
|
14
|
+
this.sink = sink;
|
|
15
|
+
this.mode = mode;
|
|
16
|
+
}
|
|
17
|
+
async put(asset) {
|
|
18
|
+
if (this.mode === 'enforce')
|
|
19
|
+
return this.inner.put(asset);
|
|
20
|
+
const { record, verified } = normalizeForPut(asset);
|
|
21
|
+
const already = this.sink.seen(record.asset_id) || this.mirror.has(record.asset_id);
|
|
22
|
+
this.sink.record({ action: 'WOULD_STORE_PUT', assetId: record.asset_id, assetKind: record.type, payloadSize: JSON.stringify(record).length });
|
|
23
|
+
if (!already) {
|
|
24
|
+
this.sink.markSeen(record.asset_id);
|
|
25
|
+
this.mirror.set(record.asset_id, record);
|
|
26
|
+
}
|
|
27
|
+
return { asset_id: record.asset_id, stored: !already, verified };
|
|
28
|
+
}
|
|
29
|
+
async get(assetId) {
|
|
30
|
+
return this.mirror.get(assetId) ?? this.inner.get(assetId);
|
|
31
|
+
}
|
|
32
|
+
async search(q) {
|
|
33
|
+
const real = await this.inner.search(q);
|
|
34
|
+
if (this.mode === 'enforce' || this.mirror.size === 0)
|
|
35
|
+
return real;
|
|
36
|
+
const seen = new Set(real.map((r) => r.asset_id));
|
|
37
|
+
const shadow = [...this.mirror.values()].filter((r) => !seen.has(r.asset_id) && matches(r, q));
|
|
38
|
+
return [...real, ...shadow];
|
|
39
|
+
}
|
|
40
|
+
async list(kind, limit = 1000) {
|
|
41
|
+
const real = await this.inner.list(kind, limit);
|
|
42
|
+
if (this.mode === 'enforce' || this.mirror.size === 0)
|
|
43
|
+
return real;
|
|
44
|
+
const seen = new Set(real.map((r) => r.asset_id));
|
|
45
|
+
const shadow = [...this.mirror.values()].filter((r) => !seen.has(r.asset_id) && (!kind || r.type === kind));
|
|
46
|
+
return [...real, ...shadow].slice(0, limit);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function matches(r, q) {
|
|
50
|
+
if (q.kind && r.type !== q.kind)
|
|
51
|
+
return false;
|
|
52
|
+
if (q.gene && r.gene !== q.gene)
|
|
53
|
+
return false;
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AssetKind, PublishReceipt } from '../hub/capability.js';
|
|
2
|
+
/** shadow 模式. 默认 'enforce'(=正常执行, decorator 退化 pass-through, 零开销秒级回滚). 'shadow'=只记录. */
|
|
3
|
+
export type ShadowMode = 'shadow' | 'enforce';
|
|
4
|
+
export type ShadowAction = 'WOULD_PUBLISH' | 'WOULD_SETTLE' | 'WOULD_PUSH' | 'WOULD_STORE_PUT' | 'WOULD_MAILBOX_COMPLETE' | 'WOULD_MAILBOX_FAIL' | 'WOULD_INGEST';
|
|
5
|
+
/** WOULD-* 意图日志: shadow 下一切对线上有副作用的动作记录. payload 默认只存字节数(脱敏 M8-5). */
|
|
6
|
+
export interface ShadowRecord {
|
|
7
|
+
seq: number;
|
|
8
|
+
at: number;
|
|
9
|
+
action: ShadowAction;
|
|
10
|
+
assetId?: string;
|
|
11
|
+
assetKind?: AssetKind;
|
|
12
|
+
envelopeType?: string;
|
|
13
|
+
claimId?: string;
|
|
14
|
+
payloadSize?: number;
|
|
15
|
+
/** v1 actual 对照槽(由对账器填, 非 sink 写). */
|
|
16
|
+
shadowReceipt?: Pick<PublishReceipt, 'status' | 'reason' | 'terminal'>;
|
|
17
|
+
}
|
|
18
|
+
/** shadow sink 抽象. 实现: JsonlShadowSink / NullShadowSink / InMemoryShadowSink. */
|
|
19
|
+
export interface ShadowSink {
|
|
20
|
+
now(): number;
|
|
21
|
+
record(r: Omit<ShadowRecord, 'seq' | 'at'>): ShadowRecord;
|
|
22
|
+
/** 去重镜像(补偿 store.put 不真写导致内存索引缺失, gotcha #2). */
|
|
23
|
+
seen(assetId: string): boolean;
|
|
24
|
+
markSeen(assetId: string): void;
|
|
25
|
+
}
|
|
26
|
+
/** 内存镜像 + 序号基类(各 sink 复用). */
|
|
27
|
+
export declare abstract class BaseShadowSink implements ShadowSink {
|
|
28
|
+
protected readonly nowFn: () => number;
|
|
29
|
+
protected seq: number;
|
|
30
|
+
private readonly mirror;
|
|
31
|
+
constructor(nowFn?: () => number);
|
|
32
|
+
now(): number;
|
|
33
|
+
abstract write(r: ShadowRecord): void;
|
|
34
|
+
record(r: Omit<ShadowRecord, 'seq' | 'at'>): ShadowRecord;
|
|
35
|
+
seen(assetId: string): boolean;
|
|
36
|
+
markSeen(assetId: string): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** 内存镜像 + 序号基类(各 sink 复用). */
|
|
2
|
+
export class BaseShadowSink {
|
|
3
|
+
nowFn;
|
|
4
|
+
seq = 0;
|
|
5
|
+
mirror = new Set();
|
|
6
|
+
constructor(nowFn = () => Date.now()) {
|
|
7
|
+
this.nowFn = nowFn;
|
|
8
|
+
}
|
|
9
|
+
now() { return this.nowFn(); }
|
|
10
|
+
record(r) {
|
|
11
|
+
this.seq += 1;
|
|
12
|
+
const full = { ...r, seq: this.seq, at: this.now() };
|
|
13
|
+
this.write(full);
|
|
14
|
+
return full;
|
|
15
|
+
}
|
|
16
|
+
seen(assetId) { return this.mirror.has(assetId); }
|
|
17
|
+
markSeen(assetId) { this.mirror.add(assetId); }
|
|
18
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CycleRecord } from './metaSignals.js';
|
|
2
|
+
/** Minimal event shape this adapter consumes (a structural subset of RootEvent). */
|
|
3
|
+
export interface CycleLogEvent {
|
|
4
|
+
type: string;
|
|
5
|
+
payload?: unknown;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Fold a window of root_events into per-cycle records (insertion order = chronological), suitable for
|
|
9
|
+
* {@link deriveCycleHistory}. Newest-last, matching deriveCycleHistory's window expectation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function cycleRecordsFromEvents(events: readonly CycleLogEvent[]): CycleRecord[];
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Adapter: v2 root_event log → normalized CycleRecord[] for deriveCycleHistory / computeMetaSignals.
|
|
2
|
+
// Mirrors how algo/cycleEngine.recentCycleOutcomes reads the log (cycle.solidified=success, cycle.failed=
|
|
3
|
+
// failed), grouping per cycleId so each terminal cycle becomes one record. Kept separate from metaSignals.ts
|
|
4
|
+
// so the meta-signal math stays a pure function over a clean shape and the v2-event coupling lives in one place.
|
|
5
|
+
//
|
|
6
|
+
// Field provenance from the v2 event payloads (see cycleEngine.ts):
|
|
7
|
+
// - status: cycle.solidified → 'success', cycle.failed → 'failed'
|
|
8
|
+
// - intent: mutation.built.payload.category (the cycle's GepCategory), if emitted
|
|
9
|
+
// - genesUsed: decision.gene_selected.payload.selectedGeneId || cycle.*.payload.gene
|
|
10
|
+
// - score: cycle.*.payload.outcome.score
|
|
11
|
+
// - blastRadius:capsule.produced.payload.blastRadius, if emitted (else absent → not counted as empty)
|
|
12
|
+
// Only terminal cycles (a cycle.solidified or cycle.failed) become records; in-flight cycles are skipped.
|
|
13
|
+
function payloadObj(e) {
|
|
14
|
+
return e.payload && typeof e.payload === 'object' ? e.payload : {};
|
|
15
|
+
}
|
|
16
|
+
function cycleIdOf(p) {
|
|
17
|
+
return typeof p['cycleId'] === 'string' ? p['cycleId'] : undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fold a window of root_events into per-cycle records (insertion order = chronological), suitable for
|
|
21
|
+
* {@link deriveCycleHistory}. Newest-last, matching deriveCycleHistory's window expectation.
|
|
22
|
+
*/
|
|
23
|
+
export function cycleRecordsFromEvents(events) {
|
|
24
|
+
const byCycle = new Map();
|
|
25
|
+
const order = [];
|
|
26
|
+
const get = (id) => {
|
|
27
|
+
let a = byCycle.get(id);
|
|
28
|
+
if (!a) {
|
|
29
|
+
a = { terminal: false };
|
|
30
|
+
byCycle.set(id, a);
|
|
31
|
+
order.push(id);
|
|
32
|
+
}
|
|
33
|
+
return a;
|
|
34
|
+
};
|
|
35
|
+
for (const e of events) {
|
|
36
|
+
const p = payloadObj(e);
|
|
37
|
+
const id = cycleIdOf(p);
|
|
38
|
+
if (!id)
|
|
39
|
+
continue;
|
|
40
|
+
const a = get(id);
|
|
41
|
+
switch (e.type) {
|
|
42
|
+
case 'mutation.built': {
|
|
43
|
+
if (typeof p['category'] === 'string')
|
|
44
|
+
a.intent = p['category'];
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case 'decision.gene_selected': {
|
|
48
|
+
if (typeof p['selectedGeneId'] === 'string')
|
|
49
|
+
a.gene = p['selectedGeneId'];
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 'capsule.produced': {
|
|
53
|
+
const br = p['blastRadius'];
|
|
54
|
+
if (br && typeof br === 'object') {
|
|
55
|
+
const o = br;
|
|
56
|
+
a.blastRadius = {
|
|
57
|
+
...(typeof o['files'] === 'number' ? { files: o['files'] } : {}),
|
|
58
|
+
...(typeof o['lines'] === 'number' ? { lines: o['lines'] } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'cycle.solidified':
|
|
64
|
+
case 'cycle.failed': {
|
|
65
|
+
a.terminal = true;
|
|
66
|
+
a.status = e.type === 'cycle.solidified' ? 'success' : 'failed';
|
|
67
|
+
if (typeof p['gene'] === 'string')
|
|
68
|
+
a.gene = p['gene'];
|
|
69
|
+
const outcome = p['outcome'];
|
|
70
|
+
if (outcome && typeof outcome === 'object' && typeof outcome['score'] === 'number') {
|
|
71
|
+
a.score = outcome['score'];
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
default:
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const records = [];
|
|
80
|
+
for (const id of order) {
|
|
81
|
+
const a = byCycle.get(id);
|
|
82
|
+
if (!a.terminal)
|
|
83
|
+
continue; // skip in-flight cycles
|
|
84
|
+
const rec = {};
|
|
85
|
+
if (a.intent !== undefined)
|
|
86
|
+
rec.intent = a.intent;
|
|
87
|
+
if (a.status !== undefined)
|
|
88
|
+
rec.outcome = { status: a.status, ...(a.score !== undefined ? { score: a.score } : {}) };
|
|
89
|
+
if (a.blastRadius !== undefined)
|
|
90
|
+
rec.blastRadius = a.blastRadius;
|
|
91
|
+
if (a.gene !== undefined)
|
|
92
|
+
rec.genesUsed = [a.gene];
|
|
93
|
+
records.push(rec);
|
|
94
|
+
}
|
|
95
|
+
return records;
|
|
96
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand a signal list into literal signals + namespace prefixes + semantic category tags.
|
|
3
|
+
* e.g. ['429', 'auth:token'] → ['429', 'auth:token', 'auth', 'problem:reliability', 'action:repair'].
|
|
4
|
+
*/
|
|
5
|
+
export declare function expandSignals(signals: readonly string[], extraText?: string): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Bag-of-words cosine similarity (0..1) between two free-text strings (ported from v1 scoreGeneSemantic).
|
|
8
|
+
* Term-frequency vectors, cosine of the angle. Returns 0 when either side has no tokens or they share none.
|
|
9
|
+
* This is the lexical-similarity recall path that complements {@link tagOverlapScore}'s curated tags:
|
|
10
|
+
* a signal 'timeout_slow' and a gene summarized "fix the slow timeout" share the 'timeout'/'slow' tokens
|
|
11
|
+
* even when neither the literal signal nor the expansion rules connect them.
|
|
12
|
+
*/
|
|
13
|
+
export declare function bagCosine(a: string, b: string): number;
|
|
14
|
+
/** Inputs used to derive a gene's tag set. All optional so callers can pass whatever they have. */
|
|
15
|
+
export interface GeneTagInput {
|
|
16
|
+
signalsMatch?: readonly string[];
|
|
17
|
+
category?: string;
|
|
18
|
+
geneId?: string;
|
|
19
|
+
summary?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Expand a gene's category + signals_match + id + summary into its semantic tag set. */
|
|
22
|
+
export declare function geneTags(gene: GeneTagInput): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Semantic tag overlap (0..1): fraction of the expanded SIGNAL tags that the gene's expanded tags cover.
|
|
25
|
+
* Normalized on the signal (query) side so a gene with a long id/summary is not penalized by noise.
|
|
26
|
+
* This is the recall component: '429' and a gene tagged 'error'/'repair' both expand to
|
|
27
|
+
* 'problem:reliability'/'action:repair', so they overlap even with zero literal string match.
|
|
28
|
+
*
|
|
29
|
+
* Known v1→v2 fidelity delta: a lone non-Latin signal caps near ~2/3 here — its raw token ('错误') is in the
|
|
30
|
+
* signal tag-set but never on the English-keyworded gene side, while an exact English signal short-circuits to
|
|
31
|
+
* literal=1.0 upstream in expandedMatchScore. v1 #99 gave CJK full literal credit via pipe-aliases; v2 reaches
|
|
32
|
+
* the right gene at ~2/3 strength. Lifting this to parity is a scoring-design change beyond this signal port.
|
|
33
|
+
*/
|
|
34
|
+
export declare function tagOverlapScore(signals: readonly string[], gene: GeneTagInput): number;
|