progmune-runtime 2.1.6 → 3.2.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.
Files changed (356) hide show
  1. package/README.md +108 -468
  2. package/dist/ablation-study.js +144 -0
  3. package/dist/ablation-study.test.js +18 -0
  4. package/dist/action-runtime.js +3 -1
  5. package/dist/active-learning.js +211 -0
  6. package/dist/analytics.js +139 -0
  7. package/dist/asset-factory.js +309 -0
  8. package/dist/asset-growth.js +244 -0
  9. package/dist/asset-promotion.js +382 -0
  10. package/dist/asset-quality.js +550 -0
  11. package/dist/audit/business-translator.js +285 -0
  12. package/dist/audit/cli.js +66 -0
  13. package/dist/audit/formatters/html.js +379 -0
  14. package/dist/audit/formatters/json.js +11 -0
  15. package/dist/audit/formatters/markdown.js +192 -0
  16. package/dist/audit/formatters/terminal.js +189 -0
  17. package/dist/audit/index.js +25 -0
  18. package/dist/audit/report-builder.js +318 -0
  19. package/dist/audit/types.js +8 -0
  20. package/dist/audit.js +3 -3
  21. package/dist/auto-benchmark-generator.js +137 -0
  22. package/dist/auto-benchmark-generator.test.js +45 -0
  23. package/dist/auto-protocol-synthesizer.js +362 -0
  24. package/dist/auto-protocol-synthesizer.test.js +82 -0
  25. package/dist/autonomous-patch.js +175 -0
  26. package/dist/autonomous-patch.test.js +128 -0
  27. package/dist/badge/badge-server.js +98 -0
  28. package/dist/behavior-miner.js +442 -0
  29. package/dist/belief-layer.js +475 -0
  30. package/dist/benchmark-count.js +5 -0
  31. package/dist/benchmark-generator.js +211 -0
  32. package/dist/benchmark-harness.js +201 -0
  33. package/dist/benchmark-pass-rate.js +7 -0
  34. package/dist/benchmark-report.js +8 -3
  35. package/dist/benchmark-save.js +14 -1
  36. package/dist/bootstrap-validation.js +197 -0
  37. package/dist/bootstrap-validation.test.js +51 -0
  38. package/dist/branch-ledger.js +1 -1
  39. package/dist/capability-gap.js +130 -0
  40. package/dist/certify-html.js +351 -0
  41. package/dist/certify.js +326 -0
  42. package/dist/check.js +4 -4
  43. package/dist/compliance-miner.js +447 -0
  44. package/dist/continuous-benchmark.js +194 -0
  45. package/dist/continuous-benchmark.test.js +116 -0
  46. package/dist/corpus-stats.js +173 -0
  47. package/dist/counterfactual-engine.js +288 -0
  48. package/dist/coverage-dashboard.js +109 -0
  49. package/dist/coverage-system.test.js +205 -0
  50. package/dist/cross-repo-precision.js +352 -0
  51. package/dist/cve-benchmark.js +180 -0
  52. package/dist/cve-benchmark.test.js +28 -0
  53. package/dist/cve-collector.js +73 -0
  54. package/dist/data-quality.js +141 -0
  55. package/dist/decision-engine.js +388 -0
  56. package/dist/derive-metadata.js +250 -0
  57. package/dist/difficulty-active.test.js +198 -0
  58. package/dist/difficulty-map.js +244 -0
  59. package/dist/discovery-analytics.js +125 -0
  60. package/dist/discovery-model.js +149 -0
  61. package/dist/discovery-optimize.test.js +199 -0
  62. package/dist/discovery-trace.js +276 -0
  63. package/dist/discovery-trace.test.js +97 -0
  64. package/dist/emitter.js +83 -1
  65. package/dist/enterprise-dashboard.js +405 -0
  66. package/dist/eval-hardening.js +297 -0
  67. package/dist/eval-hardening.test.js +85 -0
  68. package/dist/evaluation-campaign.js +359 -0
  69. package/dist/evaluation-campaign.test.js +181 -0
  70. package/dist/evidence-growth.js +143 -0
  71. package/dist/evidence-repository.js +209 -0
  72. package/dist/evidence-system.js +441 -0
  73. package/dist/execute.js +15 -7
  74. package/dist/experimental/software-physics.js +291 -0
  75. package/dist/experimental/state-inference.js +516 -0
  76. package/dist/experimental/unsupervised-physics.js +230 -0
  77. package/dist/extract-ir-python.js +54 -7
  78. package/dist/extract-ir.js +376 -12
  79. package/dist/failure-collector.js +2 -2
  80. package/dist/failure-corpus.js +322 -9
  81. package/dist/feedback.js +16 -5
  82. package/dist/feedback.test.js +49 -0
  83. package/dist/file-lock.js +1 -1
  84. package/dist/flywheel-batch.js +292 -0
  85. package/dist/frameworks/express-cli.js +237 -0
  86. package/dist/frameworks/express-detector.js +445 -0
  87. package/dist/frameworks/express-detector.test.js +206 -0
  88. package/dist/frameworks/index.js +30 -0
  89. package/dist/frameworks/nestjs-detector.js +302 -0
  90. package/dist/frameworks/trpc-detector.js +161 -0
  91. package/dist/frameworks/version-awareness.js +179 -0
  92. package/dist/function-synonyms.js +164 -0
  93. package/dist/function-synonyms.test.js +68 -0
  94. package/dist/generalization.test.js +352 -0
  95. package/dist/goal-annotator.js +113 -0
  96. package/dist/goal-planner.js +563 -0
  97. package/dist/gold-cve.js +164 -0
  98. package/dist/gold-cve.test.js +104 -0
  99. package/dist/gold-quality.js +206 -0
  100. package/dist/gold-tiers.js +241 -0
  101. package/dist/governance-dashboard.js +327 -0
  102. package/dist/graph-viz.js +240 -0
  103. package/dist/guided-frontier.js +195 -0
  104. package/dist/hierarchical-planner.js +148 -0
  105. package/dist/identifier-parser.js +260 -0
  106. package/dist/immune-metrics.js +93 -0
  107. package/dist/immune-receiver.js +158 -0
  108. package/dist/immune-reporter.js +1 -1
  109. package/dist/improvement-orchestrator.js +206 -0
  110. package/dist/inject-p0-vocabulary.js +300 -0
  111. package/dist/intent-parser.js +218 -0
  112. package/dist/invariant-algebra.js +476 -0
  113. package/dist/invariant-calculus.js +533 -0
  114. package/dist/ir-utils.js +70 -0
  115. package/dist/ir-utils.test.js +50 -0
  116. package/dist/knowledge-api.js +312 -0
  117. package/dist/knowledge-evolution.js +452 -0
  118. package/dist/knowledge-explorer.js +506 -0
  119. package/dist/knowledge-flywheel.js +274 -0
  120. package/dist/knowledge-governance.js +338 -0
  121. package/dist/knowledge-governance.test.js +150 -0
  122. package/dist/knowledge-graph.js +181 -0
  123. package/dist/knowledge-guided-synth.js +246 -0
  124. package/dist/knowledge-loop.test.js +77 -0
  125. package/dist/knowledge-object.js +316 -0
  126. package/dist/knowledge-package.js +98 -0
  127. package/dist/kpi-dashboard.js +561 -0
  128. package/dist/l3-cross-function.js +280 -0
  129. package/dist/learning-ranker.js +148 -0
  130. package/dist/learning-ranker.test.js +291 -0
  131. package/dist/ledger/accountability.js +322 -0
  132. package/dist/ledger/chain-builder.js +185 -0
  133. package/dist/ledger/cli.js +222 -0
  134. package/dist/ledger/index.js +13 -0
  135. package/dist/ledger/signatures.js +193 -0
  136. package/dist/ledger/types.js +9 -0
  137. package/dist/llm.js +74 -3
  138. package/dist/load-benchmarks.js +8 -3
  139. package/dist/logger.js +66 -0
  140. package/dist/logger.test.js +37 -0
  141. package/dist/logistic-reward.js +339 -0
  142. package/dist/logistic-reward.test.js +180 -0
  143. package/dist/macro-graph.js +193 -0
  144. package/dist/macro-repair.js +183 -0
  145. package/dist/mcp-server.mjs +1202 -483
  146. package/dist/memory-layer.js +42 -5
  147. package/dist/multi-repo-precision.js +422 -0
  148. package/dist/name-free-protocol.js +425 -0
  149. package/dist/name-free-protocol.test.js +170 -0
  150. package/dist/name-scrambling.js +138 -0
  151. package/dist/name-scrambling.test.js +16 -0
  152. package/dist/p3-observability.test.js +281 -0
  153. package/dist/p5-orchestrator.test.js +225 -0
  154. package/dist/pairwise-preference.js +294 -0
  155. package/dist/pairwise-preference.test.js +140 -0
  156. package/dist/planner-constraints.js +104 -0
  157. package/dist/planner-prompts.js +155 -0
  158. package/dist/planner-telemetry.js +415 -0
  159. package/dist/planner-trace.js +214 -0
  160. package/dist/planner.js +162 -167
  161. package/dist/plsb/artifact.js +116 -0
  162. package/dist/plsb/cli.js +71 -0
  163. package/dist/plsb/index.js +19 -0
  164. package/dist/plsb/leaderboard.js +249 -0
  165. package/dist/plsb/report-md.js +156 -0
  166. package/dist/plsb/schema.js +179 -0
  167. package/dist/plsb-benchmark.js +284 -0
  168. package/dist/plsb-benchmark.test.js +119 -0
  169. package/dist/policy/cli.js +134 -0
  170. package/dist/policy/engine.js +333 -0
  171. package/dist/policy/index.js +12 -0
  172. package/dist/policy/types.js +59 -0
  173. package/dist/policy-miner.js +505 -0
  174. package/dist/precision-analyze.js +229 -0
  175. package/dist/precision-benchmark.js +147 -0
  176. package/dist/precision-label-c.js +134 -0
  177. package/dist/precision-label.js +193 -0
  178. package/dist/precision-report-c.js +149 -0
  179. package/dist/precision-report.js +246 -0
  180. package/dist/progmune-status.js +108 -0
  181. package/dist/proof-engine.js +479 -0
  182. package/dist/proof-provenance.js +315 -0
  183. package/dist/protocol-coverage.js +294 -0
  184. package/dist/protocol-detector.js +1189 -0
  185. package/dist/protocol-embedding-expanded.js +297 -0
  186. package/dist/protocol-embedding-expanded.test.js +97 -0
  187. package/dist/protocol-embedding.js +195 -0
  188. package/dist/protocol-embedding.test.js +82 -0
  189. package/dist/protocol-extractor-v2.js +354 -0
  190. package/dist/protocol-extractor-v2.test.js +140 -0
  191. package/dist/protocol-extractor.js +310 -0
  192. package/dist/protocol-extractor.test.js +113 -0
  193. package/dist/protocol-foundation.js +322 -0
  194. package/dist/protocol-foundation.test.js +163 -0
  195. package/dist/protocol-frontier.js +243 -0
  196. package/dist/protocol-frontier.test.js +92 -0
  197. package/dist/protocol-gap-analyzer.js +228 -0
  198. package/dist/protocol-gap-analyzer.test.js +49 -0
  199. package/dist/protocol-invariants.js +276 -0
  200. package/dist/protocol-invariants.test.js +111 -0
  201. package/dist/protocol-knowledge.js +464 -0
  202. package/dist/protocol-miner.js +343 -0
  203. package/dist/protocol-mining.js +207 -0
  204. package/dist/protocol-mining.test.js +37 -0
  205. package/dist/protocol-registry.js +1 -1
  206. package/dist/protocol-security-benchmark.js +222 -0
  207. package/dist/protocol-vulnerability.js +257 -0
  208. package/dist/protocol-vulnerability.test.js +60 -0
  209. package/dist/python-benchmark.js +120 -0
  210. package/dist/python-emitter.js +163 -45
  211. package/dist/python-protocol-extractor.js +187 -0
  212. package/dist/python-protocol-extractor.test.js +116 -0
  213. package/dist/realworld-benchmark.js +646 -0
  214. package/dist/realworld-benchmark.test.js +36 -0
  215. package/dist/repair-arch.test.js +411 -0
  216. package/dist/repair-evolution.test.js +454 -0
  217. package/dist/repair-executor.js +719 -0
  218. package/dist/repair-proposal.js +4 -4
  219. package/dist/repair-ranker.js +141 -0
  220. package/dist/repair-strategies.js +419 -0
  221. package/dist/repair-taxonomy.js +234 -0
  222. package/dist/repair-types.js +12 -0
  223. package/dist/repo-evaluator.js +250 -0
  224. package/dist/repo-evaluator.test.js +128 -0
  225. package/dist/resource-abstraction.js +242 -0
  226. package/dist/resource-detector.js +211 -0
  227. package/dist/result.test.js +43 -0
  228. package/dist/reward-system.js +411 -0
  229. package/dist/reward-system.test.js +175 -0
  230. package/dist/risk-model.js +215 -0
  231. package/dist/rule-miner.js +234 -7
  232. package/dist/rule-specificity.js +254 -0
  233. package/dist/runtime-types.js +27 -0
  234. package/dist/scaffold.js +208 -0
  235. package/dist/scale-collector.test.js +101 -0
  236. package/dist/scale-trajectory-collector.js +128 -0
  237. package/dist/sdk.js +250 -0
  238. package/dist/search-planner.js +4 -41
  239. package/dist/semantic-snapshot.js +1 -1
  240. package/dist/semantic-topology.js +121 -0
  241. package/dist/semantic-trace.js +310 -317
  242. package/dist/sequence-extractor.js +343 -0
  243. package/dist/skill-library.js +245 -0
  244. package/dist/skill-planner.test.js +189 -0
  245. package/dist/software-physics.js +291 -0
  246. package/dist/software-physics.test.js +81 -0
  247. package/dist/ssg-precision.js +478 -0
  248. package/dist/ssg-validator.js +71 -21
  249. package/dist/state-inference-doubleblind.test.js +160 -0
  250. package/dist/state-inference.js +516 -0
  251. package/dist/state-inference.test.js +115 -0
  252. package/dist/state-machine-fingerprint.js +345 -0
  253. package/dist/state-machine-fingerprint.test.js +120 -0
  254. package/dist/state-miner.js +386 -0
  255. package/dist/state-name-inference.js +213 -0
  256. package/dist/state-name-inference.test.js +69 -0
  257. package/dist/strategy-planner.js +262 -96
  258. package/dist/strategy-planner.test.js +135 -0
  259. package/dist/telemetry-analytics.test.js +402 -0
  260. package/dist/terminal-format.js +68 -0
  261. package/dist/terminal-format.test.js +83 -0
  262. package/dist/topology-factory.js +196 -0
  263. package/dist/topology-representation.js +242 -0
  264. package/dist/topology-representation.test.js +27 -0
  265. package/dist/trajectory-augmentation.js +254 -0
  266. package/dist/trajectory-augmentation.test.js +63 -0
  267. package/dist/trajectory-corpus.js +440 -0
  268. package/dist/trajectory-corpus.test.js +32 -0
  269. package/dist/trajectory-feedback.test.js +116 -0
  270. package/dist/transition-synthesizer.js +286 -0
  271. package/dist/transition-synthesizer.test.js +123 -0
  272. package/dist/trust/api-semantic-mapper.js +809 -0
  273. package/dist/trust/call-graph-propagator.js +225 -0
  274. package/dist/trust/cli.js +122 -0
  275. package/dist/trust/compliance-scorer.js +283 -0
  276. package/dist/trust/confidence-calculator.js +261 -0
  277. package/dist/trust/engine.js +1145 -0
  278. package/dist/trust/explainability.js +85 -0
  279. package/dist/trust/formatters/ci.js +42 -0
  280. package/dist/trust/formatters/json.js +11 -0
  281. package/dist/trust/formatters/terminal.js +152 -0
  282. package/dist/trust/index.js +39 -0
  283. package/dist/trust/phase1-verify.js +171 -0
  284. package/dist/trust/protocol-domain-validator.js +697 -0
  285. package/dist/trust/score-calculator.js +282 -0
  286. package/dist/trust/ssg-bridge.js +641 -0
  287. package/dist/trust/ssg-bridge.test.js +269 -0
  288. package/dist/trust/types.js +67 -0
  289. package/dist/trust/violation-trace.js +335 -0
  290. package/dist/trust-api.js +179 -0
  291. package/dist/trust-calibration.js +279 -0
  292. package/dist/unknown-protocol-discovery.js +339 -0
  293. package/dist/unknown-protocol-discovery.test.js +102 -0
  294. package/dist/unsupervised-physics.js +230 -0
  295. package/dist/unsupervised-physics.test.js +95 -0
  296. package/dist/utils.test.js +37 -0
  297. package/dist/validator.js +187 -10
  298. package/dist/verification-intelligence.js +475 -0
  299. package/dist/verify-api.js +432 -0
  300. package/dist/vi-impact-report.js +293 -0
  301. package/dist/wl-fingerprint.js +162 -0
  302. package/dist/wl-fingerprint.test.js +130 -0
  303. package/dist/zeroshot-strategy.js +139 -0
  304. package/docs/Progmune_/346/212/225/350/265/204/344/272/272/347/231/275/347/232/256/344/271/246_v2.0.html +576 -0
  305. package/docs/Progmune_/351/241/271/347/233/256/345/205/250/350/247/243.html +710 -0
  306. package/package.json +74 -7
  307. package/protocols.json +1956 -50
  308. package/.dockerignore +0 -14
  309. package/.mcp.json +0 -11
  310. package/.progmune_allowlist +0 -50
  311. package/.test_report/test_report.md +0 -87
  312. package/Dockerfile +0 -9
  313. package/FAQ.md +0 -167
  314. package/WHITEPAPER.md +0 -540
  315. package/demo-project/auth.ts +0 -55
  316. package/demo-project/tsconfig.json +0 -8
  317. package/dist/acl-breakdown.js +0 -13
  318. package/dist/all-sessions.js +0 -11
  319. package/dist/antibody-stats.js +0 -11
  320. package/dist/branch-tree-count.js +0 -14
  321. package/dist/common-fixpath.js +0 -12
  322. package/dist/constraint-types.js +0 -12
  323. package/dist/exec-metrics.js +0 -11
  324. package/dist/failure-report.js +0 -11
  325. package/dist/fast-path-hits.js +0 -13
  326. package/dist/fingerprint-list.js +0 -15
  327. package/dist/gen-history-log.js +0 -13
  328. package/dist/heatmap-data.js +0 -11
  329. package/dist/recent-session.js +0 -12
  330. package/dist/svl-distribution.js +0 -11
  331. package/dist/terminal-status.js +0 -11
  332. package/dist/token-savings.js +0 -11
  333. package/dist/total-repairs.js +0 -12
  334. package/dist/unresolved-count.js +0 -12
  335. package/dist/valid-fingerprints.js +0 -13
  336. package/dist/verify-ledgers.js +0 -11
  337. package/docs/whitepaper-style.css +0 -77
  338. package/docs/whitepaper-v2.1.md +0 -609
  339. package/docs/whitepaper-v2.2.md +0 -1064
  340. package/docs/whitepaper-v2.2.pdf +0 -0
  341. package/fly.toml +0 -31
  342. package/public/dashboard.html +0 -119
  343. package/server/hub.js +0 -116
  344. package/test/replay-golden/sess_1780063202050_mgeld.json +0 -9
  345. package/test/replay-golden/sess_1780064032560_gocld.json +0 -354
  346. package/test/replay-golden/sess_1780064413331_s2709.json +0 -606
  347. package/test/replay-golden/sess_1780064792710_y3avo.json +0 -614
  348. package/test/replay-golden.ts +0 -84
  349. package/test_benchmark.js +0 -165
  350. package/test_comprehensive.mjs +0 -638
  351. package/test_concurrency.js +0 -129
  352. package/test_ir_robustness.js +0 -85
  353. package/test_semantic_contracts.js +0 -269
  354. package/test_ssg_stress.js +0 -156
  355. package/test_svl3.js +0 -58
  356. package/tsconfig.json +0 -17
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 6C: Planner — Prompt Builder
4
+ *
5
+ * Builds the LLM system prompt and formats IR function lists,
6
+ * capability chains, and protocol constraints for the planner.
7
+ *
8
+ * Extracted from planner.ts to keep the main planning module focused.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.RETRY_HINT = exports.SYSTEM_PROMPT = void 0;
12
+ exports.buildCompactFuncList = buildCompactFuncList;
13
+ exports.semanticMatch = semanticMatch;
14
+ exports.buildChainHints = buildChainHints;
15
+ exports.buildProtocolChainHint = buildProtocolChainHint;
16
+ const semantic_topology_1 = require("./semantic-topology");
17
+ // ── Constants ──
18
+ exports.SYSTEM_PROMPT = `你是程序合成助手。只输出 JSON 数组,不输出解释。
19
+
20
+ 格式:[{"f":"函数名","to":"变量名","a":[{"n":"参数名","t":"类型","v":值}]},{"r":"变量名"}]
21
+
22
+ 链式调用(最重要!读完再写):
23
+ 前面的 call 产生了 to="sessions",后面的 call 用 "v":"$sessions" 引用,形成链条。
24
+
25
+ 示例——3步链:
26
+ {"f":"getAllSessions","to":"sessions","a":[]}
27
+ {"f":"countSessionsWithViolations","to":"v","a":[{"n":"sessions","t":"any[]","v":"$sessions"}]}
28
+ {"f":"suggestRepairs","to":"r","a":[{"n":"violations","t":"ConstraintViolation[]","v":"$v"}]}
29
+ {"r":"r"}
30
+ 注意:countSessionsWithViolations 用 $sessions 引用上一步的结果;suggestRepairs 用 $v 引用再上一步。
31
+
32
+ 铁律:
33
+ - 必须用 $变量名 把前一步的输出传给下一步!禁止写 "" 或 [] 作为参数值!
34
+ - 每个 "t" 字段必须原样使用函数签名中的类型——如果有 [] 就必须保留(如 "t":"ConstraintViolation[]")
35
+ - 每个 call 用 "to" 命名变量,下一个 call 通过 "$变量名" 引用
36
+ - 0 参数函数用 "a":[],非 0 参数函数绝对不能 "a":[]
37
+ - 最后一个 action 必须是 {"r":"变量名"}
38
+ - 只输出 JSON,不输出解释`;
39
+ exports.RETRY_HINT = `输出格式:紧凑 JSON 数组 [{"f":"函数名","to":"变量名","a":[...]}]`;
40
+ // ── Formatters ──
41
+ /** Build a compact function list with parameter examples for LLM precision. */
42
+ function buildCompactFuncList(funcs, allFuncs) {
43
+ // Example values for each type — helps LLM fill meaningful args
44
+ function exampleValue(type, paramName) {
45
+ const t = (type || "any").replace(/\[\]$/, "").toLowerCase();
46
+ if (t === "string" || t === "str")
47
+ return `"${paramName}"`;
48
+ if (t === "number" || t === "int" || t === "float")
49
+ return paramName === "limit" ? "10" : "1";
50
+ if (t === "boolean" || t === "bool")
51
+ return "false";
52
+ if (t === "any" || t === "object")
53
+ return "{}";
54
+ if (t === "void" || t === "undefined" || t === "null")
55
+ return "null";
56
+ // Known enum types
57
+ if (t === "svl")
58
+ return '"SVL-4"';
59
+ if (t === "rootcause")
60
+ return '"F01"';
61
+ if (t === "branchreason")
62
+ return '"repair_attempt"';
63
+ if (t === "repairstrategy")
64
+ return '"insert"';
65
+ if (t === "constrainttype")
66
+ return '"protocol"';
67
+ if (t.endsWith("[]"))
68
+ return "[]";
69
+ if (t.startsWith("map<"))
70
+ return "new Map()";
71
+ if (t.startsWith("set<"))
72
+ return "new Set()";
73
+ return `{} as ${type}`;
74
+ }
75
+ return funcs.map((f) => {
76
+ const params = (f.params || []).map((p) => {
77
+ const t = p.type || "any";
78
+ const ex = exampleValue(t, p.name || "arg");
79
+ return `${p.name}: ${t} = ${ex}`;
80
+ }).join(", ");
81
+ let line = `${f.name}(${params}) → ${f.returnType || "any"}`;
82
+ const meta = [];
83
+ if (f.score && f.score > 0)
84
+ meta.push(`★${f.score.toFixed(1)}`);
85
+ if (f.purpose)
86
+ meta.push(f.purpose.slice(0, 60));
87
+ if (f.produces && f.produces.length > 0)
88
+ meta.push(`→${f.produces.join(",")}`);
89
+ if (meta.length > 0)
90
+ line += ` // ${meta.join(" | ")}`;
91
+ return line;
92
+ }).join("\n");
93
+ }
94
+ /** Semantic matching: check if two capability labels are related via SemanticTopology. */
95
+ function semanticMatch(a, b) {
96
+ try {
97
+ const topo = (0, semantic_topology_1.getTopology)();
98
+ if (topo.size > 0)
99
+ return topo.capabilityMatch(a, b);
100
+ }
101
+ catch { /* topology rebuild — optional */ }
102
+ if (a === b)
103
+ return true;
104
+ if (a.includes(b) || b.includes(a))
105
+ return true;
106
+ return false;
107
+ }
108
+ /** Build capability chain hints: producer→consumer relationships using semantic matching. */
109
+ function buildChainHints(funcs) {
110
+ const chains = [];
111
+ const seen = new Set();
112
+ for (const f of funcs) {
113
+ if (!f.produces)
114
+ continue;
115
+ for (const p of f.produces) {
116
+ const consumers = funcs.filter((x) => x.name !== f.name &&
117
+ (x.requires || []).some((r) => semanticMatch(p, r)));
118
+ for (const c of consumers) {
119
+ const key = `${f.name}→${c.name}`;
120
+ if (seen.has(key))
121
+ continue;
122
+ seen.add(key);
123
+ const matchedReq = (c.requires || []).find((r) => semanticMatch(p, r));
124
+ chains.push(`${f.name}()→${c.name}() // ${p} ≈ ${matchedReq || "?"}`);
125
+ }
126
+ }
127
+ }
128
+ if (chains.length === 0)
129
+ return "";
130
+ return "\n推荐调用链(先调生产者,用 $变量名 传给消费者):\n" + chains.map(c => ` ${c}`).join("\n");
131
+ }
132
+ /** Build protocol constraint hints for the LLM prompt. */
133
+ function buildProtocolChainHint(protocols) {
134
+ if (protocols.length === 0)
135
+ return "";
136
+ const byNs = new Map();
137
+ for (const p of protocols) {
138
+ const ns = p.protocol.namespace || "_global";
139
+ if (!byNs.has(ns))
140
+ byNs.set(ns, []);
141
+ byNs.get(ns).push(p);
142
+ }
143
+ const lines = ["\n⚠️ 协议约束(必须严格遵循调用顺序):"];
144
+ for (const [ns, fns] of byNs) {
145
+ if (ns === "_global" || fns.length <= 1)
146
+ continue;
147
+ lines.push(` [${ns}] 合法调用链: ${fns.map(p => p.function).join(" → ")}`);
148
+ for (const p of fns) {
149
+ const pre = p.protocol.pre_states?.join(",") || "(无)";
150
+ const post = p.protocol.post_states?.join(",") || "(无)";
151
+ lines.push(` ${p.function}: 前置状态=[${pre}] → 后置状态=[${post}]`);
152
+ }
153
+ }
154
+ return lines.join("\n");
155
+ }
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ /**
3
+ * P2.6: Planner Telemetry Layer (v2)
4
+ *
5
+ * Upgrades from P2.5:
6
+ * - Fingerprint v2: protocol + violationType + actions hash
7
+ * - RepairFeedback v2: decision (accepted|rejected|modified) + executionResult
8
+ * - RepairLifecycle: proposed → accepted → executed → success chain (RLHF data pipeline)
9
+ * - TelemetryIndex: O(1) CandidateStats lookup via Map
10
+ * - CandidateStats: accepted, rejected, executionSuccess, executionFailure, avgLatency
11
+ *
12
+ * This turns telemetry from a log into a training dataset for P4 Reward Model.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.PlannerTelemetry = void 0;
49
+ exports.candidateFingerprint = candidateFingerprint;
50
+ exports.fingerprintFromCandidate = fingerprintFromCandidate;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const crypto = __importStar(require("crypto"));
54
+ // ═══════════════════════════════════════════════════════════════
55
+ // Fingerprint v2
56
+ // ═══════════════════════════════════════════════════════════════
57
+ /**
58
+ * Stable fingerprint: protocol + violationType + normalized action sequence.
59
+ * Cross-protocol collision avoided by including protocol namespace.
60
+ */
61
+ function candidateFingerprint(protocol, actions, violationType) {
62
+ const normalized = [...actions].sort().join("→");
63
+ const payload = `${protocol}:${violationType || "none"}:${normalized}`;
64
+ return crypto.createHash("sha1").update(payload).digest("hex").slice(0, 16);
65
+ }
66
+ /** Convenience: fingerprint from a RepairCandidate + protocol context. */
67
+ function fingerprintFromCandidate(candidate, protocol, violationType) {
68
+ const actions = candidate.actions
69
+ .filter(a => a.kind === "call")
70
+ .map(a => a.function);
71
+ return candidateFingerprint(protocol, actions, violationType);
72
+ }
73
+ function emptyStats() {
74
+ return { accepted: 0, rejected: 0, executionSuccess: 0, executionFailure: 0, totalLatency: 0, latencySamples: 0 };
75
+ }
76
+ // ═══════════════════════════════════════════════════════════════
77
+ // TelemetryIndex — O(1) stats lookup
78
+ // ═══════════════════════════════════════════════════════════════
79
+ class TelemetryIndex {
80
+ constructor() {
81
+ this.stats = new Map();
82
+ }
83
+ get(fp) {
84
+ return this.stats.get(fp) || emptyStats();
85
+ }
86
+ recordAccepted(fp, executionSuccess, latencyMs) {
87
+ const s = this.getOrCreate(fp);
88
+ s.accepted++;
89
+ if (executionSuccess === true)
90
+ s.executionSuccess++;
91
+ else if (executionSuccess === false)
92
+ s.executionFailure++;
93
+ if (latencyMs !== undefined) {
94
+ s.totalLatency += latencyMs;
95
+ s.latencySamples++;
96
+ s.avgLatency = s.totalLatency / s.latencySamples;
97
+ }
98
+ }
99
+ recordRejected(fp) {
100
+ const s = this.getOrCreate(fp);
101
+ s.rejected++;
102
+ }
103
+ getAcceptanceRate(fp, minSamples = 5) {
104
+ const s = this.stats.get(fp);
105
+ if (!s)
106
+ return 0.5; // prior
107
+ const total = s.accepted + s.rejected;
108
+ if (total < minSamples)
109
+ return 0.5;
110
+ return s.accepted / total;
111
+ }
112
+ /**
113
+ * Effective reward: balances acceptance with actual execution success.
114
+ * accepted ≠ good. 50% acceptance + 50% execution success.
115
+ * Prevents the system from learning to prefer fast-but-leaky repairs.
116
+ */
117
+ getEffectiveReward(fp, minSamples = 5) {
118
+ const s = this.stats.get(fp);
119
+ if (!s)
120
+ return 0.5;
121
+ const total = s.accepted + s.rejected;
122
+ if (total < minSamples)
123
+ return 0.5;
124
+ const acceptanceRate = s.accepted / total;
125
+ const execTotal = s.executionSuccess + s.executionFailure;
126
+ const executionRate = execTotal > 0 ? s.executionSuccess / execTotal : 0.5;
127
+ return 0.5 * acceptanceRate + 0.5 * executionRate;
128
+ }
129
+ allStats() {
130
+ return new Map(this.stats);
131
+ }
132
+ getOrCreate(fp) {
133
+ if (!this.stats.has(fp))
134
+ this.stats.set(fp, emptyStats());
135
+ return this.stats.get(fp);
136
+ }
137
+ }
138
+ // ═══════════════════════════════════════════════════════════════
139
+ // PlannerTelemetry (v2)
140
+ // ═══════════════════════════════════════════════════════════════
141
+ const projectDir = process.env.PROGMUNE_PROJECT_DIR || process.cwd();
142
+ const TELEMETRY_DIR = path.resolve(projectDir, ".progmune_corpus", "telemetry");
143
+ const LIFECYCLE_DIR = path.resolve(projectDir, ".progmune_corpus", "lifecycles");
144
+ function ensureDir(dir) {
145
+ if (!fs.existsSync(dir))
146
+ fs.mkdirSync(dir, { recursive: true });
147
+ }
148
+ class PlannerTelemetry {
149
+ constructor(persistPath) {
150
+ this.events = [];
151
+ this.lifecycles = [];
152
+ this.index = new TelemetryIndex();
153
+ this.persistPath = persistPath || path.join(TELEMETRY_DIR, "decisions.jsonl");
154
+ this.lifecyclePath = path.join(LIFECYCLE_DIR, "lifecycles.jsonl");
155
+ this.load();
156
+ this.rebuildIndex();
157
+ }
158
+ // ── Recording ──
159
+ recordDecision(decision) {
160
+ const id = `PD-${Date.now()}-${crypto.randomBytes(3).toString("hex")}`;
161
+ const record = { ...decision, id, timestamp: Date.now() };
162
+ this.events.push(record);
163
+ // Record lifecycle: proposed
164
+ if (decision.selectedCandidateId) {
165
+ const sel = decision.candidates.find(c => c.candidateId === decision.selectedCandidateId);
166
+ if (sel) {
167
+ this.lifecycles.push({
168
+ candidateFingerprint: sel.candidateId,
169
+ goal: decision.goal,
170
+ proposedAt: record.timestamp,
171
+ });
172
+ }
173
+ }
174
+ return id;
175
+ }
176
+ recordFeedback(decisionId, feedback) {
177
+ const event = this.events.find(e => e.id === decisionId);
178
+ if (!event)
179
+ return false;
180
+ event.feedback = feedback;
181
+ // Update TelemetryIndex
182
+ const fp = event.selectedCandidateId;
183
+ if (fp) {
184
+ if (feedback.decision === "accepted") {
185
+ this.index.recordAccepted(fp, feedback.executionResult?.success, event.cost?.latencyMs);
186
+ }
187
+ else if (feedback.decision === "rejected") {
188
+ this.index.recordRejected(fp);
189
+ }
190
+ // "modified" — counted as neither accepted nor rejected for now
191
+ }
192
+ // Update lifecycle
193
+ const lc = this.lifecycles.find(l => l.candidateFingerprint === fp && !l.acceptedAt);
194
+ if (lc) {
195
+ lc.acceptedAt = feedback.timestamp;
196
+ lc.userReason = feedback.userReason;
197
+ this.appendLifecycle(lc);
198
+ }
199
+ this.appendToFile(event);
200
+ return true;
201
+ }
202
+ recordExecutionResult(decisionId, success, violations = [], latencyMs) {
203
+ const event = this.events.find(e => e.id === decisionId);
204
+ if (!event)
205
+ return false;
206
+ if (!event.feedback) {
207
+ event.feedback = { decision: "accepted", timestamp: Date.now() };
208
+ }
209
+ event.feedback.executionResult = { success, violations };
210
+ if (latencyMs !== undefined && !event.cost)
211
+ event.cost = {};
212
+ if (latencyMs !== undefined && event.cost)
213
+ event.cost.latencyMs = latencyMs;
214
+ // Update stats with execution result
215
+ const fp = event.selectedCandidateId;
216
+ if (fp) {
217
+ this.index.recordAccepted(fp, success, latencyMs);
218
+ }
219
+ // Update lifecycle
220
+ const lc = this.lifecycles.find(l => l.candidateFingerprint === fp && l.executionSucceeded === undefined);
221
+ if (lc) {
222
+ lc.executedAt = Date.now();
223
+ lc.executionSucceeded = success;
224
+ if (latencyMs !== undefined)
225
+ lc.executionLatencyMs = latencyMs;
226
+ this.appendLifecycle(lc);
227
+ }
228
+ this.appendToFile(event);
229
+ return true;
230
+ }
231
+ // ── Querying (O(1) via TelemetryIndex) ──
232
+ /** Acceptance rate for a specific candidate fingerprint. */
233
+ getCandidateAcceptance(fp, minSamples = 5) {
234
+ return this.index.getAcceptanceRate(fp, minSamples);
235
+ }
236
+ /** Effective reward: 50% acceptance + 50% execution success. */
237
+ getCandidateReward(fp, minSamples = 5) {
238
+ return this.index.getEffectiveReward(fp, minSamples);
239
+ }
240
+ /** Full stats for a candidate fingerprint. */
241
+ getCandidateStats(fp) {
242
+ return this.index.get(fp);
243
+ }
244
+ getAllCandidateStats() {
245
+ return this.index.allStats();
246
+ }
247
+ /** Overall acceptance rate. */
248
+ getAcceptanceRate() {
249
+ const withFeedback = this.events.filter(e => e.feedback);
250
+ if (withFeedback.length === 0)
251
+ return 0;
252
+ const accepted = withFeedback.filter(e => e.feedback.decision === "accepted");
253
+ return accepted.length / withFeedback.length;
254
+ }
255
+ getAcceptanceBySource() {
256
+ const stats = {};
257
+ for (const e of this.events) {
258
+ if (!e.feedback)
259
+ continue;
260
+ for (const c of e.candidates) {
261
+ const src = c.source;
262
+ if (!stats[src])
263
+ stats[src] = { total: 0, accepted: 0 };
264
+ stats[src].total++;
265
+ if (e.feedback.decision === "accepted" && e.selectedCandidateId === c.candidateId) {
266
+ stats[src].accepted++;
267
+ }
268
+ }
269
+ }
270
+ return Object.fromEntries(Object.entries(stats).map(([k, v]) => [k, { ...v, rate: v.total > 0 ? v.accepted / v.total : 0 }]));
271
+ }
272
+ getAcceptanceByProtocol() {
273
+ const stats = {};
274
+ for (const e of this.events) {
275
+ if (!e.feedback)
276
+ continue;
277
+ const proto = e.protocol;
278
+ if (!stats[proto])
279
+ stats[proto] = { total: 0, accepted: 0 };
280
+ stats[proto].total++;
281
+ if (e.feedback.decision === "accepted")
282
+ stats[proto].accepted++;
283
+ }
284
+ return Object.fromEntries(Object.entries(stats).map(([k, v]) => [k, { ...v, rate: v.total > 0 ? v.accepted / v.total : 0 }]));
285
+ }
286
+ getAcceptanceByGoal() {
287
+ const stats = {};
288
+ for (const e of this.events) {
289
+ if (!e.feedback)
290
+ continue;
291
+ const goal = e.goal;
292
+ if (!stats[goal])
293
+ stats[goal] = { total: 0, accepted: 0 };
294
+ stats[goal].total++;
295
+ if (e.feedback.decision === "accepted")
296
+ stats[goal].accepted++;
297
+ }
298
+ return Object.fromEntries(Object.entries(stats).map(([k, v]) => [k, { ...v, rate: v.total > 0 ? v.accepted / v.total : 0 }]));
299
+ }
300
+ getTopAcceptedRepairs(k = 5) {
301
+ const accepted = this.events.filter(e => e.feedback?.decision === "accepted" && e.selectedCandidateId);
302
+ const counts = new Map();
303
+ for (const e of accepted) {
304
+ const sel = e.candidates.find(c => c.candidateId === e.selectedCandidateId);
305
+ if (!sel)
306
+ continue;
307
+ const key = sel.actions.join("→");
308
+ const existing = counts.get(key);
309
+ if (existing) {
310
+ existing.count++;
311
+ }
312
+ else {
313
+ counts.set(key, { count: 1, goal: e.goal });
314
+ }
315
+ }
316
+ const total = accepted.length;
317
+ return [...counts.entries()]
318
+ .sort((a, b) => b[1].count - a[1].count)
319
+ .slice(0, k)
320
+ .map(([actions, v]) => ({ actions, count: v.count, goal: v.goal, rate: total > 0 ? v.count / total : 0 }));
321
+ }
322
+ getTopRejectedRepairs(k = 5) {
323
+ const rejected = this.events.filter(e => e.feedback?.decision === "rejected" && e.selectedCandidateId);
324
+ const counts = new Map();
325
+ for (const e of rejected) {
326
+ const sel = e.candidates.find(c => c.candidateId === e.selectedCandidateId);
327
+ if (!sel)
328
+ continue;
329
+ const key = sel.actions.join("→");
330
+ const existing = counts.get(key);
331
+ if (existing) {
332
+ existing.count++;
333
+ }
334
+ else {
335
+ counts.set(key, { count: 1, goal: e.goal });
336
+ }
337
+ }
338
+ const total = rejected.length;
339
+ return [...counts.entries()]
340
+ .sort((a, b) => b[1].count - a[1].count)
341
+ .slice(0, k)
342
+ .map(([actions, v]) => ({ actions, count: v.count, goal: v.goal, rate: total > 0 ? v.count / total : 0 }));
343
+ }
344
+ /** Summary stats for KPI dashboards. */
345
+ getSummaryStats() {
346
+ const withFb = this.events.filter(e => e.feedback);
347
+ return {
348
+ totalDecisions: this.events.length,
349
+ withFeedback: withFb.length,
350
+ accepted: withFb.filter(e => e.feedback.decision === "accepted").length,
351
+ rejected: withFb.filter(e => e.feedback.decision === "rejected").length,
352
+ modified: withFb.filter(e => e.feedback.decision === "modified").length,
353
+ };
354
+ }
355
+ get size() { return this.events.length; }
356
+ get withFeedback() { return this.events.filter(e => e.feedback).length; }
357
+ all() { return this.events; }
358
+ allLifecycles() { return this.lifecycles; }
359
+ // ── Persistence ──
360
+ appendToFile(record) {
361
+ try {
362
+ ensureDir(path.dirname(this.persistPath));
363
+ fs.appendFileSync(this.persistPath, JSON.stringify(record) + "\n");
364
+ }
365
+ catch { /* best-effort */ }
366
+ }
367
+ appendLifecycle(lc) {
368
+ try {
369
+ ensureDir(path.dirname(this.lifecyclePath));
370
+ fs.appendFileSync(this.lifecyclePath, JSON.stringify(lc) + "\n");
371
+ }
372
+ catch { /* best-effort */ }
373
+ }
374
+ load() {
375
+ try {
376
+ if (fs.existsSync(this.persistPath)) {
377
+ const lines = fs.readFileSync(this.persistPath, "utf-8").trim().split("\n");
378
+ for (const line of lines) {
379
+ if (!line.trim())
380
+ continue;
381
+ try {
382
+ this.events.push(JSON.parse(line));
383
+ }
384
+ catch { /* skip */ }
385
+ }
386
+ }
387
+ if (fs.existsSync(this.lifecyclePath)) {
388
+ const lines = fs.readFileSync(this.lifecyclePath, "utf-8").trim().split("\n");
389
+ for (const line of lines) {
390
+ if (!line.trim())
391
+ continue;
392
+ try {
393
+ this.lifecycles.push(JSON.parse(line));
394
+ }
395
+ catch { /* skip */ }
396
+ }
397
+ }
398
+ }
399
+ catch { /* start fresh */ }
400
+ }
401
+ rebuildIndex() {
402
+ for (const e of this.events) {
403
+ if (!e.feedback || !e.selectedCandidateId)
404
+ continue;
405
+ const fp = e.selectedCandidateId;
406
+ if (e.feedback.decision === "accepted") {
407
+ this.index.recordAccepted(fp, e.feedback.executionResult?.success, e.cost?.latencyMs);
408
+ }
409
+ else if (e.feedback.decision === "rejected") {
410
+ this.index.recordRejected(fp);
411
+ }
412
+ }
413
+ }
414
+ }
415
+ exports.PlannerTelemetry = PlannerTelemetry;