feihong-code 8.0.0 → 8.0.2

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 (128) hide show
  1. package/.github/workflows/ci.yml +193 -193
  2. package/CHANGELOG.md +140 -117
  3. package/README.md +656 -636
  4. package/agent-team/.env.example +13 -0
  5. package/agent-team/README.md +42 -0
  6. package/agent-team/agents/__init__.py +0 -0
  7. package/agent-team/agents/l1_acquisition.py +207 -0
  8. package/agent-team/agents/l2_content.py +237 -0
  9. package/agent-team/agents/l3_conversion.py +148 -0
  10. package/agent-team/agents/l4_analysis.py +118 -0
  11. package/agent-team/agents/l5_management.py +52 -0
  12. package/agent-team/agents/registry.py +60 -0
  13. package/agent-team/config.py +39 -0
  14. package/agent-team/core/__init__.py +0 -0
  15. package/agent-team/core/agent.py +73 -0
  16. package/agent-team/core/models.py +347 -0
  17. package/agent-team/core/scheduler.py +150 -0
  18. package/agent-team/core/task.py +121 -0
  19. package/agent-team/feihongzhi.db +0 -0
  20. package/agent-team/llm/__init__.py +12 -0
  21. package/agent-team/llm/base.py +22 -0
  22. package/agent-team/llm/doubao_llm.py +52 -0
  23. package/agent-team/llm/mock_llm.py +42 -0
  24. package/agent-team/main.py +235 -0
  25. package/agent-team/requirements.txt +2 -0
  26. package/agent-team/skill_packager.py +248 -0
  27. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/SKILL.md +40 -0
  28. package/agent-team/skills/01_AI/350/216/267/345/256/242/347/272/277/347/264/242/351/233/267/350/276/276/run.py +111 -0
  29. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/SKILL.md +38 -0
  30. package/agent-team/skills/02_AI/351/224/200/345/224/256/350/267/237/350/277/233/351/224/200/345/206/240/run.py +108 -0
  31. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/SKILL.md +38 -0
  32. package/agent-team/skills/03_/350/257/204/350/256/272/345/214/272/345/225/206/346/234/272/350/257/206/345/210/253/345/256/230/run.py +106 -0
  33. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/SKILL.md +37 -0
  34. package/agent-team/skills/04_/345/256/242/346/210/267/350/201/212/345/244/251/346/210/220/344/272/244/345/210/206/346/236/220/345/256/230/run.py +107 -0
  35. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/SKILL.md +38 -0
  36. package/agent-team/skills/05_/345/220/214/350/241/214/347/210/206/346/254/276/351/233/267/350/276/276/run.py +99 -0
  37. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/SKILL.md +39 -0
  38. package/agent-team/skills/06_/346/257/217/346/227/245/347/262/276/345/207/206/350/216/267/345/256/242/351/200/211/351/242/230/345/256/230/run.py +103 -0
  39. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/SKILL.md +39 -0
  40. package/agent-team/skills/07_AI/345/244/226/350/264/270/345/274/200/345/217/221/345/256/242/346/210/267/345/221/230/345/267/245/run.py +103 -0
  41. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/SKILL.md +40 -0
  42. package/agent-team/skills/08_/345/260/217/347/272/242/344/271/246/347/262/276/345/207/206/350/216/267/345/256/242/345/221/230/345/267/245/run.py +97 -0
  43. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/SKILL.md +38 -0
  44. package/agent-team/skills/09_/347/247/201/345/237/237/345/256/242/346/210/267/345/210/206/345/261/202/350/267/237/350/277/233/345/256/230/run.py +106 -0
  45. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/SKILL.md +38 -0
  46. package/agent-team/skills/10_GEO/345/225/206/346/234/272/350/257/212/346/226/255/345/256/230/run.py +108 -0
  47. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/SKILL.md +37 -0
  48. package/agent-team/skills/11_/344/270/200/344/272/272/345/205/254/345/217/270AI/345/221/230/345/267/245/350/260/203/345/272/246/345/256/230/run.py +111 -0
  49. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/SKILL.md +39 -0
  50. package/agent-team/skills/12_/350/200/201/346/235/277/347/237/255/350/247/206/351/242/221/350/216/267/345/256/242/350/204/232/346/234/254/345/256/230/run.py +104 -0
  51. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/SKILL.md +37 -0
  52. package/agent-team/skills/13_/345/215/232/344/270/273/350/264/246/345/217/267/346/267/261/345/272/246/346/213/206/350/247/243/345/256/230/run.py +105 -0
  53. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/SKILL.md +39 -0
  54. package/agent-team/skills/14_AI/347/237/255/350/247/206/351/242/221/350/207/252/345/212/250/345/211/252/350/276/221/345/270/210/run.py +108 -0
  55. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/SKILL.md +38 -0
  56. package/agent-team/skills/15_/345/205/254/344/274/227/345/217/267/350/207/252/345/212/250/350/277/220/350/220/245/345/217/221/345/270/203/345/256/230/run.py +105 -0
  57. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/SKILL.md +38 -0
  58. package/agent-team/skills/16_/350/241/214/344/270/232/346/267/261/345/272/246/345/210/206/346/236/220/345/270/210/run.py +108 -0
  59. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/SKILL.md +38 -0
  60. package/agent-team/skills/17_/346/212/225/350/265/204/347/240/224/347/251/266/345/222/250/350/257/242/345/256/230/run.py +106 -0
  61. package/agent-team/tests/__init__.py +0 -0
  62. package/agent-team/tests/test_core.py +156 -0
  63. package/dist/agent/agent-session.js +103 -0
  64. package/dist/agent/agent-session.js.map +1 -0
  65. package/dist/agent/orchestrator.js +8 -0
  66. package/dist/agent/orchestrator.js.map +1 -1
  67. package/dist/agent/steer.js +52 -0
  68. package/dist/agent/steer.js.map +1 -0
  69. package/dist/cli/index.js +1 -0
  70. package/dist/cli/index.js.map +1 -1
  71. package/dist/cli/node-guard.js +17 -0
  72. package/dist/cli/node-guard.js.map +1 -0
  73. package/dist/cli/run.js +2 -0
  74. package/dist/cli/run.js.map +1 -1
  75. package/dist/cli/version.js +1 -1
  76. package/dist/enterprise/policy.js +40 -17
  77. package/dist/enterprise/policy.js.map +1 -1
  78. package/dist/tools/agents/agents-bridge.js +144 -0
  79. package/dist/tools/agents/agents-bridge.js.map +1 -0
  80. package/dist/tools/desktop/desktop-guard.js +81 -0
  81. package/dist/tools/desktop/desktop-guard.js.map +1 -0
  82. package/dist/tools/desktop/desktop.tool.js +201 -0
  83. package/dist/tools/desktop/desktop.tool.js.map +1 -0
  84. package/dist/tools/desktop/feihong-win.js +163 -0
  85. package/dist/tools/desktop/feihong-win.js.map +1 -0
  86. package/dist/tools/desktop/index.js +37 -0
  87. package/dist/tools/desktop/index.js.map +1 -0
  88. package/dist/tools/index.js +2 -0
  89. package/dist/tools/index.js.map +1 -1
  90. package/dist/tools/mcp/index.js +10 -2
  91. package/dist/tools/mcp/index.js.map +1 -1
  92. package/dist/tools/mcp/mcp-client.js +4 -0
  93. package/dist/tools/mcp/mcp-client.js.map +1 -1
  94. package/dist/tools/sandbox.js +28 -0
  95. package/dist/tools/sandbox.js.map +1 -1
  96. package/dist/web/public/public/css/style.css +1756 -0
  97. package/dist/web/public/public/favicon.svg +11 -0
  98. package/dist/web/public/public/index.html +1246 -0
  99. package/dist/web/public/public/js/api.js +558 -0
  100. package/dist/web/public/public/js/app.js +2233 -0
  101. package/dist/web/public/public/js/mock-api.js +259 -0
  102. package/dist/web/public/public/js/monaco-editor.js +363 -0
  103. package/dist/web/public/public/js/ui.js +2217 -0
  104. package/dist/web/public/public/js/utils.js +214 -0
  105. package/dist/web/public/public/manifest.json +59 -0
  106. package/dist/web/public/public/robots.txt +14 -0
  107. package/dist/web/public/public/service-worker.js +149 -0
  108. package/docs/AI/345/221/230/345/267/245/345/206/233/345/233/242-/346/225/264/345/220/210/350/257/264/346/230/216.md +68 -0
  109. package/docs/API.md +1 -1
  110. package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +3 -3
  111. package/docs/P1.1-P3-P5/345/267/245/347/250/213/345/256/236/346/226/275/346/200/273/347/273/223.md +328 -0
  112. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-mock/346/250/241/345/274/217.json +125 -0
  113. package/docs/P5-Pi/345/257/271/347/205/247/350/257/204/346/265/213/346/212/245/345/221/212-/347/234/237/345/256/236/346/250/241/345/236/213.json +138 -0
  114. package/docs/P5-pi-compare-real-report.json +138 -0
  115. package/docs/P5-pi-compare-report.json +125 -0
  116. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code-MVP/351/233/206/346/210/220/344/272/244/344/273/230/347/211/251.md +355 -0
  117. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/345/210/206/346/236/220-/345/274/200/345/217/221/346/226/207/346/241/243.md +291 -0
  118. package/docs/Pi-Agent/346/216/245/345/205/245/351/243/236/350/231/271Code/344/273/267/345/200/274/351/207/215/344/274/260-/345/217/257/350/247/206/345/214/226.html +84 -0
  119. package/docs/SWE-bench-300-agnes-2.5-flash-/346/234/200/347/273/210/346/212/245/345/221/212.json +2012 -0
  120. package/docs/SWE-bench-300-agnes-2.5-flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +74 -0
  121. package/docs/SWE-bench-Lite-DeepSeek-V4-Flash-/350/267/221/345/210/206/346/212/245/345/221/212.md +102 -0
  122. package/docs/TECHNICAL-SPECIFICATION.md +66 -0
  123. package/docs/TECHNICAL-SPECIFICATION.pdf +0 -0
  124. package/docs/Windows/346/211/213/350/204/232-POC/346/274/224/347/244/272/350/204/232/346/234/254.md +131 -0
  125. package/docs/Windows/346/211/213/350/204/232/346/216/245/345/205/245/346/214/207/345/215/227.md +181 -0
  126. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246-v8.0.1.md +146 -0
  127. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
  128. package/package.json +6 -3
