foxclaw 0.1.0 → 0.1.3

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 (514) hide show
  1. package/README.md +54 -29
  2. package/bin/foxclaw.cjs +51 -0
  3. package/index.js +4 -10
  4. package/package.json +46 -38
  5. package/python/.dockerignore +35 -0
  6. package/python/.env.example +173 -0
  7. package/python/.gitattributes +46 -0
  8. package/python/.github/workflows/ci.yml +167 -0
  9. package/python/.github/workflows/release.yml +183 -0
  10. package/python/CHANGELOG.md +57 -0
  11. package/python/CHANGELOG_CN.md +57 -0
  12. package/python/Dockerfile +64 -0
  13. package/python/LICENSE +21 -0
  14. package/python/MANIFEST.in +14 -0
  15. package/python/README.md +201 -0
  16. package/python/README_CN.md +336 -0
  17. package/python/bench/bm25_audit.py +186 -0
  18. package/python/bench/bm25_regression.py +177 -0
  19. package/python/bench/bm25_stress.py +155 -0
  20. package/python/bench/cd_audit.py +215 -0
  21. package/python/bench/chaos.py +140 -0
  22. package/python/bench/concurrency.py +103 -0
  23. package/python/bench/e2e_real_models.py +94 -0
  24. package/python/bench/llm_retry_test.py +241 -0
  25. package/python/bench/load_test.py +193 -0
  26. package/python/bench/vector_ivf_upgrade.py +128 -0
  27. package/python/docs/CHANNELS.md +195 -0
  28. package/python/docs/GOVERNANCE.md +164 -0
  29. package/python/docs/RELEASE.md +110 -0
  30. package/python/docs/RUN.md +75 -0
  31. package/python/docs/RUN_CN.md +121 -0
  32. package/python/docs//351/205/215/347/275/256/346/214/207/345/215/227.md +152 -0
  33. package/python/evals/__init__.py +0 -0
  34. package/python/evals/governance/README.md +61 -0
  35. package/python/evals/governance/__init__.py +0 -0
  36. package/python/evals/governance/cases.py +115 -0
  37. package/python/evals/governance/compare_embeddings.py +94 -0
  38. package/python/evals/governance/convergence.svg +11 -0
  39. package/python/evals/governance/report.json +371 -0
  40. package/python/evals/governance/run_evals.py +368 -0
  41. package/python/examples/governance_middleware_demo.py +72 -0
  42. package/python/examples/langgraph_governance_demo.py +104 -0
  43. package/python/examples/sample_itinerary.csv +6 -0
  44. package/python/examples/sample_knowledge.csv +9 -0
  45. package/python/examples/sample_transactions.csv +14 -0
  46. package/python/foxclaw/__init__.py +408 -0
  47. package/python/foxclaw/agents/__init__.py +12 -0
  48. package/python/foxclaw/agents/agents.py +35 -0
  49. package/python/foxclaw/agents/base.py +794 -0
  50. package/python/foxclaw/agents/impl/__init__.py +1 -0
  51. package/python/foxclaw/agents/impl/_helpers.py +70 -0
  52. package/python/foxclaw/agents/impl/finance.py +231 -0
  53. package/python/foxclaw/agents/impl/office.py +350 -0
  54. package/python/foxclaw/agents/impl/supervisor.py +592 -0
  55. package/python/foxclaw/agents/mixins/_context.py +128 -0
  56. package/python/foxclaw/agents/mixins/augment.py +143 -0
  57. package/python/foxclaw/agents/mixins/llm.py +67 -0
  58. package/python/foxclaw/agents/mixins/memory.py +41 -0
  59. package/python/foxclaw/agents/mixins/preference.py +131 -0
  60. package/python/foxclaw/agents/mixins/prompt.py +71 -0
  61. package/python/foxclaw/agents/mixins/skillbox.py +58 -0
  62. package/python/foxclaw/agents/mixins/tool_exec.py +417 -0
  63. package/python/foxclaw/api/__init__.py +224 -0
  64. package/python/foxclaw/api/_state.py +43 -0
  65. package/python/foxclaw/api/bootstrap.py +96 -0
  66. package/python/foxclaw/api/middleware.py +294 -0
  67. package/python/foxclaw/api/routes/ahs.py +404 -0
  68. package/python/foxclaw/api/routes/attachments.py +116 -0
  69. package/python/foxclaw/api/routes/browser.py +35 -0
  70. package/python/foxclaw/api/routes/domain.py +306 -0
  71. package/python/foxclaw/api/routes/knowledge.py +145 -0
  72. package/python/foxclaw/api/routes/llm_admin.py +449 -0
  73. package/python/foxclaw/api/routes/memory.py +105 -0
  74. package/python/foxclaw/api/routes/orchestration.py +39 -0
  75. package/python/foxclaw/api/routes/recovery.py +44 -0
  76. package/python/foxclaw/api/routes/review.py +266 -0
  77. package/python/foxclaw/api/routes/search.py +33 -0
  78. package/python/foxclaw/api/routes/system.py +311 -0
  79. package/python/foxclaw/api/routes/task.py +263 -0
  80. package/python/foxclaw/api/routes/ws.py +64 -0
  81. package/python/foxclaw/api/spine.py +52 -0
  82. package/python/foxclaw/browser/__init__.py +13 -0
  83. package/python/foxclaw/browser/action/__init__.py +1 -0
  84. package/python/foxclaw/browser/action/action_executor.py +50 -0
  85. package/python/foxclaw/browser/action/action_types.py +44 -0
  86. package/python/foxclaw/browser/action/action_verifier.py +68 -0
  87. package/python/foxclaw/browser/action/url_policy.py +143 -0
  88. package/python/foxclaw/browser/adapter/__init__.py +1 -0
  89. package/python/foxclaw/browser/adapter/base_adapter.py +23 -0
  90. package/python/foxclaw/browser/adapter/web_adapter.py +46 -0
  91. package/python/foxclaw/browser/driver/__init__.py +1 -0
  92. package/python/foxclaw/browser/driver/base_driver.py +61 -0
  93. package/python/foxclaw/browser/driver/playwright_driver.py +170 -0
  94. package/python/foxclaw/browser/perception/__init__.py +1 -0
  95. package/python/foxclaw/browser/perception/dom_extractor.py +42 -0
  96. package/python/foxclaw/browser/perception/element_indexer.py +56 -0
  97. package/python/foxclaw/browser/perception/semantic_reducer.py +33 -0
  98. package/python/foxclaw/browser/perception/snapshot.py +29 -0
  99. package/python/foxclaw/browser/service.py +144 -0
  100. package/python/foxclaw/browser/session/__init__.py +1 -0
  101. package/python/foxclaw/browser/session/session_manager.py +57 -0
  102. package/python/foxclaw/capability/__init__.py +12 -0
  103. package/python/foxclaw/capability/embedding_service.py +65 -0
  104. package/python/foxclaw/channels/__init__.py +138 -0
  105. package/python/foxclaw/channels/discord.py +175 -0
  106. package/python/foxclaw/channels/dispatcher.py +179 -0
  107. package/python/foxclaw/channels/feishu.py +215 -0
  108. package/python/foxclaw/channels/openclaw_bridge.py +151 -0
  109. package/python/foxclaw/channels/signing.py +187 -0
  110. package/python/foxclaw/channels/telegram.py +120 -0
  111. package/python/foxclaw/channels/weixin.py +215 -0
  112. package/python/foxclaw/cli.py +183 -0
  113. package/python/foxclaw/cognitive/__init__.py +4 -0
  114. package/python/foxclaw/cognitive/reasoner.py +81 -0
  115. package/python/foxclaw/cognitive/state.py +141 -0
  116. package/python/foxclaw/core/__init__.py +9 -0
  117. package/python/foxclaw/core/audit_chain.py +131 -0
  118. package/python/foxclaw/core/audit_sink.py +100 -0
  119. package/python/foxclaw/core/compaction.py +265 -0
  120. package/python/foxclaw/core/config.py +65 -0
  121. package/python/foxclaw/core/confirm_nonce.py +151 -0
  122. package/python/foxclaw/core/dispatch.py +27 -0
  123. package/python/foxclaw/core/envfile.py +48 -0
  124. package/python/foxclaw/core/failure_policy.py +142 -0
  125. package/python/foxclaw/core/gateway.py +81 -0
  126. package/python/foxclaw/core/governance_audit.py +171 -0
  127. package/python/foxclaw/core/idempotency.py +282 -0
  128. package/python/foxclaw/core/injection_guard.py +202 -0
  129. package/python/foxclaw/core/memory_adapter.py +489 -0
  130. package/python/foxclaw/core/metrics.py +88 -0
  131. package/python/foxclaw/core/model_router.py +985 -0
  132. package/python/foxclaw/core/paths.py +103 -0
  133. package/python/foxclaw/core/recovery.py +349 -0
  134. package/python/foxclaw/core/scheduler.py +141 -0
  135. package/python/foxclaw/core/secrets.py +131 -0
  136. package/python/foxclaw/core/sessions.py +155 -0
  137. package/python/foxclaw/core/settings.py +414 -0
  138. package/python/foxclaw/core/shared_write.py +186 -0
  139. package/python/foxclaw/core/steering_queue.py +154 -0
  140. package/python/foxclaw/core/system_bus.py +84 -0
  141. package/python/foxclaw/core/thought_chain.py +316 -0
  142. package/python/foxclaw/core/token_meter.py +231 -0
  143. package/python/foxclaw/core/tools.py +164 -0
  144. package/python/foxclaw/core/tracing.py +375 -0
  145. package/python/foxclaw/core/truth_pipeline.py +110 -0
  146. package/python/foxclaw/core/update_check.py +149 -0
  147. package/python/foxclaw/core/vec_recall_adapter.py +477 -0
  148. package/python/foxclaw/core/verify.py +173 -0
  149. package/python/foxclaw/core/web_search.py +218 -0
  150. package/python/foxclaw/finance/__init__.py +15 -0
  151. package/python/foxclaw/finance/evidence.py +149 -0
  152. package/python/foxclaw/finance/fx.py +98 -0
  153. package/python/foxclaw/finance/graph.py +179 -0
  154. package/python/foxclaw/finance/models.py +146 -0
  155. package/python/foxclaw/finance/nlparse.py +515 -0
  156. package/python/foxclaw/finance/policy.py +301 -0
  157. package/python/foxclaw/finance/reasoner.py +121 -0
  158. package/python/foxclaw/finance/reasoning.py +319 -0
  159. package/python/foxclaw/finance/reconcile.py +175 -0
  160. package/python/foxclaw/finance/runtime.py +500 -0
  161. package/python/foxclaw/governance/__init__.py +24 -0
  162. package/python/foxclaw/governance/middleware.py +176 -0
  163. package/python/foxclaw/harness/__init__.py +17 -0
  164. package/python/foxclaw/harness/_base.py +66 -0
  165. package/python/foxclaw/harness/_policy.py +340 -0
  166. package/python/foxclaw/harness/drift.py +77 -0
  167. package/python/foxclaw/harness/event_bus.py +28 -0
  168. package/python/foxclaw/harness/harness.py +358 -0
  169. package/python/foxclaw/harness/loop_detection.py +145 -0
  170. package/python/foxclaw/itinerary/__init__.py +10 -0
  171. package/python/foxclaw/itinerary/amap_client.py +114 -0
  172. package/python/foxclaw/itinerary/models.py +80 -0
  173. package/python/foxclaw/itinerary/reasoner.py +96 -0
  174. package/python/foxclaw/itinerary/reasoning.py +168 -0
  175. package/python/foxclaw/itinerary/runtime.py +144 -0
  176. package/python/foxclaw/kernel/__init__.py +13 -0
  177. package/python/foxclaw/kernel/capabilities.py +72 -0
  178. package/python/foxclaw/kernel/policy_gate.py +108 -0
  179. package/python/foxclaw/kernel/process_manager.py +186 -0
  180. package/python/foxclaw/kernel/scheduler.py +125 -0
  181. package/python/foxclaw/kernel/sentinel.py +443 -0
  182. package/python/foxclaw/kernel/sentinel_client.py +243 -0
  183. package/python/foxclaw/kernel/spine.py +97 -0
  184. package/python/foxclaw/knowledge/__init__.py +360 -0
  185. package/python/foxclaw/knowledge/truth_crystallizer.py +89 -0
  186. package/python/foxclaw/learning/__init__.py +12 -0
  187. package/python/foxclaw/learning/knowledge_graph.py +144 -0
  188. package/python/foxclaw/learning/models.py +93 -0
  189. package/python/foxclaw/learning/reasoner.py +67 -0
  190. package/python/foxclaw/learning/runtime.py +351 -0
  191. package/python/foxclaw/learning/spaced_repetition.py +91 -0
  192. package/python/foxclaw/mcp_server.py +188 -0
  193. package/python/foxclaw/orchestration/__init__.py +167 -0
  194. package/python/foxclaw/pipeline/__init__.py +23 -0
  195. package/python/foxclaw/pipeline/cognitive_pipeline.py +429 -0
  196. package/python/foxclaw/pipeline/stage_meta.py +21 -0
  197. package/python/foxclaw/pipeline/supervisor_stages.py +201 -0
  198. package/python/foxclaw/planning/__init__.py +17 -0
  199. package/python/foxclaw/planning/llm_planner.py +232 -0
  200. package/python/foxclaw/planning/planner.py +94 -0
  201. package/python/foxclaw/search/__init__.py +24 -0
  202. package/python/foxclaw/search/agent_port.py +190 -0
  203. package/python/foxclaw/search/evidence.py +109 -0
  204. package/python/foxclaw/search/external_search.py +50 -0
  205. package/python/foxclaw/search/hkc_read_port.py +60 -0
  206. package/python/foxclaw/search/internal_search.py +71 -0
  207. package/python/foxclaw/search/models.py +127 -0
  208. package/python/foxclaw/search/planner.py +44 -0
  209. package/python/foxclaw/search/retriever.py +39 -0
  210. package/python/foxclaw/search/runtime.py +127 -0
  211. package/python/foxclaw/search/strategy.py +44 -0
  212. package/python/foxclaw/skills/__init__.py +559 -0
  213. package/python/foxclaw/skills/archive.py +111 -0
  214. package/python/foxclaw/skills/fetch.py +226 -0
  215. package/python/foxclaw/skills/hooks_spec.py +69 -0
  216. package/python/foxclaw/skills/install_cmd.py +216 -0
  217. package/python/foxclaw/skills/lifecycle.py +252 -0
  218. package/python/foxclaw/skills/markdown_skill.py +175 -0
  219. package/python/foxclaw/skills/markdown_store.py +39 -0
  220. package/python/foxclaw/skills/mcp_client.py +184 -0
  221. package/python/foxclaw/skills/mcp_store.py +40 -0
  222. package/python/foxclaw/skills/permission.py +145 -0
  223. package/python/foxclaw/skills/pipeline.py +354 -0
  224. package/python/foxclaw/skills/policy.py +74 -0
  225. package/python/foxclaw/skills/review.py +72 -0
  226. package/python/foxclaw/skills/store.py +57 -0
  227. package/python/frontend/assets/core_bg.jpg +0 -0
  228. package/python/frontend/deck/auth.js +25 -0
  229. package/python/frontend/deck/chat_model_picker.js +483 -0
  230. package/python/frontend/deck/domain.js +276 -0
  231. package/python/frontend/deck/main.js +1806 -0
  232. package/python/frontend/deck/markdown.js +44 -0
  233. package/python/frontend/deck/settings.js +307 -0
  234. package/python/frontend/deck/state.js +5 -0
  235. package/python/frontend/deck/util.js +4 -0
  236. package/python/frontend/deck/visuals.js +190 -0
  237. package/python/frontend/deck.css +855 -0
  238. package/python/frontend/deck.html +686 -0
  239. package/python/frontend/deck_v2.html +341 -0
  240. package/python/frontend/planet/index.html +266 -0
  241. package/python/frontend/planet/planet.css +579 -0
  242. package/python/frontend/planet/planet.js +1436 -0
  243. package/python/frontend/planet/vendor/three.core.min.js +6 -0
  244. package/python/frontend/planet/vendor/three.module.min.js +6 -0
  245. package/python/frontend/v3/assets/index-CQSBdxk4.js +34 -0
  246. package/python/frontend/v3/assets/index-D5nIsjms.css +1 -0
  247. package/python/frontend/v3/index.html +15 -0
  248. package/python/frontend/widget_runtime.js +252 -0
  249. package/python/frontend/widgets.js +639 -0
  250. package/python/frontend_src/index.html +14 -0
  251. package/python/frontend_src/package-lock.json +1376 -0
  252. package/python/frontend_src/package.json +19 -0
  253. package/python/frontend_src/src/App.vue +58 -0
  254. package/python/frontend_src/src/api.js +82 -0
  255. package/python/frontend_src/src/components/ChatDock.vue +365 -0
  256. package/python/frontend_src/src/components/ComposerMenu.vue +75 -0
  257. package/python/frontend_src/src/components/DocViewer.vue +162 -0
  258. package/python/frontend_src/src/components/Inspector.vue +235 -0
  259. package/python/frontend_src/src/components/LeftRail.vue +415 -0
  260. package/python/frontend_src/src/components/MenuPopover.vue +128 -0
  261. package/python/frontend_src/src/components/MessageStream.vue +389 -0
  262. package/python/frontend_src/src/components/ModelPicker.vue +350 -0
  263. package/python/frontend_src/src/components/QuickIngest.vue +112 -0
  264. package/python/frontend_src/src/components/Stage.vue +272 -0
  265. package/python/frontend_src/src/components/ToolMenu.vue +141 -0
  266. package/python/frontend_src/src/components/TopBar.vue +118 -0
  267. package/python/frontend_src/src/components/panels/ActivityPanel.vue +82 -0
  268. package/python/frontend_src/src/components/panels/AgentsPanel.vue +83 -0
  269. package/python/frontend_src/src/components/panels/KnowledgePanel.vue +425 -0
  270. package/python/frontend_src/src/components/panels/MemoryPanel.vue +117 -0
  271. package/python/frontend_src/src/components/panels/PanelBox.vue +50 -0
  272. package/python/frontend_src/src/components/panels/ReviewPanel.vue +292 -0
  273. package/python/frontend_src/src/components/panels/SettingsPanel.vue +358 -0
  274. package/python/frontend_src/src/components/panels/TasksPanel.vue +73 -0
  275. package/python/frontend_src/src/components/panels/ToolsPanel.vue +746 -0
  276. package/python/frontend_src/src/components/panels/UsagePanel.vue +105 -0
  277. package/python/frontend_src/src/lib/fmt.js +44 -0
  278. package/python/frontend_src/src/lib/i18n.js +53 -0
  279. package/python/frontend_src/src/lib/locales/en.js +173 -0
  280. package/python/frontend_src/src/lib/locales/zh.js +174 -0
  281. package/python/frontend_src/src/lib/md.js +190 -0
  282. package/python/frontend_src/src/main.js +9 -0
  283. package/python/frontend_src/src/stores/app.js +91 -0
  284. package/python/frontend_src/src/stores/chat.js +450 -0
  285. package/python/frontend_src/src/stores/model.js +96 -0
  286. package/python/frontend_src/src/stores/panels.js +289 -0
  287. package/python/frontend_src/src/stores/profile.js +31 -0
  288. package/python/frontend_src/src/stores/system.js +25 -0
  289. package/python/frontend_src/src/styles/base.css +138 -0
  290. package/python/frontend_src/src/styles/panel.css +117 -0
  291. package/python/frontend_src/src/styles/tokens.css +78 -0
  292. package/python/frontend_src/vite.config.js +39 -0
  293. package/python/pyproject.toml +268 -0
  294. package/python/requirements.txt +311 -0
  295. package/python/skills/README.md +123 -0
  296. package/python/skills/execution-contract/SKILL.md +30 -0
  297. package/python/skills/general-assistant/SKILL.md +34 -0
  298. package/python/skills/planner/SKILL.md +33 -0
  299. package/python/skills/schedule-itinerary/SKILL.md +35 -0
  300. package/python/skills/skill-composition/SKILL.md +31 -0
  301. package/python/skills/skill-guard/SKILL.md +67 -0
  302. package/python/skills/skill-memory/SKILL.md +50 -0
  303. package/python/skills/skill-router/SKILL.md +35 -0
  304. package/python/tests/conftest.py +54 -0
  305. package/python/tests/run_all.py +200 -0
  306. package/python/tests/test_agent_lifecycle.py +326 -0
  307. package/python/tests/test_ahs_p2.py +393 -0
  308. package/python/tests/test_anthropic_tools.py +192 -0
  309. package/python/tests/test_api.py +97 -0
  310. package/python/tests/test_api_auth.py +79 -0
  311. package/python/tests/test_api_host_guard.py +69 -0
  312. package/python/tests/test_attachments.py +151 -0
  313. package/python/tests/test_audit_chain.py +116 -0
  314. package/python/tests/test_audit_sink.py +130 -0
  315. package/python/tests/test_browser.py +149 -0
  316. package/python/tests/test_browser_request_guard.py +180 -0
  317. package/python/tests/test_capabilities.py +152 -0
  318. package/python/tests/test_channel_signing.py +185 -0
  319. package/python/tests/test_channel_trust.py +109 -0
  320. package/python/tests/test_channels.py +174 -0
  321. package/python/tests/test_cli.py +46 -0
  322. package/python/tests/test_compaction_toolpair.py +119 -0
  323. package/python/tests/test_config_layering.py +61 -0
  324. package/python/tests/test_confirm_nonce.py +186 -0
  325. package/python/tests/test_context_compaction_wiring.py +124 -0
  326. package/python/tests/test_dispatch.py +89 -0
  327. package/python/tests/test_domain_evals.py +334 -0
  328. package/python/tests/test_domain_import.py +72 -0
  329. package/python/tests/test_domain_reasoners.py +134 -0
  330. package/python/tests/test_e2e.py +161 -0
  331. package/python/tests/test_emb_cache.py +97 -0
  332. package/python/tests/test_embedding_singleton.py +87 -0
  333. package/python/tests/test_envfile.py +83 -0
  334. package/python/tests/test_evals_smoke.py +90 -0
  335. package/python/tests/test_event_spine.py +174 -0
  336. package/python/tests/test_evidence_semantic.py +88 -0
  337. package/python/tests/test_evidence_sse.py +94 -0
  338. package/python/tests/test_file_ingest.py +135 -0
  339. package/python/tests/test_finance.py +144 -0
  340. package/python/tests/test_finance_ledger.py +245 -0
  341. package/python/tests/test_finance_persist.py +174 -0
  342. package/python/tests/test_gateway.py +125 -0
  343. package/python/tests/test_governance.py +421 -0
  344. package/python/tests/test_governance_audit.py +324 -0
  345. package/python/tests/test_governance_middleware.py +137 -0
  346. package/python/tests/test_hkc.py +268 -0
  347. package/python/tests/test_hkc_index_build_manager.py +306 -0
  348. package/python/tests/test_hkc_manifest_reuse.py +294 -0
  349. package/python/tests/test_hkc_search_event_sync.py +482 -0
  350. package/python/tests/test_import_path_guard.py +155 -0
  351. package/python/tests/test_injection_guard.py +193 -0
  352. package/python/tests/test_integration.py +117 -0
  353. package/python/tests/test_itinerary.py +100 -0
  354. package/python/tests/test_kee_semantic.py +84 -0
  355. package/python/tests/test_kernel.py +212 -0
  356. package/python/tests/test_learning.py +101 -0
  357. package/python/tests/test_llm_admin.py +145 -0
  358. package/python/tests/test_llm_planner.py +344 -0
  359. package/python/tests/test_markdown_skills.py +62 -0
  360. package/python/tests/test_markdown_skills_openclaw.py +66 -0
  361. package/python/tests/test_mcp_connectors.py +97 -0
  362. package/python/tests/test_mcp_guardian_discovery.py +87 -0
  363. package/python/tests/test_mcp_no_memory.py +43 -0
  364. package/python/tests/test_mcp_policy_gate.py +76 -0
  365. package/python/tests/test_mcp_server.py +92 -0
  366. package/python/tests/test_memory_recall.py +92 -0
  367. package/python/tests/test_metrics.py +58 -0
  368. package/python/tests/test_multi_chain.py +90 -0
  369. package/python/tests/test_multimodal.py +122 -0
  370. package/python/tests/test_negotiation.py +136 -0
  371. package/python/tests/test_orchestration.py +109 -0
  372. package/python/tests/test_orchestration_decoupled.py +103 -0
  373. package/python/tests/test_p3_p5_hardening.py +324 -0
  374. package/python/tests/test_parallel_dispatch.py +207 -0
  375. package/python/tests/test_pipeline.py +492 -0
  376. package/python/tests/test_plan_visible.py +86 -0
  377. package/python/tests/test_planner.py +88 -0
  378. package/python/tests/test_policy_gate.py +108 -0
  379. package/python/tests/test_profile.py +67 -0
  380. package/python/tests/test_readme_claims.py +163 -0
  381. package/python/tests/test_reasoner.py +170 -0
  382. package/python/tests/test_release_check.py +252 -0
  383. package/python/tests/test_resume_checkpoint.py +148 -0
  384. package/python/tests/test_routing.py +85 -0
  385. package/python/tests/test_scheduler.py +138 -0
  386. package/python/tests/test_search.py +194 -0
  387. package/python/tests/test_secrets.py +153 -0
  388. package/python/tests/test_semantic.py +69 -0
  389. package/python/tests/test_sessions.py +90 -0
  390. package/python/tests/test_settings.py +265 -0
  391. package/python/tests/test_shadow_learning.py +290 -0
  392. package/python/tests/test_shared_write.py +200 -0
  393. package/python/tests/test_skill_taint_gate.py +145 -0
  394. package/python/tests/test_skills.py +117 -0
  395. package/python/tests/test_skills_fetch.py +282 -0
  396. package/python/tests/test_stats_and_events.py +162 -0
  397. package/python/tests/test_streaming.py +55 -0
  398. package/python/tests/test_supervisor_pipeline.py +176 -0
  399. package/python/tests/test_supervisor_triage.py +102 -0
  400. package/python/tests/test_taint.py +112 -0
  401. package/python/tests/test_task_stream.py +74 -0
  402. package/python/tests/test_thinking_sse.py +66 -0
  403. package/python/tests/test_thinking_stream.py +76 -0
  404. package/python/tests/test_tool_center.py +113 -0
  405. package/python/tests/test_tool_parallel.py +113 -0
  406. package/python/tests/test_tool_params.py +99 -0
  407. package/python/tests/test_tool_use.py +229 -0
  408. package/python/tests/test_toplevel_concurrency.py +116 -0
  409. package/python/tests/test_tracing.py +256 -0
  410. package/python/tests/test_truth_crystallizer.py +125 -0
  411. package/python/tests/test_truth_flow.py +88 -0
  412. package/python/tests/test_update_check.py +95 -0
  413. package/python/tests/test_url_policy.py +53 -0
  414. package/python/tests/test_verify_evidence.py +212 -0
  415. package/python/tests/test_version_sync.py +100 -0
  416. package/python/tests/test_web_trigger.py +82 -0
  417. package/python/tools/check_faiss_type.py +30 -0
  418. package/python/tools/check_log.ps1 +38 -0
  419. package/python/tools/ivf_status.py +72 -0
  420. package/python/tools/mypy_baseline.txt +13 -0
  421. package/python/tools/mypy_ratchet.py +143 -0
  422. package/python/tools/pack.py +173 -0
  423. package/python/tools/release_check.py +349 -0
  424. package/python/tools/restart_foxclaw.ps1 +71 -0
  425. package/python/tools/shared_write_audit.py +190 -0
  426. package/python/tools/size_baseline.txt +28 -0
  427. package/python/tools/size_check.py +102 -0
  428. package/python/tools/strip_comments.py +228 -0
  429. package/python/tools/verify_env.bat +2 -0
  430. package/python/tools/verify_env.py +25 -0
  431. package/python/vendor/HMR_LICENSE +37 -0
  432. package/python/vendor/HMR_README.md +65 -0
  433. package/python/vendor/hkc/LICENSE +37 -0
  434. package/python/vendor/hkc/hkc_ace/__init__.py +0 -0
  435. package/python/vendor/hkc/hkc_ace/ace.py +457 -0
  436. package/python/vendor/hkc/hkc_ace/skill_taxonomy.json +465 -0
  437. package/python/vendor/hkc/hkc_api/__init__.py +0 -0
  438. package/python/vendor/hkc/hkc_api/container.py +416 -0
  439. package/python/vendor/hkc/hkc_api/ingest_jobs.py +103 -0
  440. package/python/vendor/hkc/hkc_api/main.py +157 -0
  441. package/python/vendor/hkc/hkc_api/routes/__init__.py +0 -0
  442. package/python/vendor/hkc/hkc_api/routes/ability.py +151 -0
  443. package/python/vendor/hkc/hkc_api/routes/config.py +51 -0
  444. package/python/vendor/hkc/hkc_api/routes/knowledge.py +630 -0
  445. package/python/vendor/hkc/hkc_api/routes/search.py +88 -0
  446. package/python/vendor/hkc/hkc_api/schemas.py +153 -0
  447. package/python/vendor/hkc/hkc_api/synthesis.py +179 -0
  448. package/python/vendor/hkc/hkc_core/__init__.py +0 -0
  449. package/python/vendor/hkc/hkc_core/graph/__init__.py +0 -0
  450. package/python/vendor/hkc/hkc_core/graph/base.py +188 -0
  451. package/python/vendor/hkc/hkc_core/graph/sqlite_store.py +789 -0
  452. package/python/vendor/hkc/hkc_core/models/__init__.py +0 -0
  453. package/python/vendor/hkc/hkc_core/models/enums.py +65 -0
  454. package/python/vendor/hkc/hkc_core/models/ku.py +307 -0
  455. package/python/vendor/hkc/hkc_core/utils/__init__.py +0 -0
  456. package/python/vendor/hkc/hkc_core/utils/id_gen.py +113 -0
  457. package/python/vendor/hkc/hkc_crystallizer/__init__.py +44 -0
  458. package/python/vendor/hkc/hkc_crystallizer/adapters.py +94 -0
  459. package/python/vendor/hkc/hkc_crystallizer/candidate.py +145 -0
  460. package/python/vendor/hkc/hkc_crystallizer/crystallizer.py +179 -0
  461. package/python/vendor/hkc/hkc_crystallizer/ingress.py +90 -0
  462. package/python/vendor/hkc/hkc_kde/__init__.py +0 -0
  463. package/python/vendor/hkc/hkc_kde/chunker.py +197 -0
  464. package/python/vendor/hkc/hkc_kde/extractor.py +623 -0
  465. package/python/vendor/hkc/hkc_kde/kde.py +298 -0
  466. package/python/vendor/hkc/hkc_kde/loaders/__init__.py +0 -0
  467. package/python/vendor/hkc/hkc_kde/loaders/ebook_loader.py +153 -0
  468. package/python/vendor/hkc/hkc_kde/loaders/office_loader.py +194 -0
  469. package/python/vendor/hkc/hkc_kde/loaders/pdf_loader.py +162 -0
  470. package/python/vendor/hkc/hkc_kde/loaders/text_loader.py +157 -0
  471. package/python/vendor/hkc/hkc_kde/loaders/web_loader.py +91 -0
  472. package/python/vendor/hkc/hkc_kde/models.py +74 -0
  473. package/python/vendor/hkc/hkc_kde/packager.py +329 -0
  474. package/python/vendor/hkc/hkc_kde/relation_disc.py +151 -0
  475. package/python/vendor/hkc/hkc_kee/__init__.py +0 -0
  476. package/python/vendor/hkc/hkc_kee/dedup.py +227 -0
  477. package/python/vendor/hkc/hkc_kee/fingerprint.py +106 -0
  478. package/python/vendor/hkc/hkc_kee/kee.py +541 -0
  479. package/python/vendor/hkc/hkc_kep/__init__.py +0 -0
  480. package/python/vendor/hkc/hkc_kep/event_bus.py +205 -0
  481. package/python/vendor/hkc/hkc_sdk/__init__.py +63 -0
  482. package/python/vendor/hkc/hkc_sdk/base.py +151 -0
  483. package/python/vendor/hkc/hkc_sdk/direct_client.py +153 -0
  484. package/python/vendor/hkc/hkc_sdk/exceptions.py +39 -0
  485. package/python/vendor/hkc/hkc_sdk/http_client.py +166 -0
  486. package/python/vendor/hkc/hkc_sdk/models.py +171 -0
  487. package/python/vendor/hkc/hkc_search/__init__.py +0 -0
  488. package/python/vendor/hkc/hkc_search/bm25.py +325 -0
  489. package/python/vendor/hkc/hkc_search/embedding_backends.py +374 -0
  490. package/python/vendor/hkc/hkc_search/graph_search.py +132 -0
  491. package/python/vendor/hkc/hkc_search/hybrid.py +331 -0
  492. package/python/vendor/hkc/hkc_search/index_build_manager.py +378 -0
  493. package/python/vendor/hkc/hkc_search/vector_search.py +484 -0
  494. package/python/vendor/hmr/__init__.py +0 -0
  495. package/python/vendor/hmr/core/__init__.py +0 -0
  496. package/python/vendor/hmr/core/hmr.py +684 -0
  497. package/python/vendor/hmr/core/models.py +310 -0
  498. package/python/vendor/hmr/engines/__init__.py +0 -0
  499. package/python/vendor/hmr/engines/evolution.py +710 -0
  500. package/python/vendor/hmr/engines/jit_compiler.py +472 -0
  501. package/python/vendor/hmr/engines/lifecycle.py +264 -0
  502. package/python/vendor/hmr/engines/policy.py +625 -0
  503. package/python/vendor/hmr/engines/recall.py +260 -0
  504. package/python/vendor/hmr/engines/runtime_state.py +158 -0
  505. package/python/vendor/hmr/engines/scheduler.py +323 -0
  506. package/python/vendor/hmr/engines/semantic.py +150 -0
  507. package/python/vendor/hmr/engines/temporal.py +261 -0
  508. package/python/vendor/hmr/engines/thought_chain.py +635 -0
  509. package/python/vendor/hmr/graph/__init__.py +0 -0
  510. package/python/vendor/hmr/graph/cwg.py +338 -0
  511. package/python/vendor/hmr/graph/memory_graph.py +530 -0
  512. package/python/vendor/hmr/storage/__init__.py +0 -0
  513. package/python/vendor/hmr/storage/memory_fs.py +300 -0
  514. package/python/vendor/hmr/storage/vector_store.py +520 -0
