@a9i5k4/dsh-auto-memory 2.2.2 → 2.2.4
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/docs/A3-RISK-ASSESSMENT-20260830.md +61 -0
- package/docs/COT-WATCH-RFC.md +88 -0
- package/docs/DUAL-TIER-RATIFICATION-PROMPT.md +71 -0
- package/docs/HANDOFF-HARNESS.md +78 -0
- package/docs/HANDOFF-M8-M9-M10.md +203 -0
- package/docs/HY4-TOUR-LOGO-HANDOFF-2.md +60 -0
- package/docs/HY4-TOUR-LOGO-HANDOFF.md +100 -0
- package/docs/ISSUE-REPLY-UNATTENDED.md +31 -0
- package/docs/K3-LANDING-HANDOFF.md +76 -0
- package/docs/LANDING-OUTLINE.md +85 -0
- package/docs/M-CM-PLAN.md +166 -0
- package/docs/M-CM-STATE.md +64 -0
- package/docs/M3B-CONTRACT.md +461 -0
- package/docs/M4-CONTRACT.md +1207 -0
- package/docs/M5-CONTRACT.md +383 -0
- package/docs/M6-CONTRACT.md +342 -0
- package/docs/M7-ACTIVATION-ALGO-REFERENCES.md +104 -0
- package/docs/M7-ACTIVATION-CALIBRATION.md +144 -0
- package/docs/M7-ACTIVATION-FEATURE-AGENT-PROMPT.md +79 -0
- package/docs/M7-ACTIVATION-FEATURE-CALIBRATION.md +58 -0
- package/docs/M7-ACTIVATION-FEATURE-DESIGN.md +124 -0
- package/docs/M7-ACTIVATION-V2-CONTROLLED-SHADOW.md +127 -0
- package/docs/M7-ACTIVATION-V2-HANDOFF.md +132 -0
- package/docs/M7-ACTIVATION-V2-HOLDEDOUT-EVAL.md +94 -0
- package/docs/M7-ACTIVATION-V2-HOLDEDOUT-SHADOW.md +60 -0
- package/docs/M7-ACTIVATION-V2-LIVE-SHADOW-PLAN.md +85 -0
- package/docs/M7-ACTIVATION-V2-PAPER.md +303 -0
- package/docs/M7-AGENT-HANDOFF-PROMPT.md +63 -0
- package/docs/M7-ALGORITHM-DECISION.md +174 -0
- package/docs/M7-AUTONOMOUS-STATE.md +252 -0
- package/docs/M7-BENCHMARK-PLAN.md +78 -0
- package/docs/M7-CLOSED-LOOP-WIRING.md +110 -0
- package/docs/M7-EMBEDDING-BENCHMARK.md +164 -0
- package/docs/M7-INTERFACE-DIGEST.md +144 -0
- package/docs/M7-LABEL-REVIEW-REPORT.md +107 -0
- package/docs/M7-LEXICAL-TUNING.md +58 -0
- package/docs/M7-LIVE-SHADOW-SCRIPT.md +30 -0
- package/docs/M7-PYTHON-IMPLEMENTATION-REPORT.md +92 -0
- package/docs/M7-RESEARCH-PAPER.md +442 -0
- package/docs/M7-TASKSET-DISPATCH.md +213 -0
- package/docs/M8-MEMORY-HUB.md +105 -0
- package/docs/MEMORY-SYSTEMS-SURVEY-2026-09.md +166 -0
- package/docs/NEXT-MAJOR-PROMO.md +363 -0
- package/docs/NEXT-MAJOR-README-DRAFT.zh.md +205 -0
- package/docs/NEXT-MAJOR-VISION.md +112 -0
- package/docs/PREVIEW-NEXT-STEPS.md +229 -0
- package/docs/PROJECT-FREEZE-AND-ROADMAP.md +200 -0
- package/docs/PROMO-STYLE-GUIDE.md +84 -0
- package/docs/PYTHON-SIDECAR-CONTRACT.md +539 -0
- package/docs/R2-POLICY-PLUMBING-BLUEPRINT.md +99 -0
- package/docs/RELEASE-READINESS-PLAN.md +91 -0
- package/docs/RELEASE-SEMANTIC-OPTION.md +181 -0
- package/docs/S1-SCIENTIFIC-RIGOR.md +269 -0
- package/docs/S2-DEEP-ABSORPTION.md +259 -0
- package/docs/S3-TARGET-ARCHITECTURE.md +172 -0
- package/docs/USER-GUIDE.zh-CN.md +283 -0
- package/docs/banner.jpg +0 -0
- package/docs/implementation-handoff-context.zh-CN.md +429 -0
- package/docs/landing/index.html +1745 -0
- package/docs/paper-figures/fig1_model_quality.png +0 -0
- package/docs/paper-figures/fig2_chunk_reversal.png +0 -0
- package/docs/paper-figures/fig3_latency.png +0 -0
- package/docs/paper-figures/fig4_hybrid.png +0 -0
- package/docs/paper-figures/fig5_rerank_tradeoff.png +0 -0
- package/docs/paper-figures/fig6_cluster_sweep.png +0 -0
- package/docs/paper-figures/fig7_resource.png +0 -0
- package/docs/paper-figures-v2/fig1_echo_trap.png +0 -0
- package/docs/paper-figures-v2/fig2_pr_paths.png +0 -0
- package/docs/paper-figures-v2/fig3_coefficients.png +0 -0
- package/docs/paper-figures-v2/fig4_calibration.png +0 -0
- package/docs/paper-figures-v2/fig5_order_ablation.png +0 -0
- package/docs/paper-figures-v2/fig6_containment.png +0 -0
- package/docs/proactive-associative-memory-architecture.html +659 -0
- package/docs/proactive-associative-memory-meta-code.html +1058 -0
- package/docs/proactive-associative-memory-research-report.zh-CN.md +685 -0
- package/docs/proactive-associative-memory-system-map.html +1580 -0
- package/docs/promo/first-run-guide.html +397 -0
- package/docs/promo/homepage.html +384 -0
- package/docs/screenshots/calendar-en.png +0 -0
- package/docs/screenshots/calendar-zh.png +0 -0
- package/docs/screenshots/connect-en.png +0 -0
- package/docs/screenshots/connect-zh.png +0 -0
- package/docs/screenshots/main-connect-en.png +0 -0
- package/docs/screenshots/main-connect-zh.png +0 -0
- package/docs/screenshots/overview-en.png +0 -0
- package/docs/screenshots/overview-zh.png +0 -0
- package/docs/screenshots/panel-hub.png +0 -0
- package/docs/screenshots/panel-overview.png +0 -0
- package/docs/screenshots/panel-refine.png +0 -0
- package/docs/screenshots/promo/promo-0-banner-v2.png +0 -0
- package/docs/screenshots/promo/promo-1-hero.png +0 -0
- package/docs/screenshots/promo/promo-2-tour.png +0 -0
- package/docs/screenshots/promo/promo-3-recall.png +0 -0
- package/docs/screenshots/promo/promo-4-unattended.png +0 -0
- package/docs/screenshots/promo/promo-5-external.png +0 -0
- package/docs/screenshots/promo/promo-6-greeting.png +0 -0
- package/docs/screenshots/reflections-en.png +0 -0
- package/docs/screenshots/search-zh.png +0 -0
- package/docs/screenshots/settings-2-zh.png +0 -0
- package/docs/screenshots/settings-debug-zh.png +0 -0
- package/docs/screenshots/settings-en.png +0 -0
- package/docs/screenshots/settings-zh.png +0 -0
- package/docs/screenshots/tour-core.png +0 -0
- package/docs/screenshots/tour-external.png +0 -0
- package/docs/screenshots/tour-toggles.png +0 -0
- package/docs/screenshots/tour-welcome.png +0 -0
- package/docs/screenshots/workspace-map-zh.png +0 -0
- package/docs/social-preview.png +0 -0
- package/lib/client.js +277 -118
- package/lib/index.js +329 -60
- package/lib/subagent-gc.js +239 -0
- package/lib/water-window.js +88 -0
- package/package.json +2 -1
|
@@ -0,0 +1,1058 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>dsh-auto-memory · 模块 Meta Code 装配预览</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root{
|
|
9
|
+
--ink:#172238; --muted:#64748b; --paper:#edf2f8; --surface:#fff; --line:#d4deea;
|
|
10
|
+
--navy:#0d1b31; --navy-2:#142744;
|
|
11
|
+
--native:#16816d; --native-soft:#dff5ee;
|
|
12
|
+
--planned:#2864ce; --planned-soft:#e7efff;
|
|
13
|
+
--research:#7451c8; --research-soft:#eee9ff;
|
|
14
|
+
--guard:#c4473e; --guard-soft:#ffebe8;
|
|
15
|
+
--amber:#a96a16; --amber-soft:#fff2d9;
|
|
16
|
+
--shadow:0 10px 28px rgba(23,34,56,.08);
|
|
17
|
+
}
|
|
18
|
+
*{box-sizing:border-box}
|
|
19
|
+
html{scroll-behavior:smooth}
|
|
20
|
+
body{margin:0;color:var(--ink);background:var(--paper);font-family:Inter,"Segoe UI","Microsoft YaHei",sans-serif;line-height:1.55}
|
|
21
|
+
a{color:#1c5fc5;text-decoration:none}
|
|
22
|
+
a:hover{text-decoration:underline}
|
|
23
|
+
code,pre,.mono{font-family:"Cascadia Code",Consolas,monospace}
|
|
24
|
+
.topbar{position:sticky;top:0;z-index:30;color:#f7fbff;background:rgba(13,27,49,.97);border-bottom:1px solid rgba(255,255,255,.12);backdrop-filter:blur(14px)}
|
|
25
|
+
.topbar-inner{max-width:1500px;margin:0 auto;padding:12px 22px;display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}
|
|
26
|
+
.brand{display:flex;align-items:center;gap:11px}
|
|
27
|
+
.mark{width:34px;height:34px;display:grid;place-items:center;border-radius:9px;color:#fff;background:#347df1;font-weight:850}
|
|
28
|
+
.brand-title{font-weight:800}
|
|
29
|
+
.brand-sub{color:#a9b9d2;font-size:11px}
|
|
30
|
+
.top-actions{display:flex;gap:6px;flex-wrap:wrap}
|
|
31
|
+
.top-actions a{padding:6px 9px;color:#dbe8fb;border:1px solid transparent;border-radius:6px;font-size:12px}
|
|
32
|
+
.top-actions a:hover{border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.08)}
|
|
33
|
+
.page{max-width:1500px;margin:0 auto;padding:24px 22px 56px}
|
|
34
|
+
.hero{padding:26px 30px;border-radius:16px;color:#f8fbff;background:var(--navy);box-shadow:var(--shadow)}
|
|
35
|
+
.eyebrow{color:#8ab9ff;font:800 11px/1.2 Consolas,monospace;letter-spacing:1.5px;text-transform:uppercase}
|
|
36
|
+
h1{margin:10px 0 10px;font-size:clamp(26px,3.6vw,42px);line-height:1.1;letter-spacing:-.5px}
|
|
37
|
+
.lead{max-width:980px;margin:0;color:#cbd9ed;font-size:15px}
|
|
38
|
+
.hero-contract{display:flex;flex-wrap:wrap;gap:7px;margin-top:18px}
|
|
39
|
+
.contract-chip{padding:4px 9px;border:1px solid rgba(255,255,255,.2);border-radius:999px;color:#e7f0ff;font-size:11px}
|
|
40
|
+
.contract-chip.native{border-color:#63c4ae;color:#bcefe0}
|
|
41
|
+
.contract-chip.planned{border-color:#86b1ff;color:#d1e1ff}
|
|
42
|
+
.contract-chip.research{border-color:#d3b6ff;color:#f0e6ff}
|
|
43
|
+
.contract-chip.guard{border-color:#f0a49d;color:#ffd9d5}
|
|
44
|
+
.toc-wrap{margin:16px 0 0;padding:13px 15px;border:1px solid var(--line);border-radius:10px;background:rgba(255,255,255,.85)}
|
|
45
|
+
.toc-label{display:block;margin-bottom:8px;color:var(--muted);font:800 10px Consolas,monospace;letter-spacing:1px;text-transform:uppercase}
|
|
46
|
+
.toc-grid{display:flex;flex-wrap:wrap;gap:5px}
|
|
47
|
+
.toc-chip{padding:3px 8px;border:1px solid var(--line);border-radius:5px;color:#51647d;background:#fbfcfe;font-size:10.5px}
|
|
48
|
+
.toc-chip:hover{border-color:#2864ce;color:#2864ce;background:#eef4ff}
|
|
49
|
+
.toc-chip.native:hover{border-color:var(--native);color:var(--native);background:var(--native-soft)}
|
|
50
|
+
.toc-chip.research:hover,.toc-chip.memory:hover{border-color:var(--research);color:var(--research);background:var(--research-soft)}
|
|
51
|
+
.lane-sec{margin-top:30px}
|
|
52
|
+
.lane-head{display:inline-block;margin:0;padding:7px 14px;border-radius:8px;font:800 13px Consolas,monospace;letter-spacing:1px}
|
|
53
|
+
.lane-head.native{background:var(--native-soft);color:var(--native)}
|
|
54
|
+
.lane-head.control{background:var(--planned-soft);color:var(--planned)}
|
|
55
|
+
.lane-head.memory{background:var(--research-soft);color:var(--research)}
|
|
56
|
+
.lane-head.governance{background:var(--amber-soft);color:var(--amber)}
|
|
57
|
+
.lane-sub{margin:8px 2px 12px;color:var(--muted);font-size:12.5px}
|
|
58
|
+
.ring-panel{margin-top:14px;padding:15px 17px;border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow)}
|
|
59
|
+
.ring-panel h3{margin:0 0 4px;font-size:14px}
|
|
60
|
+
.ring-panel p{margin:0 0 10px;color:var(--muted);font-size:12px}
|
|
61
|
+
.ring{display:flex;flex-wrap:wrap;align-items:center;gap:6px;row-gap:8px}
|
|
62
|
+
.ring-chip{font:700 10.5px Consolas,monospace;padding:3px 8px;border-radius:6px;border:1px solid;background:#fff}
|
|
63
|
+
.ring-chip.native{border-color:#63b5a2;color:var(--native)}
|
|
64
|
+
.ring-chip.planned{border-color:#7ea6e4;color:var(--planned)}
|
|
65
|
+
.ring-chip.research{border-color:#a28bdd;color:var(--research)}
|
|
66
|
+
.ring-chip.amber{border-color:#dfb06b;color:var(--amber)}
|
|
67
|
+
.ring-arrow{color:#8fa3bd;font-weight:800}
|
|
68
|
+
.ring-loop{margin-top:8px;color:var(--muted);font-size:11.5px}
|
|
69
|
+
.ring-loop code{color:var(--native)}
|
|
70
|
+
.branch-panel{margin-top:10px;padding:12px 17px;border:1px dashed var(--line);border-radius:12px;background:#fbfdff}
|
|
71
|
+
.branch-panel h3{margin:0 0 8px;font-size:13px}
|
|
72
|
+
.branch-chips{display:flex;flex-wrap:wrap;gap:5px}
|
|
73
|
+
.edge-chip{font:10.5px Consolas,monospace;padding:2px 7px;border-radius:999px;border:1px solid;background:#fff;white-space:nowrap}
|
|
74
|
+
.edge-chip.native{border-color:#b6ddd3;color:var(--native);background:#f4fbf9}
|
|
75
|
+
.edge-chip.planned{border-color:#c4d4f1;color:var(--planned);background:#f6f9ff}
|
|
76
|
+
.edge-chip.research{border-color:#d7cbee;color:var(--research);background:#faf7ff}
|
|
77
|
+
.edge-chip.guard{border-color:#ecd8c3;color:var(--guard);background:#fffaf7}
|
|
78
|
+
.no-edge{color:#a3b0c2;font-size:11px}
|
|
79
|
+
.wiring-panel{margin-top:10px;overflow:hidden;border:1px solid #bfcddd;border-radius:12px;background:var(--navy);box-shadow:var(--shadow)}
|
|
80
|
+
.wiring-head{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 16px;color:#dbe8fb;background:var(--navy-2);font-size:11px}
|
|
81
|
+
.wiring-head strong{font:800 12px Consolas,monospace;letter-spacing:1px}
|
|
82
|
+
.invariants{margin-top:10px;padding:14px 17px;border-left:4px solid var(--amber);border-radius:0 10px 10px 0;color:#76521c;background:var(--amber-soft);font-size:12.5px}
|
|
83
|
+
.invariants ul{margin:6px 0 0;padding-left:18px}
|
|
84
|
+
.invariants li{margin:4px 0}
|
|
85
|
+
.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(560px,1fr));gap:14px;align-items:start}
|
|
86
|
+
.card{display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--line);border-radius:12px;background:#fff;box-shadow:var(--shadow)}
|
|
87
|
+
.card-head{padding:13px 16px 11px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#fbfdff,#f4f7fb)}
|
|
88
|
+
.card-topline{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
|
|
89
|
+
.card-code{color:#71839b;font:800 10px Consolas,monospace;letter-spacing:.6px;text-transform:uppercase}
|
|
90
|
+
.badge{display:inline-flex;padding:2px 7px;border-radius:5px;color:#fff;font:800 9px Consolas,monospace;text-transform:uppercase;letter-spacing:.5px}
|
|
91
|
+
.badge.native{background:var(--native)}
|
|
92
|
+
.badge.planned{background:var(--planned)}
|
|
93
|
+
.badge.research{background:var(--research)}
|
|
94
|
+
.badge.guard{background:var(--guard)}
|
|
95
|
+
.ringpos{display:inline-flex;padding:2px 7px;border:1px solid #dfe7f2;border-radius:5px;color:#5c718f;font:700 9px Consolas,monospace;background:#fff}
|
|
96
|
+
.ringpos.dim{color:#a3b0c2;border-style:dashed}
|
|
97
|
+
.card-title{margin:6px 0 3px;font-size:17px;font-weight:820;line-height:1.2}
|
|
98
|
+
.card-role{margin:0;color:var(--muted);font-size:12px}
|
|
99
|
+
.edge-chips{display:flex;flex-wrap:wrap;gap:5px;padding:8px 16px;border-bottom:1px dashed var(--line);background:#fafcff}
|
|
100
|
+
pre.meta{margin:0;padding:13px 16px;flex:1;background:var(--navy);color:#dce8fb;font:11.5px/1.62 Consolas,monospace;overflow-x:auto;white-space:pre}
|
|
101
|
+
pre.meta .c{color:#8ab9ff}
|
|
102
|
+
pre.meta .s{color:#ffd7a3}
|
|
103
|
+
pre.meta .k{color:#7ee2c8;font-weight:700}
|
|
104
|
+
.source-note{margin-top:26px;padding:13px 15px;border-left:4px solid var(--amber);border-radius:0 8px 8px 0;color:#76521c;background:var(--amber-soft);font-size:11.5px}
|
|
105
|
+
.footer{display:flex;justify-content:space-between;gap:10px;margin-top:26px;padding-top:13px;border-top:1px solid var(--line);color:var(--muted);font-size:10.5px}
|
|
106
|
+
@media (max-width:640px){.card-grid{grid-template-columns:1fr}.hero{padding:22px 20px}}
|
|
107
|
+
</style>
|
|
108
|
+
</head>
|
|
109
|
+
<body>
|
|
110
|
+
<header class="topbar">
|
|
111
|
+
<div class="topbar-inner">
|
|
112
|
+
<div class="brand"><div class="mark">AM</div><div><div class="brand-title">dsh-auto-memory · Meta Code</div><div class="brand-sub">28 模块 · 类型契约 + 关键逻辑伪代码 · 装配预览</div></div></div>
|
|
113
|
+
<nav class="top-actions" aria-label="页面导航">
|
|
114
|
+
<a href="#wiring">⓪ 全局装配</a>
|
|
115
|
+
<a href="#lane-native">① 原生请求面</a>
|
|
116
|
+
<a href="#lane-control">② 主动控制面</a>
|
|
117
|
+
<a href="#lane-memory">③ 认知记忆面</a>
|
|
118
|
+
<a href="#lane-governance">④ 治理与运营</a>
|
|
119
|
+
<a href="./proactive-associative-memory-system-map.html#map">← 系统地图</a>
|
|
120
|
+
</nav>
|
|
121
|
+
</div>
|
|
122
|
+
</header>
|
|
123
|
+
|
|
124
|
+
<div class="page">
|
|
125
|
+
<section class="hero">
|
|
126
|
+
<div class="eyebrow">Meta Code Atlas / Implementation Sketch / 2026-08-19</div>
|
|
127
|
+
<h1>每个模块一段 Meta Code:先看装配,再看实现。</h1>
|
|
128
|
+
<p class="lead">Meta code = 类型契约 + 关键逻辑骨架(伪代码,不编译),只表达职责与数据流。第 ⓪ 章是全局装配:一条主动链把各模块串起来,与系统地图的 30 条边一一对应;随后按四个泳道逐模块给出契约、啮合边与实现要点。当前维护通道使用原生 systemPrompt.section() / systemPrompt.context();未来主动 MemoryPacket 才进入 durable Agent Inbox。状态标注沿用地图:原生 / 设计 / 研究 / 安全门。</p>
|
|
129
|
+
<div class="hero-contract">
|
|
130
|
+
<span class="contract-chip native">native: 原生机制(只接不改)</span>
|
|
131
|
+
<span class="contract-chip planned">planned: 本项目计划实现</span>
|
|
132
|
+
<span class="contract-chip research">research: 论文 / 开源启发</span>
|
|
133
|
+
<span class="contract-chip guard">guard: 必须守住的边</span>
|
|
134
|
+
</div>
|
|
135
|
+
</section>
|
|
136
|
+
|
|
137
|
+
<div class="toc-wrap">
|
|
138
|
+
<span class="toc-label">模块索引 · 28 个</span>
|
|
139
|
+
<div class="toc-grid"><a class="toc-chip native" href="#mod-events">N-01 运行时事件</a><a class="toc-chip native" href="#mod-inbox">N-03 Agent Inbox</a><a class="toc-chip native" href="#mod-claim">N-04 Claim / Assemble</a><a class="toc-chip native" href="#mod-prestep">N-05 agent/pre-step</a><a class="toc-chip native" href="#mod-request">N-06 Build Request</a><a class="toc-chip native" href="#mod-model">N-07 模型 / Provider</a><a class="toc-chip native" href="#mod-toolResult">N-08 工具结果 / 反馈</a><a class="toc-chip control" href="#mod-observer">C-01 ContextObserver</a><a class="toc-chip control" href="#mod-runtime">C-02 SessionRuntime</a><a class="toc-chip control" href="#mod-gate">C-03 Retrieval Gate</a><a class="toc-chip control" href="#mod-association">C-04 Association Engine</a><a class="toc-chip control" href="#mod-rank">C-05 Rank / Dedupe / Budget</a><a class="toc-chip control" href="#mod-broker">C-06 Injection Broker</a><a class="toc-chip control" href="#mod-capability">C-07 Provider Adapter</a><a class="toc-chip memory" href="#mod-working">M-01 Working Memory</a><a class="toc-chip memory" href="#mod-episodic">M-02 Episodic Memory</a><a class="toc-chip memory" href="#mod-semantic">M-03 Semantic / Profile</a><a class="toc-chip memory" href="#mod-procedural">M-04 Procedural Memory</a><a class="toc-chip memory" href="#mod-lexical">M-05 Lexical / Entity</a><a class="toc-chip memory" href="#mod-projection">M-06 Readable Projection</a><a class="toc-chip memory" href="#mod-python">M-07 Python Memory Engine</a><a class="toc-chip governance" href="#mod-evidence">G-01 Evidence Updater</a><a class="toc-chip governance" href="#mod-audit">G-02 Injection Audit</a><a class="toc-chip governance" href="#mod-safety">G-03 Safety Gate</a><a class="toc-chip governance" href="#mod-metrics">G-04 Evaluation / Metrics</a><a class="toc-chip governance" href="#mod-fallback">G-05 Fallback / Degrade</a><a class="toc-chip research" href="#mod-research">R-01 Research Signals</a><a class="toc-chip research" href="#mod-lexical2">R-02 Cognitive Model</a></div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<section id="wiring">
|
|
143
|
+
<div class="ring-panel">
|
|
144
|
+
<h3>主环 · 未来主动 packet 的下一请求链</h3>
|
|
145
|
+
<p>14 个节点构成闭合回路;除标注外,每一步都只影响「下一请求边界」。</p>
|
|
146
|
+
<div class="ring"><span class="ring-chip native">N-01 运行时事件</span><span class="ring-arrow">→</span><span class="ring-chip native">SESSION 事实源</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-01 ContextObserver</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-02 SessionRuntime</span><span class="ring-arrow">→</span><span class="ring-chip research">M-01 Working Memory</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-03 Retrieval Gate</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-04 Association Engine</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-05 Rank / Dedupe / Budget</span><span class="ring-arrow">→</span><span class="ring-chip planned">C-06 Injection Broker</span><span class="ring-arrow">→</span><span class="ring-chip native">N-03 Agent Inbox</span><span class="ring-arrow">→</span><span class="ring-chip native">N-04 Claim / Assemble</span><span class="ring-arrow">→</span><span class="ring-chip native">N-05 agent/pre-step</span><span class="ring-arrow">→</span><span class="ring-chip native">N-06 Build Request</span><span class="ring-arrow">→</span><span class="ring-chip native">N-07 模型 / Provider</span><span class="ring-arrow">→</span><span class="ring-chip native">N-08 工具结果 / 反馈</span></div>
|
|
147
|
+
<div class="ring-loop">未来 packet 回环:<code>toolResult → events → retrieve → Inbox</code>;当前维护快照走 <code>systemPrompt.context() → RuntimeContextProjection</code></div>
|
|
148
|
+
</div>
|
|
149
|
+
<div class="branch-panel">
|
|
150
|
+
<h3>支线 · 召回源 / 证据升格 / 门与降级(15 条)</h3>
|
|
151
|
+
<div class="branch-chips"><span class="edge-chip planned">M-02 Episodic Memory → C-04 Association Engine · recall</span><span class="edge-chip planned">M-03 Semantic / Profile → C-04 Association Engine · recall</span><span class="edge-chip guard">M-04 Procedural Memory → C-04 Association Engine · checklist</span><span class="edge-chip research">M-05 Lexical / Entity → C-04 Association Engine · entity</span><span class="edge-chip planned">M-06 Readable Projection → M-03 Semantic / Profile · promote</span><span class="edge-chip planned">M-07 Python Memory Engine → C-04 Association Engine · sidecar</span><span class="edge-chip planned">G-01 Evidence Updater → M-03 Semantic / Profile · update</span><span class="edge-chip guard">G-01 Evidence Updater → M-04 Procedural Memory · promote</span><span class="edge-chip planned">G-02 Injection Audit → C-06 Injection Broker · audit</span><span class="edge-chip guard">G-03 Safety Gate → C-06 Injection Broker · gate</span><span class="edge-chip planned">C-07 Provider Adapter → C-06 Injection Broker · adapter</span><span class="edge-chip planned">G-04 Evaluation / Metrics → G-02 Injection Audit · measure</span><span class="edge-chip guard">G-05 Fallback / Degrade → C-04 Association Engine · degrade</span><span class="edge-chip research">R-01 Research Signals → C-03 Retrieval Gate · trigger</span><span class="edge-chip research">R-02 Cognitive Model → C-04 Association Engine · model</span></div>
|
|
152
|
+
</div>
|
|
153
|
+
<div class="wiring-panel">
|
|
154
|
+
<div class="wiring-head"><strong>GLOBAL WIRING · 全局装配</strong><span>契约类型 + Host 装配 + 主动链 + 反馈回环</span></div>
|
|
155
|
+
<pre class="meta" style="padding:18px 20px"><code><span class="c">/* ============================================================
|
|
156
|
+
* 全局装配 — 各模块的啮合方式(与地图 30 条边一一对应)
|
|
157
|
+
*
|
|
158
|
+
* 未来主动 packet 主环(每步请求边界前最多走一次):
|
|
159
|
+
* events → session → observer → runtime → working
|
|
160
|
+
* → gate → association → rank → safety → broker → inbox
|
|
161
|
+
* → claim → pre-step → buildRequest → model
|
|
162
|
+
* → toolResult → events(回环)
|
|
163
|
+
*
|
|
164
|
+
* 当前已落地维护通道:
|
|
165
|
+
* systemPrompt.section(稳定规则) + systemPrompt.context(易变快照)
|
|
166
|
+
* → systemPrompt.assemble → RuntimeContextProjection → agent/pre-step
|
|
167
|
+
*
|
|
168
|
+
* 支线:
|
|
169
|
+
* M-02/03/04/05 + M-07 → association (召回源)
|
|
170
|
+
* G-01 → M-02/M-03/M-04 (证据升格)
|
|
171
|
+
* G-02/G-03/C-07 → broker (审计/安全门/能力)
|
|
172
|
+
* G-04 → G-02 · G-05 → association (度量/降级)
|
|
173
|
+
* R-01 → C-03 · R-02 → C-04 (启发)
|
|
174
|
+
* ============================================================ */</span>
|
|
175
|
+
|
|
176
|
+
<span class="c">/* ---- 契约类型(各模块共享) ---- */</span>
|
|
177
|
+
<span class="k">type</span> SourceKind = <span class="s">'user'</span> | <span class="s">'tool'</span> | <span class="s">'agent'</span> | <span class="s">'lifecycle'</span>
|
|
178
|
+
<span class="k">type</span> Scope = <span class="s">'Turn'</span> | <span class="s">'Session'</span> | <span class="s">'Workspace'</span> | <span class="s">'User'</span> | <span class="s">'External'</span>
|
|
179
|
+
<span class="k">type</span> Strength = <span class="s">'soft'</span> | <span class="s">'direct'</span> | <span class="s">'checklist'</span>
|
|
180
|
+
|
|
181
|
+
<span class="k">interface</span> ContextCursor { sessionId: string; eventSeq: number; contextVersion: number }
|
|
182
|
+
<span class="k">interface</span> Segment {
|
|
183
|
+
id: string; sessionId: string; kind: SourceKind; eventSeq: number
|
|
184
|
+
text: string; entities: string[]; digest: string; ts: number
|
|
185
|
+
}
|
|
186
|
+
<span class="k">interface</span> Candidate {
|
|
187
|
+
id: string; source: <span class="s">'episodic'</span>|<span class="s">'semantic'</span>|<span class="s">'procedural'</span>|<span class="s">'lexical'</span>
|
|
188
|
+
scope: Scope; score: number; confidence: number
|
|
189
|
+
provenance: string; expiresAt: number; payload: string
|
|
190
|
+
}
|
|
191
|
+
<span class="k">interface</span> MemoryPacket {
|
|
192
|
+
packetSchemaVersion: 1
|
|
193
|
+
contextCursor: ContextCursor; retrievalVersion: string
|
|
194
|
+
triggerReason: string; strength: Strength; items: Candidate[]
|
|
195
|
+
exactDigest: string; semanticDigest: string
|
|
196
|
+
budgetBytes: number; expiry: number
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
<span class="c">/* ---- Host 装配: 事件入口 ---- */</span>
|
|
200
|
+
<span class="k">class</span> ProactiveMemoryHost {
|
|
201
|
+
observer = <span class="k">new</span> ContextObserver() <span class="c">// C-01</span>
|
|
202
|
+
runtime = <span class="k">new</span> SessionRuntime() <span class="c">// C-02</span>
|
|
203
|
+
gate = <span class="k">new</span> RetrievalGate() <span class="c">// C-03</span>
|
|
204
|
+
assoc = <span class="k">new</span> AssociationEngine() <span class="c">// C-04(注入 M-02/03/04/05/07 召回源)</span>
|
|
205
|
+
rank = <span class="k">new</span> RankDedupeBudget() <span class="c">// C-05</span>
|
|
206
|
+
safety = <span class="k">new</span> SafetyGate() <span class="c">// G-03</span>
|
|
207
|
+
broker = <span class="k">new</span> InjectionBroker() <span class="c">// C-06</span>
|
|
208
|
+
capability = <span class="k">new</span> ProviderAdapter() <span class="c">// C-07</span>
|
|
209
|
+
audit = <span class="k">new</span> InjectionAudit() <span class="c">// G-02</span>
|
|
210
|
+
evidence = <span class="k">new</span> EvidenceUpdater() <span class="c">// G-01</span>
|
|
211
|
+
metrics = <span class="k">new</span> MetricsCollector() <span class="c">// G-04</span>
|
|
212
|
+
fallback = <span class="k">new</span> FallbackController() <span class="c">// G-05</span>
|
|
213
|
+
|
|
214
|
+
<span class="c">/* N-01: 运行时事件入口 */</span>
|
|
215
|
+
onSessionEvent(env: EventEnvelope) {
|
|
216
|
+
<span class="k">const</span> seg = this.observer.observe(env) <span class="c">// C-01</span>
|
|
217
|
+
<span class="k">if</span> (!seg) <span class="k">return</span>
|
|
218
|
+
this.runtime.push(seg) <span class="c">// C-02 → M-01</span>
|
|
219
|
+
this.proactiveTick(seg) <span class="c">// 主动链: 异步, 绝不阻塞原生链</span>
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
<span class="c">/* 未来主动 packet 链: 下一步请求边界前最多生效一次; 当前 M0/M1 维护快照不经过此检索链 */</span>
|
|
223
|
+
<span class="k">async</span> proactiveTick(seg: Segment) {
|
|
224
|
+
<span class="k">const</span> cur = this.runtime.cursor(seg.sessionId)
|
|
225
|
+
|
|
226
|
+
<span class="c">// C-03 门: 现在值不值得检索</span>
|
|
227
|
+
<span class="k">const</span> decision = this.gate.decide(this.runtime.window(seg.sessionId), seg, cur)
|
|
228
|
+
<span class="k">if</span> (decision.action === <span class="s">'suppress'</span>)
|
|
229
|
+
<span class="k">return</span> this.audit.suppressed(cur, decision.reason)
|
|
230
|
+
|
|
231
|
+
<span class="c">// C-04 召回(引擎级失败 → G-05 词法回退)</span>
|
|
232
|
+
<span class="k">const</span> cands = <span class="k">await</span> this.assoc.recall(seg, cur)
|
|
233
|
+
.catch(() => this.fallback.keywordRecall(seg, cur))
|
|
234
|
+
|
|
235
|
+
<span class="c">// C-05 排序/去重/预算 → G-03 安全门 → C-06 成包</span>
|
|
236
|
+
<span class="k">const</span> ranked = this.rank.run(cands, cur)
|
|
237
|
+
<span class="k">const</span> verdict = this.safety.check(ranked, this.runtime.scopeOf(seg.sessionId))
|
|
238
|
+
<span class="k">const</span> packet = this.broker.build(ranked, verdict, this.capability.snapshot())
|
|
239
|
+
|
|
240
|
+
<span class="c">// G-02 审计 + G-04 度量(无论注入与否)</span>
|
|
241
|
+
this.audit.injection(packet, verdict)
|
|
242
|
+
this.metrics.observe(packet, verdict)
|
|
243
|
+
|
|
244
|
+
<span class="c">// 当前维护快照走 systemPrompt.context(), 由 native RuntimeContextProjection 去重/替换</span>
|
|
245
|
+
<span class="c">// C-06 → N-03(未来 active path): MemoryPacket 只写 next-step inbox, 不改当前请求</span>
|
|
246
|
+
<span class="k">if</span> (packet && verdict.action === <span class="s">'allow'</span>) this.broker.syncInbox(packet)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
<span class="c">/* G-01 反馈回环: 工具结果 / 用户纠正 → 证据更新 → M-02/M-03/M-04 */</span>
|
|
250
|
+
onToolResult(ev) { this.evidence.record(ev) }
|
|
251
|
+
onUserCorrection(ev) { this.evidence.record(ev) }
|
|
252
|
+
}</code></pre>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="invariants"><strong>架构不变量(所有 Meta code 共同遵守)</strong>
|
|
255
|
+
<ul><li>跨 session 泄漏为零</li><li>已发出的请求不原地改写;主动记忆只在下一请求边界生效</li><li>过期 / contextVersion 不匹配的 packet 必丢弃,且不标记 delivered</li><li>记忆是参考资料不是指令;不覆盖 system / developer / 当前用户指令</li><li>Procedure 未经验证不自动执行;高风险副作用默认需要用户确认</li><li>检索中间态不写主 Session;session/event 是 append-only 事实源</li></ul>
|
|
256
|
+
</div>
|
|
257
|
+
</section>
|
|
258
|
+
|
|
259
|
+
<section class="lane-sec" id="lane-native">
|
|
260
|
+
<h2 class="lane-head native">NATIVE DSH REQUEST PLANE</h2>
|
|
261
|
+
<p class="lane-sub">① 原生请求面 — 已发出的请求不可改写;当前维护快照走 runtime-context,未来 packet 才走 next-step</p>
|
|
262
|
+
<div class="card-grid"> <article class="card" id="mod-events">
|
|
263
|
+
<div class="card-head">
|
|
264
|
+
<div class="card-topline">
|
|
265
|
+
<span class="card-code">N-01 · DSH 原生链路</span>
|
|
266
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
267
|
+
<span class="ringpos">主环 #1</span>
|
|
268
|
+
</div>
|
|
269
|
+
<h3 class="card-title">运行时事件</h3>
|
|
270
|
+
<p class="card-role">用户、工具、助手可见输出和 Agent 生命周期进入 Host 的可观测入口。</p>
|
|
271
|
+
</div>
|
|
272
|
+
<div class="edge-chips"><span class="edge-chip native">← N-08 工具结果 / 反馈 · replay</span><span class="edge-chip native">→ session 事实源 · append</span></div>
|
|
273
|
+
<pre class="meta"><code><span class="c">/* N-01 运行时事件 — 原生链路的可观测入口(append-only 事实源) */</span>
|
|
274
|
+
<span class="k">interface</span> EventEnvelope { <span class="c">// 观察信封: 只取最小标量快照</span>
|
|
275
|
+
schemaVersion: 1
|
|
276
|
+
sessionId: string; agentId: string
|
|
277
|
+
eventSeq: number; turn: number; step: number
|
|
278
|
+
sourceKind: <span class="s">'user'</span> | <span class="s">'tool'</span> | <span class="s">'agent'</span> | <span class="s">'lifecycle'</span>
|
|
279
|
+
callId?: string; rootCallId?: string
|
|
280
|
+
payloadDigest: string <span class="c">// 只存摘要, 不复制整个 payload</span>
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
<span class="c">// 消费结构化事件, 而不是解析模型文本:</span>
|
|
284
|
+
on(<span class="s">'session/event'</span>, e => observe(envelope(e, <span class="s">'lifecycle'</span>))) <span class="c">// 用户消息 / 生命周期</span>
|
|
285
|
+
on(<span class="s">'tools/result'</span>, r => observe(envelope(r, <span class="s">'tool'</span>))) <span class="c">// 成功 / 失败 / 重试 / 取消 / 纠正</span>
|
|
286
|
+
on(<span class="s">'agent/step'</span>, s => observe(envelope(s, <span class="s">'agent'</span>))) <span class="c">// 步边界</span>
|
|
287
|
+
|
|
288
|
+
<span class="c">// 硬约束: 检索中间态绝不写入 Session;</span>
|
|
289
|
+
<span class="c">// Session 回放必须与观察结果一致, 检索失败不得伪造 session 事件</span></code></pre>
|
|
290
|
+
</article>
|
|
291
|
+
<article class="card" id="mod-inbox">
|
|
292
|
+
<div class="card-head">
|
|
293
|
+
<div class="card-topline">
|
|
294
|
+
<span class="card-code">N-03 · DSH 原生链路</span>
|
|
295
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
296
|
+
<span class="ringpos">主环 #10</span>
|
|
297
|
+
</div>
|
|
298
|
+
<h3 class="card-title">Agent Inbox</h3>
|
|
299
|
+
<p class="card-role">未来 MemoryPacket 的持久 next-turn / next-step projection,通过 durable splice 事件维护;当前动态维护快照走 systemPrompt.context()。</p>
|
|
300
|
+
</div>
|
|
301
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-06 Injection Broker · future packet</span><span class="edge-chip native">→ N-04 Claim / Assemble · claim</span></div>
|
|
302
|
+
<pre class="meta"><code><span class="c">/* N-03 Agent Inbox — durable next-turn / next-step projection(未来 MemoryPacket 通道, 不是唯一注入面) */</span>
|
|
303
|
+
<span class="c">// 当前维护路径: systemPrompt.context() → native RuntimeContextProjection</span>
|
|
304
|
+
<span class="c">// 相同完整快照不重复创建 user-context, 变化快照替换之前的 projection</span>
|
|
305
|
+
<span class="c">// Inbox 三原语(未来 packet / 用户消息):</span>
|
|
306
|
+
<span class="c">// claim 步边界原子领取全部 next-step 输入 → 交给 assemble</span>
|
|
307
|
+
<span class="c">// inject 写 next-step 但不唤醒(未来主动 packet 默认走这里)</span>
|
|
308
|
+
<span class="c">// steer 写 next-step 并唤醒(仅用户 / 系统授权场景)</span>
|
|
309
|
+
|
|
310
|
+
<span class="k">function</span> syncInbox(packet: MemoryPacket) {
|
|
311
|
+
<span class="c">// 先在 claimed 或可见 surface 找重复, 有则删除 pending 副本</span>
|
|
312
|
+
<span class="k">if</span> (alreadyClaimed(packet.exactDigest) || alreadyVisible(packet.exactDigest))
|
|
313
|
+
<span class="k">return</span> dropPending(packet.id)
|
|
314
|
+
<span class="c">// durable splice: 先写 durable event, 再改 live projection</span>
|
|
315
|
+
inbox.splice({ op: <span class="s">'inject'</span>,
|
|
316
|
+
message: nextStepUserMessage(packet) })
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
<span class="c">// 约束: next-step 不是临时内存, future packet 持久存在直到被 claim 或显式移除;</span>
|
|
320
|
+
<span class="c">// 取消 / 重启 / 恢复后 pending 状态必须可重建</span></code></pre>
|
|
321
|
+
</article>
|
|
322
|
+
<article class="card" id="mod-claim">
|
|
323
|
+
<div class="card-head">
|
|
324
|
+
<div class="card-topline">
|
|
325
|
+
<span class="card-code">N-04 · DSH 原生链路</span>
|
|
326
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
327
|
+
<span class="ringpos">主环 #11</span>
|
|
328
|
+
</div>
|
|
329
|
+
<h3 class="card-title">Claim / Assemble</h3>
|
|
330
|
+
<p class="card-role">请求前先领取待处理消息,再组装 system prompt、runtime context 和工具。</p>
|
|
331
|
+
</div>
|
|
332
|
+
<div class="edge-chips"><span class="edge-chip native">← N-03 Agent Inbox · claim</span><span class="edge-chip native">→ N-05 agent/pre-step · assemble + waterfall</span></div>
|
|
333
|
+
<pre class="meta"><code><span class="c">/* N-04 Claim / Assemble — 请求前的原子领取与组装(真实顺序的锚点) */</span>
|
|
334
|
+
<span class="c">// 真实顺序: claim → systemPrompt.assemble(section + context) → runtime projection</span>
|
|
335
|
+
<span class="c">// → agent/pre-step waterfall → step/start → buildRequest</span>
|
|
336
|
+
|
|
337
|
+
<span class="k">async</span> <span class="k">function</span> stepBoundary(session) {
|
|
338
|
+
<span class="k">const</span> claimed = inbox.claimAll(session) <span class="c">// 原子领取 next-step + next-turn FIFO</span>
|
|
339
|
+
<span class="k">const</span> assembly = <span class="k">await</span> systemPrompt.assemble({ session })
|
|
340
|
+
<span class="k">const</span> sections = renderContextSections(assembly)
|
|
341
|
+
<span class="k">const</span> context = runtimeContext.project(joinContextSections(sections), sections)
|
|
342
|
+
<span class="k">return</span> { claimed, assembly, context }
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
<span class="c">// 约束: section/context provider 都是同步求值, 不能在其中 await 异步检索;</span>
|
|
346
|
+
<span class="c">// 稳定规则留在 section, 易变维护快照留在 context;</span>
|
|
347
|
+
<span class="c">// 未来异步 MemoryPacket 先进入 Inbox 或 projection queue, 再交给 pre-step waterfall</span></code></pre>
|
|
348
|
+
</article>
|
|
349
|
+
<article class="card" id="mod-prestep">
|
|
350
|
+
<div class="card-head">
|
|
351
|
+
<div class="card-topline">
|
|
352
|
+
<span class="card-code">N-05 · DSH 原生链路</span>
|
|
353
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
354
|
+
<span class="ringpos">主环 #12</span>
|
|
355
|
+
</div>
|
|
356
|
+
<h3 class="card-title">agent/pre-step</h3>
|
|
357
|
+
<p class="card-role">原生 runtime-context snapshot 与未来 packet 在下一步请求前汇合的 waterfall 边界。</p>
|
|
358
|
+
</div>
|
|
359
|
+
<div class="edge-chips"><span class="edge-chip native">← N-04 Claim / Assemble · assemble + waterfall</span><span class="edge-chip native">→ N-06 Build Request · request</span></div>
|
|
360
|
+
<pre class="meta"><code><span class="c">/* N-05 agent/pre-step — DSH 核心先组装, 再把 runtime context 交给 waterfall */</span>
|
|
361
|
+
<span class="k">async</span> <span class="k">function</span> nativePreStep(agent, target, position, signal) {
|
|
362
|
+
<span class="k">const</span> claimed = agent.inbox.claim(target, position.turn)
|
|
363
|
+
<span class="k">const</span> assembly = <span class="k">await</span> agent.loopCtx.systemPrompt.assemble(assembleContextFor(agent, signal))
|
|
364
|
+
signal.throwIfAborted()
|
|
365
|
+
<span class="k">const</span> sections = renderContextSections(assembly)
|
|
366
|
+
<span class="k">const</span> context = agent.runtimeContext.project(joinContextSections(sections), sections)
|
|
367
|
+
<span class="k">const</span> decision = <span class="k">await</span> agent.dispatch.waterfall(<span class="s">'agent/pre-step'</span>,
|
|
368
|
+
{ messages: claimed, ...position, signal },
|
|
369
|
+
() => Promise.resolve({
|
|
370
|
+
kind: <span class="s">'enter'</span>,
|
|
371
|
+
messages: context === undefined ? claimed : [...claimed, context]
|
|
372
|
+
}))
|
|
373
|
+
signal.throwIfAborted()
|
|
374
|
+
<span class="k">return</span> decision.kind === <span class="s">'reject'</span> ? decision : { ...decision, assembly }
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
<span class="c">// 当前 native context 在这里按完整文本去重; 变化时替换旧 projection</span>
|
|
378
|
+
<span class="c">// 未来 packet listener 只在 waterfall 中校验/保留/消费自己的 Inbox pending</span></code></pre>
|
|
379
|
+
</article>
|
|
380
|
+
<article class="card" id="mod-request">
|
|
381
|
+
<div class="card-head">
|
|
382
|
+
<div class="card-topline">
|
|
383
|
+
<span class="card-code">N-06 · DSH 原生链路</span>
|
|
384
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
385
|
+
<span class="ringpos">主环 #13</span>
|
|
386
|
+
</div>
|
|
387
|
+
<h3 class="card-title">Build Request</h3>
|
|
388
|
+
<p class="card-role">把 assembled context、可见历史、工具 schema 和当前路由形成精确请求。</p>
|
|
389
|
+
</div>
|
|
390
|
+
<div class="edge-chips"><span class="edge-chip native">← N-05 agent/pre-step · request</span><span class="edge-chip native">→ N-07 模型 / Provider · dispatch</span></div>
|
|
391
|
+
<pre class="meta"><code><span class="c">/* N-06 Build Request — 精确成形; 此后任何事件只影响下一 step/turn */</span>
|
|
392
|
+
<span class="k">interface</span> RequestAudit {
|
|
393
|
+
provider: string; model: string
|
|
394
|
+
reasoning: <span class="s">'none'</span> | <span class="s">'summary'</span> | <span class="s">'full'</span> | <span class="s">'unknown'</span>
|
|
395
|
+
packetBytes: number; packetDigest?: string
|
|
396
|
+
contextVersion: number
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
<span class="k">function</span> buildRequest({ assembly, messages, tools, history }) {
|
|
400
|
+
<span class="k">return</span> {
|
|
401
|
+
system: renderPrompt(assembly), <span class="c">// section 稳定前缀 → KV cache 复用</span>
|
|
402
|
+
messages: [...history.visible, ...messages], <span class="c">// context 是原生 user-role snapshot</span>
|
|
403
|
+
tools,
|
|
404
|
+
_audit: <span class="k">new</span> RequestAudit(), <span class="c">// 生效 provider/model/reasoning 可追踪</span>
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
<span class="c">// 未来 MemoryPacket 也只能追加到下一请求 messages, 不能改写已发请求</span>
|
|
409
|
+
<span class="c">// 约束: 动态段每步变化会击穿前缀缓存, 与稳定段分开预算;</span>
|
|
410
|
+
<span class="c">// 字符预算 ≠ 模型 token 预算; packet 成本单独核算</span></code></pre>
|
|
411
|
+
</article>
|
|
412
|
+
<article class="card" id="mod-model">
|
|
413
|
+
<div class="card-head">
|
|
414
|
+
<div class="card-topline">
|
|
415
|
+
<span class="card-code">N-07 · DSH 原生链路</span>
|
|
416
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
417
|
+
<span class="ringpos">主环 #14</span>
|
|
418
|
+
</div>
|
|
419
|
+
<h3 class="card-title">模型 / Provider</h3>
|
|
420
|
+
<p class="card-role">异构模型实际生成、调用工具并返回可观测结果。</p>
|
|
421
|
+
</div>
|
|
422
|
+
<div class="edge-chips"><span class="edge-chip native">← N-06 Build Request · dispatch</span><span class="edge-chip native">→ N-08 工具结果 / 反馈 · feedback</span></div>
|
|
423
|
+
<pre class="meta"><code><span class="c">/* N-07 模型 / Provider — 异构模型执行; 能力由 adapter 声明, 不按名字硬编码 */</span>
|
|
424
|
+
<span class="k">function</span> dispatch(req: BuiltRequest) {
|
|
425
|
+
<span class="k">const</span> cap = capability.snapshot(route(req)) <span class="c">// C-07 协商: reasoning / runtimeContext / packetPatch</span>
|
|
426
|
+
<span class="k">return</span> llm.complete(req) <span class="c">// → assistant output / tool calls / reasoning?</span>
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
<span class="c">// 约束: 公开 reasoning ≠ 完整、忠实的内部状态(CoT faithfulness);</span>
|
|
430
|
+
<span class="c">// 闭源模型只依赖用户 / 工具 / 可见输出 / 运行时事件;</span>
|
|
431
|
+
<span class="c">// reasoning trace 不单独写入事实、授权副作用或晋升技能</span></code></pre>
|
|
432
|
+
</article>
|
|
433
|
+
<article class="card" id="mod-toolResult">
|
|
434
|
+
<div class="card-head">
|
|
435
|
+
<div class="card-topline">
|
|
436
|
+
<span class="card-code">N-08 · DSH 原生链路</span>
|
|
437
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
438
|
+
<span class="ringpos">主环 #15</span>
|
|
439
|
+
</div>
|
|
440
|
+
<h3 class="card-title">工具结果 / 反馈</h3>
|
|
441
|
+
<p class="card-role">工具成功、失败、重试、取消和用户纠正是最可靠的运行时反馈。</p>
|
|
442
|
+
</div>
|
|
443
|
+
<div class="edge-chips"><span class="edge-chip native">← N-07 模型 / Provider · feedback</span><span class="edge-chip native">→ N-01 运行时事件 · replay</span></div>
|
|
444
|
+
<pre class="meta"><code><span class="c">/* N-08 工具结果 / 反馈 — 最可靠的运行时反馈(emit-only 冻结观测) */</span>
|
|
445
|
+
on(<span class="s">'tools/result'</span>, r => {
|
|
446
|
+
<span class="c">// freeze: 冻结结果只读, 绝不当作可原地修改的对象</span>
|
|
447
|
+
<span class="k">const</span> obs = { kind: <span class="s">'tool'</span>, callId: r.callId, rootCallId: r.rootCallId,
|
|
448
|
+
ok: r.ok, digest: digest(r.payload) }
|
|
449
|
+
observer.observe(obs) <span class="c">// → C-01</span>
|
|
450
|
+
evidence.record(obs) <span class="c">// → G-01(强化 / 削弱)</span>
|
|
451
|
+
})
|
|
452
|
+
|
|
453
|
+
<span class="c">// touch 延迟到 step/end 结算, 避免开放步骤抢跑;</span>
|
|
454
|
+
<span class="c">// 只有工具明确产生下一步说明时才使用 deferContext;</span>
|
|
455
|
+
<span class="c">// 成功 / 失败 / abort / 嵌套调用都能生成稳定 observation</span></code></pre>
|
|
456
|
+
</article></div>
|
|
457
|
+
</section>
|
|
458
|
+
<section class="lane-sec" id="lane-control">
|
|
459
|
+
<h2 class="lane-head control">PROACTIVE MEMORY CONTROL PLANE</h2>
|
|
460
|
+
<p class="lane-sub">② 主动控制面 — observe → retrieve → packet</p>
|
|
461
|
+
<div class="card-grid"> <article class="card" id="mod-observer">
|
|
462
|
+
<div class="card-head">
|
|
463
|
+
<div class="card-topline">
|
|
464
|
+
<span class="card-code">C-01 · 主动控制面</span>
|
|
465
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
466
|
+
<span class="ringpos">主环 #3</span>
|
|
467
|
+
</div>
|
|
468
|
+
<h3 class="card-title">ContextObserver</h3>
|
|
469
|
+
<p class="card-role">把原生事件转换为按 session 隔离的语义上下文片段。</p>
|
|
470
|
+
</div>
|
|
471
|
+
<div class="edge-chips"><span class="edge-chip planned">← session 事实源 · observe</span><span class="edge-chip planned">→ C-02 SessionRuntime · scope</span></div>
|
|
472
|
+
<pre class="meta"><code><span class="c">/* C-01 ContextObserver — 原生事件 → 按 session 隔离的语义上下文片段 */</span>
|
|
473
|
+
<span class="k">function</span> observe(env: EventEnvelope): Segment | null {
|
|
474
|
+
<span class="k">if</span> (env.schemaVersion !== 1) <span class="k">return</span> null <span class="c">// 版本不符直接丢</span>
|
|
475
|
+
<span class="k">const</span> text = sliceByKind(env) <span class="c">// 按事件类型切片, 不粗暴取最后 N token</span>
|
|
476
|
+
<span class="k">return</span> {
|
|
477
|
+
id: uid(), sessionId: env.sessionId, kind: env.sourceKind,
|
|
478
|
+
eventSeq: env.eventSeq, text,
|
|
479
|
+
entities: extract(text), digest: digest(text), ts: now(),
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
<span class="c">// 约束: 跨 session 合并事件 = 污染后续所有检索;</span>
|
|
484
|
+
<span class="c">// contextVersion 单调递增; 过期异步结果可丢弃;</span>
|
|
485
|
+
<span class="c">// reasoning chunk 可作可选 reasoning segment, 默认不持久化</span></code></pre>
|
|
486
|
+
</article>
|
|
487
|
+
<article class="card" id="mod-runtime">
|
|
488
|
+
<div class="card-head">
|
|
489
|
+
<div class="card-topline">
|
|
490
|
+
<span class="card-code">C-02 · 主动控制面</span>
|
|
491
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
492
|
+
<span class="ringpos">主环 #4</span>
|
|
493
|
+
</div>
|
|
494
|
+
<h3 class="card-title">SessionRuntime</h3>
|
|
495
|
+
<p class="card-role">每个 agent/session 的工作状态、上下文环、pending packet 和冷却。</p>
|
|
496
|
+
</div>
|
|
497
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-01 ContextObserver · scope</span><span class="edge-chip planned">→ M-01 Working Memory · window</span></div>
|
|
498
|
+
<pre class="meta"><code><span class="c">/* C-02 SessionRuntime — per-agent/session 运行态(消灭全局状态) */</span>
|
|
499
|
+
<span class="k">const</span> states = <span class="k">new</span> WeakMap<Agent, AgentMemoryState>() <span class="c">// 执行 token 用 Map 关联嵌套观测</span>
|
|
500
|
+
|
|
501
|
+
<span class="k">interface</span> AgentMemoryState {
|
|
502
|
+
working: RingBuffer<Segment> <span class="c">// → M-01 工作记忆</span>
|
|
503
|
+
cursor: ContextCursor <span class="c">// 单调递增</span>
|
|
504
|
+
pending: MemoryPacket[] <span class="c">// 待注入队列</span>
|
|
505
|
+
cooldown: Map<string, number> <span class="c">// 触发冷却</span>
|
|
506
|
+
sidecarJob?: AbortController
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
<span class="k">function</span> teardown(agent) {
|
|
510
|
+
states.get(agent)?.sidecarJob?.abort() <span class="c">// abort 检索 → sidecar quiescence → 清理 map</span>
|
|
511
|
+
states.delete(agent)
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
<span class="c">// 验收: 并发 A/B session 隔离为零泄漏;</span>
|
|
515
|
+
<span class="c">// 不再依赖进程级 _lastAgent / 全局 _consolidating / 全局 pending queue</span></code></pre>
|
|
516
|
+
</article>
|
|
517
|
+
<article class="card" id="mod-gate">
|
|
518
|
+
<div class="card-head">
|
|
519
|
+
<div class="card-topline">
|
|
520
|
+
<span class="card-code">C-03 · 主动控制面</span>
|
|
521
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
522
|
+
<span class="ringpos">主环 #6</span>
|
|
523
|
+
</div>
|
|
524
|
+
<h3 class="card-title">Retrieval Gate</h3>
|
|
525
|
+
<p class="card-role">动态判断现在是否值得检索,而不是每一步固定召回。</p>
|
|
526
|
+
</div>
|
|
527
|
+
<div class="edge-chips"><span class="edge-chip planned">← M-01 Working Memory · signal</span><span class="edge-chip research">← R-01 Research Signals · trigger</span><span class="edge-chip planned">→ C-04 Association Engine · retrieve</span></div>
|
|
528
|
+
<pre class="meta"><code><span class="c">/* C-03 Retrieval Gate — 动态判断"现在值不值得检索"(无 CoT 也成立) */</span>
|
|
529
|
+
<span class="k">interface</span> GateDecision { action: <span class="s">'retrieve'</span> | <span class="s">'prefetch'</span> | <span class="s">'suppress'</span>; reason: string }
|
|
530
|
+
|
|
531
|
+
<span class="k">function</span> decide(win: Segment[], seg: Segment, cur: ContextCursor): GateDecision {
|
|
532
|
+
<span class="k">const</span> signals = {
|
|
533
|
+
novelty: !win.some(s => s.digest === seg.digest), <span class="c">// 新颖度</span>
|
|
534
|
+
unresolved: unresolvedEntities(win).length > 0, <span class="c">// 未决实体</span>
|
|
535
|
+
phaseShift: taskPhase(win) !== taskPhase(win.slice(0, -1)), <span class="c">// 任务阶段变化</span>
|
|
536
|
+
toolFailure: seg.kind === <span class="s">'tool'</span> && !seg.ok, <span class="c">// 工具失败</span>
|
|
537
|
+
conflict: conflictCount(cur.sessionId) > 0, <span class="c">// 冲突</span>
|
|
538
|
+
historical: hitRecent(cur.sessionId) !== null, <span class="c">// 相似历史命中</span>
|
|
539
|
+
}
|
|
540
|
+
<span class="k">if</span> (cooldownActive(cur)) <span class="k">return</span> { action: <span class="s">'suppress'</span>, reason: <span class="s">'cooldown'</span> }
|
|
541
|
+
<span class="k">if</span> (ignoredMemory(cur, seg.digest)) <span class="k">return</span> { action: <span class="s">'suppress'</span>, reason: <span class="s">'user-ignored'</span> }
|
|
542
|
+
<span class="k">const</span> s = weighted(signals) <span class="c">// 权重来自 R-02 认知模型 + R-01 论文启发</span>
|
|
543
|
+
<span class="k">return</span> s >= HOT ? { action: <span class="s">'retrieve'</span>, reason: <span class="s">'above-threshold'</span> }
|
|
544
|
+
: s >= WARM ? { action: <span class="s">'prefetch'</span>, reason: <span class="s">'warm'</span> }
|
|
545
|
+
: { action: <span class="s">'suppress'</span>, reason: <span class="s">'below-threshold'</span> }
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
<span class="c">// 公开模型可增加 uncertainty / reasoning 信号, 但不是硬依赖;</span>
|
|
549
|
+
<span class="c">// cognitive load 不是"记忆只在困难时出现"的硬门;</span>
|
|
550
|
+
<span class="c">// 滞回 + 冷却 + "已忽略记忆"抑制避免反复打扰</span></code></pre>
|
|
551
|
+
</article>
|
|
552
|
+
<article class="card" id="mod-association">
|
|
553
|
+
<div class="card-head">
|
|
554
|
+
<div class="card-topline">
|
|
555
|
+
<span class="card-code">C-04 · 主动控制面</span>
|
|
556
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
557
|
+
<span class="ringpos">主环 #7</span>
|
|
558
|
+
</div>
|
|
559
|
+
<h3 class="card-title">Association Engine</h3>
|
|
560
|
+
<p class="card-role">从预索引记忆中找出当前情境可能自动唤回的候选。</p>
|
|
561
|
+
</div>
|
|
562
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-03 Retrieval Gate · retrieve</span><span class="edge-chip planned">← M-02 Episodic Memory · recall</span><span class="edge-chip planned">← M-03 Semantic / Profile · recall</span><span class="edge-chip guard">← M-04 Procedural Memory · checklist</span><span class="edge-chip research">← M-05 Lexical / Entity · entity</span><span class="edge-chip planned">← M-07 Python Memory Engine · sidecar</span><span class="edge-chip guard">← G-05 Fallback / Degrade · degrade</span><span class="edge-chip research">← R-02 Cognitive Model · model</span><span class="edge-chip planned">→ C-05 Rank / Dedupe / Budget · candidates</span></div>
|
|
563
|
+
<pre class="meta"><code><span class="c">/* C-04 Association Engine — 三级检索: 词法初筛 → 向量/时间过滤 → 图扩散 */</span>
|
|
564
|
+
<span class="k">async</span> <span class="k">function</span> recall(seg: Segment, cur: ContextCursor): Promise<Candidate[]> {
|
|
565
|
+
<span class="k">const</span> hits: Candidate[] = []
|
|
566
|
+
|
|
567
|
+
<span class="c">// ① 关键词 / 实体快速初筛(永远可用)</span>
|
|
568
|
+
hits.push(...lexical.hits(seg.entities, seg.text)) <span class="c">// M-05</span>
|
|
569
|
+
|
|
570
|
+
<span class="c">// ② 向量 + 时间过滤(sidecar, 可降级)</span>
|
|
571
|
+
<span class="k">const</span> emb = <span class="k">await</span> sidecar.embed(seg.text, cur) <span class="c">// M-07</span>
|
|
572
|
+
<span class="k">if</span> (emb.ok) hits.push(...<span class="k">await</span> sidecar.vsearch(emb.vec, cur.scope))
|
|
573
|
+
<span class="k">else</span> hits.push(...fallbackKeyword(seg.text)) <span class="c">// G-05 词法回退</span>
|
|
574
|
+
|
|
575
|
+
<span class="c">// ③ 必要时图扩散(HippoRAG PPR / A-MEM 链接)</span>
|
|
576
|
+
<span class="k">if</span> (graphEnabled && hits.length < k)
|
|
577
|
+
hits.push(...<span class="k">await</span> sidecar.graphExpand(seg.entities))
|
|
578
|
+
|
|
579
|
+
<span class="c">// embedding 元数据(model / dimension / version)随索引持久化, 版本不一致不得混用</span>
|
|
580
|
+
<span class="c">// 图链接追加证据且可撤销, 避免一次错误扩散污染整个图</span>
|
|
581
|
+
<span class="k">return</span> hits
|
|
582
|
+
}</code></pre>
|
|
583
|
+
</article>
|
|
584
|
+
<article class="card" id="mod-rank">
|
|
585
|
+
<div class="card-head">
|
|
586
|
+
<div class="card-topline">
|
|
587
|
+
<span class="card-code">C-05 · 主动控制面</span>
|
|
588
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
589
|
+
<span class="ringpos">主环 #8</span>
|
|
590
|
+
</div>
|
|
591
|
+
<h3 class="card-title">Rank / Dedupe / Budget</h3>
|
|
592
|
+
<p class="card-role">把"相关"变成有限、可解释、不会重复的候选集合。</p>
|
|
593
|
+
</div>
|
|
594
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-04 Association Engine · candidates</span><span class="edge-chip planned">→ C-06 Injection Broker · policy</span></div>
|
|
595
|
+
<pre class="meta"><code><span class="c">/* C-05 Rank / Dedupe / Budget — 把"相关"变成有限、可解释、不重复的候选集 */</span>
|
|
596
|
+
<span class="k">function</span> run(cands: Candidate[], cur: ContextCursor): RankedResult {
|
|
597
|
+
<span class="k">const</span> scored = cands
|
|
598
|
+
.filter(c => c.scope === cur.scope && c.expiresAt > now()) <span class="c">// scope + TTL</span>
|
|
599
|
+
.map(c => ({ c, s: wSim * c.similarity + wSal * c.salience
|
|
600
|
+
+ wNov * novelty(c, cur) + wRec * recency(c, cur) }))
|
|
601
|
+
.sort((a, b) => b.s - a.s)
|
|
602
|
+
|
|
603
|
+
<span class="k">const</span> kept = [], dropped = []
|
|
604
|
+
<span class="k">const</span> seen = <span class="k">new</span> Set()
|
|
605
|
+
<span class="k">for</span> (<span class="k">const</span> x of scored) {
|
|
606
|
+
<span class="k">const</span> key = dedupeKey(x.c, cur) <span class="c">// session/agent + context cursor</span>
|
|
607
|
+
<span class="c">// + exact/semantic digest + schema/index 版本</span>
|
|
608
|
+
<span class="k">if</span> (seen.has(key)) { dropped.push({ id: x.c.id, reason: <span class="s">'duplicate'</span> }); continue }
|
|
609
|
+
<span class="k">if</span> (bytes + x.c.payload.length > budget.candidateBytes)
|
|
610
|
+
{ dropped.push({ id: x.c.id, reason: <span class="s">'budget'</span> }); continue }
|
|
611
|
+
seen.add(key); kept.push(x)
|
|
612
|
+
}
|
|
613
|
+
<span class="k">return</span> { ranked: kept, dropped } <span class="c">// 每个 drop 都有理由</span>
|
|
614
|
+
|
|
615
|
+
<span class="c">// 预算分层: 摄取上限 → 候选延迟上限 → packet UTF-8 bytes → token/context window</span>
|
|
616
|
+
<span class="c">// 超预算候选不得标记 delivered; TTL 只触发重检索, 不充当内容 identity</span>
|
|
617
|
+
}</code></pre>
|
|
618
|
+
</article>
|
|
619
|
+
<article class="card" id="mod-broker">
|
|
620
|
+
<div class="card-head">
|
|
621
|
+
<div class="card-topline">
|
|
622
|
+
<span class="card-code">C-06 · 主动控制面</span>
|
|
623
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
624
|
+
<span class="ringpos">主环 #9</span>
|
|
625
|
+
</div>
|
|
626
|
+
<h3 class="card-title">Injection Broker</h3>
|
|
627
|
+
<p class="card-role">决定未来候选记忆是否在下一请求边界变成 MemoryPacket;不负责当前 native runtime-context snapshot。</p>
|
|
628
|
+
</div>
|
|
629
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-05 Rank / Dedupe / Budget · policy</span><span class="edge-chip planned">← G-02 Injection Audit · audit</span><span class="edge-chip guard">← G-03 Safety Gate · gate</span><span class="edge-chip planned">← C-07 Provider Adapter · adapter</span><span class="edge-chip planned">→ N-03 Agent Inbox · future packet</span></div>
|
|
630
|
+
<pre class="meta"><code><span class="c">/* C-06 Injection Broker — 候选 → 下一请求边界的 MemoryPacket(或放弃) */</span>
|
|
631
|
+
<span class="k">function</span> build(ranked, verdict: SafetyVerdict, cap): MemoryPacket | null {
|
|
632
|
+
<span class="k">if</span> (!cap.packetPatch || cap.packetPatch === <span class="s">'none'</span>) <span class="k">return</span> null <span class="c">// runtime-context 不是未来 packet 通道</span>
|
|
633
|
+
<span class="k">if</span> (verdict.action !== <span class="s">'allow'</span>) <span class="k">return</span> null <span class="c">// G-03 拦截</span>
|
|
634
|
+
<span class="k">return</span> {
|
|
635
|
+
packetSchemaVersion: 1,
|
|
636
|
+
contextCursor: cur, <span class="c">// 与 retrievalVersion 一起校验新鲜度</span>
|
|
637
|
+
retrievalVersion: indexVersion(),
|
|
638
|
+
triggerReason: verdict.trigger,
|
|
639
|
+
strength: pickStrength(ranked, cap), <span class="c">// soft hint / direct context / checklist</span>
|
|
640
|
+
items: ranked,
|
|
641
|
+
exactDigest: exactDigest(ranked), semanticDigest: semanticDigest(ranked),
|
|
642
|
+
sourceSeqs: ranked.map(c => c.sourceSeq),
|
|
643
|
+
budgetBytes: totalBytes(ranked), expiry: now() + ttl,
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
<span class="c">// 约束: packet 不是高优先级新指令; 请求发出后不回写隐藏状态;</span>
|
|
648
|
+
<span class="c">// 任何注入都能回答 why / what / source / cost / expiry</span></code></pre>
|
|
649
|
+
</article>
|
|
650
|
+
<article class="card" id="mod-capability">
|
|
651
|
+
<div class="card-head">
|
|
652
|
+
<div class="card-topline">
|
|
653
|
+
<span class="card-code">C-07 · 主动控制面</span>
|
|
654
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
655
|
+
<span class="ringpos dim">支线模块</span>
|
|
656
|
+
</div>
|
|
657
|
+
<h3 class="card-title">Provider Adapter</h3>
|
|
658
|
+
<p class="card-role">按 Provider、model、version 分开协商 reasoning、native runtime context 与未来 packet surface。</p>
|
|
659
|
+
</div>
|
|
660
|
+
<div class="edge-chips"><span class="edge-chip planned">→ C-06 Injection Broker · adapter</span></div>
|
|
661
|
+
<pre class="meta"><code><span class="c">/* C-07 Provider Adapter — 分开声明 native runtime context 与 future packet surface */</span>
|
|
662
|
+
<span class="k">function</span> snapshot(route): CapabilitySnapshot {
|
|
663
|
+
<span class="k">const</span> m = manifest(route.provider, route.model, route.modelVersion)
|
|
664
|
+
<span class="k">return</span> {
|
|
665
|
+
reasoningVisibility: m.reasoning ?? <span class="s">'unknown'</span>, <span class="c">// none / summary / full / unknown</span>
|
|
666
|
+
runtimeContext: m.includeRuntimeContext !== false ? <span class="s">'native'</span> : <span class="s">'none'</span>,
|
|
667
|
+
packetPatch: m.supportsPreStep ? <span class="s">'pre-step'</span>
|
|
668
|
+
: m.supportsUserMessage ? <span class="s">'user-message'</span>
|
|
669
|
+
: <span class="s">'none'</span>,
|
|
670
|
+
abortAndResume: !!m.abortAndResume,
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
<span class="c">// runtimeContext = native systemPrompt.context() + RuntimeContextProjection</span>
|
|
675
|
+
<span class="c">// packetPatch = future Agent Inbox / next-step MemoryPacket path</span>
|
|
676
|
+
<span class="c">// includeRuntimeContext:false suppresses the first channel; it does not create the second</span>
|
|
677
|
+
<span class="c">// Minimal complete persona: complete:true + includeRuntimeContext:false</span>
|
|
678
|
+
<span class="c">// → native runtime-context 被抑制, 不能假设已挂载 dsh-agent-instructions</span>
|
|
679
|
+
<span class="c">// → 未来需自建 packetPatch user/message 路径, 否则安全降级 shadow retrieval</span>
|
|
680
|
+
<span class="c">// 约束: 不能按"模型名称"硬编码能力; preset 不支持 patch 时不强行改请求</span></code></pre>
|
|
681
|
+
</article></div>
|
|
682
|
+
</section>
|
|
683
|
+
<section class="lane-sec" id="lane-memory">
|
|
684
|
+
<h2 class="lane-head memory">COGNITIVE MEMORY PLANE</h2>
|
|
685
|
+
<p class="lane-sub">③ 认知记忆面 — working / episodic / semantic / procedural / lexical / projection / sidecar</p>
|
|
686
|
+
<div class="card-grid"> <article class="card" id="mod-working">
|
|
687
|
+
<div class="card-head">
|
|
688
|
+
<div class="card-topline">
|
|
689
|
+
<span class="card-code">M-01 · 认知记忆面</span>
|
|
690
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
691
|
+
<span class="ringpos">主环 #5</span>
|
|
692
|
+
</div>
|
|
693
|
+
<h3 class="card-title">Working Memory</h3>
|
|
694
|
+
<p class="card-role">当前 session 的短期注意力缓冲:目标、窗口、未决事项、最近结果和 pending packet。</p>
|
|
695
|
+
</div>
|
|
696
|
+
<div class="edge-chips"><span class="edge-chip planned">← C-02 SessionRuntime · window</span><span class="edge-chip planned">→ C-03 Retrieval Gate · signal</span></div>
|
|
697
|
+
<pre class="meta"><code><span class="c">/* M-01 Working Memory — session 内短期注意力缓冲(ring + TTL, 不跨 session) */</span>
|
|
698
|
+
<span class="k">class</span> WorkingMemory {
|
|
699
|
+
ring: Segment[] = []
|
|
700
|
+
cap = 32; ttl = 15 * 60_000
|
|
701
|
+
|
|
702
|
+
push(seg) { this.ring.push(seg); this.evict() } <span class="c">// 按最旧/TTL/重复淘汰, 可解释</span>
|
|
703
|
+
window() { <span class="k">return</span> this.ring.filter(s => now() - s.ts < this.ttl) }
|
|
704
|
+
signals() { <span class="c">// → C-03 gate</span>
|
|
705
|
+
<span class="k">return</span> { unresolved: this.unresolved(), phase: this.phase(),
|
|
706
|
+
last: this.ring.at(-1) }
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
<span class="c">// 按语义片段而非粗暴最后 N token;</span>
|
|
711
|
+
<span class="c">// 高相关候选可静默预取(pending), 不必立即注入;</span>
|
|
712
|
+
<span class="c">// 容量无限增长会让"联想"退化成全量 RAG</span></code></pre>
|
|
713
|
+
</article>
|
|
714
|
+
<article class="card" id="mod-episodic">
|
|
715
|
+
<div class="card-head">
|
|
716
|
+
<div class="card-topline">
|
|
717
|
+
<span class="card-code">M-02 · 认知记忆面</span>
|
|
718
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
719
|
+
<span class="ringpos dim">支线模块</span>
|
|
720
|
+
</div>
|
|
721
|
+
<h3 class="card-title">Episodic Memory</h3>
|
|
722
|
+
<p class="card-role">带时间、动作、工具结果和失败证据的事件经验。</p>
|
|
723
|
+
</div>
|
|
724
|
+
<div class="edge-chips"><span class="edge-chip planned">→ C-04 Association Engine · recall</span></div>
|
|
725
|
+
<pre class="meta"><code><span class="c">/* M-02 Episodic Memory — 带时间/动作/结果/失败证据的事件经验 */</span>
|
|
726
|
+
<span class="k">interface</span> Episode {
|
|
727
|
+
intent: string; actions: string[]; entities: string[]
|
|
728
|
+
unresolved: string[]; outcome: <span class="s">'success'</span> | <span class="s">'failure'</span>
|
|
729
|
+
provenance: string <span class="c">// sessionId + '#' + turn + '.' + step</span>
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
<span class="k">function</span> record(ev) {
|
|
733
|
+
<span class="k">const</span> ep = { intent: infer(ev), actions: ev.actions, entities: ev.entities,
|
|
734
|
+
unresolved: ev.unresolved, outcome: ev.ok ? <span class="s">'success'</span> : <span class="s">'failure'</span>,
|
|
735
|
+
provenance: sessionId + <span class="s">'#'</span> + turn + <span class="s">'.'</span> + step }
|
|
736
|
+
sidecar.append(<span class="s">'episodes.jsonl'</span>, ep) <span class="c">// 轻量事件先落 sidecar</span>
|
|
737
|
+
scheduleIdle(() => consolidate(ep)) <span class="c">// 空闲期摘要 + 巩固 → 候选进 M-03</span>
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
<span class="c">// 失败经验默认是 candidate, 不直接是事实;</span>
|
|
741
|
+
<span class="c">// 错误自我解释被持久化 = 污染长期层</span></code></pre>
|
|
742
|
+
</article>
|
|
743
|
+
<article class="card" id="mod-semantic">
|
|
744
|
+
<div class="card-head">
|
|
745
|
+
<div class="card-topline">
|
|
746
|
+
<span class="card-code">M-03 · 认知记忆面</span>
|
|
747
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
748
|
+
<span class="ringpos dim">支线模块</span>
|
|
749
|
+
</div>
|
|
750
|
+
<h3 class="card-title">Semantic / Profile</h3>
|
|
751
|
+
<p class="card-role">去重后的项目事实、环境约束、用户偏好和稳定决策。</p>
|
|
752
|
+
</div>
|
|
753
|
+
<div class="edge-chips"><span class="edge-chip planned">← M-06 Readable Projection · promote</span><span class="edge-chip planned">← G-01 Evidence Updater · update</span><span class="edge-chip planned">→ C-04 Association Engine · recall</span></div>
|
|
754
|
+
<pre class="meta"><code><span class="c">/* M-03 Semantic / Profile — 去重后的项目事实 / 环境约束 / 用户偏好 / 稳定决策 */</span>
|
|
755
|
+
<span class="k">interface</span> Fact {
|
|
756
|
+
scope: Scope
|
|
757
|
+
subject: string; predicate: string; object?: string
|
|
758
|
+
provenance: string[]; confirmedAt: number
|
|
759
|
+
ttl?: number; revoked?: boolean
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
<span class="k">function</span> upsert(cand: FactCandidate) {
|
|
763
|
+
<span class="k">if</span> (conflicts(cand)) <span class="k">return</span> conflicts.add(cand) <span class="c">// 冲突集保留双方 provenance</span>
|
|
764
|
+
<span class="k">const</span> existing = find(cand.subject, cand.predicate)
|
|
765
|
+
<span class="k">if</span> (existing && cand.source === <span class="s">'inference'</span>) <span class="k">return</span> <span class="c">// 自动推断不覆盖硬规则</span>
|
|
766
|
+
store.put(merge(existing, cand)) <span class="c">// → M-06 投影 + sidecar 索引</span>
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
<span class="c">// 用户明确声明 > 模型推断; 项目事实 / 用户画像 / 术语分开;</span>
|
|
770
|
+
<span class="c">// 冲突可见、可确认、可撤销(revoked)</span></code></pre>
|
|
771
|
+
</article>
|
|
772
|
+
<article class="card" id="mod-procedural">
|
|
773
|
+
<div class="card-head">
|
|
774
|
+
<div class="card-topline">
|
|
775
|
+
<span class="card-code">M-04 · 认知记忆面</span>
|
|
776
|
+
<span class="badge guard">GUARD · 安全</span>
|
|
777
|
+
<span class="ringpos dim">支线模块</span>
|
|
778
|
+
</div>
|
|
779
|
+
<h3 class="card-title">Procedural Memory</h3>
|
|
780
|
+
<p class="card-role">经过独立成功验证的步骤、技能、检查清单和回滚流程。</p>
|
|
781
|
+
</div>
|
|
782
|
+
<div class="edge-chips"><span class="edge-chip guard">← G-01 Evidence Updater · promote</span><span class="edge-chip guard">→ C-04 Association Engine · checklist</span></div>
|
|
783
|
+
<pre class="meta"><code><span class="c">/* M-04 Procedural Memory — 经验证的步骤/技能/检查清单(guard 级) */</span>
|
|
784
|
+
<span class="k">type</span> Stage = <span class="s">'observed'</span> | <span class="s">'candidate'</span> | <span class="s">'validated'</span> | <span class="s">'active'</span> | <span class="s">'deprecated'</span>
|
|
785
|
+
|
|
786
|
+
<span class="k">interface</span> Procedure {
|
|
787
|
+
preconditions: string[]; steps: string[]; checks: string[]
|
|
788
|
+
successCriteria: string[]; rollback: string[]
|
|
789
|
+
riskLevel: <span class="s">'low'</span> | <span class="s">'medium'</span> | <span class="s">'high'</span>; requiresApproval: boolean
|
|
790
|
+
stage: Stage; evidence: string[]
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
<span class="k">function</span> promote(p: Procedure) {
|
|
794
|
+
<span class="k">if</span> (p.riskLevel === <span class="s">'high'</span> && p.requiresApproval && !userApproved)
|
|
795
|
+
<span class="k">return</span> { action: <span class="s">'ask'</span> } <span class="c">// 永远先问, G-03</span>
|
|
796
|
+
<span class="k">if</span> (!crossSessionEvidence(p)) <span class="k">return</span> <span class="c">// 跨独立 session 证据不足则停</span>
|
|
797
|
+
p.stage = <span class="s">'validated'</span>; store.put(p)
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
<span class="c">// 注入形态: 只作建议 / checklist packet;</span>
|
|
801
|
+
<span class="c">// 高风险工具(SSH/部署/删除)永不因相似度自动执行;</span>
|
|
802
|
+
<span class="c">// 一次成功或三次重复都不足以证明技能可靠</span></code></pre>
|
|
803
|
+
</article>
|
|
804
|
+
<article class="card" id="mod-lexical">
|
|
805
|
+
<div class="card-head">
|
|
806
|
+
<div class="card-topline">
|
|
807
|
+
<span class="card-code">M-05 · 认知记忆面</span>
|
|
808
|
+
<span class="badge research">RESEARCH · 研究</span>
|
|
809
|
+
<span class="ringpos dim">支线模块</span>
|
|
810
|
+
</div>
|
|
811
|
+
<h3 class="card-title">Lexical / Entity</h3>
|
|
812
|
+
<p class="card-role">术语、缩写、别名和实体对齐层,帮助关联检索但不等于用户画像。</p>
|
|
813
|
+
</div>
|
|
814
|
+
<div class="edge-chips"><span class="edge-chip research">→ C-04 Association Engine · entity</span></div>
|
|
815
|
+
<pre class="meta"><code><span class="c">/* M-05 Lexical / Entity — 术语/缩写/别名/实体对齐(检索增强层) */</span>
|
|
816
|
+
<span class="k">function</span> hits(entities: string[], text: string): Candidate[] {
|
|
817
|
+
<span class="k">return</span> entities
|
|
818
|
+
.flatMap(e => aliasIndex[e] ?? []) <span class="c">// 别名展开</span>
|
|
819
|
+
.map(n => ({ ...n, source: <span class="s">'lexical'</span>, score: LOW_PRIOR }))
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
<span class="c">// 词法别名是低风险检索增强, 不直接提升事实置信度;</span>
|
|
823
|
+
<span class="c">// 实体关系可连接 semantic / episodic / procedure 节点;</span>
|
|
824
|
+
<span class="c">// 冲突别名保留来源与 scope; 可撤销且不覆盖原文; 共现 ≠ 偏好/事实</span></code></pre>
|
|
825
|
+
</article>
|
|
826
|
+
<article class="card" id="mod-projection">
|
|
827
|
+
<div class="card-head">
|
|
828
|
+
<div class="card-topline">
|
|
829
|
+
<span class="card-code">M-06 · 认知记忆面</span>
|
|
830
|
+
<span class="badge native">NATIVE · 原生</span>
|
|
831
|
+
<span class="ringpos dim">支线模块</span>
|
|
832
|
+
</div>
|
|
833
|
+
<h3 class="card-title">Readable Projection</h3>
|
|
834
|
+
<p class="card-role">Markdown 是用户可读、可编辑、可备份的持久投影;sidecar 承担运行时索引。</p>
|
|
835
|
+
</div>
|
|
836
|
+
<div class="edge-chips"><span class="edge-chip planned">→ M-03 Semantic / Profile · promote</span></div>
|
|
837
|
+
<pre class="meta"><code><span class="c">/* M-06 Readable Projection — Markdown 是事实可见性边界, sidecar 是运行时索引 */</span>
|
|
838
|
+
<span class="k">function</span> project(fact: Fact) {
|
|
839
|
+
writeMarkdown(target(fact.scope), render(fact)) <span class="c">// MEMORY.md / 日志 / 反思, 保留现有结构</span>
|
|
840
|
+
sidecar.index(fact) <span class="c">// JSONL / SQLite / vector 元数据</span>
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
<span class="c">// sidecar 损坏可从 Markdown 重建; 新增元数据不覆盖 Markdown;</span>
|
|
844
|
+
<span class="c">// 写入与索引更新必须原子或可恢复;</span>
|
|
845
|
+
<span class="c">// 验收: 关闭新层时现有 Markdown 行为不变</span></code></pre>
|
|
846
|
+
</article>
|
|
847
|
+
<article class="card" id="mod-python">
|
|
848
|
+
<div class="card-head">
|
|
849
|
+
<div class="card-topline">
|
|
850
|
+
<span class="card-code">M-07 · 认知记忆面</span>
|
|
851
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
852
|
+
<span class="ringpos dim">支线模块</span>
|
|
853
|
+
</div>
|
|
854
|
+
<h3 class="card-title">Python Memory Engine</h3>
|
|
855
|
+
<p class="card-role">可选 sidecar:embedding、向量/图检索、reranker、衰减和离线评测。</p>
|
|
856
|
+
</div>
|
|
857
|
+
<div class="edge-chips"><span class="edge-chip planned">→ C-04 Association Engine · sidecar</span></div>
|
|
858
|
+
<pre class="meta"><code><span class="c">/* M-07 Python Memory Engine — 可选 sidecar(JSONL 协议, 失败回退 JS) */</span>
|
|
859
|
+
<span class="k">interface</span> SidecarRequest {
|
|
860
|
+
requestId: string; contextVersion: number
|
|
861
|
+
op: <span class="s">'embed'</span> | <span class="s">'search'</span> | <span class="s">'graph-expand'</span> | <span class="s">'consolidate'</span>
|
|
862
|
+
payload: JsonValue
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
<span class="c">// JS Host: 无 shell 的 spawn/execFile 拉起长驻 worker; lazy start</span>
|
|
866
|
+
<span class="c">// stdout 只输出 JSONL; stderr 输出日志</span>
|
|
867
|
+
<span class="k">async</span> <span class="k">function</span> call(req: SidecarRequest) {
|
|
868
|
+
<span class="k">const</span> res = <span class="k">await</span> timeout(3000, jsonl(request(req)),
|
|
869
|
+
() => { sidecar.restart(); <span class="k">return</span> FALLBACK })
|
|
870
|
+
<span class="k">if</span> (res.contextVersion !== cur.contextVersion) <span class="k">return</span> DROP <span class="c">// 版本不匹配必丢弃</span>
|
|
871
|
+
<span class="k">return</span> res.candidates
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
<span class="c">// Python 崩溃/超时/未安装 → 回退 JS 关键词检索;</span>
|
|
875
|
+
<span class="c">// sidecar 不接触 ctx / Agent 对象 / 请求; 不修改请求</span></code></pre>
|
|
876
|
+
</article></div>
|
|
877
|
+
</section>
|
|
878
|
+
<section class="lane-sec" id="lane-governance">
|
|
879
|
+
<h2 class="lane-head governance">EVIDENCE · SAFETY · OPERATIONS</h2>
|
|
880
|
+
<p class="lane-sub">④ 证据 · 安全 · 运营 — 升格 / 审计 / 安全门 / 度量 / 降级 / 理论</p>
|
|
881
|
+
<div class="card-grid"> <article class="card" id="mod-evidence">
|
|
882
|
+
<div class="card-head">
|
|
883
|
+
<div class="card-topline">
|
|
884
|
+
<span class="card-code">G-01 · 治理与运营</span>
|
|
885
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
886
|
+
<span class="ringpos dim">支线模块</span>
|
|
887
|
+
</div>
|
|
888
|
+
<h3 class="card-title">Evidence Updater</h3>
|
|
889
|
+
<p class="card-role">根据成功、失败、纠正、复用和冲突更新记忆证据与状态。</p>
|
|
890
|
+
</div>
|
|
891
|
+
<div class="edge-chips"><span class="edge-chip planned">→ M-03 Semantic / Profile · update</span><span class="edge-chip guard">→ M-04 Procedural Memory · promote</span></div>
|
|
892
|
+
<pre class="meta"><code><span class="c">/* G-01 Evidence Updater — 结果证据驱动的置信度与升格决策 */</span>
|
|
893
|
+
<span class="k">function</span> record(ev) {
|
|
894
|
+
<span class="k">if</span> (ev.kind === <span class="s">'tool'</span>) {
|
|
895
|
+
ev.ok ? reinforce(ev.provenance) <span class="c">// 成功复用 → confidence ↑</span>
|
|
896
|
+
: weaken(ev.provenance) <span class="c">// 失败 → ↓</span>
|
|
897
|
+
}
|
|
898
|
+
<span class="k">if</span> (ev.kind === <span class="s">'user-correction'</span>) conflict.add(ev.fact) <span class="c">// 纠正 → 冲突集</span>
|
|
899
|
+
<span class="k">if</span> (ev.kind === <span class="s">'packet-delivered'</span>) advanceDeliveredCursor(ev.digest)
|
|
900
|
+
<span class="c">// 只有实际进入 decision.messages 的 packet 才推进 delivered cursor</span>
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
<span class="c">// 空闲期 consolidation, 不阻塞主模型请求;</span>
|
|
904
|
+
<span class="c">// 没有结果证据的自动升格 = 放大错误; 每次晋升都有 evidence list + 可逆状态</span></code></pre>
|
|
905
|
+
</article>
|
|
906
|
+
<article class="card" id="mod-audit">
|
|
907
|
+
<div class="card-head">
|
|
908
|
+
<div class="card-topline">
|
|
909
|
+
<span class="card-code">G-02 · 治理与运营</span>
|
|
910
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
911
|
+
<span class="ringpos dim">支线模块</span>
|
|
912
|
+
</div>
|
|
913
|
+
<h3 class="card-title">Injection Audit</h3>
|
|
914
|
+
<p class="card-role">记录为什么注入、注入了什么、从哪里来、花费多少以及结果如何。</p>
|
|
915
|
+
</div>
|
|
916
|
+
<div class="edge-chips"><span class="edge-chip planned">← G-04 Evaluation / Metrics · measure</span><span class="edge-chip planned">→ C-06 Injection Broker · audit</span></div>
|
|
917
|
+
<pre class="meta"><code><span class="c">/* G-02 Injection Audit — why / what / source / cost / result 全链路可解释 */</span>
|
|
918
|
+
<span class="k">function</span> injection(packet: MemoryPacket, verdict: SafetyVerdict) {
|
|
919
|
+
audit.log({
|
|
920
|
+
packetId, sessionId, cursor: packet.contextCursor,
|
|
921
|
+
trigger: verdict.trigger, scores: packet.items.map(i => i.score),
|
|
922
|
+
sourceSeqs: packet.sourceSeqs, bytes: packet.budgetBytes,
|
|
923
|
+
expiry: packet.expiry, action: verdict.action,
|
|
924
|
+
}) <span class="c">// 只存最小必要摘要: 审计本身也可能暴露敏感内容</span>
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
<span class="c">// 检索中间态不写主 Session; 注入决策与结果形成可解释审计;</span>
|
|
928
|
+
<span class="c">// UI 提供查看 / 撤销 / 禁用 / 重放入口;</span>
|
|
929
|
+
<span class="c">// 任何注入可从审计反查到来源与版本</span></code></pre>
|
|
930
|
+
</article>
|
|
931
|
+
<article class="card" id="mod-safety">
|
|
932
|
+
<div class="card-head">
|
|
933
|
+
<div class="card-topline">
|
|
934
|
+
<span class="card-code">G-03 · 治理与运营</span>
|
|
935
|
+
<span class="badge guard">GUARD · 安全</span>
|
|
936
|
+
<span class="ringpos dim">支线模块</span>
|
|
937
|
+
</div>
|
|
938
|
+
<h3 class="card-title">Safety Gate</h3>
|
|
939
|
+
<p class="card-role">记忆是参考资料,不是新指令;冲突、范围、风险和副作用必须在 Broker 前拦截。</p>
|
|
940
|
+
</div>
|
|
941
|
+
<div class="edge-chips"><span class="edge-chip guard">→ C-06 Injection Broker · gate</span></div>
|
|
942
|
+
<pre class="meta"><code><span class="c">/* G-03 Safety Gate — 在 Broker 之前拦截(记忆是参考资料, 不是新指令) */</span>
|
|
943
|
+
<span class="k">function</span> check(ranked: Candidate[], scope: Scope): SafetyVerdict {
|
|
944
|
+
<span class="k">for</span> (<span class="k">const</span> c of ranked) {
|
|
945
|
+
<span class="k">if</span> (c.scope !== scope && c.scope !== <span class="s">'Workspace'</span>) <span class="k">return</span> suppress(<span class="s">'scope'</span>)
|
|
946
|
+
<span class="k">if</span> (c.kind === <span class="s">'procedure'</span> && c.riskLevel === <span class="s">'high'</span>) <span class="k">return</span> ask() <span class="c">// 副作用默认确认</span>
|
|
947
|
+
<span class="k">if</span> (looksLikeInstruction(c.payload)) <span class="k">return</span> suppress(<span class="s">'injection'</span>) <span class="c">// 提示注入 / 过期指令</span>
|
|
948
|
+
<span class="k">if</span> (c.revoked) <span class="k">return</span> suppress(<span class="s">'revoked'</span>)
|
|
949
|
+
}
|
|
950
|
+
<span class="k">return</span> { action: <span class="s">'allow'</span>, trigger: ranked[0]?.triggerReason }
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
<span class="c">// scope: Turn / Session / Workspace / User / External 正交管理;</span>
|
|
954
|
+
<span class="c">// 公开 reasoning 不能单独授权动作或证明事实;</span>
|
|
955
|
+
<span class="c">// 外部记忆可能含提示注入 / 过期指令 / 恶意文本</span></code></pre>
|
|
956
|
+
</article>
|
|
957
|
+
<article class="card" id="mod-metrics">
|
|
958
|
+
<div class="card-head">
|
|
959
|
+
<div class="card-topline">
|
|
960
|
+
<span class="card-code">G-04 · 治理与运营</span>
|
|
961
|
+
<span class="badge planned">PLANNED · 设计</span>
|
|
962
|
+
<span class="ringpos dim">支线模块</span>
|
|
963
|
+
</div>
|
|
964
|
+
<h3 class="card-title">Evaluation / Metrics</h3>
|
|
965
|
+
<p class="card-role">用离线回放和基准评估主动召回是否真的提高任务结果。</p>
|
|
966
|
+
</div>
|
|
967
|
+
<div class="edge-chips"><span class="edge-chip planned">→ G-02 Injection Audit · measure</span></div>
|
|
968
|
+
<pre class="meta"><code><span class="c">/* G-04 Evaluation / Metrics — 离线回放 + 基准评估主动召回的真实收益 */</span>
|
|
969
|
+
<span class="k">function</span> observe(packet: MemoryPacket | null, verdict: SafetyVerdict) {
|
|
970
|
+
metrics.inc(<span class="s">'trigger'</span>, { hit: verdict.action === <span class="s">'allow'</span>, reason: verdict.trigger })
|
|
971
|
+
metrics.inc(<span class="s">'cost'</span>, { bytes: packet?.budgetBytes ?? 0 })
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
<span class="c">// 基准: LongMemEval(跨 session/时间/知识更新) + LoCoMo(长对话单跳/多跳)</span>
|
|
975
|
+
<span class="c">// 指标: trigger precision/recall · helpful gain · harmful injection</span>
|
|
976
|
+
<span class="c">// duplicate · contamination · latency · tokens · leakage</span>
|
|
977
|
+
<span class="c">// 路线: 先 Shadow Retrieval(只记录), 再 A/B Soft Injection</span>
|
|
978
|
+
<span class="c">// 只测最终答案会忽略触发时机和误注入伤害; cross-session leakage 必须为零</span></code></pre>
|
|
979
|
+
</article>
|
|
980
|
+
<article class="card" id="mod-fallback">
|
|
981
|
+
<div class="card-head">
|
|
982
|
+
<div class="card-topline">
|
|
983
|
+
<span class="card-code">G-05 · 治理与运营</span>
|
|
984
|
+
<span class="badge guard">GUARD · 安全</span>
|
|
985
|
+
<span class="ringpos dim">支线模块</span>
|
|
986
|
+
</div>
|
|
987
|
+
<h3 class="card-title">Fallback / Degrade</h3>
|
|
988
|
+
<p class="card-role">高级算法不可用时,系统仍保持 DSH 基础对话和当前记忆功能。</p>
|
|
989
|
+
</div>
|
|
990
|
+
<div class="edge-chips"><span class="edge-chip guard">→ C-04 Association Engine · degrade</span></div>
|
|
991
|
+
<pre class="meta"><code><span class="c">/* G-05 Fallback / Degrade — 高级层关闭时, 基础对话与现有记忆功能不变 */</span>
|
|
992
|
+
<span class="k">function</span> keywordRecall(seg: Segment, cur: ContextCursor): Candidate[] {
|
|
993
|
+
<span class="k">return</span> lexicalIndex.search([...seg.entities, ...tokens(seg.text)])
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
<span class="c">// Python / embedding / reranker / 图检索: 全部有超时 + 失败回退</span>
|
|
997
|
+
<span class="c">// provider unavailable ≠ 删除文件(原生 pattern 回滚临时状态)</span>
|
|
998
|
+
<span class="c">// 过期 packet 丢弃且不标记 delivered; 下一事件可重新检索</span>
|
|
999
|
+
<span class="c">// 回退路径不悄悄改变现有 Markdown 注入语义</span></code></pre>
|
|
1000
|
+
</article>
|
|
1001
|
+
<article class="card" id="mod-research">
|
|
1002
|
+
<div class="card-head">
|
|
1003
|
+
<div class="card-topline">
|
|
1004
|
+
<span class="card-code">R-01 · 理论研究</span>
|
|
1005
|
+
<span class="badge research">RESEARCH · 研究</span>
|
|
1006
|
+
<span class="ringpos dim">支线模块</span>
|
|
1007
|
+
</div>
|
|
1008
|
+
<h3 class="card-title">Research Signals</h3>
|
|
1009
|
+
<p class="card-role">论文提供触发、记忆类型、反思、技能和评测的参考,不是现成 Host 实现。</p>
|
|
1010
|
+
</div>
|
|
1011
|
+
<div class="edge-chips"><span class="edge-chip research">→ C-03 Retrieval Gate · trigger</span></div>
|
|
1012
|
+
<pre class="meta"><code><span class="c">/* R-01 Research Signals — 论文启发 → 设计约束(不是现成 Host 实现) */</span>
|
|
1013
|
+
<span class="k">const</span> constraints = {
|
|
1014
|
+
types: CoALA, <span class="c">// 记忆类型词汇</span>
|
|
1015
|
+
stream: GenerativeAgents, <span class="c">// stream + relevance/recency/importance</span>
|
|
1016
|
+
paging: MemGPT, <span class="c">// 受限窗口 + 外部记忆分页</span>
|
|
1017
|
+
graph: [A_MEM, HippoRAG], <span class="c">// 链接记忆 / KG + PPR 扩散</span>
|
|
1018
|
+
inGen: [FLARE, IRCoT, DRAGIN, SelfRAG], <span class="c">// 生成过程检索 → 只作触发启发</span>
|
|
1019
|
+
skills: [Reflexion, Voyager], <span class="c">// 经验反馈 / 环境验证技能库</span>
|
|
1020
|
+
eval: [LongMemEval, LoCoMo], <span class="c">// 评测</span>
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
<span class="c">// 约束: 不能把生成侧方法描述成已实现的 Host 主动注入;</span>
|
|
1024
|
+
<span class="c">// 每条设计类比在文档中标注"启发"而非"已实现"</span></code></pre>
|
|
1025
|
+
</article>
|
|
1026
|
+
<article class="card" id="mod-lexical2">
|
|
1027
|
+
<div class="card-head">
|
|
1028
|
+
<div class="card-topline">
|
|
1029
|
+
<span class="card-code">R-02 · 理论研究</span>
|
|
1030
|
+
<span class="badge research">RESEARCH · 研究</span>
|
|
1031
|
+
<span class="ringpos dim">支线模块</span>
|
|
1032
|
+
</div>
|
|
1033
|
+
<h3 class="card-title">Cognitive Model</h3>
|
|
1034
|
+
<p class="card-role">人类联想机制的工程抽象:激活、衰减、扩散与抑制。</p>
|
|
1035
|
+
</div>
|
|
1036
|
+
<div class="edge-chips"><span class="edge-chip research">→ C-04 Association Engine · model</span></div>
|
|
1037
|
+
<pre class="meta"><code><span class="c">/* R-02 Cognitive Model — 激活 / 衰减 / 扩散 / 抑制的工程化近似 */</span>
|
|
1038
|
+
<span class="k">function</span> activation(c: Candidate, seg: Segment, cur: ContextCursor): number {
|
|
1039
|
+
<span class="k">return</span> base(c.confidence)
|
|
1040
|
+
+ wRel * relevance(c, seg) <span class="c">// 关联度</span>
|
|
1041
|
+
+ wRec * recency(c, cur) <span class="c">// 近因</span>
|
|
1042
|
+
+ wFrq * frequency(c, cur) <span class="c">// 频因</span>
|
|
1043
|
+
+ wSal * salience(c) <span class="c">// 显著性</span>
|
|
1044
|
+
- wSup * suppression(c, cur) <span class="c">// 重复 / 已忽略抑制</span>
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
<span class="c">// Activation 只用于排序, ≠ 真实性;</span>
|
|
1048
|
+
<span class="c">// 认知状态(介入强度)与联想激活(候选)分离;</span>
|
|
1049
|
+
<span class="c">// 每个权重可通过离线回放校准;</span>
|
|
1050
|
+
<span class="c">// 不宣称软件分数等同真实脑机制或模型隐藏 attention</span></code></pre>
|
|
1051
|
+
</article></div>
|
|
1052
|
+
</section>
|
|
1053
|
+
|
|
1054
|
+
<div class="source-note"><strong>边界说明:</strong>本页 Meta code 是与 <code>proactive-associative-memory-system-map.html</code> 一一对应的实现草图,不编译、不运行;标注为「设计/研究」的模块不代表当前插件已实现。原生模块(N-*)描述的是插件「如何接入」DSH 既有机制,而非重新实现它们。</div>
|
|
1055
|
+
<footer class="footer"><span>DSH 主动联想记忆 · Meta Code 装配预览</span><span>工作区:D:\dsh-auto-memory · 设计快照:2026-08-19</span></footer>
|
|
1056
|
+
</div>
|
|
1057
|
+
</body>
|
|
1058
|
+
</html>
|