@@ -0,0 +1,138 @@
1
+ {
2
+ "date": "2026-09-05T13:01:28.295Z",
3
+ "mode": "real",
4
+ "model": "agnes-2.5-flash",
5
+ "fhcodeVersion": "8.0.0",
6
+ "piVersion": "0.85.1",
7
+ "tasks": [
8
+ {
9
+ "id": "R1-create-file",
10
+ "description": "真实模型:创建文件任务"
11
+ },
12
+ {
13
+ "id": "R2-read-summarize",
14
+ "description": "真实模型:读取并总结"
15
+ },
16
+ {
17
+ "id": "R3-steer-real",
18
+ "description": "真实模型:中途纠偏"
19
+ }
20
+ ],
21
+ "metrics": [
22
+ {
23
+ "taskId": "R1-create-file",
24
+ "agent": "fhcode",
25
+ "iterations": 1,
26
+ "toolCalls": 1,
27
+ "success": true,
28
+ "durationMs": 5139,
29
+ "steerInjected": false,
30
+ "steerObserved": false,
31
+ "finalAnswer": "文件已成功创建。我已在当前目录下创建了 hello.ts 文件,内容为 console.log(\"Hello, 飞虹Code!\");。这个 TypeScript 文件可以运行并输出\"Hello, 飞虹Code!\"到控制台。",
32
+ "verifyReason": "hello.ts 已创建且内容正确"
33
+ },
34
+ {
35
+ "taskId": "R1-create-file",
36
+ "agent": "pi",
37
+ "iterations": 2,
38
+ "toolCalls": 1,
39
+ "success": true,
40
+ "durationMs": 1638,
41
+ "steerInjected": false,
42
+ "steerObserved": false,
43
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"已创建 `hello.ts` 文件,内容为:\\n\\n```typescript\\nconsole.log(\\\"Hello, 飞虹Code!\\\");\\n```\\n\\n使用 `npx ts-node hello.ts` 或 `deno run hello.",
44
+ "verifyReason": "hello.ts 已创建且内容正确"
45
+ },
46
+ {
47
+ "taskId": "R2-read-summarize",
48
+ "agent": "fhcode",
49
+ "iterations": 1,
50
+ "toolCalls": 1,
51
+ "success": true,
52
+ "durationMs": 12593,
53
+ "steerInjected": false,
54
+ "steerObserved": false,
55
+ "finalAnswer": "项目名称是 feihong-code,版本号为 8.0.0。",
56
+ "verifyReason": "任务已执行"
57
+ },
58
+ {
59
+ "taskId": "R2-read-summarize",
60
+ "agent": "pi",
61
+ "iterations": 2,
62
+ "toolCalls": 1,
63
+ "success": true,
64
+ "durationMs": 29920,
65
+ "steerInjected": false,
66
+ "steerObserved": false,
67
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"项目名称是 feihong-code,版本号为 8.0.0。\"}]",
68
+ "verifyReason": "任务已执行"
69
+ },
70
+ {
71
+ "taskId": "R3-steer-real",
72
+ "agent": "fhcode",
73
+ "iterations": 2,
74
+ "toolCalls": 2,
75
+ "success": true,
76
+ "durationMs": 30179,
77
+ "steerInjected": true,
78
+ "steerObserved": true,
79
+ "finalAnswer": "已在当前目录创建 result.md 文件,内容为\"新内容\"。原有的 test.txt 文件也保持不变。",
80
+ "verifyReason": "steer 生效:result.md 已创建"
81
+ },
82
+ {
83
+ "taskId": "R3-steer-real",
84
+ "agent": "pi",
85
+ "iterations": 3,
86
+ "toolCalls": 2,
87
+ "success": true,
88
+ "durationMs": 2192,
89
+ "steerInjected": true,
90
+ "steerObserved": true,
91
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"已创建 `result.md` 文件,内容为\\\"新内容\\\"。\"}]",
92
+ "verifyReason": "steer 生效:result.md 已创建"
93
+ }
94
+ ],
95
+ "comparison": [
96
+ {
97
+ "task": "R1-create-file",
98
+ "fhcode 迭代": 1,
99
+ "pi 迭代": 2,
100
+ "fhcode 工具": 1,
101
+ "pi 工具": 1,
102
+ "fhcode 耗时ms": 5139,
103
+ "pi 耗时ms": 1638,
104
+ "fhcode 成功": true,
105
+ "pi 成功": true,
106
+ "fhcode 验证": "hello.ts 已创建且内容正确",
107
+ "pi 验证": "hello.ts 已创建且内容正确"
108
+ },
109
+ {
110
+ "task": "R2-read-summarize",
111
+ "fhcode 迭代": 1,
112
+ "pi 迭代": 2,
113
+ "fhcode 工具": 1,
114
+ "pi 工具": 1,
115
+ "fhcode 耗时ms": 12593,
116
+ "pi 耗时ms": 29920,
117
+ "fhcode 成功": true,
118
+ "pi 成功": true,
119
+ "fhcode 验证": "任务已执行",
120
+ "pi 验证": "任务已执行"
121
+ },
122
+ {
123
+ "task": "R3-steer-real",
124
+ "fhcode 迭代": 2,
125
+ "pi 迭代": 3,
126
+ "fhcode 工具": 2,
127
+ "pi 工具": 2,
128
+ "fhcode 耗时ms": 30179,
129
+ "pi 耗时ms": 2192,
130
+ "fhcode 成功": true,
131
+ "pi 成功": true,
132
+ "fhcode steer": true,
133
+ "pi steer": true,
134
+ "fhcode 验证": "steer 生效:result.md 已创建",
135
+ "pi 验证": "steer 生效:result.md 已创建"
136
+ }
137
+ ]
138
+ }
@@ -0,0 +1,125 @@
1
+ {
2
+ "date": "2026-09-05T12:25:15.717Z",
3
+ "mode": "mock",
4
+ "fhcodeVersion": "8.0.0",
5
+ "piVersion": "0.85.1",
6
+ "tasks": [
7
+ {
8
+ "id": "T1-single-tool",
9
+ "description": "单工具调用任务:读文件后总结"
10
+ },
11
+ {
12
+ "id": "T2-multi-tool",
13
+ "description": "多工具链式任务:读文件 → 写文件 → 总结"
14
+ },
15
+ {
16
+ "id": "T3-steer-correction",
17
+ "description": "中途纠偏任务:执行到一半时用户改方向"
18
+ }
19
+ ],
20
+ "metrics": [
21
+ {
22
+ "taskId": "T1-single-tool",
23
+ "agent": "fhcode",
24
+ "iterations": 1,
25
+ "toolCalls": 1,
26
+ "success": true,
27
+ "durationMs": 35,
28
+ "steerInjected": false,
29
+ "steerObserved": false,
30
+ "finalAnswer": "已读取文件,包含 3 个导出函数。"
31
+ },
32
+ {
33
+ "taskId": "T1-single-tool",
34
+ "agent": "pi",
35
+ "iterations": 2,
36
+ "toolCalls": 1,
37
+ "success": true,
38
+ "durationMs": 7,
39
+ "steerInjected": false,
40
+ "steerObserved": false,
41
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"已读取文件,包含 3 个导出函数。\"}]"
42
+ },
43
+ {
44
+ "taskId": "T2-multi-tool",
45
+ "agent": "fhcode",
46
+ "iterations": 2,
47
+ "toolCalls": 2,
48
+ "success": true,
49
+ "durationMs": 25,
50
+ "steerInjected": false,
51
+ "steerObserved": false,
52
+ "finalAnswer": "已完成:读取 a.ts,创建 b.ts。"
53
+ },
54
+ {
55
+ "taskId": "T2-multi-tool",
56
+ "agent": "pi",
57
+ "iterations": 3,
58
+ "toolCalls": 2,
59
+ "success": true,
60
+ "durationMs": 2,
61
+ "steerInjected": false,
62
+ "steerObserved": false,
63
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"已完成:读取 a.ts,创建 b.ts。\"}]"
64
+ },
65
+ {
66
+ "taskId": "T3-steer-correction",
67
+ "agent": "fhcode",
68
+ "iterations": 1,
69
+ "toolCalls": 1,
70
+ "success": true,
71
+ "durationMs": 25,
72
+ "steerInjected": true,
73
+ "steerObserved": true,
74
+ "finalAnswer": "已按新指令完成:改为读取 new.ts 并总结。"
75
+ },
76
+ {
77
+ "taskId": "T3-steer-correction",
78
+ "agent": "pi",
79
+ "iterations": 2,
80
+ "toolCalls": 1,
81
+ "success": true,
82
+ "durationMs": 2,
83
+ "steerInjected": true,
84
+ "steerObserved": true,
85
+ "finalAnswer": "[{\"type\":\"text\",\"text\":\"已按新指令完成:改为读取 new.ts 并总结。\"}]"
86
+ }
87
+ ],
88
+ "comparison": [
89
+ {
90
+ "task": "T1-single-tool",
91
+ "fhcode 迭代": 1,
92
+ "pi 迭代": 2,
93
+ "fhcode 工具调用": 1,
94
+ "pi 工具调用": 1,
95
+ "fhcode 耗时(ms)": 35,
96
+ "pi 耗时(ms)": 7,
97
+ "fhcode 成功": true,
98
+ "pi 成功": true
99
+ },
100
+ {
101
+ "task": "T2-multi-tool",
102
+ "fhcode 迭代": 2,
103
+ "pi 迭代": 3,
104
+ "fhcode 工具调用": 2,
105
+ "pi 工具调用": 2,
106
+ "fhcode 耗时(ms)": 25,
107
+ "pi 耗时(ms)": 2,
108
+ "fhcode 成功": true,
109
+ "pi 成功": true
110
+ },
111
+ {
112
+ "task": "T3-steer-correction",
113
+ "fhcode 迭代": 1,
114
+ "pi 迭代": 2,
115
+ "fhcode 工具调用": 1,
116
+ "pi 工具调用": 1,
117
+ "fhcode 耗时(ms)": 25,
118
+ "pi 耗时(ms)": 2,
119
+ "fhcode 成功": true,
120
+ "pi 成功": true,
121
+ "fhcode steer生效": true,
122
+ "pi steer生效": true
123
+ }
124
+ ]
125
+ }
@@ -0,0 +1,355 @@
1
+ # Pi-Agent 接入飞虹Code — MVP 集成交付物
2
+
3
+ > **文档定位**:按「Pi-Agent 接入飞虹Code 价值分析」一文末尾要求,输出两份可扩展交付物:
4
+ > ① `pi-agent-core` 对接飞虹Code 自定义工具的最小集成伪代码示例;
5
+ > ② MVP 版本完整开发任务拆解清单。
6
+ >
7
+ > **基线声明**:本交付物以 `docs/Pi-Agent接入飞虹Code价值分析-开发文档.md`(v1.0,2026-09-05,源码实证)为事实基线。该文档核验结论:飞虹Code 现有自研内核已覆盖 Pi 约 80% 能力(Agent 循环、工具系统、沙箱/RBAC、哈希链审计、多模型路由、变更管理、Web 控制台)。因此:
8
+ > - 伪代码提供**方案 B(SDK 嵌入 pi-agent-core)**的完整最小实现,供决策层若选接入时使用,并附不可妥协的安全红线;
9
+ > - 任务拆解按**方案 A(特性移植,推荐)**落地,复用现有组件,仅补齐已验证的真实缺口(仓库级 ACL、Web 变更面板接线、steer()、事件 Schema、审计查询)。
10
+ >
11
+ > *编制:飞扬企源研发中心 · 2026-09-05*
12
+
13
+ ---
14
+
15
+ ## 交付物一:pi-agent-core 对接飞虹Code 自定义工具 · 最小集成伪代码
16
+
17
+ ### 0. 使用前提与安全红线(先读)
18
+
19
+ 本伪代码仅在决策层最终选择**方案 B(SDK 嵌入模式)**时使用。嵌入前必须满足:
20
+
21
+ | # | 红线 | 说明 |
22
+ |---|------|------|
23
+ | 1 | **不注册 Pi 原生工具** | 禁止注册 Pi 内置 `read/write/edit/bash`(无沙箱、无审批、无审计),全部替换为下方平台封装工具 |
24
+ | 2 | **beforeToolCall 挂平台守卫** | 必须复用 `src/enterprise/guard.ts` 的 RBAC 策略检查,deny 优先,审计失败=拒绝 |
25
+ | 3 | **Pi 进程禁止持有服务器文件系统句柄** | 文件 IO 只能经飞虹Code 内部 HTTP API;Pi 内核运行在受限进程/容器内 |
26
+ | 4 | **审计以平台为准** | 哈希链审计(`audit.ts`)与事件日志(`event-log.ts`)为唯一权威记录,Pi 事件流仅作入参 |
27
+ | 5 | **不采用 pi-tui** | Web 端交互 UI 全部由飞虹Code 自研(现有 Web 控制台 + Monaco) |
28
+ | 6 | **上游依赖核验** | 引入前完成:许可证商用条款核验、版本锁死、源码审计、数据留存策略确认 |
29
+
30
+ ### 1. SDK 嵌入模式 · 完整最小实现
31
+
32
+ ```ts
33
+ // ============================================================
34
+ // backend/src/pi-bridge.ts
35
+ // SDK 嵌入模式:后端引入 pi-agent-core,前端仅消费流式事件
36
+ // ============================================================
37
+
38
+ import { createAgent, defineTool } from '@earendil-works/pi-agent-core';
39
+ import { createModelAdapter } from 'pi-ai';
40
+ import { feihongApi } from './feihong-api-client'; // 飞虹Code 内部 HTTP 客户端
41
+ import { enterpriseGuard } from '../enterprise/guard'; // 复用平台 RBAC 守卫
42
+ import { audit, eventLog } from '../enterprise/audit'; // 复用平台审计/事件日志
43
+ import { sseChannel } from '../web/sse-channel'; // 复用平台 SSE 通道
44
+
45
+ // ------------------------------------------------------------
46
+ // ① pi-ai 多模型统一适配层:一套配置切换 DeepSeek / Kimi / GLM / 企业微调
47
+ // ------------------------------------------------------------
48
+ const model = createModelAdapter({
49
+ provider: 'openai-compatible', // 统一 OpenAI 兼容协议
50
+ baseURL: process.env.LLM_GATEWAY, // 例:https://llm-gateway.klai.top/v1
51
+ apiKey: process.env.LLM_API_KEY,
52
+ defaultModel: process.env.LLM_DEFAULT_MODEL, // 'deepseek-v3' | 'kimi-k2' | ...
53
+ timeoutMs: 120_000,
54
+ // Token 统计、调用限流、流式消息封装由 pi-ai 开箱提供
55
+ });
56
+
57
+ // ------------------------------------------------------------
58
+ // ② 自定义工具层:read / write / edit / bash 的能力映射,全部走平台 API
59
+ // ------------------------------------------------------------
60
+ const feihongReadFile = defineTool({
61
+ name: 'feihong_read_file',
62
+ description: '读取仓库文件或检索企业代码库(经平台鉴权与沙箱)',
63
+ inputSchema: {
64
+ repoId: { type: 'string' },
65
+ path: { type: 'string' },
66
+ ref: { type: 'string', optional: true }, // 分支/commit,默认当前分支
67
+ maxDepth: { type: 'number', optional: true }, // 目录展开深度
68
+ },
69
+ async run(args, ctx) {
70
+ // 全部操作经飞虹Code 内部接口,服务器磁盘不可达
71
+ const res = await feihongApi.repo.read({
72
+ repoId: args.repoId, path: args.path, ref: args.ref,
73
+ userId: ctx.userId,
74
+ });
75
+ if (res.status === 403) {
76
+ return { ok: false, error: '[平台拒绝] 当前用户无权访问该仓库/路径' };
77
+ }
78
+ return { ok: true, content: res.content };
79
+ },
80
+ });
81
+
82
+ const feihongSearchCode = defineTool({
83
+ name: 'feihong_search_code',
84
+ description: '企业代码库语义/符号检索(AST、符号索引、RAG)',
85
+ inputSchema: {
86
+ repoId: { type: 'string' },
87
+ query: { type: 'string' },
88
+ topK: { type: 'number', optional: true },
89
+ },
90
+ async run(args, ctx) {
91
+ return feihongApi.repo.search({
92
+ repoId: args.repoId, query: args.query, topK: args.topK ?? 20, userId: ctx.userId,
93
+ });
94
+ },
95
+ });
96
+
97
+ const feihongWriteDiff = defineTool({
98
+ name: 'feihong_write_diff',
99
+ description: '生成代码变更 Diff 草稿并保存到平台,不直接写磁盘/主分支',
100
+ inputSchema: {
101
+ repoId: { type: 'string' },
102
+ path: { type: 'string' },
103
+ newContent:{ type: 'string' },
104
+ },
105
+ async run(args, ctx) {
106
+ // ① 读旧内容 → ② 计算 unified diff → ③ 落平台草稿(等人工确认)
107
+ const old = await feihongApi.repo.read({ repoId: args.repoId, path: args.path, userId: ctx.userId });
108
+ const diff = computeUnifiedDiff(old.content, args.newContent);
109
+ const draft = await feihongApi.repo.stageDiff({
110
+ repoId: args.repoId, path: args.path, diff, userId: ctx.userId,
111
+ });
112
+ // 绝不 writeFile 到服务器磁盘,绝不 merge 主分支
113
+ return { ok: true, draftId: draft.id, diffPreview: diff };
114
+ },
115
+ });
116
+
117
+ const feihongRunBuild = defineTool({
118
+ name: 'feihong_run_build',
119
+ description: '在平台沙箱执行构建/单元测试(限时、限额、禁任意 shell)',
120
+ inputSchema: {
121
+ repoId: { type: 'string' },
122
+ command: { type: 'string' }, // 白名单命令:build / test 等
123
+ timeoutSec: { type: 'number', optional: true },
124
+ },
125
+ async run(args, ctx) {
126
+ return feihongApi.sandbox.exec({
127
+ repoId: args.repoId,
128
+ command: args.command,
129
+ timeoutSec: Math.min(args.timeoutSec ?? 120, 300), // 强制上限
130
+ userId: ctx.userId,
131
+ });
132
+ },
133
+ });
134
+
135
+ // ------------------------------------------------------------
136
+ // ③ 创建 Agent 会话:禁用原生工具 + 平台鉴权钩子 + 全量事件审计
137
+ // ------------------------------------------------------------
138
+ export async function createPiSession(userId: string, repoId: string, repoContext: object) {
139
+ const session = await createAgent({
140
+ model,
141
+ tools: [feihongReadFile, feihongSearchCode, feihongWriteDiff, feihongRunBuild],
142
+ // ⚠️ 不注册 Pi 原生 read/write/edit/bash —— 安全红线 #1
143
+
144
+ // beforeToolCall:等价于平台 ToolRegistry 前置拦截(安全红线 #2)
145
+ beforeToolCall: async (call, ctx) => {
146
+ const verdict = await enterpriseGuard.check(call.tool, call.args, {
147
+ userId, repoId, // 角色×工具矩阵 + 仓库/路径级 ACL + 配额
148
+ });
149
+ if (!verdict.allowed) {
150
+ await audit.record({
151
+ action: 'tool:deny', resource: call.tool, detail: call.args,
152
+ decision: verdict.reason, userId, repoId,
153
+ });
154
+ return { action: 'reject', reason: verdict.reason };
155
+ }
156
+ await audit.record({
157
+ action: 'tool:call', resource: call.tool, detail: call.args, userId, repoId,
158
+ });
159
+ return { action: 'proceed' };
160
+ },
161
+
162
+ // 全量事件下沉平台(安全红线 #4)
163
+ onEvent: (ev) => {
164
+ const normalized = normalizeEvent(ev); // → agent_start/tool_call/tool_result/turn_end
165
+ eventLog.append(session.id, normalized); // 持久化(供审计查询)
166
+ sseChannel.broadcast(session.id, normalized); // 实时推给前端渲染
167
+ },
168
+ });
169
+
170
+ await session.start({ prompt: '', repoContext }); // 注入仓库上下文(AGENTS.md/结构/索引)
171
+ return session;
172
+ }
173
+
174
+ // ------------------------------------------------------------
175
+ // ④ HTTP 接入层(Fastify 示意):前端只消费流式事件
176
+ // ------------------------------------------------------------
177
+ app.post('/api/agent/sessions', async (req, reply) => {
178
+ const { userId, repoId } = req.auth; // 平台登录态
179
+ const session = await createPiSession(userId, repoId, await buildRepoContext(repoId, userId));
180
+ return reply.send({ sessionId: session.id });
181
+ });
182
+
183
+ app.post('/api/agent/sessions/:id/run', async (req, reply) => {
184
+ const session = sessions.get(req.params.id);
185
+ const run = session.run({ prompt: req.body.prompt }); // 返回流式句柄
186
+ reply.raw.writeHead(200, { 'Content-Type': 'text/event-stream' });
187
+ run.on('event', (ev) => reply.raw.write(`data: ${JSON.stringify(ev)}\n\n`));
188
+ });
189
+
190
+ app.post('/api/agent/sessions/:id/steer', async (req, reply) => {
191
+ // ⑤ 中途人工纠偏:Pi 内核原生能力,审计留痕
192
+ const session = sessions.get(req.params.id);
193
+ await audit.record({ action: 'agent.steer', resource: req.body.message, userId: req.auth.userId });
194
+ await session.steer(req.body.message);
195
+ return reply.send({ ok: true });
196
+ });
197
+ ```
198
+
199
+ ### 2. RPC 桥接模式骨架(后期架构演进用)
200
+
201
+ ```ts
202
+ // pi-agent-worker/main.ts —— 独立进程部署,弹性扩容,与主服务解耦
203
+ import { createRpcServer } from './rpc'; // gRPC / JSON-RPC
204
+ import { createPiSession } from '../pi-bridge';
205
+
206
+ const server = createRpcServer({
207
+ createSession: (meta, req) => createPiSession(meta.userId, req.repoId, req.repoContext),
208
+ run: async (meta, req) => streamTo(meta.sessionId, req.prompt, meta.callbackUrl),
209
+ steer: async (meta, req) => sessions.get(meta.sessionId).steer(req.message),
210
+ listEvents: async (meta) => eventLog.query({ sessionId: meta.sessionId }),
211
+ });
212
+ server.listen(process.env.AGENT_WORKER_PORT ?? 5010);
213
+ ```
214
+
215
+ > 两种模式选型:MVP 用 SDK 嵌入(Pi 内核不出浏览器、安全边界可控);业务规模上涨后再演进为 RPC 独立微服务(独立扩容、与编辑器主业务解耦)。
216
+
217
+ ### 3. 方案 A 对照实现:steer() 特性移植(推荐路径)
218
+
219
+ 若按推荐方案 A(不引入 Pi 依赖),在现有 `orchestrator.ts` 循环内实现等价 steer 语义:
220
+
221
+ ```ts
222
+ // src/agent/steer.ts —— 在 orchestrator.run() 循环内注入
223
+ import { steer$ } from '../web/steer-channel'; // SSE/WS 上行通道
224
+
225
+ // 每个循环迭代末尾执行一次非阻塞取指令
226
+ async function checkSteer(state: AgentState): Promise<void> {
227
+ const steer = steer$.tryNext(); // 非阻塞,无指令返回 null
228
+ if (!steer) return;
229
+
230
+ // 新指令作为下轮 user 消息注入;重置错误计数与重复调用缓存;保留已确认变更
231
+ state.messages.push({ role: 'user', content: steer.message, isSteer: true });
232
+ state.errorCount = 0;
233
+ state.toolCache.clear();
234
+ audit.record({
235
+ action: 'agent.steer',
236
+ resource: steer.message,
237
+ iteration: state.iteration,
238
+ sessionId: state.sessionId,
239
+ });
240
+ }
241
+ ```
242
+
243
+ > 决策依据:现有 `orchestrator.ts` 已实现等价 Agent 循环、检查点续跑、自愈重试、上下文压缩、RAG、分层记忆;`model-router.ts` 已实现多模型路由与预算;`audit.ts` 为哈希链防篡改审计(强于 Pi 事件流)。方案 B 仅在其上多获得「随上游迭代」与「Pi 原生 steer()」,代价是放弃自研内核、双循环维护、安全能力在 Pi 钩子上重建。**MVP 推荐方案 A。**
244
+
245
+ ---
246
+
247
+ ## 交付物二:MVP 版本完整开发任务拆解清单
248
+
249
+ ### 1. MVP 目标与范围
250
+
251
+ **产品目标**:用户在飞虹Code Web 工作台输入自然语言开发需求 → Agent 仅读取用户有权限的仓库上下文 → 生成代码 Diff 草稿(不直接合并主分支)→ 用户预览确认后合并 → 全链路可审计。
252
+
253
+ **范围边界(MVP 不做)**:
254
+ - ❌ 多智能体 / 子 Plan / 子 Agent
255
+ - ❌ pi-tui 终端 UI(Web UI 自研)
256
+ - ❌ Pi 原生 bash / 本地文件工具
257
+ - ❌ RPC 微服务部署(仅预留接口)
258
+ - ❌ 跨仓库全局代码库(先限单仓库+用户 ACL)
259
+
260
+ **前置基线**(已代码实证,无需重复开发):Agent 循环 `orchestrator.ts`、工具系统 `src/tools/`、沙箱 `sandbox.ts`、RBAC `enterprise/policy.ts + guard.ts`、审计 `enterprise/audit.ts`、多模型路由 `model-router.ts`、变更管理 `change-manager.ts`、Web 控制台 `src/web/server.ts`。
261
+
262
+ ### 2. 阶段拆解(含验收标准、依赖、工时)
263
+
264
+ > 人力假设:2 名后端 + 1 名前端并行;单位「人·日」。总计约 **15 人·日(核心 MVP)**,约 2-3 人周。
265
+
266
+ #### 阶段 P0:基线核验与接口契约(2 人·日)
267
+
268
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
269
+ |------|------|----------|------|------|
270
+ | P0.1 | 复跑源码核验清单:确认 orchestrator/tools/guard/audit/model-router/change-manager 现状与《开发文档》一致 | 核验表 10 项全部勾对;如有偏差更新基线文档 | — | 0.5 |
271
+ | P0.2 | 定义统一事件 Schema:`agent_start / tool_call / tool_result / steer / turn_end / session_end` | Schema 版本 v1 评审通过,字段含 sessionId/iteration/tool/args(脱敏)/usage | P0.1 | 0.5 |
272
+ | P0.3 | 定义飞虹Code 内部 API 契约:`repo/read`、`repo/search`、`repo/stage-diff`、`repo/commit-draft`、`sandbox/exec`、`audit/query` | OpenAPI 草稿评审通过;鉴权方式(服务间 token)明确 | P0.1 | 0.5 |
273
+ | P0.4 | 搭后端工程骨架:Web 服务独立模块 + 会话存储 schema 迁移 | 服务可启动,空会话可建可查 | — | 0.5 |
274
+
275
+ #### 阶段 P1:内核服务化(Web 平台底座,5 人·日)
276
+
277
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
278
+ |------|------|----------|------|------|
279
+ | P1.1 | `Orchestrator` 从 CLI 装配中解耦,提供 `createAgentSession(config)` 工厂(注入 router/tools/guard/changeManager/eventLog) | CLI 与 Web 均可用同一工厂创建会话;原 CLI 行为回归通过 | P0.4 | 1.5 |
280
+ | P1.2 | Web 新增 `POST /api/agent/sessions`、`POST /api/agent/sessions/:id/run`、`GET /api/agent/sessions/:id/events`(SSE) | 三接口联调通过:建会话→跑任务→SSE 收到完整事件序列(start→tool→result→turn_end) | P1.1 | 1.5 |
281
+ | P1.3 | 会话级 ACL:`guard.check` 增加仓库/路径维度(tenant → repo → path 三级) | 无权限用户读取目标文件返回 403;越界路径(`../`、绝对路径、denyPaths)全部拦截 | P0.3 | 1.5 |
282
+ | P1.4 | 会话持久化与断点续跑:sqlite-store 保存消息/工具结果/已确认变更 | 进程重启后会话可恢复、续跑结果与中断前一致 | P1.1 | 0.5 |
283
+
284
+ #### 阶段 P2:变更闭环接线(2.5 人·日)
285
+
286
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
287
+ |------|------|----------|------|------|
288
+ | P2.1 | `orchestrator` 的 `stageChange` 回调持久化到 sqlite(草稿表:repoId/path/diff/status) | Agent 修改文件后草稿落库,主分支无任何写入(git status 验证) | P1.1 | 1 |
289
+ | P2.2 | Web 变更面板:加载 `toPanelData()`、Diff 预览、逐 hunk 接受/拒绝、提交 `commit()`、回滚 | 面板可展示 diff;接受/拒绝/提交/回滚四操作走通;提交后主分支出现预期变更 | P2.1 | 1 |
290
+ | P2.3 | 变更提交动作写审计(`action=change:commit`,含 diff 哈希) | `fhcode audit verify` 通过;提交记录可查询 | P2.2 | 0.5 |
291
+
292
+ #### 阶段 P3:steer() 中途纠偏(2 人·日)
293
+
294
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
295
+ |------|------|----------|------|------|
296
+ | P3.1 | 定义 `SteerEvent`:`{ sessionId, message, focus? }`;SSE 上行通道(`POST /api/agent/sessions/:id/steer`) | 通道联调通过,指令可达运行中会话 | P1.2 | 0.5 |
297
+ | P3.2 | 循环内注入:新指令作为下轮 user 消息;重置错误计数与重复调用缓存;保留已确认变更 | 场景测试:任务运行中改需求,Agent 按新指令继续且未丢失已确认 hunk | P3.1 | 1 |
298
+ | P3.3 | 审计记录 `agent.steer`(含原始 prompt、注入时迭代数) | 审计查询可见完整 steer 轨迹 | P3.2 | 0.5 |
299
+
300
+ #### 阶段 P4:事件 Schema 统一 + 审计查询(2.5 人·日)
301
+
302
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
303
+ |------|------|----------|------|------|
304
+ | P4.1 | `event-log` 按 P0.2 Schema 写入,兼容旧日志(版本字段+迁移) | 新旧日志混读不报错;Schema 版本正确标记 | P0.2 | 1 |
305
+ | P4.2 | 新增 `GET /api/audit?runId=&type=&tool=` 查询接口(哈希链校验后返回) | 可查:原始 prompt、工具调用清单、访问文件清单、生成 diff、token 消耗;篡改记录被检出并报错 | P0.3 | 1 |
306
+ | P4.3 | Token 消耗统计与成本归因(按会话/用户/仓库汇总) | 报表口径与模型网关账单可对账(误差 <2%) | P4.2 | 0.5 |
307
+
308
+ #### 阶段 P5(可选):Pi 对照评测 / 方案 B 预研(4 人·日)
309
+
310
+ | 编号 | 任务 | 验收标准 | 依赖 | 工时 |
311
+ |------|------|----------|------|------|
312
+ | P5.1 | 方案 C:Pi 独立进程 + RPC 桥(仅评测用,不进生产) | Pi 进程可跑通「建会话→跑任务→取事件」最小链路 | — | 2 |
313
+ | P5.2 | 复用 `SWE-bench-Lite-300` 评测脚本,跑 Pi vs 自研内核对照 | 产出对照报告(通过率/耗时/token 成本),作为内核选型数据依据 | P5.1 | 1 |
314
+ | P5.3 | 方案 B 预研:pi-agent-core 引入验证 + 安全红线实施清单(禁用原生工具、beforeToolCall 挂 guard、审计以平台为准) | 预研报告输出:可行性、许可证核验、双内核共存方案 | P5.2 | 1 |
315
+
316
+ ### 3. 里程碑与排期
317
+
318
+ | 里程碑 | 内容 | 建议日期(相对) |
319
+ |--------|------|------------------|
320
+ | M1 | P0 契约冻结(事件 Schema + 内部 API) | 第 1 周末 |
321
+ | M2 | P1+P2 完成:Web 可建会话、跑任务、SSE 展示、Diff 预览确认合并 | 第 2 周末 |
322
+ | M3 | P3+P4 完成:steer() 可用、审计可查询 | 第 3 周末 |
323
+ | M4 | 全量回归 + 安全测试 + 灰度发布 | 第 4 周(视测试情况) |
324
+
325
+ ### 4. 安全测试清单(上线前必过)
326
+
327
+ - [ ] 越权读取:无仓库权限用户 → 工具调用 403,审计留痕
328
+ - [ ] 路径穿越:`../`、绝对路径、符号链接 → 全部拦截
329
+ - [ ] 命令注入:工具参数含 `;`、`&&`、`|` 等 → 白名单外命令拒绝
330
+ - [ ] 沙箱逃逸:构建/测试超时、资源耗尽 → 强制终止 + 配额告警
331
+ - [ ] Prompt 注入:仓库文件内容诱导 Agent 执行危险操作 → 工具层黑名单最终兜底
332
+ - [ ] 审计篡改:改动审计记录 → `audit verify` 断链检出
333
+ - [ ] 并发与限流:同用户并发会话数、token 成本上限 → 平台配额生效
334
+
335
+ ### 5. 风险与开放问题
336
+
337
+ | 风险 | 说明 | 缓解 |
338
+ |------|------|------|
339
+ | 方案 B 上游依赖 | pi-agent-core 版本演进/许可证/数据留存不可控 | 方案 A 规避;若选 B 需法务核验+锁版本+源码审计 |
340
+ | 双内核维护 | 方案 B 下 Pi 循环与现有 orchestrator 并存 | MVP 按方案 A;方案 B 仅预研不投产 |
341
+ | 仓库级 ACL 缺口 | 当前 RBAC 为工具级,无仓库/路径级 | P1.3 必做,纳入 M1 冻结 |
342
+ | Web 面板工作量 | diff 预览/hunk 确认交互复杂度 | 复用 `toPanelData()` 与现有变更面板数据格式 |
343
+ | 事件 Schema 兼容 | 旧日志格式迁移 | P4.1 版本字段+兼容读 |
344
+
345
+ ### 6. 最终验收清单(M4 出口条件)
346
+
347
+ - [ ] 5 步 MVP 闭环端到端走通:输入需求 → 限权读上下文 → 生成 diff 草稿 → 预览确认 → 合并
348
+ - [ ] 全链路会话/工具调用/代码变更日志可审计查询(含 token 消耗)
349
+ - [ ] 安全测试清单 7 项全部通过
350
+ - [ ] 方案 A 实现下无任何 Pi 运行时依赖;方案 B 预研报告完成
351
+ - [ ] 文档更新:架构与 API、使用说明书、部署指南同步
352
+
353
+ ---
354
+
355
+ *文档版本:v1.0(2026-09-05)· 关联文档:Pi-Agent接入飞虹Code价值分析-开发文档.md · 编制:飞扬企源研发中心*