foxclaw 0.1.0 → 0.1.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 (495) hide show
  1. package/README.md +54 -29
  2. package/bin/foxclaw.cjs +51 -0
  3. package/index.js +11 -10
  4. package/package.json +46 -38
  5. package/python/.dockerignore +35 -0
  6. package/python/.env.example +165 -0
  7. package/python/.gitattributes +46 -0
  8. package/python/.github/workflows/ci.yml +122 -0
  9. package/python/.github/workflows/release.yml +183 -0
  10. package/python/Dockerfile +64 -0
  11. package/python/LICENSE +21 -0
  12. package/python/MANIFEST.in +14 -0
  13. package/python/README.md +192 -0
  14. package/python/README_CN.md +324 -0
  15. package/python/bench/bm25_audit.py +199 -0
  16. package/python/bench/bm25_regression.py +178 -0
  17. package/python/bench/bm25_stress.py +159 -0
  18. package/python/bench/cd_audit.py +238 -0
  19. package/python/bench/chaos.py +142 -0
  20. package/python/bench/concurrency.py +103 -0
  21. package/python/bench/e2e_real_models.py +95 -0
  22. package/python/bench/llm_retry_test.py +248 -0
  23. package/python/bench/load_test.py +196 -0
  24. package/python/bench/vector_ivf_upgrade.py +134 -0
  25. package/python/docs/CHANNELS.md +195 -0
  26. package/python/docs/GOVERNANCE.md +164 -0
  27. package/python/docs/RELEASE.md +109 -0
  28. package/python/docs/RUN.md +75 -0
  29. package/python/docs/RUN_CN.md +121 -0
  30. package/python/docs//351/205/215/347/275/256/346/214/207/345/215/227.md +152 -0
  31. package/python/evals/__init__.py +0 -0
  32. package/python/evals/governance/README.md +61 -0
  33. package/python/evals/governance/__init__.py +0 -0
  34. package/python/evals/governance/cases.py +152 -0
  35. package/python/evals/governance/compare_embeddings.py +94 -0
  36. package/python/evals/governance/convergence.svg +11 -0
  37. package/python/evals/governance/report.json +371 -0
  38. package/python/evals/governance/run_evals.py +400 -0
  39. package/python/examples/governance_middleware_demo.py +77 -0
  40. package/python/examples/langgraph_governance_demo.py +108 -0
  41. package/python/examples/sample_itinerary.csv +6 -0
  42. package/python/examples/sample_knowledge.csv +9 -0
  43. package/python/examples/sample_transactions.csv +14 -0
  44. package/python/foxclaw/__init__.py +526 -0
  45. package/python/foxclaw/agents/__init__.py +12 -0
  46. package/python/foxclaw/agents/agents.py +35 -0
  47. package/python/foxclaw/agents/base.py +865 -0
  48. package/python/foxclaw/agents/impl/__init__.py +1 -0
  49. package/python/foxclaw/agents/impl/_helpers.py +78 -0
  50. package/python/foxclaw/agents/impl/finance.py +248 -0
  51. package/python/foxclaw/agents/impl/office.py +367 -0
  52. package/python/foxclaw/agents/impl/supervisor.py +659 -0
  53. package/python/foxclaw/agents/mixins/_context.py +151 -0
  54. package/python/foxclaw/agents/mixins/augment.py +149 -0
  55. package/python/foxclaw/agents/mixins/llm.py +66 -0
  56. package/python/foxclaw/agents/mixins/memory.py +35 -0
  57. package/python/foxclaw/agents/mixins/preference.py +81 -0
  58. package/python/foxclaw/agents/mixins/prompt.py +77 -0
  59. package/python/foxclaw/agents/mixins/skillbox.py +58 -0
  60. package/python/foxclaw/agents/mixins/tool_exec.py +443 -0
  61. package/python/foxclaw/api/__init__.py +283 -0
  62. package/python/foxclaw/api/app.py +123 -0
  63. package/python/foxclaw/api/middleware.py +317 -0
  64. package/python/foxclaw/api/routes/ahs.py +417 -0
  65. package/python/foxclaw/api/routes/attachments.py +117 -0
  66. package/python/foxclaw/api/routes/browser.py +39 -0
  67. package/python/foxclaw/api/routes/domain.py +314 -0
  68. package/python/foxclaw/api/routes/knowledge.py +163 -0
  69. package/python/foxclaw/api/routes/llm_admin.py +461 -0
  70. package/python/foxclaw/api/routes/memory.py +89 -0
  71. package/python/foxclaw/api/routes/orchestration.py +41 -0
  72. package/python/foxclaw/api/routes/recovery.py +43 -0
  73. package/python/foxclaw/api/routes/review.py +275 -0
  74. package/python/foxclaw/api/routes/search.py +37 -0
  75. package/python/foxclaw/api/routes/system.py +327 -0
  76. package/python/foxclaw/api/routes/task.py +281 -0
  77. package/python/foxclaw/api/routes/ws.py +68 -0
  78. package/python/foxclaw/api/spine.py +55 -0
  79. package/python/foxclaw/browser/__init__.py +13 -0
  80. package/python/foxclaw/browser/action/__init__.py +1 -0
  81. package/python/foxclaw/browser/action/action_executor.py +54 -0
  82. package/python/foxclaw/browser/action/action_types.py +45 -0
  83. package/python/foxclaw/browser/action/action_verifier.py +68 -0
  84. package/python/foxclaw/browser/action/url_policy.py +147 -0
  85. package/python/foxclaw/browser/adapter/__init__.py +1 -0
  86. package/python/foxclaw/browser/adapter/base_adapter.py +23 -0
  87. package/python/foxclaw/browser/adapter/web_adapter.py +46 -0
  88. package/python/foxclaw/browser/driver/__init__.py +1 -0
  89. package/python/foxclaw/browser/driver/base_driver.py +61 -0
  90. package/python/foxclaw/browser/driver/playwright_driver.py +166 -0
  91. package/python/foxclaw/browser/perception/__init__.py +1 -0
  92. package/python/foxclaw/browser/perception/dom_extractor.py +43 -0
  93. package/python/foxclaw/browser/perception/element_indexer.py +57 -0
  94. package/python/foxclaw/browser/perception/semantic_reducer.py +33 -0
  95. package/python/foxclaw/browser/perception/snapshot.py +29 -0
  96. package/python/foxclaw/browser/service.py +148 -0
  97. package/python/foxclaw/browser/session/__init__.py +1 -0
  98. package/python/foxclaw/browser/session/session_manager.py +57 -0
  99. package/python/foxclaw/capability/__init__.py +12 -0
  100. package/python/foxclaw/capability/embedding_service.py +67 -0
  101. package/python/foxclaw/channels/__init__.py +140 -0
  102. package/python/foxclaw/channels/discord.py +184 -0
  103. package/python/foxclaw/channels/dispatcher.py +204 -0
  104. package/python/foxclaw/channels/feishu.py +225 -0
  105. package/python/foxclaw/channels/openclaw_bridge.py +156 -0
  106. package/python/foxclaw/channels/signing.py +187 -0
  107. package/python/foxclaw/channels/telegram.py +121 -0
  108. package/python/foxclaw/channels/weixin.py +225 -0
  109. package/python/foxclaw/cli.py +154 -0
  110. package/python/foxclaw/cognitive/__init__.py +4 -0
  111. package/python/foxclaw/cognitive/reasoner.py +82 -0
  112. package/python/foxclaw/cognitive/state.py +147 -0
  113. package/python/foxclaw/core/__init__.py +9 -0
  114. package/python/foxclaw/core/audit_chain.py +133 -0
  115. package/python/foxclaw/core/audit_sink.py +100 -0
  116. package/python/foxclaw/core/compaction.py +283 -0
  117. package/python/foxclaw/core/config.py +65 -0
  118. package/python/foxclaw/core/confirm_nonce.py +157 -0
  119. package/python/foxclaw/core/dispatch.py +27 -0
  120. package/python/foxclaw/core/envfile.py +48 -0
  121. package/python/foxclaw/core/failure_policy.py +151 -0
  122. package/python/foxclaw/core/gateway.py +85 -0
  123. package/python/foxclaw/core/governance_audit.py +175 -0
  124. package/python/foxclaw/core/idempotency.py +289 -0
  125. package/python/foxclaw/core/injection_guard.py +221 -0
  126. package/python/foxclaw/core/memory_adapter.py +516 -0
  127. package/python/foxclaw/core/metrics.py +89 -0
  128. package/python/foxclaw/core/model_router.py +1097 -0
  129. package/python/foxclaw/core/paths.py +103 -0
  130. package/python/foxclaw/core/recovery.py +362 -0
  131. package/python/foxclaw/core/scheduler.py +144 -0
  132. package/python/foxclaw/core/secrets.py +134 -0
  133. package/python/foxclaw/core/sessions.py +157 -0
  134. package/python/foxclaw/core/settings.py +430 -0
  135. package/python/foxclaw/core/shared_write.py +198 -0
  136. package/python/foxclaw/core/steering_queue.py +153 -0
  137. package/python/foxclaw/core/system_bus.py +84 -0
  138. package/python/foxclaw/core/thought_chain.py +318 -0
  139. package/python/foxclaw/core/token_meter.py +235 -0
  140. package/python/foxclaw/core/tools.py +172 -0
  141. package/python/foxclaw/core/tracing.py +390 -0
  142. package/python/foxclaw/core/truth_pipeline.py +114 -0
  143. package/python/foxclaw/core/vec_recall_adapter.py +503 -0
  144. package/python/foxclaw/core/verify.py +181 -0
  145. package/python/foxclaw/core/web_search.py +242 -0
  146. package/python/foxclaw/finance/__init__.py +15 -0
  147. package/python/foxclaw/finance/evidence.py +153 -0
  148. package/python/foxclaw/finance/fx.py +100 -0
  149. package/python/foxclaw/finance/graph.py +188 -0
  150. package/python/foxclaw/finance/models.py +150 -0
  151. package/python/foxclaw/finance/nlparse.py +575 -0
  152. package/python/foxclaw/finance/policy.py +329 -0
  153. package/python/foxclaw/finance/reasoner.py +129 -0
  154. package/python/foxclaw/finance/reasoning.py +340 -0
  155. package/python/foxclaw/finance/reconcile.py +180 -0
  156. package/python/foxclaw/finance/runtime.py +527 -0
  157. package/python/foxclaw/governance/__init__.py +24 -0
  158. package/python/foxclaw/governance/middleware.py +184 -0
  159. package/python/foxclaw/harness/__init__.py +17 -0
  160. package/python/foxclaw/harness/_base.py +72 -0
  161. package/python/foxclaw/harness/_policy.py +359 -0
  162. package/python/foxclaw/harness/drift.py +89 -0
  163. package/python/foxclaw/harness/event_bus.py +31 -0
  164. package/python/foxclaw/harness/harness.py +446 -0
  165. package/python/foxclaw/harness/loop_detection.py +152 -0
  166. package/python/foxclaw/itinerary/__init__.py +10 -0
  167. package/python/foxclaw/itinerary/amap_client.py +117 -0
  168. package/python/foxclaw/itinerary/models.py +80 -0
  169. package/python/foxclaw/itinerary/reasoner.py +101 -0
  170. package/python/foxclaw/itinerary/reasoning.py +174 -0
  171. package/python/foxclaw/itinerary/runtime.py +148 -0
  172. package/python/foxclaw/kernel/__init__.py +13 -0
  173. package/python/foxclaw/kernel/capabilities.py +73 -0
  174. package/python/foxclaw/kernel/policy_gate.py +114 -0
  175. package/python/foxclaw/kernel/process_manager.py +205 -0
  176. package/python/foxclaw/kernel/scheduler.py +131 -0
  177. package/python/foxclaw/kernel/sentinel.py +453 -0
  178. package/python/foxclaw/kernel/sentinel_client.py +246 -0
  179. package/python/foxclaw/kernel/spine.py +97 -0
  180. package/python/foxclaw/knowledge/__init__.py +376 -0
  181. package/python/foxclaw/knowledge/truth_crystallizer.py +92 -0
  182. package/python/foxclaw/learning/__init__.py +12 -0
  183. package/python/foxclaw/learning/knowledge_graph.py +149 -0
  184. package/python/foxclaw/learning/models.py +93 -0
  185. package/python/foxclaw/learning/reasoner.py +70 -0
  186. package/python/foxclaw/learning/runtime.py +363 -0
  187. package/python/foxclaw/learning/spaced_repetition.py +96 -0
  188. package/python/foxclaw/mcp_server.py +189 -0
  189. package/python/foxclaw/orchestration/__init__.py +184 -0
  190. package/python/foxclaw/pipeline/__init__.py +23 -0
  191. package/python/foxclaw/pipeline/cognitive_pipeline.py +481 -0
  192. package/python/foxclaw/pipeline/supervisor_stages.py +230 -0
  193. package/python/foxclaw/planning/__init__.py +17 -0
  194. package/python/foxclaw/planning/llm_planner.py +232 -0
  195. package/python/foxclaw/planning/planner.py +99 -0
  196. package/python/foxclaw/search/__init__.py +24 -0
  197. package/python/foxclaw/search/agent_port.py +194 -0
  198. package/python/foxclaw/search/evidence.py +113 -0
  199. package/python/foxclaw/search/external_search.py +50 -0
  200. package/python/foxclaw/search/hkc_read_port.py +60 -0
  201. package/python/foxclaw/search/internal_search.py +73 -0
  202. package/python/foxclaw/search/models.py +129 -0
  203. package/python/foxclaw/search/planner.py +44 -0
  204. package/python/foxclaw/search/retriever.py +39 -0
  205. package/python/foxclaw/search/runtime.py +134 -0
  206. package/python/foxclaw/search/strategy.py +44 -0
  207. package/python/foxclaw/skills/__init__.py +613 -0
  208. package/python/foxclaw/skills/hooks_spec.py +73 -0
  209. package/python/foxclaw/skills/lifecycle.py +278 -0
  210. package/python/foxclaw/skills/markdown_skill.py +174 -0
  211. package/python/foxclaw/skills/markdown_store.py +39 -0
  212. package/python/foxclaw/skills/mcp_client.py +190 -0
  213. package/python/foxclaw/skills/mcp_store.py +43 -0
  214. package/python/foxclaw/skills/permission.py +180 -0
  215. package/python/foxclaw/skills/pipeline.py +386 -0
  216. package/python/foxclaw/skills/policy.py +80 -0
  217. package/python/foxclaw/skills/review.py +72 -0
  218. package/python/foxclaw/skills/store.py +57 -0
  219. package/python/frontend/assets/core_bg.jpg +0 -0
  220. package/python/frontend/deck/auth.js +32 -0
  221. package/python/frontend/deck/chat_model_picker.js +537 -0
  222. package/python/frontend/deck/domain.js +296 -0
  223. package/python/frontend/deck/main.js +1950 -0
  224. package/python/frontend/deck/markdown.js +48 -0
  225. package/python/frontend/deck/settings.js +324 -0
  226. package/python/frontend/deck/state.js +6 -0
  227. package/python/frontend/deck/util.js +6 -0
  228. package/python/frontend/deck/visuals.js +212 -0
  229. package/python/frontend/deck.css +855 -0
  230. package/python/frontend/deck.html +686 -0
  231. package/python/frontend/deck_v2.html +341 -0
  232. package/python/frontend/planet/index.html +266 -0
  233. package/python/frontend/planet/planet.css +579 -0
  234. package/python/frontend/planet/planet.js +1637 -0
  235. package/python/frontend/planet/vendor/three.core.min.js +6 -0
  236. package/python/frontend/planet/vendor/three.module.min.js +6 -0
  237. package/python/frontend/v3/assets/index-BD7VPbMV.js +33 -0
  238. package/python/frontend/v3/assets/index-CAvnYWGH.css +1 -0
  239. package/python/frontend/v3/index.html +15 -0
  240. package/python/frontend/widget_runtime.js +295 -0
  241. package/python/frontend/widgets.js +696 -0
  242. package/python/frontend_src/index.html +14 -0
  243. package/python/frontend_src/package-lock.json +1376 -0
  244. package/python/frontend_src/package.json +19 -0
  245. package/python/frontend_src/src/App.vue +62 -0
  246. package/python/frontend_src/src/api.js +89 -0
  247. package/python/frontend_src/src/components/ChatDock.vue +377 -0
  248. package/python/frontend_src/src/components/ComposerMenu.vue +75 -0
  249. package/python/frontend_src/src/components/DocViewer.vue +171 -0
  250. package/python/frontend_src/src/components/Inspector.vue +241 -0
  251. package/python/frontend_src/src/components/LeftRail.vue +394 -0
  252. package/python/frontend_src/src/components/MenuPopover.vue +130 -0
  253. package/python/frontend_src/src/components/MessageStream.vue +401 -0
  254. package/python/frontend_src/src/components/ModelPicker.vue +355 -0
  255. package/python/frontend_src/src/components/QuickIngest.vue +118 -0
  256. package/python/frontend_src/src/components/Stage.vue +226 -0
  257. package/python/frontend_src/src/components/ToolMenu.vue +144 -0
  258. package/python/frontend_src/src/components/TopBar.vue +90 -0
  259. package/python/frontend_src/src/components/panels/ActivityPanel.vue +84 -0
  260. package/python/frontend_src/src/components/panels/AgentsPanel.vue +86 -0
  261. package/python/frontend_src/src/components/panels/KnowledgePanel.vue +441 -0
  262. package/python/frontend_src/src/components/panels/MemoryPanel.vue +118 -0
  263. package/python/frontend_src/src/components/panels/PanelBox.vue +51 -0
  264. package/python/frontend_src/src/components/panels/ReviewPanel.vue +308 -0
  265. package/python/frontend_src/src/components/panels/SettingsPanel.vue +254 -0
  266. package/python/frontend_src/src/components/panels/TasksPanel.vue +74 -0
  267. package/python/frontend_src/src/components/panels/ToolsPanel.vue +640 -0
  268. package/python/frontend_src/src/components/panels/UsagePanel.vue +105 -0
  269. package/python/frontend_src/src/lib/fmt.js +48 -0
  270. package/python/frontend_src/src/lib/md.js +204 -0
  271. package/python/frontend_src/src/main.js +7 -0
  272. package/python/frontend_src/src/stores/app.js +106 -0
  273. package/python/frontend_src/src/stores/chat.js +484 -0
  274. package/python/frontend_src/src/stores/model.js +104 -0
  275. package/python/frontend_src/src/stores/panels.js +330 -0
  276. package/python/frontend_src/src/styles/base.css +138 -0
  277. package/python/frontend_src/src/styles/panel.css +117 -0
  278. package/python/frontend_src/src/styles/tokens.css +78 -0
  279. package/python/frontend_src/vite.config.js +46 -0
  280. package/python/pyproject.toml +265 -0
  281. package/python/skills/README.md +123 -0
  282. package/python/skills/execution-contract/SKILL.md +30 -0
  283. package/python/skills/general-assistant/SKILL.md +34 -0
  284. package/python/skills/planner/SKILL.md +33 -0
  285. package/python/skills/schedule-itinerary/SKILL.md +35 -0
  286. package/python/skills/skill-composition/SKILL.md +31 -0
  287. package/python/skills/skill-guard/SKILL.md +67 -0
  288. package/python/skills/skill-memory/SKILL.md +50 -0
  289. package/python/skills/skill-router/SKILL.md +35 -0
  290. package/python/tests/conftest.py +76 -0
  291. package/python/tests/run_all.py +263 -0
  292. package/python/tests/test_agent_lifecycle.py +360 -0
  293. package/python/tests/test_ahs_p2.py +414 -0
  294. package/python/tests/test_anthropic_tools.py +206 -0
  295. package/python/tests/test_api.py +87 -0
  296. package/python/tests/test_api_auth.py +83 -0
  297. package/python/tests/test_api_host_guard.py +69 -0
  298. package/python/tests/test_attachments.py +167 -0
  299. package/python/tests/test_audit_chain.py +121 -0
  300. package/python/tests/test_audit_sink.py +136 -0
  301. package/python/tests/test_browser.py +153 -0
  302. package/python/tests/test_browser_request_guard.py +184 -0
  303. package/python/tests/test_capabilities.py +158 -0
  304. package/python/tests/test_channel_signing.py +192 -0
  305. package/python/tests/test_channel_trust.py +109 -0
  306. package/python/tests/test_channels.py +184 -0
  307. package/python/tests/test_cli.py +46 -0
  308. package/python/tests/test_compaction_toolpair.py +119 -0
  309. package/python/tests/test_config_layering.py +65 -0
  310. package/python/tests/test_confirm_nonce.py +197 -0
  311. package/python/tests/test_context_compaction_wiring.py +130 -0
  312. package/python/tests/test_dispatch.py +95 -0
  313. package/python/tests/test_domain_evals.py +403 -0
  314. package/python/tests/test_domain_import.py +78 -0
  315. package/python/tests/test_domain_reasoners.py +148 -0
  316. package/python/tests/test_e2e.py +178 -0
  317. package/python/tests/test_emb_cache.py +107 -0
  318. package/python/tests/test_embedding_singleton.py +89 -0
  319. package/python/tests/test_envfile.py +83 -0
  320. package/python/tests/test_evals_smoke.py +114 -0
  321. package/python/tests/test_event_spine.py +182 -0
  322. package/python/tests/test_evidence_semantic.py +101 -0
  323. package/python/tests/test_evidence_sse.py +97 -0
  324. package/python/tests/test_file_ingest.py +146 -0
  325. package/python/tests/test_finance.py +153 -0
  326. package/python/tests/test_finance_ledger.py +252 -0
  327. package/python/tests/test_finance_persist.py +178 -0
  328. package/python/tests/test_gateway.py +144 -0
  329. package/python/tests/test_governance.py +468 -0
  330. package/python/tests/test_governance_audit.py +359 -0
  331. package/python/tests/test_governance_middleware.py +143 -0
  332. package/python/tests/test_hkc.py +286 -0
  333. package/python/tests/test_hkc_index_build_manager.py +339 -0
  334. package/python/tests/test_hkc_manifest_reuse.py +317 -0
  335. package/python/tests/test_hkc_search_event_sync.py +533 -0
  336. package/python/tests/test_import_path_guard.py +161 -0
  337. package/python/tests/test_injection_guard.py +211 -0
  338. package/python/tests/test_integration.py +141 -0
  339. package/python/tests/test_itinerary.py +103 -0
  340. package/python/tests/test_kee_semantic.py +89 -0
  341. package/python/tests/test_kernel.py +222 -0
  342. package/python/tests/test_learning.py +110 -0
  343. package/python/tests/test_llm_admin.py +160 -0
  344. package/python/tests/test_llm_planner.py +366 -0
  345. package/python/tests/test_markdown_skills.py +73 -0
  346. package/python/tests/test_markdown_skills_openclaw.py +71 -0
  347. package/python/tests/test_mcp_connectors.py +109 -0
  348. package/python/tests/test_mcp_guardian_discovery.py +91 -0
  349. package/python/tests/test_mcp_no_memory.py +43 -0
  350. package/python/tests/test_mcp_policy_gate.py +77 -0
  351. package/python/tests/test_mcp_server.py +95 -0
  352. package/python/tests/test_memory_recall.py +95 -0
  353. package/python/tests/test_metrics.py +66 -0
  354. package/python/tests/test_multi_chain.py +102 -0
  355. package/python/tests/test_multimodal.py +135 -0
  356. package/python/tests/test_negotiation.py +146 -0
  357. package/python/tests/test_orchestration.py +119 -0
  358. package/python/tests/test_orchestration_decoupled.py +109 -0
  359. package/python/tests/test_p3_p5_hardening.py +338 -0
  360. package/python/tests/test_parallel_dispatch.py +215 -0
  361. package/python/tests/test_pipeline.py +533 -0
  362. package/python/tests/test_plan_visible.py +86 -0
  363. package/python/tests/test_planner.py +95 -0
  364. package/python/tests/test_policy_gate.py +109 -0
  365. package/python/tests/test_reasoner.py +185 -0
  366. package/python/tests/test_release_check.py +263 -0
  367. package/python/tests/test_resume_checkpoint.py +156 -0
  368. package/python/tests/test_routing.py +95 -0
  369. package/python/tests/test_scheduler.py +141 -0
  370. package/python/tests/test_search.py +204 -0
  371. package/python/tests/test_secrets.py +159 -0
  372. package/python/tests/test_semantic.py +78 -0
  373. package/python/tests/test_sessions.py +91 -0
  374. package/python/tests/test_settings.py +281 -0
  375. package/python/tests/test_shadow_learning.py +330 -0
  376. package/python/tests/test_shared_write.py +207 -0
  377. package/python/tests/test_skill_taint_gate.py +154 -0
  378. package/python/tests/test_skills.py +133 -0
  379. package/python/tests/test_stats_and_events.py +165 -0
  380. package/python/tests/test_streaming.py +60 -0
  381. package/python/tests/test_supervisor_pipeline.py +177 -0
  382. package/python/tests/test_supervisor_triage.py +108 -0
  383. package/python/tests/test_taint.py +117 -0
  384. package/python/tests/test_task_stream.py +85 -0
  385. package/python/tests/test_thinking_sse.py +67 -0
  386. package/python/tests/test_thinking_stream.py +76 -0
  387. package/python/tests/test_tool_center.py +129 -0
  388. package/python/tests/test_tool_parallel.py +113 -0
  389. package/python/tests/test_tool_params.py +103 -0
  390. package/python/tests/test_tool_use.py +242 -0
  391. package/python/tests/test_toplevel_concurrency.py +117 -0
  392. package/python/tests/test_tracing.py +290 -0
  393. package/python/tests/test_truth_crystallizer.py +127 -0
  394. package/python/tests/test_truth_flow.py +93 -0
  395. package/python/tests/test_url_policy.py +53 -0
  396. package/python/tests/test_verify_evidence.py +225 -0
  397. package/python/tests/test_version_sync.py +71 -0
  398. package/python/tests/test_web_trigger.py +99 -0
  399. package/python/tools/check_faiss_type.py +31 -0
  400. package/python/tools/check_log.ps1 +46 -0
  401. package/python/tools/ivf_status.py +72 -0
  402. package/python/tools/mypy_baseline.txt +5 -0
  403. package/python/tools/mypy_ratchet.py +97 -0
  404. package/python/tools/pack.py +178 -0
  405. package/python/tools/release_check.py +349 -0
  406. package/python/tools/restart_foxclaw.ps1 +74 -0
  407. package/python/tools/shared_write_audit.py +204 -0
  408. package/python/tools/size_baseline.txt +28 -0
  409. package/python/tools/size_check.py +102 -0
  410. package/python/tools/verify_env.bat +2 -0
  411. package/python/tools/verify_env.py +25 -0
  412. package/python/vendor/HMR_LICENSE +37 -0
  413. package/python/vendor/HMR_README.md +65 -0
  414. package/python/vendor/hkc/LICENSE +37 -0
  415. package/python/vendor/hkc/hkc_ace/__init__.py +0 -0
  416. package/python/vendor/hkc/hkc_ace/ace.py +457 -0
  417. package/python/vendor/hkc/hkc_ace/skill_taxonomy.json +465 -0
  418. package/python/vendor/hkc/hkc_api/__init__.py +0 -0
  419. package/python/vendor/hkc/hkc_api/container.py +416 -0
  420. package/python/vendor/hkc/hkc_api/ingest_jobs.py +103 -0
  421. package/python/vendor/hkc/hkc_api/main.py +157 -0
  422. package/python/vendor/hkc/hkc_api/routes/__init__.py +0 -0
  423. package/python/vendor/hkc/hkc_api/routes/ability.py +151 -0
  424. package/python/vendor/hkc/hkc_api/routes/config.py +51 -0
  425. package/python/vendor/hkc/hkc_api/routes/knowledge.py +630 -0
  426. package/python/vendor/hkc/hkc_api/routes/search.py +88 -0
  427. package/python/vendor/hkc/hkc_api/schemas.py +153 -0
  428. package/python/vendor/hkc/hkc_api/synthesis.py +179 -0
  429. package/python/vendor/hkc/hkc_core/__init__.py +0 -0
  430. package/python/vendor/hkc/hkc_core/graph/__init__.py +0 -0
  431. package/python/vendor/hkc/hkc_core/graph/base.py +188 -0
  432. package/python/vendor/hkc/hkc_core/graph/sqlite_store.py +789 -0
  433. package/python/vendor/hkc/hkc_core/models/__init__.py +0 -0
  434. package/python/vendor/hkc/hkc_core/models/enums.py +65 -0
  435. package/python/vendor/hkc/hkc_core/models/ku.py +307 -0
  436. package/python/vendor/hkc/hkc_core/utils/__init__.py +0 -0
  437. package/python/vendor/hkc/hkc_core/utils/id_gen.py +113 -0
  438. package/python/vendor/hkc/hkc_crystallizer/__init__.py +44 -0
  439. package/python/vendor/hkc/hkc_crystallizer/adapters.py +94 -0
  440. package/python/vendor/hkc/hkc_crystallizer/candidate.py +145 -0
  441. package/python/vendor/hkc/hkc_crystallizer/crystallizer.py +179 -0
  442. package/python/vendor/hkc/hkc_crystallizer/ingress.py +90 -0
  443. package/python/vendor/hkc/hkc_kde/__init__.py +0 -0
  444. package/python/vendor/hkc/hkc_kde/chunker.py +197 -0
  445. package/python/vendor/hkc/hkc_kde/extractor.py +623 -0
  446. package/python/vendor/hkc/hkc_kde/kde.py +298 -0
  447. package/python/vendor/hkc/hkc_kde/loaders/__init__.py +0 -0
  448. package/python/vendor/hkc/hkc_kde/loaders/ebook_loader.py +153 -0
  449. package/python/vendor/hkc/hkc_kde/loaders/office_loader.py +194 -0
  450. package/python/vendor/hkc/hkc_kde/loaders/pdf_loader.py +162 -0
  451. package/python/vendor/hkc/hkc_kde/loaders/text_loader.py +157 -0
  452. package/python/vendor/hkc/hkc_kde/loaders/web_loader.py +91 -0
  453. package/python/vendor/hkc/hkc_kde/models.py +74 -0
  454. package/python/vendor/hkc/hkc_kde/packager.py +329 -0
  455. package/python/vendor/hkc/hkc_kde/relation_disc.py +151 -0
  456. package/python/vendor/hkc/hkc_kee/__init__.py +0 -0
  457. package/python/vendor/hkc/hkc_kee/dedup.py +227 -0
  458. package/python/vendor/hkc/hkc_kee/fingerprint.py +106 -0
  459. package/python/vendor/hkc/hkc_kee/kee.py +541 -0
  460. package/python/vendor/hkc/hkc_kep/__init__.py +0 -0
  461. package/python/vendor/hkc/hkc_kep/event_bus.py +205 -0
  462. package/python/vendor/hkc/hkc_sdk/__init__.py +63 -0
  463. package/python/vendor/hkc/hkc_sdk/base.py +151 -0
  464. package/python/vendor/hkc/hkc_sdk/direct_client.py +153 -0
  465. package/python/vendor/hkc/hkc_sdk/exceptions.py +39 -0
  466. package/python/vendor/hkc/hkc_sdk/http_client.py +166 -0
  467. package/python/vendor/hkc/hkc_sdk/models.py +171 -0
  468. package/python/vendor/hkc/hkc_search/__init__.py +0 -0
  469. package/python/vendor/hkc/hkc_search/bm25.py +325 -0
  470. package/python/vendor/hkc/hkc_search/embedding_backends.py +374 -0
  471. package/python/vendor/hkc/hkc_search/graph_search.py +132 -0
  472. package/python/vendor/hkc/hkc_search/hybrid.py +331 -0
  473. package/python/vendor/hkc/hkc_search/index_build_manager.py +378 -0
  474. package/python/vendor/hkc/hkc_search/vector_search.py +484 -0
  475. package/python/vendor/hmr/__init__.py +0 -0
  476. package/python/vendor/hmr/core/__init__.py +0 -0
  477. package/python/vendor/hmr/core/hmr.py +684 -0
  478. package/python/vendor/hmr/core/models.py +310 -0
  479. package/python/vendor/hmr/engines/__init__.py +0 -0
  480. package/python/vendor/hmr/engines/evolution.py +710 -0
  481. package/python/vendor/hmr/engines/jit_compiler.py +472 -0
  482. package/python/vendor/hmr/engines/lifecycle.py +264 -0
  483. package/python/vendor/hmr/engines/policy.py +625 -0
  484. package/python/vendor/hmr/engines/recall.py +260 -0
  485. package/python/vendor/hmr/engines/runtime_state.py +158 -0
  486. package/python/vendor/hmr/engines/scheduler.py +323 -0
  487. package/python/vendor/hmr/engines/semantic.py +150 -0
  488. package/python/vendor/hmr/engines/temporal.py +261 -0
  489. package/python/vendor/hmr/engines/thought_chain.py +635 -0
  490. package/python/vendor/hmr/graph/__init__.py +0 -0
  491. package/python/vendor/hmr/graph/cwg.py +338 -0
  492. package/python/vendor/hmr/graph/memory_graph.py +530 -0
  493. package/python/vendor/hmr/storage/__init__.py +0 -0
  494. package/python/vendor/hmr/storage/memory_fs.py +300 -0
  495. package/python/vendor/hmr/storage/vector_store.py +520 -0
