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,123 @@
1
+ # Foxclaw Skill 实现 — AHS 标准的参考落地
2
+
3
+ > 本目录是 **Agent Harness Skills (AHS) v1.0 标准在 Foxclaw 中的具体实现**。
4
+ >
5
+ > - **公用标准**(`/agent-harness-skills/`):厂商无关的抽象规范,定义"应该怎样"。
6
+ > - **本实现**(本目录):把抽象规范**绑定到 Foxclaw 的真实模块**,定义"在 Foxclaw 里实际怎么做"。
7
+ >
8
+ > 两者是"规范 vs 参考实现"的关系。读标准看 `/agent-harness-skills/`,读落地看这里。
9
+
10
+ ---
11
+
12
+ ## 标准 → Foxclaw 实现 的映射
13
+
14
+ AHS 标准里的每个抽象概念,在 Foxclaw 里都有一个**真实模块**承接。这张表是本实现的核心:
15
+
16
+ | AHS 抽象概念 | Foxclaw 真实模块 | 文件 |
17
+ |-------------|----------------|------|
18
+ | agent / executor | 五个认知 Agent(主管/财务/行政/办公/助手) | `foxclaw/agents/agents.py` |
19
+ | skill-guard(守门·四阶段权限) | `permission.py::evaluate`(四阶段);V2 后经统一门 **PolicyGate** 归一 | `foxclaw/skills/permission.py` `foxclaw/kernel/policy_gate.py` |
20
+ | 认知护栏(标准之外) | Harness 三维漂移检测(语义/工具/范围) | `foxclaw/harness/harness.py` |
21
+ | skill-memory(记忆) | HMR v2.0 双层记忆适配器 | `foxclaw/core/memory_adapter.py` |
22
+ | 审计追踪 | ThoughtChain 思维链 + HookManager.audit_log(有界) | `foxclaw/core/thought_chain.py` `foxclaw/skills/lifecycle.py` |
23
+ | execution-contract(契约) | `SkillSpec` / `SkillResult` 数据结构 | `foxclaw/skills/__init__.py` |
24
+ | skill-router(路由) | **P1-2 统一 planner** 打分 + 主管分诊 + 管线内 `stage_route`(A) | `foxclaw/planning/planner.py` `foxclaw/skills/pipeline.py` `foxclaw/agents/agents.py` |
25
+ | planner(规划) | **P1-2 确定性拆解** `plan()` + 管线 `stage_plan`(A) | `foxclaw/planning/planner.py` `foxclaw/skills/pipeline.py` |
26
+ | skill-composition(编排) | skill 级 `compose`(+回滚补偿)+ Agent 级 Orchestration(P3 解耦) | `foxclaw/skills/pipeline.py` `foxclaw/orchestration/` |
27
+ | 断路器 / 循环检测 | `CircuitBreaker` + `ToolLoopDetector`(skill 层横切) | `foxclaw/skills/lifecycle.py` `foxclaw/harness/loop_detection.py` |
28
+ | 管线内工具调用(A 方案) | Agent 在认知管线内受 PolicyGate 治理地自主用工具 | `foxclaw/pipeline/cognitive_pipeline.py` `foxclaw/agents/base.py` |
29
+ | 领域 skill | 财务/学习/行程内核 | `foxclaw/finance/` `foxclaw/learning/` `foxclaw/itinerary/` |
30
+ | 模型调用 | 多模型路由(DeepSeek 等) | `foxclaw/core/model_router.py` |
31
+
32
+ ---
33
+
34
+ ## 六个 skill 在 Foxclaw 里的具体落地
35
+
36
+ ### 1. execution-contract → Foxclaw 的 SkillSpec/SkillResult
37
+
38
+ 标准定义了抽象的 SkillInput/SkillOutput。**Foxclaw 用 `foxclaw/skills/__init__.py` 里的
39
+ `SkillSpec` 和 `SkillResult` 落地**:
40
+ - `SkillResult` 字段:`skill_id/success/output/status/message/loop_warning`——**无 trace_node_id**;审计追踪由 ThoughtChain(Agent `_think` 写节点)+ HookManager.audit_log 独立承担,不塞进结果结构
41
+ - `trust_level` → **`SkillSpec.trust_level()` 单一真源**(`permission.evaluate` 直接调用它)按 kind(local/mcp/web_api)推断,SkillAdapter 据此对 mcp 结果降级(原 `permission.TRUST_LEVEL` 双真源 dict 已删,见 V3·P6)
42
+ - 输入校验 → `permission.evaluate` **Stage1** 对 `SkillSpec.params` 执行(经 `invoke → PolicyGate.check_action → evaluate`)
43
+
44
+ > 差异:标准是 schema 描述;Foxclaw 是可运行的 Python dataclass + 真实校验代码。
45
+
46
+ ### 2. skill-router → 主管 Agent 的分诊
47
+
48
+ 标准定义了三步打分算法。**P1-2 后:该算法(否定过滤 0.8×触发命中 + 0.2×描述匹配)统一在 `foxclaw/planning/planner.py::trigger_route`,主管分派 / `skills/pipeline.py::route` / 管线 `stage_route` 都复用**:
49
+ - 否定词检测 → 统一原语 `planner.is_negated`;主管另有 `_is_meta` 判元问题
50
+ - 主管路由 `SupervisorAgent._route()` 基于 `ROUTING_KEYWORDS`,选定后 `subagents[target].run_task()` 分派
51
+ - **A 方案**:管线内 `stage_route` 用同一 `route` 选主 **skill** 写 `ctx.route`(opt-in,默认关)
52
+
53
+ > 差异:标准是"选一个 skill_id";Foxclaw 有两条落地——① 主管把任务分派给**真实 Agent 实例**;② 管线内直接选 **skill**。共用 `planning.planner` 打分引擎。
54
+
55
+ ### 3. planner → 主管 Agent 的任务分解
56
+
57
+ 标准定义了结构化执行计划。**P1-2 后:任务拆分由确定性统一 planner 承担**:
58
+ - `skills/pipeline.py::plan` 用 `planning/planner.py` 的 `split_on`/`PARALLEL_TRIGGERS`/`SPLIT_MARKERS` 把任务拆成 Plan/PlanTask(并行/顺序 + 依赖),不再纯靠 LLM 猜结构
59
+ - 管线 `stage_plan` 把任务结构写入 `ctx.plan`(informational)
60
+ - 每子任务经 `route` 映射到 skill / 领域 Agent;assumptions/risks 写入 ThoughtChain 节点
61
+
62
+ > 差异:标准是 JSON 计划模板;Foxclaw 是**确定性 P1-2 拆结构** + 需要生成性内容时另调真实 LLM + 写入真实思维链。
63
+
64
+ ### 4. skill-composition → 主管编排 + Orchestration 引擎
65
+
66
+ 标准定义了串行/并行/混合编排。**Foxclaw 有两层落地**:
67
+ - **skill 级**:`skills/pipeline.py::compose` 按计划串行执行各 skill,关键路径失败 → 逆序回滚有副作用步骤(`_rollback` compensate/需人工)
68
+ - **Agent 级**:`foxclaw/orchestration/` 跨 Agent 路由(`/api/orchestration/request` → `route_request`,P3 已解耦通用)+ 态势聚合(`/api/orchestration/situation`)
69
+ - 断路器 → **`CircuitBreaker`(`skills/lifecycle.py`,skill 层构件,非 Harness)**
70
+
71
+ > 差异:标准是编排协议;Foxclaw 是 skill 级 compose(带回滚补偿)+ Agent 级真实消息路由/态势引擎。
72
+
73
+ ### 5. skill-guard → Foxclaw 的 Harness(这是最核心的落地)⭐
74
+
75
+ 标准定义了四阶段权限管线。**四阶段全部实现在 `foxclaw/skills/permission.py::evaluate`**(不是 harness.py——harness 是下面另一回事的三维漂移检测)。V2 后经统一门 `PolicyGate.check_action` 调用:
76
+
77
+ | 标准的四阶段 | Foxclaw 的实现(全在 `permission.py::evaluate`) |
78
+ |-------------|--------------|
79
+ | Stage1 validate | 校验 `SkillSpec.params` 必填项 |
80
+ | Stage2 deny>ask>allow | `PermissionRules` 规则匹配(deny 铁律不可覆盖) |
81
+ | Stage3 capability | `side_effect`/`destructive`/`external`/readonly,Fail-closed |
82
+ | Stage4 confirm | 有副作用/external/ask 规则且未确认 → 需确认 |
83
+
84
+ > **V2 统一门(①Step4)**:动作权限(上表)与推理漂移(下方 Harness)归一到 `foxclaw/kernel/policy_gate.py` 的一套 `Verdict` + 统一 `policy.decision.*` 审计事件,底层仍是同一次 evaluate/check,行为逐字不变。
85
+ > **V2 管线内 dispatch(A 方案)**:Agent 在认知管线内自主用工具时,`stage_act` 同样经此四阶段——只读自动、有副作用挂起 `needs_confirmation`(dispatch 前拦截 ⇒ 零副作用)。
86
+
87
+ **Foxclaw 独有的增强(标准之外的护城河)——注意:这是 Harness,与上面的四阶段权限是两回事:**
88
+ - **三维漂移检测**(语义/工具/范围)→ 这是标准没有的"认知护栏",防 Agent 跑偏
89
+ - **Shadow 校准模式** → 新 Agent 前 N 轮只观测不拦截,自动校准阈值
90
+ - **调度层豁免**(`block_on_semantic` + `IS_ROUTER`)→ 主管豁免语义拦截
91
+ - **Policy 自学习** → 重复漂移模式自动沉淀为规则
92
+
93
+ > 差异:标准 guard 只管"工具权限";Foxclaw Harness = 工具权限 + **认知漂移检测**(Foxclaw 原创)。
94
+ > 这正是 Foxclaw 作为"认知型 Agent OS"区别于工具型 Agent 的核心价值。
95
+
96
+ ### 6. skill-memory → HMR 双层记忆
97
+
98
+ 标准定义了后端无关的记忆协议。**Foxclaw 用 HMR(`memory_adapter.py`)落地**:
99
+ - 召回 → `_recall_memory(task)` 真实调 HMR 向量检索
100
+ - 注入 → 召回结果写入 Agent 的 messages 上下文
101
+ - 提取持久化 → 办公 Agent 的 `_store_memory` 真实写入 HMR
102
+ - private/shared 双层 → Foxclaw HMR 的真实双层架构(by_agent 分布)
103
+ - embedding → 真实的 TF-IDF 降级 / sentence-transformers / OpenAI embedding
104
+
105
+ > 差异:标准是"后端无关协议";Foxclaw 是绑定 HMR v2.0 的真实记忆引擎,带衰减和双层。
106
+
107
+ ---
108
+
109
+ ## 一句话总结
110
+
111
+ > **公用版 AHS 定义"Agent Harness 的 skill 层应该长什么样"(抽象规范);
112
+ > Foxclaw 版把它落到"用 HMR 做记忆、用 Harness 三维漂移做守门、用三 Agent(主管/财务/办公学习)做路由编排、
113
+ > 用 ThoughtChain 做审计"的真实实现上。**
114
+ >
115
+ > Foxclaw 实现不仅满足标准,还在 guard 维度**超出标准**(增加了认知漂移检测这一护城河)。
116
+
117
+ ---
118
+
119
+ ## 对照阅读
120
+
121
+ - 想了解**标准本身** → 读 `/agent-harness-skills/README_CN.md`
122
+ - 想了解**Foxclaw 怎么实现标准** → 读本文件
123
+ - 想看**实现代码** → 见上方映射表里的真实模块文件
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: execution-contract
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/execution-contract
5
+ description: Foxclaw 实现版契约。把 AHS 标准的 IO 结构落地到 SkillSpec/SkillResult 数据结构。
6
+ bound_modules:
7
+ - foxclaw/skills/__init__.py (SkillSpec / SkillResult / SkillAdapter)
8
+ - foxclaw/skills/permission.py (输入校验 Stage1)
9
+ side_effect: read
10
+ trust_level: high
11
+ ---
12
+
13
+ # Execution Contract(Foxclaw 实现版)
14
+
15
+ > AHS 标准 `execution-contract` 在 Foxclaw 的落地。标准定义 IO schema,本文件定义 Foxclaw 的真实数据结构。
16
+
17
+ ## 标准 → Foxclaw 真实落地
18
+
19
+ | AHS 标准 | Foxclaw 实现 | 代码位置 |
20
+ |---------|------------|---------|
21
+ | SkillInput | `SkillAdapter.invoke` 的入参 | `skills/__init__.py` |
22
+ | SkillOutput | `SkillResult` dataclass(字段:`skill_id/success/output/status/message/loop_warning`) | `skills/__init__.py: SkillResult` |
23
+ | 审计追踪 | **不在 SkillResult 里**——由 ThoughtChain(Agent `_think` 写节点)+ SkillAdapter 的 `HookManager.audit_log`(有界)双重承担 | `core/thought_chain.py`、`skills/lifecycle.py` |
24
+ | trust_level | **`SkillSpec.trust_level()` 单一真源**(`permission.evaluate` 直接调用)按 kind(local/web_api/mcp)推断,`SkillAdapter` 据此对 mcp 结果降级(原 `permission.TRUST_LEVEL` 已删,见 V3·P6) | `skills/__init__.py`、`skills/permission.py` |
25
+ | 输入校验 | `permission.evaluate` **Stage1** 校验 `SkillSpec.params`(经 `invoke → PolicyGate.check_action → evaluate`) | `skills/permission.py: evaluate` |
26
+
27
+ ## 关键差异
28
+
29
+ > 标准是 schema 描述;Foxclaw 是可运行的 Python dataclass + 真实校验代码。
30
+ > 注:`SkillResult` **无 `trace_node_id` 字段**——审计追踪独立由 ThoughtChain + HookManager 承担,不塞进结果结构。
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: general-assistant
3
+ version: "1.0-foxclaw"
4
+ builtin: true
5
+ side_effect: read
6
+ description: 通用助理技能。信息整理、汇总、跨域转述、沟通措辞、待办跟进。原是独立的"助手 Agent",现下放为指令技能,由主管/办公在任何 Agent 命中"整理/汇总/沟通"类任务时自动注入。
7
+ triggers: [整理, 汇总, 汇总一下, 纪要, 邮件, 协助, 沟通, 联系, 转达, 待办, 跟进, 汇报]
8
+ ---
9
+
10
+ # General Assistant(通用助理)
11
+
12
+ > 原 `AssistantAgent` 下放而成。它不再是一个常驻 Agent —— 谁来干这件事,取决于任务流向哪个
13
+ > Agent(主管统筹、办公学习、财务),技能只负责"怎么干"。
14
+
15
+ ## 什么时候用
16
+
17
+ - 用户给了一堆散乱材料(多封邮件、多个文件、几段对话),要一个结论或一份纪要;
18
+ - 要把某个领域的产出转述给别的场景(财务结论 → 给同事的说明;学习笔记 → 汇报材料);
19
+ - 需要一段得体的对外措辞(邮件、消息、回复),而不是继续深挖领域内容;
20
+ - 需要把已经聊过的事收成待办清单并跟进。
21
+
22
+ ## 做法
23
+
24
+ 1. **先分清事实与结论**:事实必须有出处(用户原话、文件、工具返回);结论要能指出它由哪几条事实推出。
25
+ 2. **一段一段收敛**:材料 → 要点(每条一行) → 归并同类 → 排序(重要/紧急) → 成稿。
26
+ 3. **跨域转述保真**:引用数字时带单位和口径(含不含税、哪个时间段),不四舍五入到失真。
27
+ 4. **措辞**默认简洁、无套话;对外的邮件给主题行 + 正文,不给"注意事项"说教。
28
+ 5. 收尾给一个**可执行**的下一步(谁、做什么、何时),没有就明说"无需跟进"。
29
+
30
+ ## 硬边界
31
+
32
+ - 材料里没有的事不补;补了要标「推测」。
33
+ - 不把"我建议"写成"已经安排"——没有执行凭据就不声称已完成。
34
+ - 涉及付款、发送、删除等有副作用的动作,交回主管走确认流程,不要在本技能里直接做。
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: planner
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/planner
5
+ description: Foxclaw 实现版规划。把 AHS 标准的任务分解落地到主管 Agent 的 plan 逻辑。
6
+ bound_modules:
7
+ - foxclaw/planning/planner.py (★ P1-2 统一拆分原语:split_on / PARALLEL_TRIGGERS / SPLIT_MARKERS)
8
+ - foxclaw/skills/pipeline.py (plan:确定性拆解为 Plan/PlanTask)
9
+ - foxclaw/pipeline/cognitive_pipeline.py (stage_plan:管线内结构规划)
10
+ - foxclaw/agents/agents.py (SupervisorAgent._plan_task / run_task)
11
+ side_effect: read
12
+ trust_level: high
13
+ ---
14
+
15
+ # Planner(Foxclaw 实现版)
16
+
17
+ > AHS 标准 `planner` 在 Foxclaw 的落地。标准定义计划结构,本文件定义 Foxclaw 用主管真实 LLM 生成。
18
+
19
+ ## 标准 → Foxclaw 真实落地
20
+
21
+ > ⚠️ **P1-2 后:任务拆分(并行/顺序连接词、`split_on`)由确定性统一 planner 承担**——`skills/pipeline.py::plan` 与管线 `stage_plan` 都用 `foxclaw/planning/planner.py` 的 `PARALLEL_TRIGGERS`/`SPLIT_MARKERS`,不再纯靠 LLM 猜结构。
22
+
23
+ | AHS 标准 | Foxclaw 实现 | 代码位置 |
24
+ |---------|------------|---------|
25
+ | 出执行计划(拆结构) | `plan(task)` 确定性拆成 Plan/PlanTask(并行/顺序 + 依赖) | `skills/pipeline.py: plan` |
26
+ | 拆分原语 | `split_on` + 并行/顺序连接词表 | `planning/planner.py` |
27
+ | 子任务→执行者 | 每子任务经 `route` 映射到 skill / 领域 Agent | `skills/pipeline.py: route`、`agents.py: _route` |
28
+ | 管线内结构化 | `stage_plan` 把任务结构写入 `ctx.plan`(informational) | `pipeline/cognitive_pipeline.py: stage_plan` |
29
+ | assumptions/risks | 写入 Agent 的 ThoughtChain 节点 | `core/thought_chain.py` |
30
+
31
+ ## 关键差异
32
+
33
+ > 标准是 JSON 计划模板;Foxclaw 是**确定性 P1-2 planner 拆结构**(可并行/顺序 + 依赖)+ 主管对需要生成性内容时另调真实 LLM + 写入真实 ThoughtChain。
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: schedule-itinerary
3
+ version: "1.0-foxclaw"
4
+ builtin: true
5
+ side_effect: read
6
+ description: 日程行程技能。排期、会议、出差、路线与冲突检查、差旅预算协商。原是独立的"行政 Agent",现下放为指令技能,由办公学习 Agent 在命中日程类任务时注入;行程内核(ItineraryRuntime)仍由代码提供真实路线与冲突数据。
7
+ triggers: [日程, 行程, 会议, 出差, 预约, 日历, 路线, 提醒, 排期, 时间冲突, 几点]
8
+ ---
9
+
10
+ # Schedule & Itinerary(日程行程)
11
+
12
+ > 原 `AdminAgent` 下放而成。**能力分两层**:真实路线/冲突由 `ItineraryRuntime` 算(代码),
13
+ > 本技能只规定"怎么排、怎么问、怎么不硬闯"。
14
+
15
+ ## 什么时候用
16
+
17
+ - 用户要给一段时间内的安排(今天/本周/出差几天)定顺序;
18
+ - 要判断"这个会议塞不塞得进去",或两个安排是否撞车;
19
+ - 出差需要路线、耗时、可达性判断;
20
+ - 差旅预算被财务拒了,需要降标准重报。
21
+
22
+ ## 做法
23
+
24
+ 1. **先取约束,再排**:硬约束(截止时间、必须到场、交通耗时)优先于软偏好(上午效率高)。
25
+ 2. **冲突必须查,不许假设**:已有行程与待排时间相差 1 小时内即视为可能冲突,标出来让用户定。
26
+ 3. **给方案而不是给日程表**:最多 2 个方案,各自代价(早起的代价、多花的时间)写清楚。
27
+ 4. **预算协商一轮一降、有下限**:每轮降到上一轮的 75%,不低于原始申请的 60%;到下限就认输
28
+ 交人决定,不贴着红线反复试探。
29
+ 5. 输出用时间轴(时间 → 事项 → 地点/通勤),不要散文。
30
+
31
+ ## 硬边界
32
+
33
+ - 内核没挂载/没有路点时,明说"按估算排",不要把估算讲成实际路线。
34
+ - 不替用户对外承诺时间;排完是"建议",发出邀请属副作用动作,交回主管确认。
35
+ - 查不到(地图/接口失败)就说查不到,不猜通勤时长。
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: skill-composition
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/skill-composition
5
+ description: Foxclaw 实现版编排。把 AHS 标准的多 skill 协作落地到主管编排 + Orchestration 引擎。
6
+ bound_modules:
7
+ - foxclaw/skills/pipeline.py (★ compose:多 skill 串行执行 + 逆序回滚补偿)
8
+ - foxclaw/skills/lifecycle.py (CircuitBreaker 断路器)
9
+ - foxclaw/orchestration/ (跨 Agent 编排:route_request / gather_situation)
10
+ - foxclaw/agents/agents.py (SupervisorAgent)
11
+ side_effect: read
12
+ trust_level: high
13
+ ---
14
+
15
+ # Skill Composition(Foxclaw 实现版)
16
+
17
+ > AHS 标准 `skill-composition` 在 Foxclaw 的落地。标准定义编排协议,本文件定义 Foxclaw 用真实编排引擎。
18
+
19
+ ## 标准 → Foxclaw 真实落地
20
+
21
+ | AHS 标准 | Foxclaw 实现 | 代码位置 |
22
+ |---------|------------|---------|
23
+ | 多 skill 编排 | `compose(plan)` 按计划串行执行各 skill | `skills/pipeline.py: compose` |
24
+ | 失败回滚 | 关键路径失败 → 逆序回滚有副作用步骤(compensate/需人工) | `skills/pipeline.py: _rollback` |
25
+ | 跨 Agent 协作 | `/api/orchestration/request` → `Orchestrator.route_request`(P3 已解耦、通用) | `api.py:571`、`orchestration/` |
26
+ | 全局态势 | `/api/orchestration/situation` → `gather_situation` | `api.py:554`、`orchestration/` |
27
+ | 断路器 | `CircuitBreaker`(三态机,每 skill 独立) | `skills/lifecycle.py: CircuitBreaker` |
28
+
29
+ ## 关键差异
30
+
31
+ > 标准是编排协议;Foxclaw 有两层:**skill 级** `compose`(多 skill + 回滚补偿,`skills/pipeline.py`)+ **Agent 级** orchestration(跨 Agent 路由/态势,P3 已去领域硬编码)。断路器是 **skill 层**构件(`lifecycle.py`),不属 Harness。
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: skill-guard
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/skill-guard
5
+ description: Foxclaw 实现版守门 skill。四阶段权限管线落地在 permission.py;Foxclaw 另有 Harness 三维漂移检测(标准之外的认知护城河);V2 后两者经统一门 PolicyGate 归一。
6
+ bound_modules:
7
+ - foxclaw/skills/permission.py (★ 四阶段权限管线 evaluate)
8
+ - foxclaw/kernel/policy_gate.py (★ V2 统一门:权限 + 漂移归一)
9
+ - foxclaw/harness/harness.py (三维漂移检测,认知护栏)
10
+ - foxclaw/skills/__init__.py (SkillAdapter.invoke 调 check_action)
11
+ - foxclaw/agents/base.py (_think → _reasoning_result → check_reasoning)
12
+ side_effect: read
13
+ trust_level: high
14
+ ---
15
+
16
+ # Skill Guard(Foxclaw 实现版)
17
+
18
+ > 本文件是 AHS 标准 `skill-guard` 在 Foxclaw 的具体实现说明。
19
+ > 标准定义"应该怎样守门",本文件定义"Foxclaw 用哪些真实模块守门"。
20
+
21
+ ## 标准四阶段 → Foxclaw 真实落地
22
+
23
+ > ⚠️ 四阶段**全部实现在 `foxclaw/skills/permission.py::evaluate`**(不是 harness.py——harness 做的是下面另一回事的三维漂移检测)。`SkillAdapter.invoke` 经统一门 `PolicyGate.check_action` 调用 evaluate。
24
+
25
+ | AHS 标准阶段 | Foxclaw 实现 | 代码位置 |
26
+ |-------------|------------|---------|
27
+ | Stage1 validate | 校验 `SkillSpec.params` 必填项 | `skills/permission.py: evaluate`(Stage1) |
28
+ | Stage2 deny>ask>allow | `PermissionRules` 规则匹配(deny 铁律不可覆盖) | `skills/permission.py: evaluate`(Stage2) |
29
+ | Stage3 capability | `side_effect` + `destructive` + `external` + readonly 模式,Fail-closed | `skills/permission.py: evaluate`(Stage3) |
30
+ | Stage4 confirm | 有副作用/external/ask 规则且未确认 → 需确认 | `skills/permission.py: evaluate`(Stage4) |
31
+
32
+ **V2 统一门(①Step4)**:动作权限(上表,`check_action`)与推理漂移(下节 Harness,`check_reasoning`)现归一到 `foxclaw/kernel/policy_gate.py` 的一套 `Verdict`;非 allow 发统一 `policy.decision.*` 审计事件。底层仍是同一次 evaluate/check,行为逐字不变。
33
+
34
+ **V2 管线内 dispatch(A 方案)**:Agent 在认知管线内自主用工具时,`stage_act` 同样经 `SkillAdapter→PolicyGate.check_action` 走本四阶段——**只读自动、有副作用挂起 needs_confirmation(权限门在 dispatch 前拦截⇒零副作用)**,与直呼工具面同一治理。见 `foxclaw/pipeline/cognitive_pipeline.py`。
35
+
36
+ ## Foxclaw 超出标准的部分(护城河)⭐
37
+
38
+ 标准的 guard 只管"工具权限"。Foxclaw 的 Harness 在此之上**增加了认知护栏**,这是 Foxclaw
39
+ 作为认知型 Agent OS 的核心差异:
40
+
41
+ ### 1. 三维漂移检测(标准没有)
42
+ `harness.check(node)` 对每个 ThoughtChain 推理节点计算:
43
+ ```
44
+ delta = 0.5·语义漂移 + 0.3·工具漂移 + 0.2·范围漂移
45
+ ```
46
+ - 语义漂移:推理内容与 Agent 职责基准的距离(防"财务 Agent 去写诗")
47
+ - 工具漂移:是否超出 ALLOWED_TOOL_CATEGORIES
48
+ - 范围漂移:是否超出任务初始范围
49
+
50
+ 判定:`< warn` PASS / `warn~block` WARN / `≥ block` BLOCK(抛 HarnessBlockedError)。
51
+
52
+ ### 2. Shadow 校准模式(标准没有)
53
+ 新 Agent 前 `FOXCLAW_SHADOW_ROUNDS` 轮只观测不拦截,收集真实漂移分布自动校准阈值,
54
+ 避免阈值拍脑袋导致误杀。
55
+
56
+ ### 3. 调度层豁免(对应标准的 mode,但 Foxclaw 特化)
57
+ - `IS_ROUTER=True` 的主管 Agent → `block_on_semantic=False`
58
+ - 主管收到任意输入豁免语义拦截(接收一切是其本职),但工具/范围越权仍拦
59
+ - 领域 Agent 保留完整三维拦截
60
+
61
+ ### 4. Policy 自学习(标准没有)
62
+ 重复出现的漂移模式自动沉淀为 Policy 规则,Policy 版本递增。
63
+
64
+ ## 与标准的关系
65
+
66
+ > Foxclaw 的 guard = AHS 标准的工具权限管线 + Foxclaw 原创的认知漂移检测。
67
+ > 满足标准的同时,在认知维度超出标准。
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: skill-memory
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/skill-memory
5
+ description: Foxclaw 实现版记忆 skill。把 AHS 标准的后端无关记忆协议落地到 HMR v2.0 双层记忆引擎。
6
+ bound_modules:
7
+ - foxclaw/core/memory_adapter.py (HMR 适配器)
8
+ - foxclaw/agents/base.py (_recall_memory / _store_memory)
9
+ side_effect: read
10
+ trust_level: high
11
+ ---
12
+
13
+ # Skill Memory(Foxclaw 实现版)
14
+
15
+ > 本文件是 AHS 标准 `skill-memory` 在 Foxclaw 的具体实现说明。
16
+ > 标准定义"后端无关的记忆协议",本文件定义"Foxclaw 用 HMR 怎么实现"。
17
+
18
+ ## 标准三操作 → Foxclaw 真实落地
19
+
20
+ | AHS 标准操作 | Foxclaw 实现 | 代码位置 |
21
+ |-------------|------------|---------|
22
+ | recall 召回 | `_recall_memory(task)` 调 HMR 向量检索 | `agents/base.py` |
23
+ | inject 注入 | 召回结果写入 Agent messages 上下文 | `agents/base.py` |
24
+ | extract 提取 | `_store_memory()` 写入 HMR | `agents/agents.py: OfficeAgent` |
25
+
26
+ ## Foxclaw 的真实记忆引擎(HMR v2.0)
27
+
28
+ 标准说"后端无关",Foxclaw 绑定的真实后端是 **HMR(Hierarchical Memory Runtime)**:
29
+
30
+ ### 双层架构(对应标准的 private/shared)
31
+ - **私有层**:每个 Agent 只能召回自己的记忆(by_agent 分布)
32
+ - **共享层**:标记 shared 的记忆所有 Agent 可召回(如主管的全局决策)
33
+ - 真实统计:`/api/memory/stats` 返回 private/shared/by_agent/relations
34
+
35
+ ### Embedding(对应标准的相关性计算)
36
+ Foxclaw 实际用三档(自动探测):
37
+ - OpenAI Embedding(配了 openai key)
38
+ - Sentence-Transformers(装了 800MB 包)
39
+ - TF-IDF n-gram(降级默认,无需额外依赖)
40
+
41
+ ### 知识图谱(标准未强制,Foxclaw 增强)
42
+ HMR 维护记忆间的关系图(relations),办公 Agent 入库时自动抽取知识关系。
43
+
44
+ ### 衰减(对应标准的 decay_management)
45
+ HMR 按时间 + 引用频率管理记忆生命周期。
46
+
47
+ ## 与标准的关系
48
+
49
+ > 标准是抽象协议(任何向量库/KV 都能实现);
50
+ > Foxclaw 是绑定 HMR v2.0 的真实引擎,带双层、知识图谱、三档 embedding。
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: skill-router
3
+ version: "1.0-foxclaw"
4
+ implements: agent-harness-skills/skill-router
5
+ description: Foxclaw 实现版路由。把 AHS 标准的任务→skill 匹配落地到主管 Agent 的分诊逻辑。
6
+ bound_modules:
7
+ - foxclaw/planning/planner.py (★ P1-2 统一路由原语:is_negated / trigger_route / keyword_hits)
8
+ - foxclaw/skills/pipeline.py (route:在 skill 候选上打分)
9
+ - foxclaw/pipeline/cognitive_pipeline.py (stage_route:A 方案管线内选 skill)
10
+ - foxclaw/agents/agents.py (SupervisorAgent._route / _is_meta:分派到子 Agent)
11
+ side_effect: read
12
+ trust_level: high
13
+ ---
14
+
15
+ # Skill Router(Foxclaw 实现版)
16
+
17
+ > AHS 标准 `skill-router` 在 Foxclaw 的落地。标准定义匹配算法,本文件定义 Foxclaw 用主管 Agent 实现。
18
+
19
+ ## 标准 → Foxclaw 真实落地
20
+
21
+ > ⚠️ **P1-2 后:路由/规划的三步打分原语(否定过滤 0.8×触发命中 + 0.2×描述匹配、`is_negated`、`split_on`)统一收敛到 `foxclaw/planning/planner.py` 单一真源**;主管分派、`skills/pipeline.py::route`、管线内 `stage_route` 都复用它,不再各写一套。
22
+
23
+ | AHS 标准 | Foxclaw 实现 | 代码位置 |
24
+ |---------|------------|---------|
25
+ | 三步打分 / 选主 | `trigger_route(task, candidates)` 统一引擎 | `planning/planner.py: trigger_route` |
26
+ | 否定词检测 | `is_negated`(统一原语);主管另有 `_is_meta` 判元问题 | `planning/planner.py`、`agents.py: _is_meta` |
27
+ | 触发词匹配 | 候选的 triggers 命中(skill 侧)/ `ROUTING_KEYWORDS`(Agent 侧) | `planning/planner.py`、`agents.py` |
28
+ | 选 skill(A 方案) | 管线内 `stage_route` 用 `skills.pipeline.route` 选主 skill 写 `ctx.route` | `pipeline/cognitive_pipeline.py: stage_route` |
29
+ | 兜底 fallback | 无法归类 → 主管自答(助手/行政已下放为 `general-assistant` / `schedule-itinerary` 技能) | `pipeline/supervisor_stages.py: sv_route / sv_dispatch` |
30
+ | 实际分派 | 主管 `subagents[target].run_task()` | `agents.py: SupervisorAgent.run_task` |
31
+
32
+ ## 关键差异
33
+
34
+ > 标准是"选一个 skill_id";Foxclaw 有**两条落地**:① 主管把任务分派给一个**真实 Agent 实例**(agents.py);② A 方案下管线内 `stage_route` 直接选 **skill**(opt-in,默认关)。两者共用 `planning.planner` 打分引擎。
35
+ > 元问题(你是谁/能联网吗)由主管自答,跳过分派——Foxclaw 特有。
@@ -0,0 +1,54 @@
1
+ """pytest 共享配置:sys.path 注入 + 环境隔离(等价于 run_all.py 的 env 注入)。
2
+
3
+ 关键点:env 必须在**模块级**设置(而非 fixture)。因为 pytest 收集阶段就会 import
4
+ 每个测试文件,若 env 晚于 import 设置,测试文件顶层的 `Foxclaw(...)` /
5
+ `TestClient(app)` 会读到未隔离的环境(真实 Key 打外部 API、读真实数据目录等)。
6
+ conftest.py 由 pytest 在收集前加载,故模块级赋值能保证先于任何测试文件 import 生效。
7
+ """
8
+ import os
9
+ import sys
10
+ import tempfile
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+
15
+ _REPO_ROOT = Path(__file__).parent.parent
16
+ if str(_REPO_ROOT) not in sys.path:
17
+ sys.path.insert(0, str(_REPO_ROOT))
18
+
19
+ _VENDOR_HKC = _REPO_ROOT / "vendor" / "hkc"
20
+ if _VENDOR_HKC.exists() and str(_VENDOR_HKC) not in sys.path:
21
+ sys.path.insert(0, str(_VENDOR_HKC))
22
+
23
+ if sys.platform == "win32":
24
+ import _pytest.pathlib as _ppl
25
+
26
+ def _skip_force_symlink(root, target, link_to):
27
+ return None
28
+
29
+ _ppl._force_symlink = _skip_force_symlink
30
+
31
+ os.environ["FOXCLAW_SKIP_DOTENV"] = "1"
32
+ os.environ["FOXCLAW_SHADOW_ROUNDS"] = "50"
33
+ os.environ["HF_HUB_OFFLINE"] = "1"
34
+ os.environ["TRANSFORMERS_OFFLINE"] = "1"
35
+ os.environ["HKC_EMBEDDING"] = "stub"
36
+ os.environ["FOXCLAW_MCP_SERVER"] = "0"
37
+ os.environ["FOXCLAW_PROVIDER"] = ""
38
+ os.environ["FOXCLAW_MODEL"] = ""
39
+ for _k in ("DEEPSEEK_API_KEY", "ANTHROPIC_API_KEY", "OPENAI_API_KEY",
40
+ "GOOGLE_API_KEY", "DASHSCOPE_API_KEY", "FOXCLAW_API_KEY"):
41
+ os.environ[_k] = ""
42
+
43
+ os.environ.setdefault("FOXCLAW_DATA_DIR", tempfile.mkdtemp(prefix="foxclaw_test_"))
44
+
45
+
46
+ @pytest.fixture
47
+ def test_dir(tmp_path) -> str:
48
+ """字符串路径的临时目录,替代脚本式测试里的 tempfile.mkdtemp。
49
+
50
+ 注意不能直接用 pytest 内置 `tmpdir`(旧式 py.path.local,在 Windows + Python 3.14
51
+ 下会触发 WinError 448),故返回 str(tmp_path) 供 `Path()` / `tempfile.mkdtemp(dir=...)`
52
+ 等接受字符串的调用点使用。
53
+ """
54
+ return str(tmp_path)