@@ -0,0 +1,39 @@
1
+ import { execSync } from 'node:child_process'
2
+ import { defineConfig } from 'vite'
3
+ import vue from '@vitejs/plugin-vue'
4
+ import { fileURLToPath, URL } from 'node:url'
5
+
6
+ function gitInfo() {
7
+ try {
8
+ const sha = execSync('git rev-parse --short HEAD', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim()
9
+ const ts = Number(execSync('git log -1 --format=%ct', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim()) * 1000
10
+ return { sha, ts: Number.isFinite(ts) ? ts : 0 }
11
+ } catch {
12
+ return { sha: 'dev', ts: 0 }
13
+ }
14
+ }
15
+
16
+ export default defineConfig({
17
+ base: '/v3/',
18
+ plugins: [vue()],
19
+ resolve: {
20
+ alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) },
21
+ },
22
+ define: {
23
+ __APP_INFO__: JSON.stringify({ git: gitInfo(), built: Date.now() }),
24
+ },
25
+ build: {
26
+ outDir: '../frontend/v3',
27
+ emptyOutDir: true,
28
+ target: 'es2022',
29
+ },
30
+ server: {
31
+ port: 5173,
32
+ proxy: {
33
+ '/api': { target: 'http://127.0.0.1:8000', changeOrigin: true },
34
+ '/ws': { target: 'ws://127.0.0.1:8000', ws: true },
35
+ '/planet': { target: 'http://127.0.0.1:8000', changeOrigin: true },
36
+ '/knowledge': { target: 'http://127.0.0.1:8000', changeOrigin: true },
37
+ },
38
+ },
39
+ })
@@ -0,0 +1,268 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "foxclaw"
7
+ version = "0.1.3"
8
+ description = "Foxclaw - a personal agent with memory, built on the HMR memory runtime"
9
+ requires-python = ">=3.11"
10
+
11
+ # 项目页正文(long_description)。此前缺这一行,PyPI 项目页只显示
12
+ # 「该软件包的作者未提供项目描述」——元数据里没有 Description。中英文各一份,
13
+ # 这里按主要读者选中文版;发布门槛见 tools/release_check.py 的 no_readme /
14
+ # no_long_description 检查(缺正文直接失败,不再允许空白页发出)。
15
+ readme = { file = "README_CN.md", content-type = "text/markdown" }
16
+
17
+ # 许可:仓库根目录 LICENSE 为 MIT。这里用 { file = "LICENSE" } 而不是 PEP 639 的
18
+ # SPDX 字符串(`license = "MIT"`),因为 build-system 只要求 setuptools>=68,而
19
+ # SPDX 字符串要 setuptools>=77 才会被接受;老写法在 68+ 全部可用,metadata 里同样
20
+ # 带上完整许可全文。
21
+ license = { file = "LICENSE" }
22
+ classifiers = [
23
+ "License :: OSI Approved :: MIT License",
24
+ ]
25
+
26
+ # 依赖以本表为唯一来源(CI 用 `pip install -e .` 安装,不再手写第二份清单)。
27
+ # 注意:HMR 与 HKC 以 vendor/ 内嵌随包分发、走 sys.path 加载,不是 PyPI 依赖,
28
+ # 故此处**不**声明 hmr/hkc —— 此前声明 hmr>=1.0.0 是空转项(永不从 PyPI 安装)。
29
+ dependencies = [
30
+ # LLM 提供商(未装/未配 key 时模型路由降级 stub,其余功能照常)
31
+ "anthropic>=0.25.0",
32
+ "openai>=1.0.0",
33
+ # 语义嵌入与向量检索(Harness 语义漂移检测 + HKC 语义搜索)
34
+ "sentence-transformers>=2.7.0",
35
+ "numpy>=1.26.0",
36
+ "scikit-learn>=1.4.0",
37
+ # HKC 向量索引的硬依赖(不是可选):vendor/hkc/hkc_search/vector_search.py
38
+ # 的 VectorIndex._init_index() 缺 faiss 时直接 raise ImportError。
39
+ # 此前只在注释里写「已随本体」而依赖表漏声明 → CI 干净环境装不到,
40
+ # test_hkc_manifest_reuse 顶层 import 失败(collection error),
41
+ # Stage B/C 的 vector.size() 断言全红。本机曾手动装过,故一直没暴露。
42
+ "faiss-cpu>=1.8.0",
43
+ # API 服务
44
+ "fastapi>=0.111.0",
45
+ "uvicorn>=0.29.0",
46
+ "websockets>=12.0",
47
+ "pydantic>=2.0.0",
48
+ # 内置 MCP 服务器(/api/mcp/)+ Skill MCP 客户端(mcp_server.py / skills/mcp_client.py 顶层硬依赖)
49
+ # 锁 <2.0:mcp 2.x 是大重构(拆出 mcp_types、改 fastmcp/streamable_http/sse 客户端 API、
50
+ # 换 httpx2),与本仓库基于 1.x 的调用不兼容;1.27.x 已在 CI 与本地全量回归验证。
51
+ "mcp>=1.27.0,<2.0",
52
+ # HTTP 客户端(渠道适配器 + Web 工具)。沿用既有 <0.28 约束
53
+ "httpx>=0.24,<0.28",
54
+ # 飞书加密事件解密
55
+ "cryptography>=41.0.0",
56
+ # 配置与终端输出
57
+ "pyyaml>=6.0.0",
58
+ "python-dotenv>=1.0.0",
59
+ "rich>=13.7.0",
60
+ ]
61
+
62
+ [project.scripts]
63
+ # 命令名与包名一致(foxclaw),`pip install` 之后直接可用:
64
+ # `pip install -e .` 之后可直接 `foxclaw serve`。
65
+ foxclaw = "foxclaw.cli:main"
66
+
67
+ [tool.setuptools]
68
+ # vendor/ 里的 HMR 与 HKC 是内嵌运行时(不是 PyPI 依赖)。此前 packages.find 只收
69
+ # foxclaw*,装完 import 得到的是「记忆/知识子系统全部降级为 None」的占位包。
70
+ # 这里把它们真正打进 wheel,并让 package-data 一并带上 LICENSE/JSON 等非 .py 资源。
71
+ include-package-data = true
72
+
73
+ [tool.setuptools.packages.find]
74
+ # foxclaw 在仓库根;hmr 在 vendor/ 下;hkc_* 在 vendor/hkc/ 下 —— 三个搜索根都要给。
75
+ where = [".", "vendor", "vendor/hkc"]
76
+ include = ["foxclaw*", "hmr*", "hkc_*"]
77
+
78
+ [project.optional-dependencies]
79
+ dev = [
80
+ "pytest>=8.0",
81
+ "pytest-asyncio>=0.23.0",
82
+ "ruff>=0.16",
83
+ "mypy>=1.10",
84
+ "coverage>=7.5",
85
+ # 默认回归硬依赖:test_file_ingest / test_domain_import 顶层 import docx/openpyxl,
86
+ # 缺失即 ModuleNotFoundError。与下方 knowledge-files 重复声明是刻意的——
87
+ # 此处是"测试视角"(回归必需),下方是"功能视角"(文件摄入)。放 dev 而非 knowledge-files,
88
+ # 避免为了两个 docx/xlsx 测试连带拖入 pymupdf/ebooklib/mobi 等 PDF/epub 重依赖。
89
+ "python-docx>=1.1",
90
+ "openpyxl>=3.1",
91
+ ]
92
+ # 浏览器子系统(HIR-Browser)。playwright 是重可选依赖:装了才启用真实浏览器,
93
+ # 未装则 /api/browser/* 优雅降级(available=False)。装后还需 `playwright install chromium`。
94
+ browser = ["playwright>=1.44.0"]
95
+ # Google Gemini provider。model_router 在 FOXCLAW_PROVIDER=google 时才惰性 import
96
+ # google.generativeai;未装则该分支 ImportError(其余 provider 不受影响)。此前只在
97
+ # 文档里写「pip install google-generativeai」,依赖表无对应声明,属 R1 检测出的缺口。
98
+ gemini = ["google-generativeai>=0.8"]
99
+ # 自定义模型 API key 存 OS 凭据库(Windows DPAPI / macOS Keychain / Linux Secret
100
+ # Service)。未装则回退 base64 混淆(防 grep,非加密),见 core/secrets.py。
101
+ keyring = ["keyring>=24.0"]
102
+ # 知识核心(HKC,vendor/hkc)。核心运行时依赖;缺失时 /api/knowledge/* 优雅降级。
103
+ # 真实语义向量另需 sentence-transformers+faiss(已随本体);文件摄入见 knowledge-files。
104
+ knowledge = ["networkx>=3.0", "rank-bm25>=0.2", "aiofiles>=23.0", "requests>=2.31"]
105
+ # HKC 文件摄入(PDF/epub/mobi/docx/xlsx)。仅当要摄入电子书/PDF/Office 文档时需要。
106
+ knowledge-files = ["pymupdf>=1.24", "ebooklib>=0.18", "beautifulsoup4>=4.12", "mobi>=0.3.3", "python-multipart>=0.0.9", "python-docx>=1.1", "openpyxl>=3.1"]
107
+
108
+
109
+ # ─────────────────────────────────────────────────────────────
110
+ # 工程化工具链(S1):ruff / mypy / pytest / coverage
111
+ # 策略:首次引入,存量告警显式豁免(只保留死代码/真 bug 硬门),S3 拆分后逐步收紧。
112
+ # ─────────────────────────────────────────────────────────────
113
+
114
+ [tool.ruff]
115
+ line-length = 120
116
+ target-version = "py311"
117
+ # 只 lint 主包 + 测试;vendor/ 是内嵌第三方,frontend/skills/tools/bench/evals/examples 非 Python 主包。
118
+ extend-exclude = ["vendor/", "frontend/", "skills/", "tools/", "bench/", "evals/", "examples/"]
119
+
120
+ [tool.ruff.lint]
121
+ select = ["E", "F", "W", "B", "I", "UP"]
122
+ # 存量告警显式豁免(风格/现代化类);F 系列(pyflakes 死代码/未定义名)已清零并作为硬门。
123
+ # S3 拆分大文件后,逐条从 ignore 移除以收紧。
124
+ ignore = [
125
+ "E501", # line-too-long(862 存量)
126
+ "E701", "E702", "E731", "E741", "E401", "E402", # pycodestyle 风格
127
+ "I001", # import 排序(138 存量)
128
+ "B008", "B034", "B904", "B905", # bugbear 非致命(33 存量)
129
+ "UP006", "UP015", "UP017", "UP031", "UP035", "UP037", "UP041", "UP042", "UP045", # pyupgrade(143 存量)
130
+ ]
131
+
132
+ [tool.mypy]
133
+ python_version = "3.11"
134
+ ignore_missing_imports = true
135
+ check_untyped_defs = true
136
+ # 渐进式:mypy 存量错误用棘轮门管理(tools/mypy_ratchet.py + tools/mypy_baseline.txt)。
137
+ # 2026-11 实测 152 errors in 45 files,已冻结:CI 中错误数一旦增加即失败,
138
+ # 下降后用 `python tools/mypy_ratchet.py --update` 调低基线。只降不升。
139
+
140
+ [tool.pytest.ini_options]
141
+ testpaths = ["tests"]
142
+ # S2 迁移完成:全部测试文件均已迁移为 pytest(无顶层 import 副作用,可安全收集)。
143
+ # 注意:网关/内置MCP/流式限流等少数测试依赖模块级单例(FOXCLAW_GATEWAY、FOXCLAW_MCP_SERVER、
144
+ # _STREAM_LIMITER 均在 import 时按 env 固化),单进程 `pytest tests/` 会让这些单例被首个
145
+ # import 定死、相互污染。故全量执行统一走 tests/run_all.py(每个文件独立子进程
146
+ # `python -m pytest <file> -q` 隔离)。本白名单确保任意单文件可被 pytest 收集/运行。
147
+ python_files = [
148
+ "test_agent_lifecycle.py",
149
+ "test_ahs_p2.py",
150
+ "test_anthropic_tools.py",
151
+ "test_api.py",
152
+ "test_api_auth.py",
153
+ "test_api_host_guard.py",
154
+ "test_attachments.py",
155
+ "test_audit_chain.py",
156
+ "test_audit_sink.py",
157
+ "test_browser.py",
158
+ "test_browser_request_guard.py",
159
+ "test_capabilities.py",
160
+ "test_channel_signing.py",
161
+ "test_channel_trust.py",
162
+ "test_channels.py",
163
+ "test_cli.py",
164
+ "test_compaction_toolpair.py",
165
+ "test_config_layering.py",
166
+ "test_confirm_nonce.py",
167
+ "test_context_compaction_wiring.py",
168
+ "test_dispatch.py",
169
+ "test_domain_evals.py",
170
+ "test_domain_import.py",
171
+ "test_domain_reasoners.py",
172
+ "test_e2e.py",
173
+ "test_emb_cache.py",
174
+ "test_embedding_singleton.py",
175
+ "test_evals_smoke.py",
176
+ "test_event_spine.py",
177
+ "test_evidence_semantic.py",
178
+ "test_evidence_sse.py",
179
+ "test_file_ingest.py",
180
+ "test_finance.py",
181
+ "test_gateway.py",
182
+ "test_governance.py",
183
+ "test_governance_audit.py",
184
+ "test_governance_middleware.py",
185
+ "test_hkc.py",
186
+ "test_hkc_index_build_manager.py",
187
+ "test_hkc_manifest_reuse.py",
188
+ "test_hkc_search_event_sync.py",
189
+ "test_import_path_guard.py",
190
+ "test_injection_guard.py",
191
+ "test_integration.py",
192
+ "test_itinerary.py",
193
+ "test_kee_semantic.py",
194
+ "test_kernel.py",
195
+ "test_learning.py",
196
+ "test_llm_planner.py",
197
+ "test_markdown_skills.py",
198
+ "test_markdown_skills_openclaw.py",
199
+ "test_mcp_connectors.py",
200
+ "test_mcp_guardian_discovery.py",
201
+ "test_mcp_no_memory.py",
202
+ "test_mcp_policy_gate.py",
203
+ "test_mcp_server.py",
204
+ "test_memory_recall.py",
205
+ "test_metrics.py",
206
+ "test_multi_chain.py",
207
+ "test_multimodal.py",
208
+ "test_negotiation.py",
209
+ "test_orchestration.py",
210
+ "test_orchestration_decoupled.py",
211
+ "test_p3_p5_hardening.py",
212
+ "test_parallel_dispatch.py",
213
+ "test_pipeline.py",
214
+ "test_plan_visible.py",
215
+ "test_planner.py",
216
+ "test_policy_gate.py",
217
+ "test_profile.py",
218
+ "test_reasoner.py",
219
+ "test_release_check.py",
220
+ "test_resume_checkpoint.py",
221
+ "test_routing.py",
222
+ "test_scheduler.py",
223
+ "test_search.py",
224
+ "test_semantic.py",
225
+ "test_sessions.py",
226
+ "test_settings.py",
227
+ "test_shadow_learning.py",
228
+ "test_shared_write.py",
229
+ "test_envfile.py",
230
+ "test_secrets.py",
231
+ "test_skill_taint_gate.py",
232
+ "test_skills.py",
233
+ "test_skills_fetch.py",
234
+ "test_stats_and_events.py",
235
+ "test_streaming.py",
236
+ "test_supervisor_pipeline.py",
237
+ "test_verify_evidence.py",
238
+ "test_supervisor_triage.py",
239
+ "test_taint.py",
240
+ "test_task_stream.py",
241
+ "test_thinking_sse.py",
242
+ "test_thinking_stream.py",
243
+ "test_tool_center.py",
244
+ "test_tool_parallel.py",
245
+ "test_tool_params.py",
246
+ "test_tool_use.py",
247
+ "test_toplevel_concurrency.py",
248
+ "test_tracing.py",
249
+ "test_truth_crystallizer.py",
250
+ "test_truth_flow.py",
251
+ "test_update_check.py",
252
+ "test_url_policy.py",
253
+ "test_version_sync.py",
254
+ "test_web_trigger.py",
255
+ ]
256
+ addopts = "-q"
257
+
258
+ [tool.coverage.run]
259
+ source = ["foxclaw"]
260
+ # 全量回归走 run_all.py(每文件独立子进程),coverage 需 parallel 模式:每个子进程各写一份
261
+ # .coverage,最后 `coverage combine` 合并成基线。patch=["subprocess"] 让 coverage run 设置
262
+ # COVERAGE_PROCESS_CONFIG 环境变量,子进程经 coverage 的 sitecustomize(.pth)自动测量,
263
+ # 无需逐个子进程手动包 coverage run(run_all.py 的 subprocess 用 dict(os.environ,...) 继承,链路完整)。
264
+ parallel = true
265
+ patch = ["subprocess"]
266
+
267
+ [tool.coverage.report]
268
+ show_missing = true
@@ -0,0 +1,311 @@
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile pyproject.toml --universal -o requirements.txt
3
+ annotated-doc==0.0.5
4
+ # via
5
+ # fastapi
6
+ # typer
7
+ annotated-types==0.8.0
8
+ # via pydantic
9
+ anthropic==2.6.0
10
+ # via foxclaw (pyproject.toml)
11
+ anyio==4.16.0
12
+ # via
13
+ # anthropic
14
+ # httpx
15
+ # httpx2
16
+ # mcp
17
+ # openai
18
+ # sse-starlette
19
+ # starlette
20
+ attrs==26.1.0
21
+ # via
22
+ # jsonschema
23
+ # referencing
24
+ certifi==2026.10.23
25
+ # via
26
+ # httpcore
27
+ # httpx
28
+ cffi==2.1.1 ; platform_python_implementation != 'PyPy'
29
+ # via cryptography
30
+ click==8.5.1
31
+ # via
32
+ # huggingface-hub
33
+ # uvicorn
34
+ cloudpickle==3.1.2
35
+ # via joblib
36
+ colorama==0.4.6 ; sys_platform == 'win32'
37
+ # via
38
+ # tqdm
39
+ # typer
40
+ cryptography==50.0.2
41
+ # via
42
+ # foxclaw (pyproject.toml)
43
+ # pyjwt
44
+ cuda-bindings==13.5.0 ; python_full_version < '3.15' and sys_platform == 'linux'
45
+ # via torch
46
+ cuda-pathfinder==1.8.6 ; python_full_version < '3.15' and sys_platform == 'linux'
47
+ # via cuda-bindings
48
+ cuda-toolkit==13.2.2 ; sys_platform == 'linux'
49
+ # via torch
50
+ docstring-parser==0.18.0
51
+ # via anthropic
52
+ faiss-cpu==1.15.1
53
+ # via foxclaw (pyproject.toml)
54
+ fastapi==0.162.2
55
+ # via foxclaw (pyproject.toml)
56
+ filelock==4.2.9
57
+ # via
58
+ # huggingface-hub
59
+ # torch
60
+ fsspec==2026.9.0
61
+ # via
62
+ # huggingface-hub
63
+ # torch
64
+ h11==0.16.0
65
+ # via
66
+ # httpcore
67
+ # httpcore2
68
+ # uvicorn
69
+ hf-xet==1.8.0 ; platform_machine == 'AMD64' or platform_machine == 'ARM64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'
70
+ # via huggingface-hub
71
+ httpcore==1.0.9
72
+ # via httpx
73
+ httpcore2==2.16.0 ; sys_platform != 'emscripten'
74
+ # via httpx2
75
+ httpx==0.27.2
76
+ # via
77
+ # foxclaw (pyproject.toml)
78
+ # mcp
79
+ httpx-sse==0.4.3
80
+ # via mcp
81
+ httpx2==2.16.0
82
+ # via
83
+ # anthropic
84
+ # huggingface-hub
85
+ # openai
86
+ httpx2-jsfetch==1.0 ; sys_platform == 'emscripten'
87
+ # via httpx2
88
+ huggingface-hub==2.4.0
89
+ # via
90
+ # sentence-transformers
91
+ # tokenizers
92
+ # transformers
93
+ idna==3.20
94
+ # via
95
+ # anyio
96
+ # httpx
97
+ # httpx2
98
+ jinja2==3.1.6
99
+ # via torch
100
+ jiter==0.19.0
101
+ # via
102
+ # anthropic
103
+ # openai
104
+ joblib==1.6.0
105
+ # via scikit-learn
106
+ jsonschema==4.26.0
107
+ # via mcp
108
+ jsonschema-specifications==2025.9.1
109
+ # via jsonschema
110
+ markdown-it-py==4.2.0
111
+ # via rich
112
+ markupsafe==3.0.4
113
+ # via jinja2
114
+ mcp==1.30.0
115
+ # via foxclaw (pyproject.toml)
116
+ mdurl==0.1.2
117
+ # via markdown-it-py
118
+ mpmath==1.3.0
119
+ # via sympy
120
+ narwhals==2.28.0
121
+ # via scikit-learn
122
+ networkx==3.7
123
+ # via torch
124
+ numpy==2.5.4
125
+ # via
126
+ # foxclaw (pyproject.toml)
127
+ # faiss-cpu
128
+ # scikit-learn
129
+ # scipy
130
+ # sentence-transformers
131
+ # transformers
132
+ nvidia-cublas==13.4.1.3 ; sys_platform == 'linux'
133
+ # via
134
+ # cuda-toolkit
135
+ # nvidia-cudnn-cu13
136
+ # nvidia-cusolver
137
+ nvidia-cuda-cccl==13.3.5.0.6 ; sys_platform == 'linux'
138
+ # via nvidia-nvshmem-cu13
139
+ nvidia-cuda-cupti==13.2.86 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
140
+ # via cuda-toolkit
141
+ nvidia-cuda-nvrtc==13.2.86 ; sys_platform == 'linux'
142
+ # via
143
+ # cuda-toolkit
144
+ # nvidia-cublas
145
+ nvidia-cuda-runtime==13.2.86 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
146
+ # via cuda-toolkit
147
+ nvidia-cudnn-cu13==9.26.0.51 ; sys_platform == 'linux'
148
+ # via torch
149
+ nvidia-cufft==12.2.0.57 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
150
+ # via cuda-toolkit
151
+ nvidia-cufile==1.17.1.22 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
152
+ # via cuda-toolkit
153
+ nvidia-cusolver==12.2.0.11 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
154
+ # via cuda-toolkit
155
+ nvidia-cusparse==12.7.10.12 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
156
+ # via
157
+ # cuda-toolkit
158
+ # nvidia-cusolver
159
+ nvidia-cusparselt-cu13==0.8.1 ; sys_platform == 'linux'
160
+ # via torch
161
+ nvidia-nccl-cu13==2.30.7 ; sys_platform == 'linux'
162
+ # via torch
163
+ nvidia-nvjitlink==13.5.37 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
164
+ # via
165
+ # cuda-toolkit
166
+ # nvidia-cufft
167
+ # nvidia-cusolver
168
+ # nvidia-cusparse
169
+ nvidia-nvshmem-cu13==3.7.2 ; sys_platform == 'linux'
170
+ # via torch
171
+ nvidia-nvtx==13.2.86 ; (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')
172
+ # via cuda-toolkit
173
+ openai==3.46.0
174
+ # via foxclaw (pyproject.toml)
175
+ opentelemetry-api==1.45.2
176
+ # via
177
+ # anthropic
178
+ # fastapi
179
+ packaging==26.3
180
+ # via
181
+ # faiss-cpu
182
+ # huggingface-hub
183
+ # transformers
184
+ pycparser==3.12 ; implementation_name != 'PyPy' and platform_python_implementation != 'PyPy'
185
+ # via cffi
186
+ pydantic==2.14.3
187
+ # via
188
+ # foxclaw (pyproject.toml)
189
+ # anthropic
190
+ # fastapi
191
+ # mcp
192
+ # openai
193
+ # pydantic-settings
194
+ pydantic-core==2.50.4
195
+ # via pydantic
196
+ pydantic-settings==2.16.2
197
+ # via mcp
198
+ pygments==2.21.0
199
+ # via rich
200
+ pyjwt==2.15.1
201
+ # via mcp
202
+ python-dotenv==1.2.4
203
+ # via
204
+ # foxclaw (pyproject.toml)
205
+ # pydantic-settings
206
+ python-multipart==0.0.33
207
+ # via mcp
208
+ pywin32==312 ; sys_platform == 'win32'
209
+ # via mcp
210
+ pyyaml==6.0.3
211
+ # via
212
+ # foxclaw (pyproject.toml)
213
+ # huggingface-hub
214
+ # transformers
215
+ referencing==0.37.0
216
+ # via
217
+ # jsonschema
218
+ # jsonschema-specifications
219
+ regex==2026.11.9
220
+ # via transformers
221
+ rich==15.0.0
222
+ # via
223
+ # foxclaw (pyproject.toml)
224
+ # typer
225
+ rpds-py==2026.9.1
226
+ # via
227
+ # jsonschema
228
+ # referencing
229
+ safetensors==0.8.0
230
+ # via transformers
231
+ scikit-learn==1.9.1
232
+ # via
233
+ # foxclaw (pyproject.toml)
234
+ # sentence-transformers
235
+ scipy==1.18.1
236
+ # via
237
+ # scikit-learn
238
+ # sentence-transformers
239
+ sentence-transformers==6.2.0
240
+ # via foxclaw (pyproject.toml)
241
+ setuptools==84.2.1
242
+ # via torch
243
+ shellingham==1.5.4
244
+ # via typer
245
+ sniffio==1.3.1
246
+ # via
247
+ # anthropic
248
+ # httpx
249
+ # openai
250
+ sse-starlette==3.7.0
251
+ # via mcp
252
+ starlette==1.10.0
253
+ # via
254
+ # fastapi
255
+ # mcp
256
+ # sse-starlette
257
+ sympy==1.14.0
258
+ # via torch
259
+ threadpoolctl==3.8.0
260
+ # via scikit-learn
261
+ tokenizers==0.23.3
262
+ # via
263
+ # sentence-transformers
264
+ # transformers
265
+ torch==2.15.0
266
+ # via sentence-transformers
267
+ tqdm==4.70.1
268
+ # via
269
+ # huggingface-hub
270
+ # sentence-transformers
271
+ # transformers
272
+ transformers==5.22.2
273
+ # via sentence-transformers
274
+ triton==3.9.0 ; python_full_version < '3.16' and sys_platform == 'linux'
275
+ # via torch
276
+ truststore==0.10.5 ; sys_platform != 'emscripten'
277
+ # via
278
+ # httpcore2
279
+ # httpx2
280
+ typer==0.28.0
281
+ # via transformers
282
+ typing-extensions==4.16.0
283
+ # via
284
+ # anthropic
285
+ # anyio
286
+ # fastapi
287
+ # httpx2
288
+ # huggingface-hub
289
+ # mcp
290
+ # openai
291
+ # opentelemetry-api
292
+ # pydantic
293
+ # pydantic-core
294
+ # pydantic-settings
295
+ # referencing
296
+ # sentence-transformers
297
+ # starlette
298
+ # torch
299
+ # typing-inspection
300
+ typing-inspection==0.4.5
301
+ # via
302
+ # fastapi
303
+ # mcp
304
+ # pydantic
305
+ # pydantic-settings
306
+ uvicorn==0.54.0
307
+ # via
308
+ # foxclaw (pyproject.toml)
309
+ # mcp
310
+ websockets==17.4
311
+ # via foxclaw (pyproject.toml)