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
package/README.md CHANGED
@@ -1,29 +1,54 @@
1
- # foxclaw
2
-
3
- Personal AI agent — a fox living in your device.
4
-
5
- > **0.1.0 is a placeholder release.** This package currently only reserves the
6
- > `foxclaw` name on npm. The actual agent will be shipped in a later version.
7
-
8
- ## Install
9
-
10
- ```bash
11
- npm install foxclaw
12
- ```
13
-
14
- ## Usage
15
-
16
- ```js
17
- import { version } from "foxclaw";
18
-
19
- console.log(version); // 0.1.0
20
- ```
21
-
22
- ## Related
23
-
24
- - Python package: [foxclaw on PyPI](https://pypi.org/project/foxclaw/)
25
- - Source: [github.com/snowfoxHQ/FoxClaw](https://github.com/snowfoxHQ/FoxClaw)
26
-
27
- ## License
28
-
29
- MIT
1
+ # foxclaw
2
+
3
+ A personal agent with memory — a fox living in your device.
4
+
5
+ The npm package ships the **full project source** under `python/`, the same code
6
+ published on PyPI and hosted on GitHub. The `foxclaw` binary forwards its
7
+ arguments to the bundled Python CLI.
8
+
9
+ ## Requirements
10
+
11
+ - Node.js >= 18
12
+ - Python >= 3.11 (for running the agent)
13
+ - Python dependencies: `pip install fastapi uvicorn pydantic httpx pyyaml`
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ npm install -g foxclaw
19
+ ```
20
+
21
+ Or, if you prefer the Python package (recommended, pulls dependencies for you):
22
+
23
+ ```bash
24
+ pip install foxclaw
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ ```bash
30
+ foxclaw --help
31
+ foxclaw serve --port 8000 # start the HTTP API
32
+ foxclaw config # show resolved config
33
+ ```
34
+
35
+ Point at a specific interpreter when several Pythons are installed:
36
+
37
+ ```bash
38
+ FOXCLAW_PYTHON=/usr/bin/python3.12 foxclaw serve
39
+ ```
40
+
41
+ ## Layout
42
+
43
+ | Path | Contents |
44
+ |---|---|
45
+ | `python/foxclaw/` | Agent source |
46
+ | `python/vendor/hmr/` | Embedded memory runtime |
47
+ | `python/vendor/hkc/` | Embedded knowledge core |
48
+ | `bin/foxclaw.cjs` | CLI launcher |
49
+
50
+ ## Links
51
+
52
+ - Homepage: <https://github.com/snowfoxHQ/FoxClaw>
53
+ - Python package: <https://pypi.org/project/foxclaw/>
54
+ - Issues: <https://github.com/snowfoxHQ/FoxClaw/issues>
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * foxclaw CLI - runs the full Python project bundled in python/.
4
+ *
5
+ * Resolves a Python interpreter, points PYTHONPATH at the bundled source tree,
6
+ * and forwards every argument to `python -m foxclaw.cli`.
7
+ */
8
+ const { spawn } = require("node:child_process");
9
+ const fs = require("node:fs");
10
+ const path = require("node:path");
11
+
12
+ const pkgRoot = path.resolve(__dirname, "..");
13
+ const bundled = path.join(pkgRoot, "python");
14
+ const hasBundled = fs.existsSync(path.join(bundled, "foxclaw", "cli.py"));
15
+
16
+ const env = { ...process.env };
17
+ if (hasBundled) {
18
+ env.PYTHONPATH = env.PYTHONPATH
19
+ ? `${bundled}${path.delimiter}${env.PYTHONPATH}`
20
+ : bundled;
21
+ }
22
+
23
+ const candidates = [
24
+ process.env.FOXCLAW_PYTHON,
25
+ process.platform === "win32" ? "python" : "python3",
26
+ "python",
27
+ ].filter(Boolean);
28
+
29
+ function run(python) {
30
+ return new Promise((resolve) => {
31
+ const child = spawn(python, ["-m", "foxclaw.cli", ...process.argv.slice(2)], {
32
+ stdio: "inherit",
33
+ env,
34
+ cwd: process.cwd(),
35
+ });
36
+ child.on("error", () => resolve(false));
37
+ child.on("exit", (code, signal) => resolve({ code, signal }));
38
+ });
39
+ }
40
+
41
+ (async () => {
42
+ for (const python of candidates) {
43
+ const result = await run(python);
44
+ if (result === false) continue; // interpreter missing, try next
45
+ process.exit(typeof result.code === "number" ? result.code : 1);
46
+ }
47
+ console.error(
48
+ "[foxclaw] Python 3.11+ not found. Install it, or set FOXCLAW_PYTHON to the interpreter path."
49
+ );
50
+ process.exit(127);
51
+ })();
package/index.js CHANGED
@@ -1,10 +1,4 @@
1
- /**
2
- * FoxClaw — 占位实现。
3
- *
4
- * 0.1.0 仅用于在 npm 上保留 `foxclaw` 包名,功能尚未实现。
5
- */
6
-
7
- export const name = "foxclaw";
8
- export const version = "0.1.0";
9
-
10
- export default { name, version };
1
+ export const name = "foxclaw";
2
+ export const version = "0.1.3";
3
+
4
+ export default { name, version };
package/package.json CHANGED
@@ -1,38 +1,46 @@
1
- {
2
- "name": "foxclaw",
3
- "version": "0.1.0",
4
- "description": "Personal AI agent - a fox living in your device",
5
- "keywords": [
6
- "agent",
7
- "ai",
8
- "assistant",
9
- "foxclaw"
10
- ],
11
- "license": "MIT",
12
- "author": "snowfox <142133502+snowfoxHQ@users.noreply.github.com>",
13
- "homepage": "https://github.com/snowfoxHQ/FoxClaw#readme",
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/snowfoxHQ/FoxClaw.git",
17
- "directory": "npm"
18
- },
19
- "bugs": {
20
- "url": "https://github.com/snowfoxHQ/FoxClaw/issues"
21
- },
22
- "type": "module",
23
- "main": "index.js",
24
- "exports": {
25
- ".": "./index.js"
26
- },
27
- "files": [
28
- "index.js",
29
- "README.md"
30
- ],
31
- "engines": {
32
- "node": ">=18"
33
- },
34
- "publishConfig": {
35
- "access": "public",
36
- "registry": "https://registry.npmjs.org/"
37
- }
38
- }
1
+ {
2
+ "name": "foxclaw",
3
+ "version": "0.1.3",
4
+ "description": "A personal agent with memory - a fox living in your device",
5
+ "keywords": [
6
+ "agent",
7
+ "ai",
8
+ "assistant",
9
+ "foxclaw"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "snowfox <142133502+snowfoxHQ@users.noreply.github.com>",
13
+ "homepage": "https://github.com/snowfoxHQ/FoxClaw#readme",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/snowfoxHQ/FoxClaw.git",
17
+ "directory": "npm"
18
+ },
19
+ "bugs": {
20
+ "url": "https://github.com/snowfoxHQ/FoxClaw/issues"
21
+ },
22
+ "type": "module",
23
+ "main": "index.js",
24
+ "exports": {
25
+ ".": "./index.js"
26
+ },
27
+ "bin": {
28
+ "foxclaw": "bin/foxclaw.cjs"
29
+ },
30
+ "files": [
31
+ "bin/",
32
+ "python/",
33
+ "index.js",
34
+ "README.md"
35
+ ],
36
+ "scripts": {
37
+ "prepublishOnly": "node build.cjs"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ }
46
+ }
@@ -0,0 +1,35 @@
1
+ # VCS
2
+ .git
3
+ .gitignore
4
+ .github
5
+
6
+ # 密钥与本地配置(绝不进镜像)
7
+ .env
8
+ .env.*
9
+ !.env.example
10
+
11
+ # Python 缓存与构建产物
12
+ __pycache__/
13
+ *.py[cod]
14
+ *.egg-info/
15
+ build/
16
+ dist/
17
+
18
+ # 工具缓存
19
+ .pytest_cache/
20
+ .ruff_cache/
21
+ .mypy_cache/
22
+ .coverage
23
+ .coverage.*
24
+ htmlcov/
25
+
26
+ # 回归失败产物
27
+ tests/_fail_*.txt
28
+
29
+ # 本地工具/IDE 缓存
30
+ .codebuddy/
31
+ .workbuddy/
32
+ .idea/
33
+ .vscode/
34
+ *.log
35
+ .DS_Store
@@ -0,0 +1,173 @@
1
+ # ============================================================
2
+ # Foxclaw 配置文件模板
3
+ # ============================================================
4
+ # 用法:
5
+ # 1. 复制本文件,改名为 .env(去掉 .example)
6
+ # 2. 在下面填入你自己的 Key(等号后面,不要加引号)
7
+ # 3. 启动:foxclaw serve(等价于 python -m uvicorn foxclaw.api:app --port 8000)
8
+ #
9
+ # 说明:
10
+ # - 所有 Key 都是可选的,不填则对应功能降级/禁用
11
+ # - .env 文件不会被分发(已在 .gitignore),你的 Key 是安全的
12
+ # - 至少配一个大模型 Key,系统才能真实工作(否则 stub 降级)
13
+ # - 改完跑一遍 `foxclaw config check`:会指出类型写错、拼错的键(比如多打一个 S
14
+ # 导致设置根本不生效)、以及互相矛盾的组合(如只配 KEY_ID 不配 SECRET)。
15
+ # 该命令只读,不会修改你的 .env。
16
+ # ============================================================
17
+
18
+ # ---------- 大模型(配任意一个即可,系统自动探测)----------
19
+ # DeepSeek(国内,性价比高,需 pip install openai)
20
+ DEEPSEEK_API_KEY=
21
+
22
+ # Claude
23
+ ANTHROPIC_API_KEY=
24
+
25
+ # OpenAI GPT(需 pip install openai)
26
+ OPENAI_API_KEY=
27
+
28
+ # Google Gemini(需 pip install google-generativeai)
29
+ GOOGLE_API_KEY=
30
+
31
+ # 通义千问(需 pip install openai)
32
+ DASHSCOPE_API_KEY=
33
+
34
+ # 本地模型 Ollama/vLLM(填 base_url,如 http://localhost:11434/v1)
35
+ LOCAL_LLM_BASE=
36
+
37
+ # 可选:强制指定模型名(不填则用各 provider 默认,如 deepseek-chat)
38
+ FOXCLAW_MODEL=
39
+
40
+ # ---------- 高德地图(行政 Agent 用,两个 Key 功能不同)----------
41
+ # Web服务 Key:后端查真实路线/地理编码/POI(在高德控制台选「Web服务」)
42
+ AMAP_MAPS_API_KEY=
43
+
44
+ # Web端(JS API)Key:前端画地图(在高德控制台选「Web端(JS API)」)
45
+ AMAP_JS_KEY=
46
+
47
+ # Web端安全密钥 jscode:2021 年后申请的 JSAPI Key 必须配,与上面 Key 配对
48
+ AMAP_JS_SCODE=
49
+
50
+ # ---------- 联网搜索(可选,让 Agent 能查实时信息)----------
51
+ # 百度 AI 搜索(千帆 ai_search,底层百度搜索 + ERNIE),国内稳定,每日 100 次免费额度。
52
+ # 在百度千帆 AppBuilder 控制台申请 API Key:https://qianfan.cloud.baidu.com
53
+ # 不配则 Agent 无法联网,问"最新版本/今日新闻"会如实说查不到(不编造)
54
+ BAIDU_SEARCH_KEY=
55
+ # 搜索用的模型(可选,默认 ernie-3.5-8k;想更强可填 ernie-4.5-turbo-32k)
56
+ BAIDU_SEARCH_MODEL=ernie-3.5-8k
57
+ # 搜索接入点(默认即此,一般不用改)
58
+ BAIDU_SEARCH_BASE=https://qianfan.baidubce.com/v2/ai_search
59
+
60
+ # ★ 系统唯一本地 embedding(HKC 检索 + HMR 记忆 + Harness 漂移 + Evidence 语义 全用这个)
61
+ # 解析优先级(vendor/hmr/storage/vector_store.py):
62
+ # EMBEDDING_MODEL > HKC_EMBEDDING_MODEL > FOXCLAW_EMBEDDING_MODEL > all-MiniLM-L6-v2
63
+ # 填本地目录(如 D:\models\bge-m3)可完全离线;填 HF 仓库名(如 BAAI/bge-m3)则用缓存。
64
+ # 换模型会让已落盘的向量维度不匹配,启动时告警并要求重建索引。
65
+ EMBEDDING_MODEL=
66
+
67
+ # ---------- HKC 知识库行为开关(2026-11)----------
68
+ # auto = 本地 SentenceTransformer 优先,不可用则退 stub
69
+ # local = 强制本地;stub = 不加载模型(检索退化为关键词);tei = 走远程服务(配 URL)
70
+ HKC_EMBEDDING=auto
71
+ # 仅 HKC_EMBEDDING=tei 时使用
72
+ HKC_EMBEDDING_URL=http://localhost:8080
73
+ # 只给 HKC 单独指定模型;留空则跟随 EMBEDDING_MODEL
74
+ HKC_EMBEDDING_MODEL=
75
+ # 知识库数据目录
76
+ HKC_DATA_DIR=./hkc_data
77
+ # 单文档最多切多少 chunk(默认安全值 800 段 ≈ 125 万字符)
78
+ # 0 或负数 = 不限制:上传上限 20MB ≈ 4400 段,一次误传会在后台连跑数小时并持续计费,
79
+ # 且截断后同文件重传会被去重拦截、只能拆分后补传 —— 除非确需整本摄入,否则别设 0。
80
+ HKC_MAX_CHUNKS_PER_DOC=800
81
+ # 抽取并发(默认 4)/ 每批条数(默认 1)
82
+ HKC_EXTRACT_CONCURRENCY=4
83
+ HKC_EXTRACT_BATCH=1
84
+ # 单次抽取 LLM 超时(秒)
85
+ HKC_LLM_TIMEOUT=60
86
+ # 累计向量数超过此值时索引自动升级 Flat → IVF(默认 10000;0=禁用)
87
+ HKC_VECTOR_IVF_THRESHOLD=10000
88
+ # embedding 计算线程数(默认 2)
89
+ HKC_EMB_TORCH_THREADS=2
90
+
91
+ # ---------- 记忆后端(2026-11)----------
92
+ # hmr(默认) | vecrecall。vecrecall 落盘在独立子目录,不与 hmr 混写;
93
+ # 切换不迁移旧数据,切回 hmr 时原数据仍在。
94
+ # 兼容 hestiaOS 旧变量名:FOXCLAW_ 为空时读 HESTIA_MEMORY_BACKEND。
95
+ FOXCLAW_MEMORY_BACKEND=hmr
96
+ # 1 = 每条记忆同步写 sha256 区块(哈希链,可审计防篡改)。仅 vecrecall 生效,
97
+ # 开启后存储量约翻倍。兼容 HESTIA_MEMORY_CHAIN。
98
+ FOXCLAW_MEMORY_CHAIN=0
99
+
100
+ # ---------- 运行参数(可选)----------
101
+ # 数据目录
102
+ FOXCLAW_DATA_DIR=./foxclaw_data
103
+ # `foxclaw skills install @owner/slug` 走的 ClawHub 地址。默认 https://clawhub.ai;
104
+ # 内网镜像或自建 registry 填这里。只在装技能时访问,平时不发任何请求。
105
+ FOXCLAW_CLAWHUB_REGISTRY=
106
+ # 导入白名单:/api/{finance,learning,itinerary}/import 的 csv_path 只允许数据目录内的文件。
107
+ # 要从别处导入(如下载目录),把目录填进来,逗号分隔。
108
+ FOXCLAW_IMPORT_ROOTS=
109
+
110
+ # Harness 影子校准轮数(越小越快进入拦截模式)
111
+ FOXCLAW_SHADOW_ROUNDS=20
112
+
113
+ # 新版本检查。默认关:foxclaw 本地优先,不该在你不说的情况下外呼。
114
+ # 设 1 后启动/首次打开界面时查一次 PyPI(pypi.org/pypi/foxclaw/json),24h 缓存,
115
+ # 有新版时顶栏版本号旁出现提示;只发这一个 GET,不带任何本机信息。
116
+ FOXCLAW_UPDATE_CHECK=0
117
+
118
+ # 不联网校验模型版本。模型已缓存但机器连不上 huggingface.co 时打开,可跳过
119
+ # 每次构造前 5 次重试的空等(约 20-40s);模型还没下载过时别开,否则无法自动下载。
120
+ # HF_HUB_OFFLINE=1
121
+
122
+ # MCP server:1=启动时同时暴露 MCP 端点,供外部 Agent 接入
123
+ FOXCLAW_MCP_SERVER=0
124
+
125
+ # 联网搜索 · 读取超时(秒)。深度搜索慢,默认 45;可调大避免超时
126
+ BAIDU_SEARCH_TIMEOUT=60
127
+ # 联网搜索 · 深度搜索开关:1=更全但慢(几十秒) / 0=普通搜索更快(~5-10秒)
128
+ # 只做快速信息检索填 0 即可
129
+ BAIDU_SEARCH_DEEP=0
130
+
131
+ # ---------- 上下文预算(2026-11 接入 Compactor)----------
132
+ # 单次 LLM 调用的上下文上限(估算 token)。超过则按「LLM 摘要 → 部分摘要 → 截断」
133
+ # 三级降级压缩,保留系统提示与最近 4 组消息。置 0 关闭压缩(退回按条数硬截)。
134
+ FOXCLAW_CONTEXT_MAX_TOKENS=6000
135
+
136
+ # ---------- 安全(2026-11 加固,建议按需启用)----------
137
+ # DNS rebinding 防护:Host 头为公网域名时拒绝本机数据面请求。自建域名/反代访问时
138
+ # 把域名填进来(逗号分隔,支持 *.example.com),否则会被 403。
139
+ FOXCLAW_ALLOWED_HOSTS=
140
+
141
+ # 浏览器导航默认拒绝 file://、javascript:、内网/回环地址(SSRF 防护)。
142
+ # 需要让 Agent 访问局域网设备(如 192.168.x.x 的路由器后台)时才置 1。
143
+ FOXCLAW_BROWSER_ALLOW_PRIVATE=0
144
+
145
+ # 渠道发送者白名单:只有列出的 sender_id 发来的消息才按「指令」执行,
146
+ # 其余一律包成 <untrusted> 数据块(可作答、不执行)。逗号分隔,支持
147
+ # `sender_id` / `channel:sender_id` / `channel:*`(该渠道下全部发送者)。
148
+ # 裸 `*` 不再自动生效,需同时设 FOXCLAW_CHANNEL_TRUST_ALL=1(等于放弃这层防护,不推荐)。
149
+ FOXCLAW_CHANNEL_TRUSTED_SENDERS=
150
+ # 显式开启「所有渠道所有发送者都可信」。仅在你完全清楚后果时设置。
151
+ FOXCLAW_CHANNEL_TRUST_ALL=
152
+
153
+ # 单个工具调用的硬超时(秒)。超时即跳过该步并回注「未完成」提示,防一个慢工具拖死整轮。
154
+ FOXCLAW_TOOL_TIMEOUT=45
155
+
156
+ # ---------- 出站渠道签名(2026-11 接入,可选)----------
157
+ # 与自建网关(OpenClaw 桥)共享的 HMAC 密钥。配置后出站请求带
158
+ # X-Foxclaw-Signature/Timestamp/Nonce(签名覆盖 timestamp+nonce+正文摘要),
159
+ # 网关侧用同一密钥验签即可确认「真伪 + 未被篡改 + 未重放」。
160
+ # 留空 = 不签(opt-in)。**一旦配置,签名失败就不发送**(fail-closed,不降级成明文)。
161
+ # 注意:Telegram/Discord/飞书/微信官方 API 不验我们的签名,这条只对「两端都自己控制」
162
+ # 的网关链路有意义,别指望它防官方渠道。
163
+ FOXCLAW_CHANNEL_SIGNING_SECRET=
164
+ # 密钥轮换时用于对账(随签名一起发送,不参与签名计算)。可留空。
165
+ FOXCLAW_CHANNEL_SIGNING_KEY_ID=
166
+
167
+ # ---------- 服务鉴权(2026-11 补齐)----------
168
+ # 设了它,/api/* /knowledge/* /config/* /stats 对「非本机」客户端要求 X-API-Key 头。
169
+ # 本机(127.0.0.1 / ::1)默认仍免密,见 FOXCLAW_LOOPBACK_BYPASS。
170
+ # 对外暴露(FOXCLAW_HOST=0.0.0.0)时必填,否则任何能连上端口的人都能读你的知识/记忆。
171
+ FOXCLAW_API_KEY=
172
+ # 设为 0 则本机也强制校验(前端目前不会自动带 key,打开后浏览器访问会 401)。
173
+ # FOXCLAW_LOOPBACK_BYPASS=1
@@ -0,0 +1,46 @@
1
+ # ============================================================
2
+ # 换行符与二进制处理 —— 跨平台协作必需
3
+ # ============================================================
4
+ # 背景:本仓库此前只有 core.autocrlf=true,没有 .gitattributes。后果是换行符由**每个
5
+ # 协作者的本地 git 配置**决定:Windows 上 checkout 会把 LF 变 CRLF,于是同一个人换台
6
+ # 机器、或不同人 clone,就会产出「整文件级」的假 diff,让 review 淹没在噪音里。
7
+ # 这里把规则钉进仓库,使行为不再依赖本地配置。
8
+ #
9
+ # 已跟踪文件现状:取样 200 个中 LF=183 / CRLF=5 / 混合=1 —— 主体是 LF,故以 LF 为准。
10
+ # 注意:本次**没有**执行 `git add --renormalize .`(那会一次改动数百文件、无法 review);
11
+ # 少数 CRLF 文件会在各自下次被编辑时自然归一。
12
+
13
+ # 默认:文本文件以 LF 入库、以 LF 检出
14
+ * text=auto eol=lf
15
+
16
+ # Windows 专属脚本必须 CRLF —— cmd.exe / PowerShell 对 LF 解析异常
17
+ *.bat text eol=crlf
18
+ *.cmd text eol=crlf
19
+ *.ps1 text eol=crlf
20
+
21
+ # 二进制:禁止换行符转换与文本 diff
22
+ *.png binary
23
+ *.jpg binary
24
+ *.jpeg binary
25
+ *.gif binary
26
+ *.ico binary
27
+ *.webp binary
28
+ *.pdf binary
29
+ *.zip binary
30
+ *.gz binary
31
+ *.7z binary
32
+ *.docx binary
33
+ *.xlsx binary
34
+ *.pptx binary
35
+ *.ttf binary
36
+ *.otf binary
37
+ *.woff binary
38
+ *.woff2 binary
39
+ *.so binary
40
+ *.pyd binary
41
+ *.dll binary
42
+ *.exe binary
43
+
44
+ # 说明:本项目依赖锁定在 pyproject.toml([project].dependencies),当前**无**锁文件
45
+ # (uv.lock / poetry.lock)。若日后引入,建议在此追加 `uv.lock -diff`,避免锁文件
46
+ # 把 diff 高亮占满。
@@ -0,0 +1,167 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, master ]
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ # 合并自占位包仓库的 ci.yml:只取权限最小化与手动触发两项,
10
+ # 其余(3.10/3.13/3.14 矩阵、ruff format 硬门)未并入——
11
+ # 本项目 requires-python>=3.11,且存量 240 个文件未过 ruff format,
12
+ # 直接加会当场红。格式门待单独一轮 format 后再开。
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ toolchain:
18
+ # S1:工程化安全网 —— ruff(硬门) + mypy(棘轮) + 体积(棘轮) + pytest 收集。
19
+ # ruff 只保留 F 系列死代码/真 bug 作为硬门,存量风格告警已在 pyproject 显式豁免;
20
+ # 覆盖 foxclaw/ 与 tests/(tests 于 2026-11 纳入:此前 13 条 F 系列全藏在这里)。
21
+ # mypy 自 2026-11 起改为棘轮门(tools/mypy_ratchet.py):存量 673 冻结,只许降不许升。
22
+ # 此前是 continue-on-error,数字从注释里的 425 一路涨到 673 也无人发现 ——
23
+ # 不阻塞的检查等于没有检查。
24
+ # 体积门(tools/size_check.py):单文件 <=15KB;现有 25 个超限文件冻结在白名单,
25
+ # 新增超限直接失败,拆小了会提示移出白名单。
26
+ # pytest 只做快速收集检查(S2 已把全部 76 个测试迁为 pytest,无顶层副作用),
27
+ # 真正的断言执行统一走下方 regression job 的 run_all.py(每文件独立子进程隔离单例)。
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ # 3.12 是发布/回归基线;3.14 覆盖「本地装了新版、CI 从未验证」的版本漂移。
32
+ python-version: ["3.12", "3.14"]
33
+ runs-on: ubuntu-latest
34
+ timeout-minutes: 15
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+
38
+ - name: Set up Python ${{ matrix.python-version }}
39
+ uses: actions/setup-python@v5
40
+ with:
41
+ python-version: ${{ matrix.python-version }}
42
+
43
+ - name: Install toolchain (pinned, py3.12)
44
+ if: matrix.python-version == '3.12'
45
+ # 基线版本按 requirements.txt 装:那是 uv 从 pyproject 解析出的完整闭包,
46
+ # 与本机 .venv 一致。dev extra 随后补装,pip 不会改写已满足的 pin。
47
+ run: |
48
+ python -m pip install --upgrade pip
49
+ pip install -r requirements.txt
50
+ pip install -e ".[dev]"
51
+
52
+ - name: Install toolchain (latest, py3.14)
53
+ if: matrix.python-version == '3.14'
54
+ # 3.14 腿刻意不读 requirements.txt:它的职责是发现「依赖在新解释器上解析/安装失败」,
55
+ # 跟着 pin 会把这个信号一起锁死。
56
+ run: |
57
+ python -m pip install --upgrade pip
58
+ pip install -e ".[dev]"
59
+
60
+ - name: Ruff (hard gate)
61
+ # tests/ 一并纳入:未用 import / 未定义名在测试里同样是死代码信号。
62
+ # 此前 tests/ 完全没有门禁,存量 13 条 F 系列(含 1 条 F811 重复 import)藏在
63
+ # 测试文件里无人发现 —— 只查 foxclaw/ 等于给测试留了盲区。
64
+ run: |
65
+ ruff check foxclaw/
66
+ ruff check tests/
67
+
68
+ - name: Mypy ratchet (no new type errors)
69
+ # 只在基线版本跑:基线数字按 3.12 校准,两版本并行会因 typeshed 差异抖动。
70
+ if: matrix.python-version == '3.12'
71
+ run: python tools/mypy_ratchet.py
72
+
73
+ - name: File size ratchet (<=15KB)
74
+ run: python tools/size_check.py
75
+
76
+ - name: Pytest collect check (all tests migrated)
77
+ run: python -m pytest --collect-only -q
78
+
79
+ - name: Release preflight (version sources)
80
+ # 版本号漏改一处会让发布物自相对不上,而发出去不能覆盖。这里只查"四处是否一致",
81
+ # 产物结构检查(需先 build)在 .github/workflows/release.yml 里。
82
+ if: matrix.python-version == '3.12'
83
+ run: python tools/release_check.py
84
+
85
+ regression:
86
+ runs-on: ubuntu-latest
87
+ timeout-minutes: 25
88
+ steps:
89
+ - uses: actions/checkout@v4
90
+
91
+ - name: Set up Python
92
+ uses: actions/setup-python@v5
93
+ with:
94
+ python-version: "3.12"
95
+
96
+ - name: Cache pip + HF models
97
+ uses: actions/cache@v4
98
+ with:
99
+ path: |
100
+ ~/.cache/pip
101
+ ~/.cache/huggingface
102
+ key: foxclaw-deps-${{ runner.os }}-py312-v1
103
+
104
+ - name: Install dependencies
105
+ run: |
106
+ python -m pip install --upgrade pip
107
+ # 单源:pyproject.toml 声明依赖,requirements.txt 是它解析出的锁定闭包(uv 生成)。
108
+ # 先装锁再装本体,回归跑的就是本机 .venv 同一套版本,而不是当天 PyPI 的最新版。
109
+ # HMR/HKC 是 vendor 内嵌、走 sys.path 加载,不是 PyPI 依赖(已在 pyproject 注明)。
110
+ # dev extra 提供 pytest + openpyxl/python-docx(默认回归 test_file_ingest/test_domain_import 硬依赖)。
111
+ pip install -r requirements.txt
112
+ pip install -e ".[dev]"
113
+
114
+ - name: Warm embedding cache
115
+ # 先联网下好默认 embedding,run_all 会以 HF_HUB_OFFLINE 离线读取(与本地一致)。
116
+ #
117
+ # 【纠正】原注释写「下载失败也不致命:Harness 会自动降级 n-gram 哈希嵌入,
118
+ # 回归仍绿」—— **这句是错的**,且很可能让 M2 缺陷长期潜伏。
119
+ # 实测(2026-10-05):哈希嵌入对中文几乎无区分度(同域相似度 -0.17、
120
+ # 跨域 +0.00,差异 <0.17)→ 语义漂移分恒为 1.0 → 所有正常请求一律 BLOCK,
121
+ # 6 项治理测试全红。降级**不是**安全兜底。
122
+ #
123
+ # 现在:预热失败即让 CI 失败(去掉 `|| true`),因为它直接决定治理能力可用性,
124
+ # 不该被静默吞掉。M2 修复后降级方向已改为 fail-open(停用语义维度、
125
+ # 保留 tool/scope 确定性判定),回归可绿,但**拦截能力是降级的**,
126
+ # 不可把降级当作正常路径。
127
+ run: python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('all-MiniLM-L6-v2')"
128
+
129
+ - name: Full regression (with coverage)
130
+ # run_all.py 内部注入 HF_HUB_OFFLINE / 强制 stub LLM / UTF-8,故 CI 无需 LLM key、
131
+ # 不联网调模型,确定性绿。coverage 用 parallel 模式测所有子进程,最后 combine 出基线数字。
132
+ run: |
133
+ coverage run tests/run_all.py
134
+ coverage combine
135
+ coverage report
136
+ coverage xml
137
+
138
+ audit:
139
+ # 依赖漏洞门。此前 SCA 只覆盖 Dockerfile 与前端 package.json,Python 侧完全空白 ——
140
+ # 实测全局环境 34 个包挂着 278 条已知漏洞(pyjwt 15、starlette 14、filelock 9…),
141
+ # 而同一份 pyproject 干净解析出来是 0 条,说明问题在"从不升级的运行环境"而非依赖声明。
142
+ #
143
+ # 审计 requirements.txt 而非运行环境:它是「实际会被装出来的东西」,结果可复现,
144
+ # 且不依赖扫描机的环境状态。此门红了怎么修:
145
+ # 1) 升级 pyproject 里对应依赖的下限/上限;
146
+ # 2) uv pip compile pyproject.toml --universal -o requirements.txt 重新生成并提交
147
+ # (--universal 必须带:否则 Windows 专属包会写成无条件依赖,本作业在 Linux 上装不动);
148
+ # 3) 确无可用修复版本时,在下面 --ignore-vuln 逐条登记 ID + 原因,不要整门关掉。
149
+ runs-on: ubuntu-latest
150
+ timeout-minutes: 10
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+
154
+ - name: Set up Python
155
+ uses: actions/setup-python@v5
156
+ with:
157
+ python-version: "3.12"
158
+
159
+ - name: Install pip-audit
160
+ run: |
161
+ python -m pip install --upgrade pip
162
+ pip install "pip-audit>=2.7"
163
+
164
+ - name: Audit pinned runtime dependencies
165
+ # --no-deps:requirements.txt 已是 uv 解析好的完整闭包(含全部传递依赖),
166
+ # 不需要 pip-audit 再解析一遍 —— 不加会静默跑几分钟且可能超时。
167
+ run: pip-audit -r requirements.txt --no-deps --progress-spinner off