progmune-runtime 2.0.2 → 2.1.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/.mcp.json +11 -0
- package/.progmune_allowlist +50 -0
- package/.test_report/test_report.md +87 -0
- package/Dockerfile +2 -10
- package/FAQ.md +167 -0
- package/demo-project/auth.ts +55 -0
- package/demo-project/tsconfig.json +8 -0
- package/dist/ab-stats.js +11 -0
- package/dist/acl-breakdown.js +13 -0
- package/dist/all-sessions.js +11 -0
- package/dist/antibody-stats.js +11 -0
- package/dist/audit.js +218 -0
- package/dist/benchmark-count.js +7 -0
- package/dist/benchmark-full.js +17 -0
- package/dist/benchmark-pass-rate.js +54 -0
- package/dist/benchmark-report.js +67 -0
- package/dist/benchmark-save.js +62 -0
- package/dist/benchmark-status.js +15 -0
- package/dist/branch-ledger.js +365 -0
- package/dist/branch-tree-count.js +14 -0
- package/dist/check.js +506 -0
- package/dist/common-fixpath.js +12 -0
- package/dist/constraint-types.js +12 -0
- package/dist/deterministic-replay.js +277 -0
- package/dist/emitter.js +112 -12
- package/dist/exec-metrics.js +11 -0
- package/dist/execute.js +242 -0
- package/dist/extract-ir.js +550 -5
- package/dist/failure-collector.js +143 -0
- package/dist/failure-corpus.js +481 -35
- package/dist/failure-report.js +11 -0
- package/dist/failures.js +11 -0
- package/dist/fast-path-hits.js +13 -0
- package/dist/feedback.js +6 -3
- package/dist/file-lock.js +82 -0
- package/dist/find-session.js +10 -0
- package/dist/fingerprint-list.js +15 -0
- package/dist/gen-history-log.js +13 -0
- package/dist/generate.js +2 -1
- package/dist/generate_500.js +4 -2
- package/dist/genome.js +11 -0
- package/dist/heatmap-data.js +11 -0
- package/dist/heatmap.js +11 -0
- package/dist/immune-reporter.js +137 -0
- package/dist/learned.js +11 -0
- package/dist/ledger-registry.js +241 -0
- package/dist/llm.js +43 -2
- package/dist/load-benchmarks.js +47 -0
- package/dist/main.js +2 -1
- package/dist/mcp-server.mjs +446 -34
- package/dist/memory-layer.js +51 -13
- package/dist/metrics.js +11 -0
- package/dist/obs-web.js +561 -0
- package/dist/p0_ssg_demo.js +255 -40
- package/dist/planner.js +933 -65
- package/dist/protocol-registry.js +105 -0
- package/dist/recent-session.js +12 -0
- package/dist/repair-proposal.js +353 -0
- package/dist/report.js +32 -0
- package/dist/runtime-invariants.js +161 -0
- package/dist/runtime-types.js +117 -0
- package/dist/search-planner.js +38 -9
- package/dist/semantic-snapshot.js +155 -0
- package/dist/semantic-trace.js +1497 -0
- package/dist/semantic-validator.js +3 -2
- package/dist/semantic_guard_test.js +2 -1
- package/dist/sessions.js +11 -0
- package/dist/ssg-validator.js +658 -20
- package/dist/svl-distribution.js +11 -0
- package/dist/terminal-status.js +11 -0
- package/dist/test_failure_corpus.js +3 -1
- package/dist/token-savings.js +11 -0
- package/dist/total-repairs.js +12 -0
- package/dist/unresolved-count.js +12 -0
- package/dist/valid-fingerprints.js +13 -0
- package/dist/validator.js +116 -60
- package/dist/verify-fps.js +11 -0
- package/dist/verify-ledgers.js +11 -0
- package/docs/whitepaper-style.css +77 -0
- package/docs/whitepaper-v2.1.md +609 -0
- package/docs/whitepaper-v2.2.md +1064 -0
- package/docs/whitepaper-v2.2.pdf +0 -0
- package/fly.toml +1 -1
- package/package.json +13 -4
- package/protocols.json +136 -0
- package/public/dashboard.html +119 -0
- package/readme.md +829 -0
- package/server/hub.js +84 -12
- package/test/replay-golden/sess_1780063202050_mgeld.json +9 -0
- package/test/replay-golden/sess_1780064032560_gocld.json +354 -0
- package/test/replay-golden/sess_1780064413331_s2709.json +606 -0
- package/test/replay-golden/sess_1780064792710_y3avo.json +614 -0
- package/test/replay-golden.ts +84 -0
- package/test_benchmark.js +165 -0
- package/test_comprehensive.mjs +638 -0
- package/test_concurrency.js +129 -0
- package/test_ir_robustness.js +85 -0
- package/test_semantic_contracts.js +269 -0
- package/test_ssg_stress.js +156 -0
- package/test_svl3.js +58 -0
- package/tsconfig.json +1 -1
- package/.env.example +0 -3
- package/.progmune_memory/fingerprints.json +0 -7
- package/.progmune_memory/opt_in.json +0 -4
- package/README.md +0 -118
- package/dist/mcp-server.js +0 -55
- package/immune_hub_data/2026-05-14.json +0 -50
|
Binary file
|
package/fly.toml
CHANGED
package/package.json
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "progmune-runtime",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Progmune Runtime — Program Immunology: Constraint-Guided Program Synthesis Runtime",
|
|
5
5
|
"main": "dist/mcp-server.mjs",
|
|
6
6
|
"bin": {
|
|
7
|
-
"progmune-runtime": "
|
|
7
|
+
"progmune-runtime": "dist/mcp-server.mjs"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"build": "tsc -p tsconfig.json",
|
|
11
|
-
"start": "node dist/mcp-server.mjs"
|
|
11
|
+
"start": "node dist/mcp-server.mjs",
|
|
12
|
+
"test": "node dist/mcp-server.mjs test",
|
|
13
|
+
"ir": "npx ts-node src/extract-ir.ts .",
|
|
14
|
+
"guard": "node -e \"require('./dist/validator.js'); console.log('✅ 校验器已加载')\"",
|
|
15
|
+
"obs": "npx ts-node src/semantic-trace.ts",
|
|
16
|
+
"obs-web": "npx ts-node src/obs-web.ts",
|
|
17
|
+
"check": "npx ts-node src/check.ts",
|
|
18
|
+
"audit": "npx ts-node src/audit.ts",
|
|
19
|
+
"replay-golden": "npx ts-node --transpile-only test/replay-golden.ts"
|
|
12
20
|
},
|
|
13
21
|
"keywords": [
|
|
14
22
|
"program-synthesis",
|
|
@@ -28,6 +36,7 @@
|
|
|
28
36
|
"typescript": "^6.0.3"
|
|
29
37
|
},
|
|
30
38
|
"devDependencies": {
|
|
31
|
-
"@types/node": "^25.6.0"
|
|
39
|
+
"@types/node": "^25.6.0",
|
|
40
|
+
"dotenv": "^17.4.2"
|
|
32
41
|
}
|
|
33
42
|
}
|
package/protocols.json
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://progmune.dev/schemas/protocols.json",
|
|
3
|
+
"$description": "Progmune 协议定义 —— 函数调用的合法状态转换规则。支持命名空间(namespace)隔离不同资源的状态机。",
|
|
4
|
+
"initialState": "UNAUTHENTICATED",
|
|
5
|
+
"namespaceInitialStates": {
|
|
6
|
+
"_global": "UNAUTHENTICATED",
|
|
7
|
+
"auth": "UNAUTHENTICATED",
|
|
8
|
+
"dev_pipeline": "IR_STALE"
|
|
9
|
+
},
|
|
10
|
+
"states": {
|
|
11
|
+
"UNAUTHENTICATED": "初始状态:用户未认证",
|
|
12
|
+
"PASSWORD_VERIFIED": "密码已通过验证",
|
|
13
|
+
"TOKEN_ISSUED": "JWT 令牌已签发",
|
|
14
|
+
"SESSION_ACTIVE": "会话已激活",
|
|
15
|
+
"IR_STALE": "IR 已过期或未生成",
|
|
16
|
+
"IR_EXTRACTED": "IR 已从源码提取",
|
|
17
|
+
"ACTION_VALIDATED": "动作已通过 SVL 校验",
|
|
18
|
+
"SEQUENCE_VALIDATED": "动作序列 + 变量流向已通过校验",
|
|
19
|
+
"CODE_EMITTED": "目标代码已生成",
|
|
20
|
+
"SESSION_RECORDED": "执行会话已保存"
|
|
21
|
+
},
|
|
22
|
+
"rules": {
|
|
23
|
+
"verify_password": {
|
|
24
|
+
"namespace": "auth",
|
|
25
|
+
"pre_states": ["UNAUTHENTICATED"],
|
|
26
|
+
"post_states": ["PASSWORD_VERIFIED"],
|
|
27
|
+
"description": "验证用户密码 → 进入已认证状态"
|
|
28
|
+
},
|
|
29
|
+
"generate_jwt": {
|
|
30
|
+
"namespace": "auth",
|
|
31
|
+
"pre_states": ["PASSWORD_VERIFIED"],
|
|
32
|
+
"post_states": ["TOKEN_ISSUED"],
|
|
33
|
+
"invalidate": ["PASSWORD_VERIFIED"],
|
|
34
|
+
"description": "签发 JWT 令牌 → 必须在密码验证之后,签发后密码验证状态失效"
|
|
35
|
+
},
|
|
36
|
+
"create_session": {
|
|
37
|
+
"namespace": "auth",
|
|
38
|
+
"pre_states": ["TOKEN_ISSUED"],
|
|
39
|
+
"post_states": ["SESSION_ACTIVE"],
|
|
40
|
+
"invalidate": ["TOKEN_ISSUED"],
|
|
41
|
+
"description": "创建会话 → 必须在令牌签发之后,创建后令牌状态失效"
|
|
42
|
+
},
|
|
43
|
+
"revoke_token": {
|
|
44
|
+
"namespace": "auth",
|
|
45
|
+
"pre_states": ["TOKEN_ISSUED"],
|
|
46
|
+
"post_states": ["UNAUTHENTICATED"],
|
|
47
|
+
"invalidate": ["TOKEN_ISSUED"],
|
|
48
|
+
"description": "撤销令牌 → 回到未认证状态"
|
|
49
|
+
},
|
|
50
|
+
"logout": {
|
|
51
|
+
"namespace": "auth",
|
|
52
|
+
"pre_states": ["SESSION_ACTIVE"],
|
|
53
|
+
"post_states": ["UNAUTHENTICATED"],
|
|
54
|
+
"invalidate": ["SESSION_ACTIVE"],
|
|
55
|
+
"description": "登出 → 清除会话,回到未认证状态"
|
|
56
|
+
},
|
|
57
|
+
"open_file": {
|
|
58
|
+
"namespace": "file",
|
|
59
|
+
"pre_states": [],
|
|
60
|
+
"post_states": ["FILE_OPEN"],
|
|
61
|
+
"description": "打开文件 → 获得文件句柄"
|
|
62
|
+
},
|
|
63
|
+
"read_file": {
|
|
64
|
+
"namespace": "file",
|
|
65
|
+
"pre_states": ["FILE_OPEN"],
|
|
66
|
+
"post_states": [],
|
|
67
|
+
"description": "读取文件内容 → 需要文件已打开"
|
|
68
|
+
},
|
|
69
|
+
"write_file": {
|
|
70
|
+
"namespace": "file",
|
|
71
|
+
"pre_states": ["FILE_OPEN"],
|
|
72
|
+
"post_states": [],
|
|
73
|
+
"description": "写入文件内容 → 需要文件已打开"
|
|
74
|
+
},
|
|
75
|
+
"close_file": {
|
|
76
|
+
"namespace": "file",
|
|
77
|
+
"pre_states": ["FILE_OPEN"],
|
|
78
|
+
"post_states": [],
|
|
79
|
+
"invalidate": ["FILE_OPEN"],
|
|
80
|
+
"description": "关闭文件句柄 → 释放文件资源"
|
|
81
|
+
},
|
|
82
|
+
"connect_db": {
|
|
83
|
+
"namespace": "db",
|
|
84
|
+
"pre_states": [],
|
|
85
|
+
"post_states": ["DB_CONNECTED"],
|
|
86
|
+
"description": "建立数据库连接"
|
|
87
|
+
},
|
|
88
|
+
"query_db": {
|
|
89
|
+
"namespace": "db",
|
|
90
|
+
"pre_states": ["DB_CONNECTED"],
|
|
91
|
+
"post_states": [],
|
|
92
|
+
"description": "执行数据库查询 → 需要已连接"
|
|
93
|
+
},
|
|
94
|
+
"disconnect_db": {
|
|
95
|
+
"namespace": "db",
|
|
96
|
+
"pre_states": ["DB_CONNECTED"],
|
|
97
|
+
"post_states": [],
|
|
98
|
+
"invalidate": ["DB_CONNECTED"],
|
|
99
|
+
"description": "断开数据库连接"
|
|
100
|
+
},
|
|
101
|
+
"extractIR": {
|
|
102
|
+
"namespace": "dev_pipeline",
|
|
103
|
+
"pre_states": [],
|
|
104
|
+
"post_states": ["IR_EXTRACTED"],
|
|
105
|
+
"invalidate": ["IR_STALE"],
|
|
106
|
+
"description": "从源码提取 IR → 产出 IR_EXTRACTED 状态"
|
|
107
|
+
},
|
|
108
|
+
"validateAction": {
|
|
109
|
+
"namespace": "dev_pipeline",
|
|
110
|
+
"pre_states": ["IR_EXTRACTED"],
|
|
111
|
+
"post_states": ["ACTION_VALIDATED"],
|
|
112
|
+
"description": "校验单个动作合法性 → 需要 IR 已提取"
|
|
113
|
+
},
|
|
114
|
+
"validateActionSequence": {
|
|
115
|
+
"namespace": "dev_pipeline",
|
|
116
|
+
"pre_states": ["ACTION_VALIDATED"],
|
|
117
|
+
"post_states": ["SEQUENCE_VALIDATED"],
|
|
118
|
+
"invalidate": ["ACTION_VALIDATED"],
|
|
119
|
+
"description": "批量校验动作序列 → 需要动作已验证,校验后消耗"
|
|
120
|
+
},
|
|
121
|
+
"emitCode": {
|
|
122
|
+
"namespace": "dev_pipeline",
|
|
123
|
+
"pre_states": ["SEQUENCE_VALIDATED"],
|
|
124
|
+
"post_states": ["CODE_EMITTED"],
|
|
125
|
+
"invalidate": ["SEQUENCE_VALIDATED"],
|
|
126
|
+
"description": "编译动作序列为目标代码 → 需要序列已验证"
|
|
127
|
+
},
|
|
128
|
+
"recordSession": {
|
|
129
|
+
"namespace": "dev_pipeline",
|
|
130
|
+
"pre_states": ["CODE_EMITTED"],
|
|
131
|
+
"post_states": ["SESSION_RECORDED"],
|
|
132
|
+
"invalidate": ["CODE_EMITTED"],
|
|
133
|
+
"description": "保存执行会话到语料库 → 需要代码已生成"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Progmune 全球免疫网络 - 仪表板</title>
|
|
7
|
+
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
|
8
|
+
<style>
|
|
9
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0; padding: 20px; background: #f5f7fa; color: #333; }
|
|
10
|
+
.container { max-width: 1200px; margin: 0 auto; }
|
|
11
|
+
h1 { color: #2c3e50; border-bottom: 3px solid #3498db; padding-bottom: 10px; }
|
|
12
|
+
.stats { display: flex; gap: 20px; margin: 20px 0; flex-wrap: wrap; }
|
|
13
|
+
.stat-card { background: white; border-radius: 8px; padding: 20px; flex: 1; min-width: 200px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
|
|
14
|
+
.stat-card h3 { margin: 0 0 10px 0; font-size: 14px; color: #7f8c8d; text-transform: uppercase; }
|
|
15
|
+
.stat-card .number { font-size: 36px; font-weight: bold; color: #2c3e50; }
|
|
16
|
+
.charts { display: flex; gap: 20px; margin: 20px 0; flex-wrap: wrap; }
|
|
17
|
+
.chart-box { background: white; border-radius: 8px; padding: 20px; flex: 1; min-width: 400px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
|
|
18
|
+
.timeline { background: white; border-radius: 8px; padding: 20px; margin: 20px 0; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
|
|
19
|
+
.timeline-item { display: flex; align-items: center; padding: 8px 0; border-bottom: 1px solid #ecf0f1; }
|
|
20
|
+
.timeline-item:last-child { border-bottom: none; }
|
|
21
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; font-weight: bold; margin-right: 10px; }
|
|
22
|
+
.badge.svl4 { background: #e74c3c; color: white; }
|
|
23
|
+
.badge.svl3 { background: #f39c12; color: white; }
|
|
24
|
+
.badge.svl2 { background: #3498db; color: white; }
|
|
25
|
+
.badge.svl1 { background: #2ecc71; color: white; }
|
|
26
|
+
</style>
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
<div class="container">
|
|
30
|
+
<h1>🛡️ Progmune 全球免疫网络 - 仪表板</h1>
|
|
31
|
+
<div class="stats" id="stats"></div>
|
|
32
|
+
<div class="charts">
|
|
33
|
+
<div class="chart-box">
|
|
34
|
+
<h3>高频错误模式 (Top 10)</h3>
|
|
35
|
+
<canvas id="patternChart"></canvas>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="chart-box">
|
|
38
|
+
<h3>SVL 级别分布</h3>
|
|
39
|
+
<canvas id="svlChart"></canvas>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="timeline">
|
|
43
|
+
<h3>最近免疫事件</h3>
|
|
44
|
+
<div id="timeline"></div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<script>
|
|
49
|
+
async function loadDashboard() {
|
|
50
|
+
try {
|
|
51
|
+
const resp = await fetch('/api/dashboard');
|
|
52
|
+
const data = await resp.json();
|
|
53
|
+
renderStats(data);
|
|
54
|
+
renderPatternChart(data.topPatterns);
|
|
55
|
+
renderSVLChart(data.topPatterns);
|
|
56
|
+
renderTimeline(data.timeline);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
document.getElementById('stats').innerHTML = '<p style="color:red">加载失败,请检查服务器是否运行。</p>';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function renderStats(data) {
|
|
63
|
+
document.getElementById('stats').innerHTML = `
|
|
64
|
+
<div class="stat-card"><h3>今日上报</h3><div class="number">${data.todayCount}</div></div>
|
|
65
|
+
<div class="stat-card"><h3>本周上报</h3><div class="number">${data.weekCount}</div></div>
|
|
66
|
+
<div class="stat-card"><h3>总计上报</h3><div class="number">${data.totalCount}</div></div>
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function renderPatternChart(patterns) {
|
|
71
|
+
const ctx = document.getElementById('patternChart').getContext('2d');
|
|
72
|
+
const labels = patterns.map(p => p.pattern.length > 40 ? p.pattern.substring(0,40)+'...' : p.pattern);
|
|
73
|
+
new Chart(ctx, {
|
|
74
|
+
type: 'bar',
|
|
75
|
+
data: {
|
|
76
|
+
labels: labels,
|
|
77
|
+
datasets: [{
|
|
78
|
+
label: '出现次数',
|
|
79
|
+
data: patterns.map(p => p.count),
|
|
80
|
+
backgroundColor: 'rgba(231, 76, 60, 0.7)'
|
|
81
|
+
}]
|
|
82
|
+
},
|
|
83
|
+
options: { responsive: true, indexAxis: 'y', plugins: { legend: { display: false } } }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function renderSVLChart(patterns) {
|
|
88
|
+
const svlCounts = { 'SVL-1': 0, 'SVL-2': 0, 'SVL-3': 0, 'SVL-4': 0 };
|
|
89
|
+
patterns.forEach(p => {
|
|
90
|
+
const svl = p.pattern.split(' | ')[0];
|
|
91
|
+
if (svlCounts[svl] !== undefined) svlCounts[svl] += p.count;
|
|
92
|
+
});
|
|
93
|
+
const ctx = document.getElementById('svlChart').getContext('2d');
|
|
94
|
+
new Chart(ctx, {
|
|
95
|
+
type: 'doughnut',
|
|
96
|
+
data: {
|
|
97
|
+
labels: ['SVL-1 符号错误', 'SVL-2 类型错误', 'SVL-3 数据流错误', 'SVL-4 协议违规'],
|
|
98
|
+
datasets: [{
|
|
99
|
+
data: [svlCounts['SVL-1'], svlCounts['SVL-2'], svlCounts['SVL-3'], svlCounts['SVL-4']],
|
|
100
|
+
backgroundColor: ['#2ecc71', '#3498db', '#f39c12', '#e74c3c']
|
|
101
|
+
}]
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function renderTimeline(timeline) {
|
|
107
|
+
document.getElementById('timeline').innerHTML = timeline.map(t => `
|
|
108
|
+
<div class="timeline-item">
|
|
109
|
+
<span class="badge svl${t.svl ? t.svl.slice(-1) : '1'}">${t.svl || '?'}</span>
|
|
110
|
+
<span style="flex:1">${t.pattern || '(empty)'}</span>
|
|
111
|
+
<span style="color:#7f8c8d; font-size:12px">${t.time}</span>
|
|
112
|
+
</div>
|
|
113
|
+
`).join('');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
loadDashboard();
|
|
117
|
+
</script>
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|