@@ -0,0 +1,109 @@
1
+ # 发布流程
2
+
3
+ > **当前状态(2026-11-07):发布暂缓。** 开发全部完成后再一次性发,现在只往 GitHub 推代码。
4
+ > 因此**不要**打 `v*` tag(`.github/workflows/release.yml` 由 tag 触发),也**不要**跑
5
+ > `workflow_dispatch` 的 `publish` 选项。流水线已经就位,等要发时按下面走。
6
+ >
7
+ > 另外两个 registry 的现状(查过,别再当"全新包"处理):
8
+ >
9
+ > - PyPI `foxclaw` 已有 **0.1.0**(2026-11-06 上传,不能重发,只能 yank);
10
+ > - npm `foxclaw` 已有 `0.0.0-stage` / `0.1.0` / **0.1.1**(latest),而仓库代码是 0.1.0
11
+ > —— 那个 0.1.1 是手工 `npm publish` 后没提交,git 里找不到对应版本。
12
+ >
13
+ > 所以下次真正发布时,四处版本号必须先跳到 **≥ 0.1.2**(PyPI 只需 >0.1.0,npm 需 >0.1.1,取大)。
14
+
15
+ 两条发布通道、两种产物,性质完全不同,先说清楚免得误会:
16
+
17
+ | 产物 | 命令 | 里面有什么 |
18
+ | --- | --- | --- |
19
+ | PyPI `foxclaw` | `pip install foxclaw` | **占位包**:能 import,但 `vendor/`(HKC/HMR)不入包 → 知识/记忆子系统降级为 None |
20
+ | npm `foxclaw` | `npm i foxclaw` | 占位包:`index.js` 只导出 `name` / `version` |
21
+ | GitHub Release | tag 自动 | 上面两个包的文件 + 自动生成的 release notes |
22
+
23
+ `vendor/` 不入包是设计现状(`packages.find` 只收 `foxclaw*`,HMR/HKC 以 sys.path
24
+ 内嵌,运行期按 `Path(__file__)/../../vendor` 找)。发布说明里必须写明"这是占位包",
25
+ 不要让人装完以为拿到了完整运行时。
26
+
27
+ ## 1. 本地预检(发布前必须绿)
28
+
29
+ ```bash
30
+ python tools/release_check.py --tag v0.1.0 # 四处版本号一致 + tag 对得上
31
+ python -m build # 出 dist/*.whl + *.tar.gz
32
+ cd npm && npm pack --pack-destination ../dist && cd ..
33
+ python tools/release_check.py --dist dist --npm-tgz dist/*.tgz
34
+ ```
35
+
36
+ 第二道检查会做这些事,任一 `[ERROR]` 都不许发布:
37
+
38
+ - `dist/` 里恰好一个 wheel + 一个 sdist,文件名与版本号一致;
39
+ - wheel 的 `METADATA` 里 `Name` / `Version` 与 `pyproject.toml` 一致;
40
+ - 归档内**不得**出现 `.env`(除 `.env.example`)、`docs/internal/`、`foxclaw_data/`、
41
+ `__pycache__`、嵌套压缩包、`.venv`;
42
+ - npm tgz 文件名与 `package/package.json` 的 `name@version` 一致;
43
+ - 缺 `vendor/` 只报 `[WARN]`(见上表),不会拦发布。
44
+
45
+ 版本号的唯一来源是 `pyproject.toml`,另外三处(`foxclaw/__init__.py`、
46
+ `npm/package.json`、`npm/index.js`)由 `tests/test_version_sync.py` 盯着必须相等。
47
+ 改版本时**四处一起改**,只改一处会在第一道检查里挂掉。
48
+
49
+ ## 2. 打 tag(自动构建 + 挂 Release,不外发)
50
+
51
+ ```bash
52
+ git tag v0.1.0 && git push origin v0.1.0
53
+ ```
54
+
55
+ `.github/workflows/release.yml` 的 `build` job 会:校验版本/tag → 构建 → npm pack →
56
+ 产物结构校验 → 上传 `python-dist` / `npm-tgz` 两个 artifact;`github-release` job 把它们
57
+ 挂成 Release 附件(重跑用 `--clobber` 覆盖附件,不重建 Release)。
58
+
59
+ 这一步**不会**上传到 PyPI / npm,打错了删 tag 重来即可。
60
+
61
+ ## 3. 上传到 PyPI / npm(需要人工审批)
62
+
63
+ Actions → Release → Run workflow:
64
+
65
+ - `publish`:选 `pypi` / `npm` / `both`
66
+ - `ref`:填**同一个 tag**(如 `v0.1.0`;不填会直接失败——不允许发分支 HEAD)
67
+
68
+ 然后经由 environment 审批:
69
+
70
+ | environment | 审批后执行 | 用的 secret |
71
+ | --- | --- | --- |
72
+ | `pypi` | `pypa/gh-action-pypi-publish` | `PYPI_API_TOKEN`(项目级 `pypi-`/`npt_` token) |
73
+ | `npm` | `npm publish` | `NPM_TOKEN`(granular,仅 `foxclaw` 的 publish 权限) |
74
+
75
+ 需要在仓库 Settings → Environments 里先建 `pypi`、`npm` 两个环境并配 Required reviewers,
76
+ 否则"审批门"不存在,勾了就直接发。
77
+
78
+ ## 4. 发错了怎么办
79
+
80
+ **PyPI / npm 的版本号不可撤回**。能做的只有:
81
+
82
+ - PyPI:`yank`(`twine`/网页)→ 该版本不再被新装选中,但**仍然占着号**,不能重发同号;
83
+ 修好后必须 `0.1.1`。
84
+ - npm:`npm unpublish foxclaw@0.1.0` 只在发布后 72 小时内、且无其他包依赖时可用;
85
+ 过了就只能 `npm deprecate` + 发新号。
86
+
87
+ 所以"先构建、再审批上传"不是流程洁癖,是这两个 registry 的规则逼出来的。
88
+
89
+ ## 5. 切到 OIDC(零长期密钥)
90
+
91
+ 当前用 token,因为上传已有人工审批兜底。想彻底去掉长期密钥时:
92
+
93
+ - PyPI:项目页 → Publishing → 加 GitHub publisher(owner/repo/workflow/environment
94
+ 必须与实际一致),首次发布用 "pending publisher";然后删掉 secret,给 job 加
95
+ `permissions: id-token: write`。
96
+ - npm:npm ≥ 11.5 支持 trusted publishing,同样加 `id-token: write` 并去掉 `NODE_AUTH_TOKEN`。
97
+
98
+ ## 仓库名(2026-11-08 已定)
99
+
100
+ 两个仓库,职责不同,别再混:
101
+
102
+ | 仓库 | 可见性 | 用途 |
103
+ |---|---|---|
104
+ | `snowfoxHQ/FoxClaw` | public | 对外发布。PyPI/npm 的 `homepage`/`repository` 都指它,OIDC publisher 也填它 |
105
+ | 私有开发库(名称不对外) | private | 本地 `git remote origin` 指向的开发备份 |
106
+
107
+ 公开仓库原名 `SnowFoxClaw`,已于 2026-11-08 改名为 `FoxClaw`(GitHub 对旧名自动 301,
108
+ 老链接不会 404)。切 OIDC 时 publisher 的 repo 必须写成 `FoxClaw`——不是私有开发库的名字,
109
+ 也不是小写 `foxclaw`(registry 侧对大小写不敏感,GitHub 侧 OIDC 校验按仓库真实名匹配)。
@@ -0,0 +1,75 @@
1
+ # Foxclaw Run Guide (English)
2
+
3
+ > Chinese version with more detail: [RUN_CN.md](RUN_CN.md)
4
+
5
+ ## Windows + OneDrive (most common pitfall)
6
+
7
+ If tests raise `FileNotFoundError: [WinError 2] ... test_data`, the project is under a OneDrive-managed folder (Documents/Desktop/Pictures) whose redirect placeholders Python can't create dirs in. Move it:
8
+
9
+ ```powershell
10
+ Copy-Item -Recurse "<your path>\foxclaw" "C:\foxclaw"
11
+ cd C:\foxclaw
12
+ python tests/run_all.py
13
+ ```
14
+
15
+ ## 1. Install
16
+
17
+ ```bash
18
+ pip install -e . # dependencies come from pyproject.toml (single source of truth)
19
+ # lightweight alternative (uninstalled extras degrade gracefully):
20
+ # pip install fastapi uvicorn "httpx<0.28" cryptography websockets pyyaml numpy scikit-learn rich pydantic python-dotenv
21
+ ```
22
+
23
+ `cryptography` → Feishu encrypted-event decryption; `websockets` → Discord Gateway; `httpx` → channel HTTP + web tools.
24
+
25
+ ## 2. Verify (no API key needed)
26
+
27
+ ```bash
28
+ python tests/run_all.py # full regression (all green)
29
+ python tests/test_e2e.py # cognitive runtime only
30
+ python tests/test_api.py # API layer
31
+ ```
32
+
33
+ These run without an LLM key or real HMR — proving cognition is decoupled from the model.
34
+
35
+ > **About pytest**: all 76 tests are now pytest-style (S2 migration) and need `pip install pytest`
36
+ > (or `pip install -e ".[dev]"`). When pytest is absent the runner **explicitly marks all 76 as
37
+ > "skipped"** and excludes them from the denominator — they neither vanish silently nor fake a pass.
38
+
39
+ ## 3. Start the service
40
+
41
+ ```bash
42
+ export DEEPSEEK_API_KEY=sk-... # or ANTHROPIC_API_KEY; Windows: $env:...="..."
43
+ export FOXCLAW_PROVIDER=deepseek # optional explicit provider
44
+ export FOXCLAW_DATA_DIR=./foxclaw_data
45
+ # binds 127.0.0.1 by default. Exposing to LAN requires FOXCLAW_HOST=0.0.0.0 **and** FOXCLAW_API_KEY
46
+ # (the __main__ entry refuses to start on non-loopback without a key; override with FOXCLAW_ALLOW_INSECURE=1).
47
+ python -m uvicorn foxclaw.api:app --host 127.0.0.1 --port 8000
48
+ ```
49
+
50
+ ## 4. Channels & governance
51
+
52
+ Connect WeChat / Feishu / Telegram / Discord — see [CHANNELS.md](CHANNELS.md). Runtime governance (idempotency / crash recovery / loop detection) is auto-wired — see [GOVERNANCE.md](GOVERNANCE.md).
53
+
54
+ ## 5. Embedded HMR
55
+
56
+ HMR v2.0 is embedded in `vendor/hmr/`, auto-loaded, persisting to the data dir's `hmr/` subdir. To upgrade, API-compatibly replace `vendor/hmr/`; the adapter (`foxclaw/core/memory_adapter.py`) and main body stay unchanged.
57
+
58
+ ## 6. Key environment variables
59
+
60
+ | Var | Meaning |
61
+ |-----|---------|
62
+ | `DEEPSEEK_API_KEY` / `ANTHROPIC_API_KEY` | LLM key; unset → stub |
63
+ | `FOXCLAW_PROVIDER` | explicit provider |
64
+ | `FOXCLAW_DATA_DIR` | data directory |
65
+ | `FOXCLAW_SHADOW_ROUNDS` | shadow calibration rounds |
66
+ | `FOXCLAW_EMBEDDING_MODEL` | 语义漂移 embedding 模型;中文部署设 `paraphrase-multilingual-MiniLM-L12-v2`(中文跑题硬拦率 0→1.0,见 `evals/governance/compare_embeddings.py`);默认 `all-MiniLM-L6-v2` |
67
+ | `FOXCLAW_API_KEY` | **Optional auth**: when set, `/api/*` requires `X-API-Key: <value>` (else 401); WebSocket `/ws/harness` uses `?key=<value>` instead (browsers can't set WS headers; the frontend reads it from `localStorage.foxclawApiKey`). When unset, auth is off — safe only on loopback. Frontend and `/docs` stay open. |
68
+ | `FOXCLAW_HOST` / `FOXCLAW_PORT` | Bind address / port for the `python -m foxclaw.api` entry. **Default `127.0.0.1:8000`.** |
69
+ | `FOXCLAW_ALLOW_INSECURE` | Set to `1` to let the entry start on a non-loopback host without `FOXCLAW_API_KEY` (not recommended). |
70
+ | `FOXCLAW_CORS_ORIGINS` | Comma-separated allowed origins. **Default: loopback only** (`localhost` / `127.0.0.1` / `[::1]`, any port). Set explicitly for cross-origin deploys; `*` opens it fully (not recommended). |
71
+ | `FOXCLAW_SHARED_WRITE_MODE` | Shared-memory write policy mode: **`audit` (default) publishes `memory.shared.write` events without blocking**; `warn` also logs; `enforce` actually denies (raises `SharedWriteDenied`). Default is audit because the 8 existing legitimate shared writes must validate the policy table on real traffic before enforcement is switched on. See `foxclaw/core/shared_write.py`. **Run `python tools/shared_write_audit.py` before rolling forward** — end-to-end acceptance (8 real write sites must pass untouched, 5 intrusion probes must be caught; exit code 0 required). |
72
+ | `FOXCLAW_SHARED_WRITE_AUDIT` | Shared-write audit **persistence** switch (default on): appends every `memory.shared.write` event as a JSON line to `{data_dir}/audit/shared_write.jsonl`, so real-traffic samples accumulate for the enforce decision (the spine history is a 1000-entry ring buffer that high-frequency events flush out). Set `0` to disable. How to judge: review each `allowed=false` line — if all are genuine intrusions and none is a legitimate write, switch to `enforce`. |
73
+ | `FOXCLAW_GOVERNANCE_AUDIT` | Unified **governance audit stream** switch (default on, batch 3): rulings from the Harness/Permission/Orchestration/Skill layers are recorded as `governance.decision` events (WS-visible) and persisted to `{data_dir}/audit/governance.jsonl`. Each record carries a `decision_id` (this ruling) and a `correlation_id` (cross-layer join key: a permission ruling's decision_id is attached to the skill execution audit; negotiation rounds share the req.id). Set `0` to disable (all layers skip automatically, zero overhead). |
74
+ | `FOXCLAW_SHADOW_PROMOTE_MIN_OBS` | Observations required before a shadow rule can be promoted (default 50, batch 4 P0-1): rule candidates born from BLOCK enter `shadow_rules` (**not in effect**); after N same-dimension observations they are promoted (take effect) or discarded (harm rate > 0.3, or zero impact). Before that, rules only observe and never block — the guardrail against "unverified online learning". Roll back with `harness.rollback(rule_id)`; the full trail lives in the policy YAML `history` section. |
75
+ | `FOXCLAW_SKIP_DOTENV` | Set to `1` to **skip loading the project-root `.env` entirely** — process env vars become the only source. **For tests/CI only**: a developer `.env` carrying real keys or `FOXCLAW_MCP_SERVER=1` / `FOXCLAW_API_KEY` leaks into test processes, making results machine-dependent, causing tests to hit real external APIs, and writing into real data directories. `tests/run_all.py` sets it to `1` by default. **Do not set this in local development.** |
@@ -0,0 +1,121 @@
1
+ # Foxclaw 运行指南(中文版)
2
+
3
+ ## ⚠ Windows + OneDrive 路径问题(最常见的坑)
4
+
5
+ 如果在 Windows 上运行测试报 `FileNotFoundError: [WinError 2] ... test_data`:
6
+
7
+ **原因**:项目被放在 OneDrive 接管的目录(文档/桌面/图片),这些是 OneDrive 重定向占位符,Python 无法在其中创建目录。**典型症状**:PowerShell 能 `cd` 进去,但 Python 建子目录失败。这和代码无关。
8
+
9
+ **解法**:移到不受 OneDrive 管理的路径:
10
+
11
+ ```powershell
12
+ Copy-Item -Recurse "<你的当前路径>\foxclaw" "C:\foxclaw"
13
+ cd C:\foxclaw
14
+ python tests/run_all.py
15
+ ```
16
+
17
+ ## 一、安装依赖
18
+
19
+ ```bash
20
+ pip install -e . # 依赖以 pyproject.toml 为唯一来源(推荐)
21
+ # Windows 上 pip 装系统包可能需要 --break-system-packages
22
+
23
+ # 轻量安装(不用全部依赖时,相关能力会自动降级):
24
+ # pip install fastapi uvicorn "httpx<0.28" cryptography websockets pyyaml numpy scikit-learn rich pydantic python-dotenv
25
+ # 不装 sentence-transformers → 线束语义检测降级为 n-gram 哈希;
26
+ # 不装 openai/anthropic → 模型路由降级为 stub。
27
+ ```
28
+
29
+ 依赖说明:`cryptography` 用于飞书加密事件解密;`websockets` 用于 Discord Gateway;`httpx` 用于各渠道 HTTP 调用与 Web 工具。未装 `sentence-transformers` 时线束语义检测自动降级为 n-gram 哈希,不会崩溃。
30
+
31
+ ## 二、验证(无需 API key)
32
+
33
+ ```bash
34
+ # 全量回归(全绿)
35
+ python tests/run_all.py
36
+
37
+ # 单独验证认知运行时 / API 层
38
+ python tests/test_e2e.py
39
+ python tests/test_api.py
40
+ ```
41
+
42
+ 这些测试在没有大模型 key、没有真实 HMR 的情况下也能跑 —— 证明认知运行时与大模型解耦。
43
+
44
+ > **关于 pytest**:76 个测试已**全部迁移为 pytest**(S2 迁移),需 `pip install pytest`
45
+ > (或 `pip install -e ".[dev]"`)才会执行。未安装时运行器会**显式标记全部 76 项为「跳过」**
46
+ > 并从分母扣除 —— 不会静默消失,也不会伪装成通过。
47
+
48
+ ## 三、启动服务
49
+
50
+ ```bash
51
+ # 配 key 则真实调模型,不配则降级 stub(其他功能照常)
52
+ export DEEPSEEK_API_KEY=sk-... # 或 ANTHROPIC_API_KEY
53
+ # Windows: $env:DEEPSEEK_API_KEY="sk-..."
54
+ export FOXCLAW_PROVIDER=deepseek # 可选:显式指定 provider
55
+ export FOXCLAW_DATA_DIR=./foxclaw_data # 数据目录
56
+
57
+ # 默认绑 127.0.0.1(仅本机)。对外暴露必须同时设 FOXCLAW_HOST=0.0.0.0 与 FOXCLAW_API_KEY——
58
+ # __main__ 入口在「非回环 + 无鉴权」时会拒绝启动(确需如此可设 FOXCLAW_ALLOW_INSECURE=1)。
59
+ python -m uvicorn foxclaw.api:app --host 127.0.0.1 --port 8000
60
+ ```
61
+
62
+ 浏览器访问 http://localhost:8000 。
63
+
64
+ ## 四、接入消息平台
65
+
66
+ 四个主流渠道(微信/飞书/Telegram/Discord)各按官方规范实现,凭证由你本地注入。完整配置(怎么拿 token、各渠道启动方式、多渠道并跑)见 [CHANNELS.md](CHANNELS.md)。最简验证(Telegram,@BotFather 拿 token):
67
+
68
+ ```python
69
+ from foxclaw import Foxclaw
70
+ from foxclaw.channels.dispatcher import ChannelDispatcher
71
+ from foxclaw.channels.telegram import TelegramAdapter
72
+ import time
73
+
74
+ os_ = Foxclaw(data_dir="./data")
75
+ disp = ChannelDispatcher(os_.supervisor)
76
+ tg = TelegramAdapter(bot_token="你的token")
77
+ disp.register_channel(tg)
78
+ while True:
79
+ tg.poll_once() # 收消息 → 主管处理 → 自动回复
80
+ time.sleep(1)
81
+ ```
82
+
83
+ ## 五、运行时治理
84
+
85
+ 幂等/崩溃恢复/循环检测等已自动接入,无需额外配置。详见 [GOVERNANCE.md](GOVERNANCE.md)。崩溃重启后,系统启动时会打印上次被中断的任务。
86
+
87
+ ## 六、关于内嵌的 HMR
88
+
89
+ HMR v2.0 已内嵌在 `vendor/hmr/`,启动自动接入,记忆落盘到数据目录的 `hmr/` 子目录。替换为新版 HMR 只需 API 兼容地替换 `vendor/hmr/`,适配层(`foxclaw/core/memory_adapter.py`)和主体不用改。
90
+
91
+ ## 七、主要 API 端点
92
+
93
+ | 端点 | 说明 |
94
+ |------|------|
95
+ | `GET /api/status` | 五个智能体状态 |
96
+ | `POST /api/task` | 执行任务 `{task, agent_id}` |
97
+ | `GET /api/thoughtchain/{agent}/chain` | 推理链 |
98
+ | `GET /api/thoughtchain/{agent}/summary` | 推理链摘要 |
99
+ | `GET /api/harness/{agent}/status` | 线束阈值/权重/策略 |
100
+ | `GET /api/harness/{agent}/policy` | 完整策略 YAML |
101
+ | `WS /ws/harness` | 实时线束事件流 |
102
+
103
+ (完整 85 个端点见 `foxclaw/api.py`,含财务/学习/行程内核与 AHS 相关接口。)
104
+
105
+ ## 八、环境变量
106
+
107
+ | 变量 | 说明 |
108
+ |------|------|
109
+ | `DEEPSEEK_API_KEY` / `ANTHROPIC_API_KEY` | 大模型 key,不配则 stub |
110
+ | `FOXCLAW_PROVIDER` | 显式指定 provider(deepseek/anthropic…) |
111
+ | `FOXCLAW_DATA_DIR` | 数据目录 |
112
+ | `FOXCLAW_SHADOW_ROUNDS` | 影子校准轮数 |
113
+ | `FOXCLAW_API_KEY` | **可选鉴权**:设了则 `/api/*` 与 `/knowledge/*` 需带 `X-API-Key`(否则 401);WS 用 `?key=`。**不设=无鉴权,仅回环地址安全。** |
114
+ | `FOXCLAW_HOST` / `FOXCLAW_PORT` | `python -m foxclaw.api` 入口的绑定地址/端口。**默认 `127.0.0.1:8000`。** |
115
+ | `FOXCLAW_ALLOW_INSECURE` | 设为 `1` 允许「非回环 + 无鉴权」启动(不推荐)。 |
116
+ | `FOXCLAW_CORS_ORIGINS` | 允许的跨源来源(逗号分隔)。**默认仅回环**(localhost/127.0.0.1/[::1],任意端口);显式设 `*` 才全开(不推荐)。 |
117
+ | `FOXCLAW_SHARED_WRITE_MODE` | 共享层写入策略模式:**`audit`(默认)只发 `memory.shared.write` 事件、不拦截**;`warn` 额外打告警;`enforce` 真正拒绝(抛 `SharedWriteDenied`)。默认 audit 是因为现有 8 处合法共享写入需要先在真实流量上验证策略表,再切拦截。见 `foxclaw/core/shared_write.py`。**灰度推进前先跑 `python tools/shared_write_audit.py`**(端到端验收:8 处真实写入零误伤 + 5 类越界注入被识别,退出码 0 才算过)。 |
118
+ | `FOXCLAW_SHARED_WRITE_AUDIT` | 共享层审计**落盘**开关(默认开):把 `memory.shared.write` 事件逐条 JSON 追加到 `{数据目录}/audit/shared_write.jsonl`,供切 enforce 前积累真实流量样本(脊柱 history 是 1000 条环形缓冲,会被高频事件冲掉)。设 `0` 关闭。判读:文件里 `allowed=false` 的每行逐条看,全为真越界且无一条误伤 → 可切 `enforce`。 |
119
+ | `FOXCLAW_GOVERNANCE_AUDIT` | 治理审计**总流**开关(默认开,批次 3):Harness/Permission/Orchestration/Skill 四层裁决统一记 `governance.decision` 事件(WS 可见)+ 落盘 `{数据目录}/audit/governance.jsonl`。每条带 `decision_id`(本次裁决 ID)与 `correlation_id`(跨层关联键:权限裁决的 decision_id 挂到 skill 执行审计上;协商多轮共用 req.id)。设 `0` 关闭(各层自动跳过,零开销)。 |
120
+ | `FOXCLAW_SHADOW_PROMOTE_MIN_OBS` | 影子规则升迁所需观察次数(默认 50,批次 4 P0-1):BLOCK 产生的规则候选先进入 `shadow_rules`(**不生效**),同维度场景累计观察满 N 次后按证据 promote(生效)/discard(误伤率>0.3 或零影响)。未达标前规则只观察不拦截——这是「在线无验证学习」的护栏。回滚用 `harness.rollback(rule_id)`;全轨迹见 policy YAML 的 `history` 段。 |
121
+ | `FOXCLAW_SKIP_DOTENV` | 设为 `1` 则**完全不加载项目根目录 `.env`**,只用进程环境变量。**专供测试/CI**:`.env` 里若带真实 Key 或 `FOXCLAW_MCP_SERVER=1` / `FOXCLAW_API_KEY`,会污染测试判定(同代码在不同机器结果不同)、让测试真的打外部 API 并写进真实数据目录。`tests/run_all.py` 已默认设 `1`。**本地开发不要设。** |
@@ -0,0 +1,152 @@
1
+ # Foxclaw 配置指南
2
+
3
+ 所有密钥(Key)统一在项目根目录的 `.env` 文件里配置,不写死在代码中。
4
+ 这样你的 Key 安全(不随代码分发),换 Key 也只改一处。
5
+
6
+ ## 三步开始
7
+
8
+ 1. **复制模板**
9
+
10
+ 把项目根目录的 `.env.example` 复制一份,改名为 `.env`:
11
+ ```powershell
12
+ # Windows
13
+ Copy-Item .env.example .env
14
+ ```
15
+ ```bash
16
+ # macOS / Linux
17
+ cp .env.example .env
18
+ ```
19
+
20
+ 2. **填入你的 Key**(用文本编辑器打开 `.env`,等号后面填,不要加引号)
21
+
22
+ 3. **启动**
23
+ ```powershell
24
+ foxclaw serve
25
+ ```
26
+ 浏览器打开 http://localhost:8000(默认只监听 `127.0.0.1:8000`,`--host` / `--port` 可改)。
27
+
28
+ 想先确认配置有没有读对:
29
+ ```powershell
30
+ foxclaw config check
31
+ ```
32
+
33
+ 启动时看日志确认:
34
+ - `✓ 已加载配置文件 .env` —— .env 被读到了
35
+ - `✓ 模型路由: deepseek(deepseek-chat)` —— 模型 Key 生效
36
+ - 若显示 `⚠ 模型路由: ... 降级 stub` —— 会注明原因(缺 Key 或缺库)
37
+
38
+ ## 各项 Key 说明
39
+
40
+ ### 大模型(至少配一个,系统才真实工作)
41
+
42
+ 配任意一个,系统自动探测启用。多个都配时按优先级:Claude → GPT → DeepSeek → Gemini → 通义 → 本地。
43
+
44
+ | 配置项 | 模型 | 获取地址 | 额外依赖 |
45
+ |--------|------|----------|----------|
46
+ | `DEEPSEEK_API_KEY` | DeepSeek | platform.deepseek.com | `pip install openai` |
47
+ | `ANTHROPIC_API_KEY` | Claude | console.anthropic.com | 已内置 |
48
+ | `OPENAI_API_KEY` | GPT | platform.openai.com | `pip install openai` |
49
+ | `GOOGLE_API_KEY` | Gemini | aistudio.google.com | `pip install -e ".[gemini]"` |
50
+ | `DASHSCOPE_API_KEY` | 通义千问 | dashscope.aliyun.com | `pip install openai` |
51
+ | `LOCAL_LLM_BASE` | 本地模型 | Ollama/vLLM 的地址 | `pip install openai` |
52
+
53
+ 不配任何模型 Key 也能运行,但 LLM 回复是占位文本(stub),且漂移检测不完整。
54
+
55
+ ### 高德地图(行政 Agent 用,两个 Key 功能不同)
56
+
57
+ 在高德开放平台(lbs.amap.com)控制台创建,**注意要建两个不同类型的 Key**:
58
+
59
+ | 配置项 | 类型 | 作用 |
60
+ |--------|------|------|
61
+ | `AMAP_MAPS_API_KEY` | Web服务 | 后端:查真实路线时间、地址转坐标、POI 搜索 |
62
+ | `AMAP_JS_KEY` | Web端(JS API) | 前端:画真实地图底图 |
63
+ | `AMAP_JS_SCODE` | (安全密钥) | 前端:2021 年后申请的 JSAPI Key 必须配,与上面配对 |
64
+
65
+ - 只配 `AMAP_MAPS_API_KEY`:路线时间真实,但前端地图是 SVG 示意图
66
+ - 只配 `AMAP_JS_KEY` + `AMAP_JS_SCODE`:前端真地图,但路线时间是估算
67
+ - 三个都配:行政 Agent 完整(真实路线 + 真地图)
68
+ - 都不配:地图降级为 SVG 坐标示意图,路线用直线估算
69
+
70
+ ### 运行参数(可选)
71
+
72
+ | 配置项 | 说明 | 默认 |
73
+ |--------|------|------|
74
+ | `FOXCLAW_MODEL` | 强制指定模型名(如 deepseek-reasoner) | 各 provider 默认 |
75
+ | `FOXCLAW_DATA_DIR` | 数据目录 | ./foxclaw_data |
76
+ | `FOXCLAW_SHADOW_ROUNDS` | Harness 影子校准轮数 | 20 |
77
+
78
+ ### V2 高级开关(可选,**默认全关**,按需 opt-in)
79
+
80
+ 这些是 V2 架构引入的旋钮,不配则行为与之前一致(安全默认)。
81
+
82
+ | 配置项 | 说明 | 默认 |
83
+ |--------|------|------|
84
+ | `FOXCLAW_MAX_CONCURRENCY` | 微内核调度器并发配额(背压);留空=无上限 | 无上限 |
85
+ | `FOXCLAW_PIPELINE_SKILL_DISPATCH` | 允许 Agent 在认知管线内**自主调用工具**(只读自动、有副作用挂起等确认);`=1` 开启 | 关 |
86
+ | `FOXCLAW_TRUTH_TO_HKC` | 执行真值经 KDE→KEE **结晶进 HKC**(有 LLM 成本);`=1` 开启 | 关 |
87
+ | `FOXCLAW_FINANCE_LLM_ARBITER` | 财务守门人对**模糊金额**叠加 LLM 复核(只 approve→confirm,永不 reject);`=1` 开启 | 关 |
88
+
89
+ ### 安全 / 部署(可选)
90
+
91
+ | 配置项 | 说明 | 默认 |
92
+ |--------|------|------|
93
+ | `FOXCLAW_API_KEY` | 设了则除 `/`、`/health`、`/docs` 外所有请求需带 `X-API-Key` 头;不设=开放(本地默认) | 无(开放) |
94
+ | `FOXCLAW_CORS_ORIGINS` | 逗号分隔的允许来源,收紧 CORS | `*` |
95
+ | `FOXCLAW_BROWSER_HEADLESS` | 浏览器子系统无头模式;`=0` 显示窗口 | 1(无头) |
96
+
97
+ ### 运维 / 观测开关(可选,默认值已够用)
98
+
99
+ 这些开关代码里都会读取,但常规使用无需改动;排查问题或对接监控时再配。
100
+ (此前有 22 个开关只存在于代码里、文档未收录,排查时只能翻源码 —— 现在补在这里。)
101
+
102
+ | 配置项 | 说明 | 默认 |
103
+ |--------|------|------|
104
+ | `FOXCLAW_GATEWAY_RATE` | 统一网关每客户端每分钟请求数 | 600 |
105
+ | `FOXCLAW_GATEWAY_QUOTA` | 统一网关每客户端每小时配额 | 20000 |
106
+ | `FOXCLAW_MAX_BODY_MB` | 请求体大小上限(MB) | 32 |
107
+ | `FOXCLAW_STREAM_RATE` | SSE 流式接口每分钟次数上限 | 60 |
108
+ | `FOXCLAW_STREAM_CONCURRENCY` | SSE 流式接口并发上限 | 4 |
109
+ | `FOXCLAW_TRACE_SAMPLE` | 链路追踪采样率(0~1) | 0(不采样) |
110
+ | `FOXCLAW_TRACE_SLOW_MS` | 慢请求阈值(毫秒),超过即标记 | 1000 |
111
+ | `FOXCLAW_TRACE_RETAIN` | 内存保留 span 数(有界环形缓冲) | 5000 |
112
+ | `FOXCLAW_OTLP_ENDPOINT` | OTLP 导出地址;**不配=完全关闭** | 关 |
113
+ | `FOXCLAW_OTLP_SERVICE` | OTLP `service.name` | `foxclaw` |
114
+ | `FOXCLAW_MCP_RATE_READ` | 内置 MCP server 只读工具每分钟上限 | 120 |
115
+ | `FOXCLAW_MCP_RATE_AGENT` | `ask_foxclaw` 每分钟上限 | 20 |
116
+ | `FOXCLAW_MCP_AGENTS` | 额外暴露 `ask_foxclaw`(会驱动 Agent);`=1` 开启 | 关 |
117
+ | `FOXCLAW_ROUTE_SKILL` | 管线内技能自动路由;`=0` 关闭 | 开 |
118
+ | `FOXCLAW_LLM_PLAN` | 主管优先用 LLM 规划;`=1` 开启 | 关 |
119
+ | `FOXCLAW_LLM_REPLAN` | 失败步骤反思重规划;`=1` 开启 | 关 |
120
+ | `FOXCLAW_EVIDENCE_MODEL` | 证据链使用的模型(覆盖默认) | 跟随主模型 |
121
+ | `FOXCLAW_DLP_SEMANTIC` | 输出 DLP 语义比对;`=1` 开启 | 关 |
122
+
123
+ 守门人(Guardian)相关 —— 把动作裁决/凭证代注入挪到独立进程,默认关闭:
124
+
125
+ | 配置项 | 说明 | 默认 |
126
+ |--------|------|------|
127
+ | `FOXCLAW_GUARDIAN` | `=1` 启用独立守门人进程 | 关 |
128
+ | `FOXCLAW_GUARDIAN_DATA_DIR` | 守门人数据目录(由主进程透传) | 跟随 `FOXCLAW_DATA_DIR` |
129
+ | `FOXCLAW_GUARDIAN_SECRETS` | 守门人侧凭证表(JSON)路径 | 无 |
130
+ | `FOXCLAW_GUARDIAN_MCP_SERVERS` | 守门人侧 MCP 配置持久化文件 | 默认路径 |
131
+ | `FOXCLAW_GUARDIAN_SECRET_<NAME>` | 按名字注入的单条凭证 —— 注意是**前缀**,不是独立开关 | 无 |
132
+
133
+ ## 安全提示
134
+
135
+ - `.env` 已加入 `.gitignore`,不会被 git 提交或随代码分发
136
+ - 不要把 `.env` 发给别人或上传到公开仓库
137
+ - 若 Key 不慎泄露,去对应平台重置(作废旧的,生成新的)
138
+
139
+ ## 常见问题
140
+
141
+ **Q: 启动显示 stub 降级,但我配了 Key?**
142
+ - 检查日志里降级原因。最常见是缺库:DeepSeek/GPT/通义需 `pip install openai`
143
+ - 确认 `.env` 在项目根目录(和 `pyproject.toml` 同级),不是在 `foxclaw/` 里
144
+ - 确认等号后面没加引号、没多空格
145
+
146
+ **Q: 地图加载不出来(空白或报错)?**
147
+ - 按 F12 看浏览器 Console 报错
148
+ - `INVALID_USER_SCODE` → 安全密钥(AMAP_JS_SCODE)没配或配错
149
+ - `USERKEY_PLAT_NOMATCH` → JSAPI Key 类型不对(必须是「Web端(JS API)」)
150
+
151
+ **Q: 端口被占用(10048)?**
152
+ - 上一个进程没关。先 `taskkill /F /IM python.exe`(Windows)再启动
File without changes
@@ -0,0 +1,61 @@
1
+ # Agent 治理评测(M1 · 造证据)
2
+
3
+ > 由 [`docs/开发路线图.md`](../../docs/开发路线图.md) M1 落地。目的:把护城河的四类主张
4
+ > ——漂移拦得住、循环停得下、崩了认得出、越用越准——从"机制存在"变成**可复现的量化证据**。
5
+ > 全程**离线**:不调用任何 LLM、不联网(语义向量用本地缓存模型,缺失则降级哈希嵌入)。
6
+
7
+ ## 怎么跑
8
+
9
+ ```bash
10
+ # 完整评测(产出 report.json + convergence.svg)
11
+ HF_HUB_OFFLINE=1 python evals/governance/run_evals.py
12
+
13
+ # 冒烟(纳入全量回归 run_all.py,防评测骨架腐坏)
14
+ python tests/test_evals_smoke.py
15
+ ```
16
+
17
+ ## 测什么 / 指标口径
18
+
19
+ | 维度 | 指标 | 口径 |
20
+ |---|---|---|
21
+ | 漂移检测(语义/工具/范围) | `flag_recall` | 对抗动作被**检出**(WARN+)的比例——漂移感知到了吗(主门槛 ≥0.8) |
22
+ | | `hard_fpr` | 正常任务被 **BLOCK** 的比例——唯一真正有害的误报(主门槛 ≤0.15) |
23
+ | | `block_recall` | 对抗动作被 BLOCK 的比例——是否升级到硬停(信息项) |
24
+ | | `soft_fpr` | 正常任务被 WARN 的比例——软噪声,**不阻断执行**(质量项) |
25
+ | 循环检测 | 触发轮次 | repeat / ping_pong / no_progress 各在第几轮被判 stuck;正常多样调用不误报 |
26
+ | 崩溃恢复 | `correct` / `non_destructive` | 中断任务识别正确(boot_id 防 pid 复用);探测外部活进程**不误杀** |
27
+ | 自学习 | `tool_weight_curve` / `converged` | 重复越权下 tool 权重单调收紧、拦截率恒 1.0、正常任务无硬误报 |
28
+
29
+ **关键区分:BLOCK 是硬停(阻断行动),WARN 只降低置信度、不阻断。** 因此有害误报只算 `hard_fpr`;
30
+ benign 被 WARN 记为 `soft_fpr`(质量信号,非失败)。这是指标语义的正确划分,不是为了让评测好看。
31
+
32
+ ## 首版结果(2026-07-03,离线,all-MiniLM-L6-v2)
33
+
34
+ - 漂移检测:三维 `flag_recall` 均 **1.0**、`hard_fpr` 均 **0.0** —— 漂移全被感知、正常任务零硬误报。
35
+ - 循环:repeat@3 / ping_pong@4 / no_progress@3 全检出,正常调用不误报。
36
+ - 恢复:中断识别正确 + 非破坏(修复后的 `_pid_alive` 不再误杀)。
37
+ - 自学习:tool 权重 `0.33→0.53` 单调收紧,收敛 = True。
38
+
39
+ ### 证据型发现(评测自动沉淀)
40
+
41
+ 1. **语义维度对中文偏弱**:`semantic` 的 `flag_recall=1.0` 但 `block_recall=0.0`——默认**英文**
42
+ `all-MiniLM-L6-v2` 压缩了中文语义距离,跑题够得着 WARN、够不着 BLOCK。这正好印证系统的
43
+ **「模型无关」原则**:应允许换中文/多语 embedding。
44
+ **✅ 已兑现(2026-07-03)**:`compare_embeddings.py` 换多语 `paraphrase-multilingual-MiniLM-L12-v2`
45
+ 重跑同一中文场景——**中文跑题硬拦率 `block_recall` 0.0 → 1.0**(向量层:跑题漂移 0.48→0.99)。
46
+ 换模型一行搞定:`FOXCLAW_EMBEDDING_MODEL=paraphrase-multilingual-MiniLM-L12-v2`。代价是更敏感
47
+ (benign 软误报 `soft_fpr` 升到 ~0.67,但只 WARN 不阻断,`hard_fpr` 仍 0)。见 `compare_embeddings.py`。
48
+ 2. **工具场景软误报偏高**(`soft_fpr≈0.67`,全为 WARN 非 BLOCK):同源于中文语义距离偏大;
49
+ 硬误报 `hard_fpr=0`,不影响执行。自学习把权重从 semantic 移向 tool 后,该软噪声会**自行下降**
50
+ (见 `benign_soft_warn_curve`)——是学习的良性副作用。
51
+
52
+ ## 产物
53
+
54
+ - `report.json` —— 全部指标 + `findings` + 逐 probe 明细(可 diff、可追踪回归)。
55
+ - `convergence.svg` —— 自学习 tool 权重收敛曲线(零依赖手绘 SVG)。
56
+
57
+ ## 下一步(把门槛往上抬)
58
+
59
+ - ~~接入中文/多语 embedding,重测 `semantic.block_recall`~~ ✅ 已做(`compare_embeddings.py`,0→1.0);
60
+ - 扩充对抗任务集(更多跑题/越权/蔓延变体),把 recall/fpr 做成随样本量稳定的曲线;
61
+ - 与 M3「治理中间件」联动:把这份评测数据作为对外可信度的卖点。
File without changes