@baimingtao/lbs-agent 1.0.0

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 (1114) hide show
  1. package/AGENTS.md +54 -0
  2. package/README.md +181 -0
  3. package/SOUL.md +31 -0
  4. package/application/__init__.py +1 -0
  5. package/application/container.py +376 -0
  6. package/application/contracts/__init__.py +5 -0
  7. package/application/contracts/result.py +84 -0
  8. package/application/onboarding.py +243 -0
  9. package/application/runtime_factory.py +198 -0
  10. package/application/runtime_paths.py +61 -0
  11. package/application/services/__init__.py +1 -0
  12. package/application/services/agent_service.py +159 -0
  13. package/application/services/cron_service.py +49 -0
  14. package/application/services/gateway_service.py +156 -0
  15. package/application/services/interactive_service.py +275 -0
  16. package/application/services/mcp_service.py +102 -0
  17. package/application/services/model_service.py +519 -0
  18. package/application/services/orchestration_service.py +169 -0
  19. package/application/services/session_service.py +130 -0
  20. package/application/services/skill_service.py +369 -0
  21. package/application/services/tool_service.py +165 -0
  22. package/bin/lbs.js +109 -0
  23. package/config/__init__.py +2 -0
  24. package/config/config.py +453 -0
  25. package/config/config_contract.py +198 -0
  26. package/config/mcp.yaml +30 -0
  27. package/config/state_root.py +28 -0
  28. package/extensions/mcps/optional/linear/manifest.yaml +38 -0
  29. package/extensions/mcps/optional/n8n/manifest.yaml +77 -0
  30. package/extensions/mcps/optional/unreal-engine/manifest.yaml +54 -0
  31. package/extensions/prompts/agents/audit.md +46 -0
  32. package/extensions/prompts/agents/auditor.md +71 -0
  33. package/extensions/prompts/agents/browser_worker.md +56 -0
  34. package/extensions/prompts/agents/chat.md +23 -0
  35. package/extensions/prompts/agents/code.md +52 -0
  36. package/extensions/prompts/agents/data_analyst.md +39 -0
  37. package/extensions/prompts/agents/document.md +19 -0
  38. package/extensions/prompts/agents/email_agent.md +30 -0
  39. package/extensions/prompts/agents/github_agent.md +33 -0
  40. package/extensions/prompts/agents/planner.md +40 -0
  41. package/extensions/prompts/agents/research.md +50 -0
  42. package/extensions/prompts/agents/security.md +28 -0
  43. package/extensions/prompts/agents/verifier.md +28 -0
  44. package/extensions/prompts/agents/vision.md +27 -0
  45. package/extensions/skills/builtin/autonomous-ai-agents/DESCRIPTION.md +3 -0
  46. package/extensions/skills/builtin/autonomous-ai-agents/claude-code/SKILL.md +669 -0
  47. package/extensions/skills/builtin/autonomous-ai-agents/codex/SKILL.md +138 -0
  48. package/extensions/skills/builtin/autonomous-ai-agents/hermes-agent/SKILL.md +728 -0
  49. package/extensions/skills/builtin/autonomous-ai-agents/hermes-agent/references/native-mcp.md +344 -0
  50. package/extensions/skills/builtin/autonomous-ai-agents/hermes-agent/references/webhooks.md +193 -0
  51. package/extensions/skills/builtin/autonomous-ai-agents/opencode/SKILL.md +219 -0
  52. package/extensions/skills/builtin/browser-use/SKILL.md +152 -0
  53. package/extensions/skills/builtin/computer-use/SKILL.md +242 -0
  54. package/extensions/skills/builtin/creative/DESCRIPTION.md +3 -0
  55. package/extensions/skills/builtin/creative/architecture-diagram/SKILL.md +148 -0
  56. package/extensions/skills/builtin/creative/architecture-diagram/templates/template.html +319 -0
  57. package/extensions/skills/builtin/creative/ascii-art/SKILL.md +322 -0
  58. package/extensions/skills/builtin/creative/ascii-video/README.md +290 -0
  59. package/extensions/skills/builtin/creative/ascii-video/SKILL.md +241 -0
  60. package/extensions/skills/builtin/creative/ascii-video/references/architecture.md +568 -0
  61. package/extensions/skills/builtin/creative/ascii-video/references/composition.md +662 -0
  62. package/extensions/skills/builtin/creative/ascii-video/references/effects.md +640 -0
  63. package/extensions/skills/builtin/creative/ascii-video/references/inputs.md +685 -0
  64. package/extensions/skills/builtin/creative/ascii-video/references/optimization.md +688 -0
  65. package/extensions/skills/builtin/creative/ascii-video/references/scenes.md +741 -0
  66. package/extensions/skills/builtin/creative/ascii-video/references/shaders.md +683 -0
  67. package/extensions/skills/builtin/creative/ascii-video/references/troubleshooting.md +367 -0
  68. package/extensions/skills/builtin/creative/baoyu-infographic/PORT_NOTES.md +43 -0
  69. package/extensions/skills/builtin/creative/baoyu-infographic/SKILL.md +237 -0
  70. package/extensions/skills/builtin/creative/baoyu-infographic/references/analysis-framework.md +182 -0
  71. package/extensions/skills/builtin/creative/baoyu-infographic/references/base-prompt.md +43 -0
  72. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/bento-grid.md +41 -0
  73. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/binary-comparison.md +48 -0
  74. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/bridge.md +41 -0
  75. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/circular-flow.md +41 -0
  76. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/comic-strip.md +41 -0
  77. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
  78. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/dashboard.md +41 -0
  79. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/dense-modules.md +72 -0
  80. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/funnel.md +41 -0
  81. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
  82. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/hub-spoke.md +41 -0
  83. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/iceberg.md +41 -0
  84. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/isometric-map.md +41 -0
  85. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/jigsaw.md +41 -0
  86. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/linear-progression.md +48 -0
  87. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/periodic-table.md +41 -0
  88. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/story-mountain.md +41 -0
  89. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
  90. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/tree-branching.md +41 -0
  91. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/venn-diagram.md +41 -0
  92. package/extensions/skills/builtin/creative/baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
  93. package/extensions/skills/builtin/creative/baoyu-infographic/references/structured-content-template.md +244 -0
  94. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/aged-academia.md +36 -0
  95. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/bold-graphic.md +36 -0
  96. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/chalkboard.md +61 -0
  97. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/claymation.md +29 -0
  98. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/corporate-memphis.md +29 -0
  99. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/craft-handmade.md +44 -0
  100. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
  101. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
  102. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/ikea-manual.md +29 -0
  103. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/kawaii.md +29 -0
  104. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/knolling.md +29 -0
  105. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/lego-brick.md +29 -0
  106. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/morandi-journal.md +60 -0
  107. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/origami.md +29 -0
  108. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/pixel-art.md +29 -0
  109. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/pop-laboratory.md +48 -0
  110. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
  111. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
  112. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/subway-map.md +29 -0
  113. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/technical-schematic.md +36 -0
  114. package/extensions/skills/builtin/creative/baoyu-infographic/references/styles/ui-wireframe.md +29 -0
  115. package/extensions/skills/builtin/creative/claude-design/SKILL.md +591 -0
  116. package/extensions/skills/builtin/creative/comfyui/SKILL.md +609 -0
  117. package/extensions/skills/builtin/creative/comfyui/references/official-cli.md +252 -0
  118. package/extensions/skills/builtin/creative/comfyui/references/rest-api.md +297 -0
  119. package/extensions/skills/builtin/creative/comfyui/references/template-integrity.md +227 -0
  120. package/extensions/skills/builtin/creative/comfyui/references/workflow-format.md +205 -0
  121. package/extensions/skills/builtin/creative/comfyui/scripts/_common.py +835 -0
  122. package/extensions/skills/builtin/creative/comfyui/scripts/auto_fix_deps.py +225 -0
  123. package/extensions/skills/builtin/creative/comfyui/scripts/check_deps.py +437 -0
  124. package/extensions/skills/builtin/creative/comfyui/scripts/comfyui_setup.sh +286 -0
  125. package/extensions/skills/builtin/creative/comfyui/scripts/extract_schema.py +315 -0
  126. package/extensions/skills/builtin/creative/comfyui/scripts/fetch_logs.py +157 -0
  127. package/extensions/skills/builtin/creative/comfyui/scripts/hardware_check.py +497 -0
  128. package/extensions/skills/builtin/creative/comfyui/scripts/health_check.py +223 -0
  129. package/extensions/skills/builtin/creative/comfyui/scripts/run_batch.py +243 -0
  130. package/extensions/skills/builtin/creative/comfyui/scripts/run_workflow.py +796 -0
  131. package/extensions/skills/builtin/creative/comfyui/scripts/ws_monitor.py +267 -0
  132. package/extensions/skills/builtin/creative/comfyui/tests/README.md +44 -0
  133. package/extensions/skills/builtin/creative/comfyui/tests/conftest.py +64 -0
  134. package/extensions/skills/builtin/creative/comfyui/tests/pytest.ini +5 -0
  135. package/extensions/skills/builtin/creative/comfyui/tests/test_check_deps.py +68 -0
  136. package/extensions/skills/builtin/creative/comfyui/tests/test_cloud_integration.py +95 -0
  137. package/extensions/skills/builtin/creative/comfyui/tests/test_common.py +443 -0
  138. package/extensions/skills/builtin/creative/comfyui/tests/test_extract_schema.py +184 -0
  139. package/extensions/skills/builtin/creative/comfyui/tests/test_run_workflow.py +210 -0
  140. package/extensions/skills/builtin/creative/comfyui/workflows/README.md +86 -0
  141. package/extensions/skills/builtin/creative/comfyui/workflows/animatediff_video.json +64 -0
  142. package/extensions/skills/builtin/creative/comfyui/workflows/flux_dev_txt2img.json +78 -0
  143. package/extensions/skills/builtin/creative/comfyui/workflows/sd15_txt2img.json +49 -0
  144. package/extensions/skills/builtin/creative/comfyui/workflows/sdxl_img2img.json +54 -0
  145. package/extensions/skills/builtin/creative/comfyui/workflows/sdxl_inpaint.json +59 -0
  146. package/extensions/skills/builtin/creative/comfyui/workflows/sdxl_txt2img.json +49 -0
  147. package/extensions/skills/builtin/creative/comfyui/workflows/upscale_4x.json +27 -0
  148. package/extensions/skills/builtin/creative/comfyui/workflows/wan_video_t2v.json +69 -0
  149. package/extensions/skills/builtin/creative/design-md/SKILL.md +171 -0
  150. package/extensions/skills/builtin/creative/design-md/templates/starter.md +92 -0
  151. package/extensions/skills/builtin/creative/excalidraw/SKILL.md +195 -0
  152. package/extensions/skills/builtin/creative/excalidraw/references/colors.md +44 -0
  153. package/extensions/skills/builtin/creative/excalidraw/references/dark-mode.md +67 -0
  154. package/extensions/skills/builtin/creative/excalidraw/references/examples.md +140 -0
  155. package/extensions/skills/builtin/creative/excalidraw/scripts/upload.py +133 -0
  156. package/extensions/skills/builtin/creative/humanizer/LICENSE +21 -0
  157. package/extensions/skills/builtin/creative/humanizer/SKILL.md +578 -0
  158. package/extensions/skills/builtin/creative/manim-video/README.md +23 -0
  159. package/extensions/skills/builtin/creative/manim-video/SKILL.md +269 -0
  160. package/extensions/skills/builtin/creative/manim-video/references/animation-design-thinking.md +161 -0
  161. package/extensions/skills/builtin/creative/manim-video/references/animations.md +282 -0
  162. package/extensions/skills/builtin/creative/manim-video/references/camera-and-3d.md +135 -0
  163. package/extensions/skills/builtin/creative/manim-video/references/decorations.md +202 -0
  164. package/extensions/skills/builtin/creative/manim-video/references/equations.md +216 -0
  165. package/extensions/skills/builtin/creative/manim-video/references/graphs-and-data.md +163 -0
  166. package/extensions/skills/builtin/creative/manim-video/references/mobjects.md +333 -0
  167. package/extensions/skills/builtin/creative/manim-video/references/paper-explainer.md +255 -0
  168. package/extensions/skills/builtin/creative/manim-video/references/production-quality.md +190 -0
  169. package/extensions/skills/builtin/creative/manim-video/references/rendering.md +185 -0
  170. package/extensions/skills/builtin/creative/manim-video/references/scene-planning.md +118 -0
  171. package/extensions/skills/builtin/creative/manim-video/references/troubleshooting.md +135 -0
  172. package/extensions/skills/builtin/creative/manim-video/references/updaters-and-trackers.md +260 -0
  173. package/extensions/skills/builtin/creative/manim-video/references/visual-design.md +124 -0
  174. package/extensions/skills/builtin/creative/manim-video/scripts/setup.sh +14 -0
  175. package/extensions/skills/builtin/creative/p5js/README.md +64 -0
  176. package/extensions/skills/builtin/creative/p5js/SKILL.md +555 -0
  177. package/extensions/skills/builtin/creative/p5js/references/animation.md +439 -0
  178. package/extensions/skills/builtin/creative/p5js/references/color-systems.md +352 -0
  179. package/extensions/skills/builtin/creative/p5js/references/core-api.md +410 -0
  180. package/extensions/skills/builtin/creative/p5js/references/export-pipeline.md +566 -0
  181. package/extensions/skills/builtin/creative/p5js/references/interaction.md +398 -0
  182. package/extensions/skills/builtin/creative/p5js/references/shapes-and-geometry.md +300 -0
  183. package/extensions/skills/builtin/creative/p5js/references/troubleshooting.md +532 -0
  184. package/extensions/skills/builtin/creative/p5js/references/typography.md +302 -0
  185. package/extensions/skills/builtin/creative/p5js/references/visual-effects.md +895 -0
  186. package/extensions/skills/builtin/creative/p5js/references/webgl-and-3d.md +423 -0
  187. package/extensions/skills/builtin/creative/p5js/scripts/export-frames.js +179 -0
  188. package/extensions/skills/builtin/creative/p5js/scripts/render.sh +108 -0
  189. package/extensions/skills/builtin/creative/p5js/scripts/serve.sh +28 -0
  190. package/extensions/skills/builtin/creative/p5js/scripts/setup.sh +87 -0
  191. package/extensions/skills/builtin/creative/p5js/templates/viewer.html +395 -0
  192. package/extensions/skills/builtin/creative/popular-web-designs/SKILL.md +202 -0
  193. package/extensions/skills/builtin/creative/popular-web-designs/templates/airbnb.md +259 -0
  194. package/extensions/skills/builtin/creative/popular-web-designs/templates/airtable.md +102 -0
  195. package/extensions/skills/builtin/creative/popular-web-designs/templates/apple.md +326 -0
  196. package/extensions/skills/builtin/creative/popular-web-designs/templates/bmw.md +193 -0
  197. package/extensions/skills/builtin/creative/popular-web-designs/templates/cal.md +272 -0
  198. package/extensions/skills/builtin/creative/popular-web-designs/templates/claude.md +325 -0
  199. package/extensions/skills/builtin/creative/popular-web-designs/templates/clay.md +317 -0
  200. package/extensions/skills/builtin/creative/popular-web-designs/templates/clickhouse.md +294 -0
  201. package/extensions/skills/builtin/creative/popular-web-designs/templates/cohere.md +279 -0
  202. package/extensions/skills/builtin/creative/popular-web-designs/templates/coinbase.md +142 -0
  203. package/extensions/skills/builtin/creative/popular-web-designs/templates/composio.md +320 -0
  204. package/extensions/skills/builtin/creative/popular-web-designs/templates/cursor.md +322 -0
  205. package/extensions/skills/builtin/creative/popular-web-designs/templates/elevenlabs.md +278 -0
  206. package/extensions/skills/builtin/creative/popular-web-designs/templates/expo.md +294 -0
  207. package/extensions/skills/builtin/creative/popular-web-designs/templates/figma.md +233 -0
  208. package/extensions/skills/builtin/creative/popular-web-designs/templates/framer.md +259 -0
  209. package/extensions/skills/builtin/creative/popular-web-designs/templates/hashicorp.md +291 -0
  210. package/extensions/skills/builtin/creative/popular-web-designs/templates/ibm.md +345 -0
  211. package/extensions/skills/builtin/creative/popular-web-designs/templates/intercom.md +159 -0
  212. package/extensions/skills/builtin/creative/popular-web-designs/templates/kraken.md +138 -0
  213. package/extensions/skills/builtin/creative/popular-web-designs/templates/linear.app.md +380 -0
  214. package/extensions/skills/builtin/creative/popular-web-designs/templates/lovable.md +311 -0
  215. package/extensions/skills/builtin/creative/popular-web-designs/templates/minimax.md +270 -0
  216. package/extensions/skills/builtin/creative/popular-web-designs/templates/mintlify.md +339 -0
  217. package/extensions/skills/builtin/creative/popular-web-designs/templates/miro.md +121 -0
  218. package/extensions/skills/builtin/creative/popular-web-designs/templates/mistral.ai.md +274 -0
  219. package/extensions/skills/builtin/creative/popular-web-designs/templates/mongodb.md +279 -0
  220. package/extensions/skills/builtin/creative/popular-web-designs/templates/notion.md +322 -0
  221. package/extensions/skills/builtin/creative/popular-web-designs/templates/nvidia.md +306 -0
  222. package/extensions/skills/builtin/creative/popular-web-designs/templates/ollama.md +280 -0
  223. package/extensions/skills/builtin/creative/popular-web-designs/templates/opencode.ai.md +294 -0
  224. package/extensions/skills/builtin/creative/popular-web-designs/templates/pinterest.md +243 -0
  225. package/extensions/skills/builtin/creative/popular-web-designs/templates/posthog.md +269 -0
  226. package/extensions/skills/builtin/creative/popular-web-designs/templates/raycast.md +281 -0
  227. package/extensions/skills/builtin/creative/popular-web-designs/templates/replicate.md +274 -0
  228. package/extensions/skills/builtin/creative/popular-web-designs/templates/resend.md +316 -0
  229. package/extensions/skills/builtin/creative/popular-web-designs/templates/revolut.md +198 -0
  230. package/extensions/skills/builtin/creative/popular-web-designs/templates/runwayml.md +257 -0
  231. package/extensions/skills/builtin/creative/popular-web-designs/templates/sanity.md +370 -0
  232. package/extensions/skills/builtin/creative/popular-web-designs/templates/sentry.md +275 -0
  233. package/extensions/skills/builtin/creative/popular-web-designs/templates/spacex.md +207 -0
  234. package/extensions/skills/builtin/creative/popular-web-designs/templates/spotify.md +259 -0
  235. package/extensions/skills/builtin/creative/popular-web-designs/templates/stripe.md +335 -0
  236. package/extensions/skills/builtin/creative/popular-web-designs/templates/supabase.md +268 -0
  237. package/extensions/skills/builtin/creative/popular-web-designs/templates/superhuman.md +265 -0
  238. package/extensions/skills/builtin/creative/popular-web-designs/templates/together.ai.md +276 -0
  239. package/extensions/skills/builtin/creative/popular-web-designs/templates/uber.md +308 -0
  240. package/extensions/skills/builtin/creative/popular-web-designs/templates/vercel.md +323 -0
  241. package/extensions/skills/builtin/creative/popular-web-designs/templates/voltagent.md +336 -0
  242. package/extensions/skills/builtin/creative/popular-web-designs/templates/warp.md +265 -0
  243. package/extensions/skills/builtin/creative/popular-web-designs/templates/webflow.md +105 -0
  244. package/extensions/skills/builtin/creative/popular-web-designs/templates/wise.md +186 -0
  245. package/extensions/skills/builtin/creative/popular-web-designs/templates/x.ai.md +270 -0
  246. package/extensions/skills/builtin/creative/popular-web-designs/templates/zapier.md +341 -0
  247. package/extensions/skills/builtin/creative/pretext/SKILL.md +220 -0
  248. package/extensions/skills/builtin/creative/pretext/references/patterns.md +258 -0
  249. package/extensions/skills/builtin/creative/pretext/templates/donut-orbit.html +1468 -0
  250. package/extensions/skills/builtin/creative/pretext/templates/hello-orb-flow.html +95 -0
  251. package/extensions/skills/builtin/creative/sketch/SKILL.md +218 -0
  252. package/extensions/skills/builtin/creative/songwriting-and-ai-music/SKILL.md +273 -0
  253. package/extensions/skills/builtin/creative/touchdesigner-mcp/SKILL.md +356 -0
  254. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/3d-scene.md +275 -0
  255. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/animation.md +221 -0
  256. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/audio-reactive.md +175 -0
  257. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/dat-scripting.md +352 -0
  258. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/external-data.md +322 -0
  259. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/geometry-comp.md +121 -0
  260. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/glsl.md +151 -0
  261. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/layout-compositor.md +131 -0
  262. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/mcp-tools.md +382 -0
  263. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/midi-osc.md +210 -0
  264. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/network-patterns.md +767 -0
  265. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/operator-tips.md +106 -0
  266. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/operators.md +239 -0
  267. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/panel-ui.md +281 -0
  268. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/particles.md +245 -0
  269. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/pitfalls.md +568 -0
  270. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/postfx.md +183 -0
  271. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/projection-mapping.md +211 -0
  272. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/python-api.md +463 -0
  273. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/replicator.md +197 -0
  274. package/extensions/skills/builtin/creative/touchdesigner-mcp/references/troubleshooting.md +244 -0
  275. package/extensions/skills/builtin/creative/touchdesigner-mcp/scripts/setup.sh +115 -0
  276. package/extensions/skills/builtin/data-science/DESCRIPTION.md +3 -0
  277. package/extensions/skills/builtin/data-science/jupyter-live-kernel/SKILL.md +152 -0
  278. package/extensions/skills/builtin/dogfood/SKILL.md +162 -0
  279. package/extensions/skills/builtin/dogfood/references/issue-taxonomy.md +109 -0
  280. package/extensions/skills/builtin/dogfood/templates/dogfood-report-template.md +86 -0
  281. package/extensions/skills/builtin/email/DESCRIPTION.md +3 -0
  282. package/extensions/skills/builtin/email/himalaya/SKILL.md +302 -0
  283. package/extensions/skills/builtin/email/himalaya/references/configuration.md +216 -0
  284. package/extensions/skills/builtin/email/himalaya/references/message-composition.md +199 -0
  285. package/extensions/skills/builtin/github/DESCRIPTION.md +3 -0
  286. package/extensions/skills/builtin/github/codebase-inspection/SKILL.md +116 -0
  287. package/extensions/skills/builtin/github/github-auth/SKILL.md +247 -0
  288. package/extensions/skills/builtin/github/github-auth/scripts/gh-env.sh +66 -0
  289. package/extensions/skills/builtin/github/github-code-review/SKILL.md +481 -0
  290. package/extensions/skills/builtin/github/github-code-review/references/review-output-template.md +74 -0
  291. package/extensions/skills/builtin/github/github-issues/SKILL.md +370 -0
  292. package/extensions/skills/builtin/github/github-issues/templates/bug-report.md +35 -0
  293. package/extensions/skills/builtin/github/github-issues/templates/feature-request.md +31 -0
  294. package/extensions/skills/builtin/github/github-pr-workflow/SKILL.md +367 -0
  295. package/extensions/skills/builtin/github/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  296. package/extensions/skills/builtin/github/github-pr-workflow/references/conventional-commits.md +71 -0
  297. package/extensions/skills/builtin/github/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  298. package/extensions/skills/builtin/github/github-pr-workflow/templates/pr-body-feature.md +33 -0
  299. package/extensions/skills/builtin/github/github-repo-management/SKILL.md +516 -0
  300. package/extensions/skills/builtin/github/github-repo-management/references/github-api-cheatsheet.md +161 -0
  301. package/extensions/skills/builtin/index-cache/anthropics_skills_skills_.json +1 -0
  302. package/extensions/skills/builtin/index-cache/claude_marketplace_anthropics_skills.json +1 -0
  303. package/extensions/skills/builtin/index-cache/lobehub_index.json +1 -0
  304. package/extensions/skills/builtin/index-cache/openai_skills_skills_.json +1 -0
  305. package/extensions/skills/builtin/media/DESCRIPTION.md +3 -0
  306. package/extensions/skills/builtin/media/gif-search/SKILL.md +91 -0
  307. package/extensions/skills/builtin/media/heartmula/SKILL.md +171 -0
  308. package/extensions/skills/builtin/media/songsee/SKILL.md +83 -0
  309. package/extensions/skills/builtin/media/youtube-content/SKILL.md +75 -0
  310. package/extensions/skills/builtin/media/youtube-content/references/output-formats.md +56 -0
  311. package/extensions/skills/builtin/media/youtube-content/scripts/fetch_transcript.py +124 -0
  312. package/extensions/skills/builtin/mlops/DESCRIPTION.md +3 -0
  313. package/extensions/skills/builtin/mlops/evaluation/DESCRIPTION.md +3 -0
  314. package/extensions/skills/builtin/mlops/evaluation/lm-evaluation-harness/SKILL.md +495 -0
  315. package/extensions/skills/builtin/mlops/evaluation/lm-evaluation-harness/references/api-evaluation.md +490 -0
  316. package/extensions/skills/builtin/mlops/evaluation/lm-evaluation-harness/references/benchmark-guide.md +488 -0
  317. package/extensions/skills/builtin/mlops/evaluation/lm-evaluation-harness/references/custom-tasks.md +602 -0
  318. package/extensions/skills/builtin/mlops/evaluation/lm-evaluation-harness/references/distributed-eval.md +519 -0
  319. package/extensions/skills/builtin/mlops/evaluation/weights-and-biases/SKILL.md +592 -0
  320. package/extensions/skills/builtin/mlops/evaluation/weights-and-biases/references/artifacts.md +584 -0
  321. package/extensions/skills/builtin/mlops/evaluation/weights-and-biases/references/integrations.md +700 -0
  322. package/extensions/skills/builtin/mlops/evaluation/weights-and-biases/references/sweeps.md +846 -0
  323. package/extensions/skills/builtin/mlops/huggingface-hub/SKILL.md +81 -0
  324. package/extensions/skills/builtin/mlops/inference/DESCRIPTION.md +3 -0
  325. package/extensions/skills/builtin/mlops/inference/llama-cpp/SKILL.md +249 -0
  326. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/advanced-usage.md +504 -0
  327. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/hub-discovery.md +168 -0
  328. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/optimization.md +89 -0
  329. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/quantization.md +243 -0
  330. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/server.md +150 -0
  331. package/extensions/skills/builtin/mlops/inference/llama-cpp/references/troubleshooting.md +442 -0
  332. package/extensions/skills/builtin/mlops/inference/vllm/SKILL.md +369 -0
  333. package/extensions/skills/builtin/mlops/inference/vllm/references/optimization.md +226 -0
  334. package/extensions/skills/builtin/mlops/inference/vllm/references/quantization.md +284 -0
  335. package/extensions/skills/builtin/mlops/inference/vllm/references/server-deployment.md +255 -0
  336. package/extensions/skills/builtin/mlops/inference/vllm/references/troubleshooting.md +448 -0
  337. package/extensions/skills/builtin/mlops/models/DESCRIPTION.md +3 -0
  338. package/extensions/skills/builtin/mlops/models/audiocraft/SKILL.md +568 -0
  339. package/extensions/skills/builtin/mlops/models/audiocraft/references/advanced-usage.md +666 -0
  340. package/extensions/skills/builtin/mlops/models/audiocraft/references/troubleshooting.md +504 -0
  341. package/extensions/skills/builtin/mlops/models/segment-anything/SKILL.md +506 -0
  342. package/extensions/skills/builtin/mlops/models/segment-anything/references/advanced-usage.md +589 -0
  343. package/extensions/skills/builtin/mlops/models/segment-anything/references/troubleshooting.md +484 -0
  344. package/extensions/skills/builtin/note-taking/DESCRIPTION.md +3 -0
  345. package/extensions/skills/builtin/note-taking/obsidian/SKILL.md +61 -0
  346. package/extensions/skills/builtin/productivity/DESCRIPTION.md +3 -0
  347. package/extensions/skills/builtin/productivity/airtable/SKILL.md +229 -0
  348. package/extensions/skills/builtin/productivity/google-workspace/SKILL.md +314 -0
  349. package/extensions/skills/builtin/productivity/google-workspace/references/gmail-search-syntax.md +63 -0
  350. package/extensions/skills/builtin/productivity/google-workspace/scripts/_hermes_home.py +42 -0
  351. package/extensions/skills/builtin/productivity/google-workspace/scripts/google_api.py +1225 -0
  352. package/extensions/skills/builtin/productivity/google-workspace/scripts/gws_bridge.py +111 -0
  353. package/extensions/skills/builtin/productivity/google-workspace/scripts/setup.py +481 -0
  354. package/extensions/skills/builtin/productivity/maps/SKILL.md +182 -0
  355. package/extensions/skills/builtin/productivity/maps/scripts/maps_client.py +1297 -0
  356. package/extensions/skills/builtin/productivity/nano-pdf/SKILL.md +52 -0
  357. package/extensions/skills/builtin/productivity/notion/SKILL.md +448 -0
  358. package/extensions/skills/builtin/productivity/notion/references/block-types.md +112 -0
  359. package/extensions/skills/builtin/productivity/ocr-and-documents/DESCRIPTION.md +3 -0
  360. package/extensions/skills/builtin/productivity/ocr-and-documents/SKILL.md +172 -0
  361. package/extensions/skills/builtin/productivity/ocr-and-documents/scripts/extract_marker.py +87 -0
  362. package/extensions/skills/builtin/productivity/ocr-and-documents/scripts/extract_pymupdf.py +98 -0
  363. package/extensions/skills/builtin/productivity/petdex/SKILL.md +76 -0
  364. package/extensions/skills/builtin/productivity/powerpoint/LICENSE.txt +30 -0
  365. package/extensions/skills/builtin/productivity/powerpoint/SKILL.md +237 -0
  366. package/extensions/skills/builtin/productivity/powerpoint/editing.md +205 -0
  367. package/extensions/skills/builtin/productivity/powerpoint/pptxgenjs.md +420 -0
  368. package/extensions/skills/builtin/productivity/powerpoint/scripts/__init__.py +0 -0
  369. package/extensions/skills/builtin/productivity/powerpoint/scripts/add_slide.py +195 -0
  370. package/extensions/skills/builtin/productivity/powerpoint/scripts/clean.py +286 -0
  371. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/helpers/__init__.py +0 -0
  372. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/helpers/merge_runs.py +199 -0
  373. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/helpers/simplify_redlines.py +197 -0
  374. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/pack.py +159 -0
  375. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  376. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  377. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  378. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  379. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  380. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  381. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  382. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  383. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  384. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  385. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  386. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  387. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  388. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  389. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  390. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  391. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  392. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  393. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  394. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  395. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  396. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  397. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  398. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  399. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  400. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  401. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  402. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-contentTypes.xsd +42 -0
  403. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-coreProperties.xsd +50 -0
  404. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-digSig.xsd +49 -0
  405. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-relationships.xsd +33 -0
  406. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/mce/mc.xsd +75 -0
  407. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  408. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  409. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  410. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  411. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  412. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  413. package/extensions/skills/builtin/productivity/powerpoint/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  414. package/extensions/skills/builtin/productivity/teams-meeting-pipeline/SKILL.md +116 -0
  415. package/extensions/skills/builtin/research/DESCRIPTION.md +3 -0
  416. package/extensions/skills/builtin/research/arxiv/SKILL.md +282 -0
  417. package/extensions/skills/builtin/research/arxiv/scripts/search_arxiv.py +114 -0
  418. package/extensions/skills/builtin/research/blogwatcher/SKILL.md +137 -0
  419. package/extensions/skills/builtin/research/llm-wiki/SKILL.md +449 -0
  420. package/extensions/skills/builtin/research/polymarket/SKILL.md +75 -0
  421. package/extensions/skills/builtin/research/polymarket/references/api-endpoints.md +220 -0
  422. package/extensions/skills/builtin/research/polymarket/scripts/polymarket.py +284 -0
  423. package/extensions/skills/builtin/research/research-paper-writing/SKILL.md +813 -0
  424. package/extensions/skills/builtin/research/research-paper-writing/references/autoreason-methodology.md +394 -0
  425. package/extensions/skills/builtin/research/research-paper-writing/references/checklists.md +434 -0
  426. package/extensions/skills/builtin/research/research-paper-writing/references/citation-workflow.md +564 -0
  427. package/extensions/skills/builtin/research/research-paper-writing/references/experiment-patterns.md +728 -0
  428. package/extensions/skills/builtin/research/research-paper-writing/references/human-evaluation.md +476 -0
  429. package/extensions/skills/builtin/research/research-paper-writing/references/paper-types.md +481 -0
  430. package/extensions/skills/builtin/research/research-paper-writing/references/reviewer-guidelines.md +433 -0
  431. package/extensions/skills/builtin/research/research-paper-writing/references/sources.md +191 -0
  432. package/extensions/skills/builtin/research/research-paper-writing/references/writing-guide.md +474 -0
  433. package/extensions/skills/builtin/research/research-paper-writing/templates/README.md +251 -0
  434. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/README.md +534 -0
  435. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
  436. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
  437. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
  438. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
  439. package/extensions/skills/builtin/research/research-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
  440. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/README.md +48 -0
  441. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/acl.sty +312 -0
  442. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/acl_latex.tex +377 -0
  443. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/acl_lualatex.tex +101 -0
  444. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/acl_natbib.bst +1940 -0
  445. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/anthology.bib.txt +26 -0
  446. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/custom.bib +70 -0
  447. package/extensions/skills/builtin/research/research-paper-writing/templates/acl/formatting.md +322 -0
  448. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/README.md +3 -0
  449. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
  450. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
  451. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  452. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
  453. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
  454. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
  455. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/math_commands.tex +508 -0
  456. package/extensions/skills/builtin/research/research-paper-writing/templates/colm2025/natbib.sty +1246 -0
  457. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
  458. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
  459. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
  460. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  461. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
  462. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
  463. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/math_commands.tex +508 -0
  464. package/extensions/skills/builtin/research/research-paper-writing/templates/iclr2026/natbib.sty +1246 -0
  465. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/algorithm.sty +79 -0
  466. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/algorithmic.sty +201 -0
  467. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/example_paper.bib +75 -0
  468. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  469. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/example_paper.tex +662 -0
  470. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
  471. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/icml2026.bst +1443 -0
  472. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/icml2026.sty +767 -0
  473. package/extensions/skills/builtin/research/research-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  474. package/extensions/skills/builtin/research/research-paper-writing/templates/neurips2025/Makefile +36 -0
  475. package/extensions/skills/builtin/research/research-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
  476. package/extensions/skills/builtin/research/research-paper-writing/templates/neurips2025/main.tex +38 -0
  477. package/extensions/skills/builtin/research/research-paper-writing/templates/neurips2025/neurips.sty +382 -0
  478. package/extensions/skills/builtin/research/web-research/SKILL.md +10 -0
  479. package/extensions/skills/builtin/smart-home/DESCRIPTION.md +3 -0
  480. package/extensions/skills/builtin/smart-home/openhue/SKILL.md +109 -0
  481. package/extensions/skills/builtin/social-media/DESCRIPTION.md +3 -0
  482. package/extensions/skills/builtin/social-media/xurl/SKILL.md +429 -0
  483. package/extensions/skills/builtin/software-development/hermes-agent-skill-authoring/SKILL.md +196 -0
  484. package/extensions/skills/builtin/software-development/node-inspect-debugger/SKILL.md +319 -0
  485. package/extensions/skills/builtin/software-development/plan/SKILL.md +338 -0
  486. package/extensions/skills/builtin/software-development/python-debugpy/SKILL.md +375 -0
  487. package/extensions/skills/builtin/software-development/requesting-code-review/SKILL.md +275 -0
  488. package/extensions/skills/builtin/software-development/simplify-code/SKILL.md +118 -0
  489. package/extensions/skills/builtin/software-development/spike/SKILL.md +197 -0
  490. package/extensions/skills/builtin/software-development/systematic-debugging/SKILL.md +411 -0
  491. package/extensions/skills/builtin/software-development/test-driven-development/SKILL.md +362 -0
  492. package/extensions/skills/builtin/yuanbao/SKILL.md +108 -0
  493. package/extensions/skills/optional/DESCRIPTION.md +22 -0
  494. package/extensions/skills/optional/autonomous-ai-agents/DESCRIPTION.md +1 -0
  495. package/extensions/skills/optional/autonomous-ai-agents/antigravity-cli/SKILL.md +197 -0
  496. package/extensions/skills/optional/autonomous-ai-agents/antigravity-cli/references/cli-docs.md +64 -0
  497. package/extensions/skills/optional/autonomous-ai-agents/blackbox/SKILL.md +144 -0
  498. package/extensions/skills/optional/autonomous-ai-agents/grok/SKILL.md +246 -0
  499. package/extensions/skills/optional/autonomous-ai-agents/honcho/SKILL.md +431 -0
  500. package/extensions/skills/optional/autonomous-ai-agents/openhands/SKILL.md +149 -0
  501. package/extensions/skills/optional/creative/baoyu-article-illustrator/PORT_NOTES.md +48 -0
  502. package/extensions/skills/optional/creative/baoyu-article-illustrator/SKILL.md +207 -0
  503. package/extensions/skills/optional/creative/baoyu-article-illustrator/prompts/system.md +32 -0
  504. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/palettes/macaron.md +33 -0
  505. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/palettes/mono-ink.md +42 -0
  506. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/palettes/neon.md +33 -0
  507. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/palettes/warm.md +32 -0
  508. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/prompt-construction.md +426 -0
  509. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/style-presets.md +80 -0
  510. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/blueprint.md +57 -0
  511. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/chalkboard.md +62 -0
  512. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/editorial.md +59 -0
  513. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/elegant.md +56 -0
  514. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/fantasy-animation.md +58 -0
  515. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/flat-doodle.md +61 -0
  516. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/flat.md +59 -0
  517. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/ink-notes.md +90 -0
  518. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/intuition-machine.md +57 -0
  519. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/minimal.md +58 -0
  520. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/nature.md +58 -0
  521. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/notion.md +58 -0
  522. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/pixel-art.md +57 -0
  523. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/playful.md +59 -0
  524. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/retro.md +59 -0
  525. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/scientific.md +59 -0
  526. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/screen-print.md +70 -0
  527. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/sketch-notes.md +56 -0
  528. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/sketch.md +57 -0
  529. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/vector-illustration.md +57 -0
  530. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/vintage.md +59 -0
  531. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/warm.md +58 -0
  532. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles/watercolor.md +58 -0
  533. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/styles.md +223 -0
  534. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/usage.md +50 -0
  535. package/extensions/skills/optional/creative/baoyu-article-illustrator/references/workflow.md +332 -0
  536. package/extensions/skills/optional/creative/baoyu-comic/PORT_NOTES.md +77 -0
  537. package/extensions/skills/optional/creative/baoyu-comic/SKILL.md +247 -0
  538. package/extensions/skills/optional/creative/baoyu-comic/references/analysis-framework.md +176 -0
  539. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/chalk.md +101 -0
  540. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/ink-brush.md +97 -0
  541. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/ligne-claire.md +75 -0
  542. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/manga.md +93 -0
  543. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/minimalist.md +84 -0
  544. package/extensions/skills/optional/creative/baoyu-comic/references/art-styles/realistic.md +89 -0
  545. package/extensions/skills/optional/creative/baoyu-comic/references/auto-selection.md +71 -0
  546. package/extensions/skills/optional/creative/baoyu-comic/references/base-prompt.md +98 -0
  547. package/extensions/skills/optional/creative/baoyu-comic/references/character-template.md +180 -0
  548. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/cinematic.md +23 -0
  549. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/dense.md +23 -0
  550. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/four-panel.md +40 -0
  551. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/mixed.md +23 -0
  552. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/splash.md +23 -0
  553. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/standard.md +23 -0
  554. package/extensions/skills/optional/creative/baoyu-comic/references/layouts/webtoon.md +30 -0
  555. package/extensions/skills/optional/creative/baoyu-comic/references/ohmsha-guide.md +85 -0
  556. package/extensions/skills/optional/creative/baoyu-comic/references/partial-workflows.md +106 -0
  557. package/extensions/skills/optional/creative/baoyu-comic/references/presets/concept-story.md +121 -0
  558. package/extensions/skills/optional/creative/baoyu-comic/references/presets/four-panel.md +107 -0
  559. package/extensions/skills/optional/creative/baoyu-comic/references/presets/ohmsha.md +114 -0
  560. package/extensions/skills/optional/creative/baoyu-comic/references/presets/shoujo.md +116 -0
  561. package/extensions/skills/optional/creative/baoyu-comic/references/presets/wuxia.md +110 -0
  562. package/extensions/skills/optional/creative/baoyu-comic/references/storyboard-template.md +142 -0
  563. package/extensions/skills/optional/creative/baoyu-comic/references/tones/action.md +110 -0
  564. package/extensions/skills/optional/creative/baoyu-comic/references/tones/dramatic.md +95 -0
  565. package/extensions/skills/optional/creative/baoyu-comic/references/tones/energetic.md +105 -0
  566. package/extensions/skills/optional/creative/baoyu-comic/references/tones/neutral.md +63 -0
  567. package/extensions/skills/optional/creative/baoyu-comic/references/tones/romantic.md +100 -0
  568. package/extensions/skills/optional/creative/baoyu-comic/references/tones/vintage.md +104 -0
  569. package/extensions/skills/optional/creative/baoyu-comic/references/tones/warm.md +94 -0
  570. package/extensions/skills/optional/creative/baoyu-comic/references/workflow.md +401 -0
  571. package/extensions/skills/optional/creative/blender-mcp/SKILL.md +117 -0
  572. package/extensions/skills/optional/creative/concept-diagrams/SKILL.md +362 -0
  573. package/extensions/skills/optional/creative/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
  574. package/extensions/skills/optional/creative/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
  575. package/extensions/skills/optional/creative/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
  576. package/extensions/skills/optional/creative/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
  577. package/extensions/skills/optional/creative/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
  578. package/extensions/skills/optional/creative/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
  579. package/extensions/skills/optional/creative/concept-diagrams/examples/electricity-grid-flow.md +182 -0
  580. package/extensions/skills/optional/creative/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
  581. package/extensions/skills/optional/creative/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
  582. package/extensions/skills/optional/creative/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
  583. package/extensions/skills/optional/creative/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
  584. package/extensions/skills/optional/creative/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
  585. package/extensions/skills/optional/creative/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
  586. package/extensions/skills/optional/creative/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
  587. package/extensions/skills/optional/creative/concept-diagrams/examples/wind-turbine-structure.md +338 -0
  588. package/extensions/skills/optional/creative/concept-diagrams/references/dashboard-patterns.md +43 -0
  589. package/extensions/skills/optional/creative/concept-diagrams/references/infrastructure-patterns.md +144 -0
  590. package/extensions/skills/optional/creative/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  591. package/extensions/skills/optional/creative/concept-diagrams/templates/template.html +174 -0
  592. package/extensions/skills/optional/creative/creative-ideation/SKILL.md +177 -0
  593. package/extensions/skills/optional/creative/creative-ideation/references/anti-slop.md +106 -0
  594. package/extensions/skills/optional/creative/creative-ideation/references/exercises.md +71 -0
  595. package/extensions/skills/optional/creative/creative-ideation/references/full-prompt-library.md +180 -0
  596. package/extensions/skills/optional/creative/creative-ideation/references/heuristics.md +85 -0
  597. package/extensions/skills/optional/creative/creative-ideation/references/method-catalog.md +88 -0
  598. package/extensions/skills/optional/creative/creative-ideation/references/methods/affinity-diagrams.md +67 -0
  599. package/extensions/skills/optional/creative/creative-ideation/references/methods/analogy-and-blending.md +83 -0
  600. package/extensions/skills/optional/creative/creative-ideation/references/methods/biomimicry.md +58 -0
  601. package/extensions/skills/optional/creative/creative-ideation/references/methods/chance-and-remix.md +75 -0
  602. package/extensions/skills/optional/creative/creative-ideation/references/methods/compression-progress.md +64 -0
  603. package/extensions/skills/optional/creative/creative-ideation/references/methods/creative-discipline.md +82 -0
  604. package/extensions/skills/optional/creative/creative-ideation/references/methods/defamiliarization.md +58 -0
  605. package/extensions/skills/optional/creative/creative-ideation/references/methods/derive-and-mapping.md +76 -0
  606. package/extensions/skills/optional/creative/creative-ideation/references/methods/first-principles.md +63 -0
  607. package/extensions/skills/optional/creative/creative-ideation/references/methods/jobs-to-be-done.md +73 -0
  608. package/extensions/skills/optional/creative/creative-ideation/references/methods/lateral-provocations.md +81 -0
  609. package/extensions/skills/optional/creative/creative-ideation/references/methods/leverage-points.md +70 -0
  610. package/extensions/skills/optional/creative/creative-ideation/references/methods/oblique-strategies.md +87 -0
  611. package/extensions/skills/optional/creative/creative-ideation/references/methods/oulipo.md +75 -0
  612. package/extensions/skills/optional/creative/creative-ideation/references/methods/pataphysics.md +64 -0
  613. package/extensions/skills/optional/creative/creative-ideation/references/methods/pattern-languages.md +78 -0
  614. package/extensions/skills/optional/creative/creative-ideation/references/methods/polya.md +77 -0
  615. package/extensions/skills/optional/creative/creative-ideation/references/methods/premortem-and-inversion.md +71 -0
  616. package/extensions/skills/optional/creative/creative-ideation/references/methods/scamper.md +63 -0
  617. package/extensions/skills/optional/creative/creative-ideation/references/methods/story-skeletons.md +100 -0
  618. package/extensions/skills/optional/creative/creative-ideation/references/methods/triz-principles.md +95 -0
  619. package/extensions/skills/optional/creative/creative-ideation/references/methods/volume-generation.md +74 -0
  620. package/extensions/skills/optional/creative/hyperframes/SKILL.md +191 -0
  621. package/extensions/skills/optional/creative/hyperframes/references/cli.md +185 -0
  622. package/extensions/skills/optional/creative/hyperframes/references/composition.md +129 -0
  623. package/extensions/skills/optional/creative/hyperframes/references/features.md +289 -0
  624. package/extensions/skills/optional/creative/hyperframes/references/gsap.md +136 -0
  625. package/extensions/skills/optional/creative/hyperframes/references/troubleshooting.md +137 -0
  626. package/extensions/skills/optional/creative/hyperframes/references/website-to-video.md +145 -0
  627. package/extensions/skills/optional/creative/hyperframes/scripts/setup.sh +135 -0
  628. package/extensions/skills/optional/creative/kanban-video-orchestrator/SKILL.md +158 -0
  629. package/extensions/skills/optional/creative/kanban-video-orchestrator/assets/brief.md.tmpl +79 -0
  630. package/extensions/skills/optional/creative/kanban-video-orchestrator/assets/setup.sh.tmpl +186 -0
  631. package/extensions/skills/optional/creative/kanban-video-orchestrator/assets/soul.md.tmpl +38 -0
  632. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/examples.md +203 -0
  633. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/intake.md +142 -0
  634. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/kanban-setup.md +271 -0
  635. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/monitoring.md +155 -0
  636. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/role-archetypes.md +234 -0
  637. package/extensions/skills/optional/creative/kanban-video-orchestrator/references/tool-matrix.md +281 -0
  638. package/extensions/skills/optional/creative/kanban-video-orchestrator/scripts/bootstrap_pipeline.py +499 -0
  639. package/extensions/skills/optional/creative/kanban-video-orchestrator/scripts/monitor.py +195 -0
  640. package/extensions/skills/optional/creative/meme-generation/EXAMPLES.md +46 -0
  641. package/extensions/skills/optional/creative/meme-generation/SKILL.md +130 -0
  642. package/extensions/skills/optional/creative/meme-generation/scripts/generate_meme.py +470 -0
  643. package/extensions/skills/optional/creative/meme-generation/scripts/templates.json +97 -0
  644. package/extensions/skills/optional/creative/pixel-art/ATTRIBUTION.md +48 -0
  645. package/extensions/skills/optional/creative/pixel-art/SKILL.md +199 -0
  646. package/extensions/skills/optional/creative/pixel-art/references/palettes.md +49 -0
  647. package/extensions/skills/optional/creative/pixel-art/scripts/__init__.py +0 -0
  648. package/extensions/skills/optional/creative/pixel-art/scripts/palettes.py +167 -0
  649. package/extensions/skills/optional/creative/pixel-art/scripts/pixel_art.py +162 -0
  650. package/extensions/skills/optional/creative/pixel-art/scripts/pixel_art_video.py +345 -0
  651. package/extensions/skills/optional/devops/cli/SKILL.md +156 -0
  652. package/extensions/skills/optional/devops/cli/references/app-discovery.md +111 -0
  653. package/extensions/skills/optional/devops/cli/references/authentication.md +59 -0
  654. package/extensions/skills/optional/devops/cli/references/cli-reference.md +104 -0
  655. package/extensions/skills/optional/devops/cli/references/running-apps.md +171 -0
  656. package/extensions/skills/optional/devops/docker-management/SKILL.md +281 -0
  657. package/extensions/skills/optional/devops/hermes-s6-container-supervision/SKILL.md +178 -0
  658. package/extensions/skills/optional/devops/pinggy-tunnel/SKILL.md +309 -0
  659. package/extensions/skills/optional/devops/watchers/SKILL.md +111 -0
  660. package/extensions/skills/optional/devops/watchers/scripts/_watermark.py +148 -0
  661. package/extensions/skills/optional/devops/watchers/scripts/watch_github.py +169 -0
  662. package/extensions/skills/optional/devops/watchers/scripts/watch_http_json.py +131 -0
  663. package/extensions/skills/optional/devops/watchers/scripts/watch_rss.py +121 -0
  664. package/extensions/skills/optional/dogfood/DESCRIPTION.md +3 -0
  665. package/extensions/skills/optional/dogfood/adversarial-ux-test/SKILL.md +191 -0
  666. package/extensions/skills/optional/finance/3-statement-model/SKILL.md +430 -0
  667. package/extensions/skills/optional/finance/3-statement-model/references/formatting.md +118 -0
  668. package/extensions/skills/optional/finance/3-statement-model/references/formulas.md +292 -0
  669. package/extensions/skills/optional/finance/3-statement-model/references/sec-filings.md +125 -0
  670. package/extensions/skills/optional/finance/comps-analysis/SKILL.md +662 -0
  671. package/extensions/skills/optional/finance/dcf-model/SKILL.md +850 -0
  672. package/extensions/skills/optional/finance/dcf-model/TROUBLESHOOTING.md +40 -0
  673. package/extensions/skills/optional/finance/dcf-model/requirements.txt +7 -0
  674. package/extensions/skills/optional/finance/dcf-model/scripts/validate_dcf.py +291 -0
  675. package/extensions/skills/optional/finance/excel-author/SKILL.md +244 -0
  676. package/extensions/skills/optional/finance/excel-author/scripts/recalc.py +88 -0
  677. package/extensions/skills/optional/finance/lbo-model/SKILL.md +290 -0
  678. package/extensions/skills/optional/finance/merger-model/SKILL.md +144 -0
  679. package/extensions/skills/optional/finance/pptx-author/SKILL.md +173 -0
  680. package/extensions/skills/optional/finance/stocks/SKILL.md +88 -0
  681. package/extensions/skills/optional/finance/stocks/scripts/stocks_client.py +755 -0
  682. package/extensions/skills/optional/mcp/DESCRIPTION.md +3 -0
  683. package/extensions/skills/optional/mcp/fastmcp/SKILL.md +300 -0
  684. package/extensions/skills/optional/mcp/fastmcp/references/fastmcp-cli.md +110 -0
  685. package/extensions/skills/optional/mcp/fastmcp/scripts/scaffold_fastmcp.py +56 -0
  686. package/extensions/skills/optional/mcp/fastmcp/templates/api_wrapper.py +54 -0
  687. package/extensions/skills/optional/mcp/fastmcp/templates/database_server.py +77 -0
  688. package/extensions/skills/optional/mcp/fastmcp/templates/file_processor.py +55 -0
  689. package/extensions/skills/optional/mcp/mcporter/SKILL.md +123 -0
  690. package/extensions/skills/optional/migration/DESCRIPTION.md +1 -0
  691. package/extensions/skills/optional/migration/openclaw-migration/SKILL.md +298 -0
  692. package/extensions/skills/optional/migration/openclaw-migration/scripts/openclaw_to_hermes.py +3136 -0
  693. package/extensions/skills/optional/mlops/accelerate/SKILL.md +333 -0
  694. package/extensions/skills/optional/mlops/accelerate/references/custom-plugins.md +453 -0
  695. package/extensions/skills/optional/mlops/accelerate/references/megatron-integration.md +489 -0
  696. package/extensions/skills/optional/mlops/accelerate/references/performance.md +525 -0
  697. package/extensions/skills/optional/mlops/chroma/SKILL.md +408 -0
  698. package/extensions/skills/optional/mlops/chroma/references/integration.md +38 -0
  699. package/extensions/skills/optional/mlops/clip/SKILL.md +255 -0
  700. package/extensions/skills/optional/mlops/clip/references/applications.md +207 -0
  701. package/extensions/skills/optional/mlops/faiss/SKILL.md +223 -0
  702. package/extensions/skills/optional/mlops/faiss/references/index_types.md +280 -0
  703. package/extensions/skills/optional/mlops/flash-attention/SKILL.md +364 -0
  704. package/extensions/skills/optional/mlops/flash-attention/references/benchmarks.md +215 -0
  705. package/extensions/skills/optional/mlops/flash-attention/references/transformers-integration.md +293 -0
  706. package/extensions/skills/optional/mlops/guidance/SKILL.md +574 -0
  707. package/extensions/skills/optional/mlops/guidance/references/backends.md +553 -0
  708. package/extensions/skills/optional/mlops/guidance/references/constraints.md +674 -0
  709. package/extensions/skills/optional/mlops/guidance/references/examples.md +767 -0
  710. package/extensions/skills/optional/mlops/huggingface-tokenizers/SKILL.md +518 -0
  711. package/extensions/skills/optional/mlops/huggingface-tokenizers/references/algorithms.md +653 -0
  712. package/extensions/skills/optional/mlops/huggingface-tokenizers/references/integration.md +637 -0
  713. package/extensions/skills/optional/mlops/huggingface-tokenizers/references/pipeline.md +723 -0
  714. package/extensions/skills/optional/mlops/huggingface-tokenizers/references/training.md +565 -0
  715. package/extensions/skills/optional/mlops/inference/outlines/SKILL.md +654 -0
  716. package/extensions/skills/optional/mlops/inference/outlines/references/backends.md +615 -0
  717. package/extensions/skills/optional/mlops/inference/outlines/references/examples.md +773 -0
  718. package/extensions/skills/optional/mlops/inference/outlines/references/json_generation.md +649 -0
  719. package/extensions/skills/optional/mlops/instructor/SKILL.md +742 -0
  720. package/extensions/skills/optional/mlops/instructor/references/examples.md +107 -0
  721. package/extensions/skills/optional/mlops/instructor/references/providers.md +70 -0
  722. package/extensions/skills/optional/mlops/instructor/references/validation.md +606 -0
  723. package/extensions/skills/optional/mlops/lambda-labs/SKILL.md +549 -0
  724. package/extensions/skills/optional/mlops/lambda-labs/references/advanced-usage.md +611 -0
  725. package/extensions/skills/optional/mlops/lambda-labs/references/troubleshooting.md +530 -0
  726. package/extensions/skills/optional/mlops/llava/SKILL.md +306 -0
  727. package/extensions/skills/optional/mlops/llava/references/training.md +197 -0
  728. package/extensions/skills/optional/mlops/modal/SKILL.md +345 -0
  729. package/extensions/skills/optional/mlops/modal/references/advanced-usage.md +503 -0
  730. package/extensions/skills/optional/mlops/modal/references/troubleshooting.md +494 -0
  731. package/extensions/skills/optional/mlops/nemo-curator/SKILL.md +384 -0
  732. package/extensions/skills/optional/mlops/nemo-curator/references/deduplication.md +87 -0
  733. package/extensions/skills/optional/mlops/nemo-curator/references/filtering.md +102 -0
  734. package/extensions/skills/optional/mlops/obliteratus/SKILL.md +342 -0
  735. package/extensions/skills/optional/mlops/obliteratus/references/analysis-modules.md +160 -0
  736. package/extensions/skills/optional/mlops/obliteratus/references/methods-guide.md +139 -0
  737. package/extensions/skills/optional/mlops/obliteratus/templates/abliteration-config.yaml +33 -0
  738. package/extensions/skills/optional/mlops/obliteratus/templates/analysis-study.yaml +40 -0
  739. package/extensions/skills/optional/mlops/obliteratus/templates/batch-abliteration.yaml +41 -0
  740. package/extensions/skills/optional/mlops/peft/SKILL.md +435 -0
  741. package/extensions/skills/optional/mlops/peft/references/advanced-usage.md +514 -0
  742. package/extensions/skills/optional/mlops/peft/references/troubleshooting.md +480 -0
  743. package/extensions/skills/optional/mlops/pinecone/SKILL.md +360 -0
  744. package/extensions/skills/optional/mlops/pinecone/references/deployment.md +181 -0
  745. package/extensions/skills/optional/mlops/pytorch-fsdp/SKILL.md +85 -0
  746. package/extensions/skills/optional/mlops/pytorch-fsdp/references/index.md +7 -0
  747. package/extensions/skills/optional/mlops/pytorch-fsdp/references/other.md +3297 -0
  748. package/extensions/skills/optional/mlops/pytorch-lightning/SKILL.md +348 -0
  749. package/extensions/skills/optional/mlops/pytorch-lightning/references/callbacks.md +436 -0
  750. package/extensions/skills/optional/mlops/pytorch-lightning/references/distributed.md +490 -0
  751. package/extensions/skills/optional/mlops/pytorch-lightning/references/hyperparameter-tuning.md +556 -0
  752. package/extensions/skills/optional/mlops/qdrant/SKILL.md +497 -0
  753. package/extensions/skills/optional/mlops/qdrant/references/advanced-usage.md +648 -0
  754. package/extensions/skills/optional/mlops/qdrant/references/troubleshooting.md +631 -0
  755. package/extensions/skills/optional/mlops/research/DESCRIPTION.md +3 -0
  756. package/extensions/skills/optional/mlops/research/dspy/SKILL.md +592 -0
  757. package/extensions/skills/optional/mlops/research/dspy/references/examples.md +663 -0
  758. package/extensions/skills/optional/mlops/research/dspy/references/modules.md +475 -0
  759. package/extensions/skills/optional/mlops/research/dspy/references/optimizers.md +566 -0
  760. package/extensions/skills/optional/mlops/saelens/SKILL.md +390 -0
  761. package/extensions/skills/optional/mlops/saelens/references/README.md +69 -0
  762. package/extensions/skills/optional/mlops/saelens/references/api.md +333 -0
  763. package/extensions/skills/optional/mlops/saelens/references/tutorials.md +318 -0
  764. package/extensions/skills/optional/mlops/simpo/SKILL.md +220 -0
  765. package/extensions/skills/optional/mlops/simpo/references/datasets.md +478 -0
  766. package/extensions/skills/optional/mlops/simpo/references/hyperparameters.md +452 -0
  767. package/extensions/skills/optional/mlops/simpo/references/loss-functions.md +350 -0
  768. package/extensions/skills/optional/mlops/slime/SKILL.md +467 -0
  769. package/extensions/skills/optional/mlops/slime/references/api-reference.md +392 -0
  770. package/extensions/skills/optional/mlops/slime/references/troubleshooting.md +386 -0
  771. package/extensions/skills/optional/mlops/stable-diffusion/SKILL.md +523 -0
  772. package/extensions/skills/optional/mlops/stable-diffusion/references/advanced-usage.md +716 -0
  773. package/extensions/skills/optional/mlops/stable-diffusion/references/troubleshooting.md +555 -0
  774. package/extensions/skills/optional/mlops/tensorrt-llm/SKILL.md +189 -0
  775. package/extensions/skills/optional/mlops/tensorrt-llm/references/multi-gpu.md +298 -0
  776. package/extensions/skills/optional/mlops/tensorrt-llm/references/optimization.md +242 -0
  777. package/extensions/skills/optional/mlops/tensorrt-llm/references/serving.md +470 -0
  778. package/extensions/skills/optional/mlops/torchtitan/SKILL.md +361 -0
  779. package/extensions/skills/optional/mlops/torchtitan/references/checkpoint.md +181 -0
  780. package/extensions/skills/optional/mlops/torchtitan/references/custom-models.md +258 -0
  781. package/extensions/skills/optional/mlops/torchtitan/references/float8.md +133 -0
  782. package/extensions/skills/optional/mlops/torchtitan/references/fsdp.md +126 -0
  783. package/extensions/skills/optional/mlops/training/axolotl/SKILL.md +164 -0
  784. package/extensions/skills/optional/mlops/training/axolotl/references/api.md +1535 -0
  785. package/extensions/skills/optional/mlops/training/axolotl/references/dataset-formats.md +843 -0
  786. package/extensions/skills/optional/mlops/training/axolotl/references/index.md +15 -0
  787. package/extensions/skills/optional/mlops/training/axolotl/references/other.md +2367 -0
  788. package/extensions/skills/optional/mlops/training/trl-fine-tuning/SKILL.md +460 -0
  789. package/extensions/skills/optional/mlops/training/trl-fine-tuning/references/dpo-variants.md +227 -0
  790. package/extensions/skills/optional/mlops/training/trl-fine-tuning/references/grpo-training.md +504 -0
  791. package/extensions/skills/optional/mlops/training/trl-fine-tuning/references/online-rl.md +82 -0
  792. package/extensions/skills/optional/mlops/training/trl-fine-tuning/references/reward-modeling.md +122 -0
  793. package/extensions/skills/optional/mlops/training/trl-fine-tuning/references/sft-training.md +168 -0
  794. package/extensions/skills/optional/mlops/training/trl-fine-tuning/templates/basic_grpo_training.py +228 -0
  795. package/extensions/skills/optional/mlops/training/unsloth/SKILL.md +81 -0
  796. package/extensions/skills/optional/mlops/training/unsloth/references/index.md +7 -0
  797. package/extensions/skills/optional/mlops/training/unsloth/references/llms-full.md +381 -0
  798. package/extensions/skills/optional/mlops/training/unsloth/references/llms-txt.md +382 -0
  799. package/extensions/skills/optional/mlops/training/unsloth/references/llms.md +82 -0
  800. package/extensions/skills/optional/mlops/whisper/SKILL.md +319 -0
  801. package/extensions/skills/optional/mlops/whisper/references/languages.md +189 -0
  802. package/extensions/skills/optional/productivity/canvas/SKILL.md +98 -0
  803. package/extensions/skills/optional/productivity/canvas/scripts/canvas_api.py +160 -0
  804. package/extensions/skills/optional/productivity/here-now/SKILL.md +217 -0
  805. package/extensions/skills/optional/productivity/here-now/scripts/drive.sh +406 -0
  806. package/extensions/skills/optional/productivity/here-now/scripts/publish.sh +445 -0
  807. package/extensions/skills/optional/productivity/memento-flashcards/SKILL.md +324 -0
  808. package/extensions/skills/optional/productivity/memento-flashcards/scripts/memento_cards.py +353 -0
  809. package/extensions/skills/optional/productivity/memento-flashcards/scripts/youtube_quiz.py +88 -0
  810. package/extensions/skills/optional/productivity/shop/SKILL.md +224 -0
  811. package/extensions/skills/optional/productivity/shop/references/catalog-mcp.md +236 -0
  812. package/extensions/skills/optional/productivity/shop/references/direct-api.md +265 -0
  813. package/extensions/skills/optional/productivity/shop/references/legal.md +3 -0
  814. package/extensions/skills/optional/productivity/shop/references/safety.md +36 -0
  815. package/extensions/skills/optional/productivity/shopify/SKILL.md +373 -0
  816. package/extensions/skills/optional/productivity/siyuan/SKILL.md +298 -0
  817. package/extensions/skills/optional/productivity/telephony/SKILL.md +418 -0
  818. package/extensions/skills/optional/productivity/telephony/scripts/telephony.py +1343 -0
  819. package/extensions/skills/optional/research/bioinformatics/SKILL.md +235 -0
  820. package/extensions/skills/optional/research/darwinian-evolver/SKILL.md +161 -0
  821. package/extensions/skills/optional/research/darwinian-evolver/scripts/parrot_openrouter.py +218 -0
  822. package/extensions/skills/optional/research/darwinian-evolver/scripts/show_snapshot.py +92 -0
  823. package/extensions/skills/optional/research/darwinian-evolver/templates/custom_problem_template.py +240 -0
  824. package/extensions/skills/optional/research/domain-intel/SKILL.md +97 -0
  825. package/extensions/skills/optional/research/domain-intel/scripts/domain_intel.py +397 -0
  826. package/extensions/skills/optional/research/drug-discovery/SKILL.md +218 -0
  827. package/extensions/skills/optional/research/drug-discovery/references/ADMET_REFERENCE.md +66 -0
  828. package/extensions/skills/optional/research/drug-discovery/scripts/chembl_target.py +53 -0
  829. package/extensions/skills/optional/research/drug-discovery/scripts/ro5_screen.py +44 -0
  830. package/extensions/skills/optional/research/duckduckgo-search/SKILL.md +238 -0
  831. package/extensions/skills/optional/research/duckduckgo-search/scripts/duckduckgo.sh +28 -0
  832. package/extensions/skills/optional/research/gitnexus-explorer/SKILL.md +196 -0
  833. package/extensions/skills/optional/research/gitnexus-explorer/scripts/proxy.mjs +92 -0
  834. package/extensions/skills/optional/research/osint-investigation/SKILL.md +227 -0
  835. package/extensions/skills/optional/research/osint-investigation/references/sources/courtlistener.md +92 -0
  836. package/extensions/skills/optional/research/osint-investigation/references/sources/gdelt.md +94 -0
  837. package/extensions/skills/optional/research/osint-investigation/references/sources/icij-offshore.md +79 -0
  838. package/extensions/skills/optional/research/osint-investigation/references/sources/nyc-acris.md +85 -0
  839. package/extensions/skills/optional/research/osint-investigation/references/sources/ofac-sdn.md +84 -0
  840. package/extensions/skills/optional/research/osint-investigation/references/sources/opencorporates.md +88 -0
  841. package/extensions/skills/optional/research/osint-investigation/references/sources/sec-edgar.md +80 -0
  842. package/extensions/skills/optional/research/osint-investigation/references/sources/senate-ld.md +85 -0
  843. package/extensions/skills/optional/research/osint-investigation/references/sources/usaspending.md +90 -0
  844. package/extensions/skills/optional/research/osint-investigation/references/sources/wayback.md +87 -0
  845. package/extensions/skills/optional/research/osint-investigation/references/sources/wikipedia.md +96 -0
  846. package/extensions/skills/optional/research/osint-investigation/scripts/_http.py +82 -0
  847. package/extensions/skills/optional/research/osint-investigation/scripts/_normalize.py +67 -0
  848. package/extensions/skills/optional/research/osint-investigation/scripts/build_findings.py +221 -0
  849. package/extensions/skills/optional/research/osint-investigation/scripts/entity_resolution.py +228 -0
  850. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_courtlistener.py +149 -0
  851. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_gdelt.py +161 -0
  852. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
  853. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
  854. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
  855. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_opencorporates.py +191 -0
  856. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
  857. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_senate_ld.py +146 -0
  858. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_usaspending.py +170 -0
  859. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_wayback.py +142 -0
  860. package/extensions/skills/optional/research/osint-investigation/scripts/fetch_wikipedia.py +266 -0
  861. package/extensions/skills/optional/research/osint-investigation/scripts/timing_analysis.py +252 -0
  862. package/extensions/skills/optional/research/osint-investigation/templates/source-template.md +57 -0
  863. package/extensions/skills/optional/research/parallel-cli/SKILL.md +391 -0
  864. package/extensions/skills/optional/research/qmd/SKILL.md +417 -0
  865. package/extensions/skills/optional/research/scrapling/SKILL.md +336 -0
  866. package/extensions/skills/optional/research/searxng-search/SKILL.md +212 -0
  867. package/extensions/skills/optional/research/searxng-search/scripts/searxng.sh +22 -0
  868. package/extensions/skills/optional/security/DESCRIPTION.md +3 -0
  869. package/extensions/skills/optional/software-development/code-wiki/SKILL.md +442 -0
  870. package/extensions/skills/optional/software-development/code-wiki/templates/README.md +31 -0
  871. package/extensions/skills/optional/software-development/code-wiki/templates/architecture.md +30 -0
  872. package/extensions/skills/optional/software-development/code-wiki/templates/getting-started.md +47 -0
  873. package/extensions/skills/optional/software-development/code-wiki/templates/module.md +38 -0
  874. package/extensions/skills/optional/software-development/rest-graphql-debug/SKILL.md +514 -0
  875. package/extensions/skills/optional/software-development/subagent-driven-development/SKILL.md +352 -0
  876. package/extensions/skills/optional/software-development/subagent-driven-development/references/context-budget-discipline.md +53 -0
  877. package/extensions/skills/optional/software-development/subagent-driven-development/references/gates-taxonomy.md +93 -0
  878. package/extensions/skills/optional/web-development/DESCRIPTION.md +5 -0
  879. package/extensions/skills/optional/web-development/cloudflare-temporary-deploy/SKILL.md +127 -0
  880. package/extensions/skills/optional/web-development/cloudflare-temporary-deploy/scripts/parse_deploy_output.py +122 -0
  881. package/extensions/skills/optional/web-development/page-agent/SKILL.md +190 -0
  882. package/interfaces/__init__.py +1 -0
  883. package/interfaces/api/__init__.py +1 -0
  884. package/interfaces/api/_impl/_models.py +105 -0
  885. package/interfaces/api/_impl/server.py +1480 -0
  886. package/interfaces/cli/__init__.py +1 -0
  887. package/interfaces/cli/_impl/__init__.py +1 -0
  888. package/interfaces/cli/_impl/commands/__init__.py +1 -0
  889. package/interfaces/cli/_impl/commands/agents.py +106 -0
  890. package/interfaces/cli/_impl/commands/architecture.py +63 -0
  891. package/interfaces/cli/_impl/commands/chat_repl.py +291 -0
  892. package/interfaces/cli/_impl/commands/common.py +17 -0
  893. package/interfaces/cli/_impl/commands/cron.py +145 -0
  894. package/interfaces/cli/_impl/commands/doctor.py +201 -0
  895. package/interfaces/cli/_impl/commands/gateway.py +111 -0
  896. package/interfaces/cli/_impl/commands/llm.py +113 -0
  897. package/interfaces/cli/_impl/commands/models.py +578 -0
  898. package/interfaces/cli/_impl/commands/orchestrator.py +71 -0
  899. package/interfaces/cli/_impl/commands/run_agent.py +102 -0
  900. package/interfaces/cli/_impl/commands/sessions.py +237 -0
  901. package/interfaces/cli/_impl/commands/skill.py +121 -0
  902. package/interfaces/cli/_impl/commands/smoke_test.py +193 -0
  903. package/interfaces/cli/_impl/commands/soul.py +106 -0
  904. package/interfaces/cli/_impl/commands/tools.py +249 -0
  905. package/interfaces/cli/_impl/handlers/__init__.py +1 -0
  906. package/interfaces/cli/_impl/main.py +727 -0
  907. package/interfaces/cli/_impl/parser/__init__.py +1 -0
  908. package/interfaces/cli/_impl/renderers/__init__.py +23 -0
  909. package/interfaces/cli/_impl/result.py +81 -0
  910. package/interfaces/gateway/__init__.py +1 -0
  911. package/interfaces/gateway/_impl/__init__.py +163 -0
  912. package/interfaces/gateway/_impl/adapters/dingtalk/__init__.py +8 -0
  913. package/interfaces/gateway/_impl/adapters/dingtalk/adapter.py +100 -0
  914. package/interfaces/gateway/_impl/adapters/feishu/__init__.py +8 -0
  915. package/interfaces/gateway/_impl/adapters/feishu/adapter.py +575 -0
  916. package/interfaces/gateway/_impl/adapters/qq/__init__.py +8 -0
  917. package/interfaces/gateway/_impl/adapters/qq/adapter.py +266 -0
  918. package/interfaces/gateway/_impl/adapters/slack/__init__.py +8 -0
  919. package/interfaces/gateway/_impl/adapters/slack/adapter.py +72 -0
  920. package/interfaces/gateway/_impl/adapters/wechat/__init__.py +8 -0
  921. package/interfaces/gateway/_impl/adapters/wechat/adapter.py +239 -0
  922. package/interfaces/gateway/_impl/middleware/__init__.py +1 -0
  923. package/interfaces/gateway/_impl/routes/__init__.py +1 -0
  924. package/interfaces/web/__init__.py +1 -0
  925. package/interfaces/web/frontend/.oxlintrc.json +8 -0
  926. package/interfaces/web/frontend/README.md +32 -0
  927. package/interfaces/web/frontend/index.html +13 -0
  928. package/interfaces/web/frontend/package-lock.json +5179 -0
  929. package/interfaces/web/frontend/package.json +48 -0
  930. package/interfaces/web/frontend/postcss.config.js +6 -0
  931. package/interfaces/web/frontend/public/cat-spritesheet.webp +0 -0
  932. package/interfaces/web/frontend/public/favicon.svg +1 -0
  933. package/interfaces/web/frontend/public/icons.svg +24 -0
  934. package/interfaces/web/frontend/run-5173.cmd +3 -0
  935. package/interfaces/web/frontend/src/App.css +184 -0
  936. package/interfaces/web/frontend/src/App.tsx +272 -0
  937. package/interfaces/web/frontend/src/api/client.ts +115 -0
  938. package/interfaces/web/frontend/src/assets/hero.png +0 -0
  939. package/interfaces/web/frontend/src/assets/react.svg +1 -0
  940. package/interfaces/web/frontend/src/assets/vite.svg +1 -0
  941. package/interfaces/web/frontend/src/components/AgentAvatar.tsx +59 -0
  942. package/interfaces/web/frontend/src/components/CatSpirit.tsx +248 -0
  943. package/interfaces/web/frontend/src/components/ChatFlow.tsx +587 -0
  944. package/interfaces/web/frontend/src/components/DateTimePicker.tsx +170 -0
  945. package/interfaces/web/frontend/src/components/MarkdownView.tsx +20 -0
  946. package/interfaces/web/frontend/src/components/NiceSelect.tsx +166 -0
  947. package/interfaces/web/frontend/src/components/PagePanel.tsx +68 -0
  948. package/interfaces/web/frontend/src/components/PixelCat.tsx +150 -0
  949. package/interfaces/web/frontend/src/components/RichEditor.tsx +129 -0
  950. package/interfaces/web/frontend/src/components/SakuraParticles.tsx +70 -0
  951. package/interfaces/web/frontend/src/components/SidebarLeft.tsx +100 -0
  952. package/interfaces/web/frontend/src/components/SidebarRight.tsx +333 -0
  953. package/interfaces/web/frontend/src/components/Toggle.tsx +19 -0
  954. package/interfaces/web/frontend/src/contexts/ThemeContext.tsx +230 -0
  955. package/interfaces/web/frontend/src/contexts/ThemeContextCore.ts +14 -0
  956. package/interfaces/web/frontend/src/contexts/useTheme.ts +8 -0
  957. package/interfaces/web/frontend/src/hooks/useAgent.ts +507 -0
  958. package/interfaces/web/frontend/src/hooks/useDashboardData.ts +160 -0
  959. package/interfaces/web/frontend/src/index.css +1903 -0
  960. package/interfaces/web/frontend/src/main.tsx +11 -0
  961. package/interfaces/web/frontend/src/mock/data.ts +3 -0
  962. package/interfaces/web/frontend/src/pages/AgentsPage.tsx +156 -0
  963. package/interfaces/web/frontend/src/pages/CronPage.tsx +80 -0
  964. package/interfaces/web/frontend/src/pages/FilesPage.tsx +57 -0
  965. package/interfaces/web/frontend/src/pages/McpPage.tsx +143 -0
  966. package/interfaces/web/frontend/src/pages/ModelsPage.tsx +170 -0
  967. package/interfaces/web/frontend/src/pages/SessionsPage.tsx +135 -0
  968. package/interfaces/web/frontend/src/pages/SkillsPage.tsx +4 -0
  969. package/interfaces/web/frontend/src/pages/SoulsPage.tsx +109 -0
  970. package/interfaces/web/frontend/src/pages/ToolsPage.tsx +3 -0
  971. package/interfaces/web/frontend/src/pages/UsagePage.tsx +132 -0
  972. package/interfaces/web/frontend/src/pages/WorkersPage.tsx +198 -0
  973. package/interfaces/web/frontend/src/types/index.ts +138 -0
  974. package/interfaces/web/frontend/tailwind.config.js +52 -0
  975. package/interfaces/web/frontend/tsconfig.app.json +26 -0
  976. package/interfaces/web/frontend/tsconfig.json +7 -0
  977. package/interfaces/web/frontend/tsconfig.node.json +23 -0
  978. package/interfaces/web/frontend/vite.config.ts +16 -0
  979. package/interfaces/web/frontend/yarn.lock +2281 -0
  980. package/interfaces/web/legacy_web/index.html +1259 -0
  981. package/lbs.py +6 -0
  982. package/package.json +53 -0
  983. package/requirements.txt +98 -0
  984. package/runtime/__init__.py +1 -0
  985. package/runtime/context/__init__.py +26 -0
  986. package/runtime/context/compression/strategies/__init__.py +1 -0
  987. package/runtime/context/compression/token_counter.py +62 -0
  988. package/runtime/context/compressor.py +594 -0
  989. package/runtime/context/management/__init__.py +1 -0
  990. package/runtime/context/management/context_builder.py +67 -0
  991. package/runtime/context/management/context_manager.py +1008 -0
  992. package/runtime/context/trimming/__init__.py +1 -0
  993. package/runtime/context/trimming/priority.py +58 -0
  994. package/runtime/context/trimming/window.py +56 -0
  995. package/runtime/core/__init__.py +1 -0
  996. package/runtime/core/llm/__init__.py +24 -0
  997. package/runtime/core/llm/auxiliary_client.py +279 -0
  998. package/runtime/core/llm/builtins.py +300 -0
  999. package/runtime/core/llm/client/__init__.py +699 -0
  1000. package/runtime/core/llm/credential.py +334 -0
  1001. package/runtime/core/llm/error_classifier.py +158 -0
  1002. package/runtime/core/llm/factory/__init__.py +1 -0
  1003. package/runtime/core/llm/health.py +106 -0
  1004. package/runtime/core/llm/model_router.py +592 -0
  1005. package/runtime/core/llm/provider.py +120 -0
  1006. package/runtime/core/llm/redact.py +142 -0
  1007. package/runtime/core/llm/registry/__init__.py +50 -0
  1008. package/runtime/core/llm/registry/models.yaml +233 -0
  1009. package/runtime/core/llm/think_scrubber.py +232 -0
  1010. package/runtime/core/llm/tokenizer.py +150 -0
  1011. package/runtime/core/llm/usage_pricing.py +373 -0
  1012. package/runtime/core/sub_agents/__init__.py +11 -0
  1013. package/runtime/core/sub_agents/agents.yaml +477 -0
  1014. package/runtime/core/sub_agents/base.py +28 -0
  1015. package/runtime/core/sub_agents/builtin/__init__.py +1 -0
  1016. package/runtime/core/sub_agents/registry.py +96 -0
  1017. package/runtime/core/tokenizer.py +146 -0
  1018. package/runtime/gateway.py +14 -0
  1019. package/runtime/memory/__init__.py +11 -0
  1020. package/runtime/memory/context_memory.py +249 -0
  1021. package/runtime/memory/long_term/knowledge_graph/__init__.py +1 -0
  1022. package/runtime/memory/long_term/sqlite/__init__.py +104 -0
  1023. package/runtime/memory/long_term/vector_store/__init__.py +1 -0
  1024. package/runtime/memory/manager.py +144 -0
  1025. package/runtime/memory/provider.py +97 -0
  1026. package/runtime/memory/providers/long_term.py +143 -0
  1027. package/runtime/memory/providers/working.py +53 -0
  1028. package/runtime/memory/session/__init__.py +4 -0
  1029. package/runtime/memory/session/identity.py +48 -0
  1030. package/runtime/memory/session/session_context.py +23 -0
  1031. package/runtime/memory/session/session_store.py +1118 -0
  1032. package/runtime/memory/short_term/__init__.py +8 -0
  1033. package/runtime/memory/short_term/buffer.py +8 -0
  1034. package/runtime/memory/short_term/working.py +93 -0
  1035. package/runtime/memory/task_contracts/__init__.py +115 -0
  1036. package/runtime/orchestration/__init__.py +8 -0
  1037. package/runtime/orchestration/auto_cycle/__init__.py +486 -0
  1038. package/runtime/orchestration/auto_cycle/trigger.py +8 -0
  1039. package/runtime/orchestration/background_review.py +470 -0
  1040. package/runtime/orchestration/display.py +206 -0
  1041. package/runtime/orchestration/iteration_budget.py +98 -0
  1042. package/runtime/orchestration/loop/__init__.py +17 -0
  1043. package/runtime/orchestration/loop/completion_gate.py +156 -0
  1044. package/runtime/orchestration/loop/context_window.py +71 -0
  1045. package/runtime/orchestration/loop/main_loop.py +2014 -0
  1046. package/runtime/orchestration/loop/message_history.py +71 -0
  1047. package/runtime/orchestration/loop/progress_tracker.py +211 -0
  1048. package/runtime/orchestration/loop/run_trace.py +70 -0
  1049. package/runtime/orchestration/loop/tool_call_executor.py +214 -0
  1050. package/runtime/orchestration/loop/tool_execution_contract.py +134 -0
  1051. package/runtime/orchestration/loop/types.py +282 -0
  1052. package/runtime/orchestration/retry_engine.py +241 -0
  1053. package/runtime/orchestration/runtime/__init__.py +20 -0
  1054. package/runtime/orchestration/runtime/arbiter.py +85 -0
  1055. package/runtime/orchestration/runtime/checkpoint.py +148 -0
  1056. package/runtime/orchestration/runtime/error_policy.py +55 -0
  1057. package/runtime/orchestration/runtime/events.py +92 -0
  1058. package/runtime/orchestration/runtime/process_registry.py +605 -0
  1059. package/runtime/orchestration/runtime/resume_manager.py +283 -0
  1060. package/runtime/orchestration/runtime/retry_policy.py +26 -0
  1061. package/runtime/orchestration/runtime/status.py +60 -0
  1062. package/runtime/orchestration/runtime/types.py +74 -0
  1063. package/runtime/orchestration/scheduler/__init__.py +8 -0
  1064. package/runtime/orchestration/scheduler/master_scheduler.py +36 -0
  1065. package/runtime/orchestration/scheduler/task_graph.py +67 -0
  1066. package/runtime/orchestration/supervisor_loop.py +1041 -0
  1067. package/runtime/orchestration/tool_guardrails.py +249 -0
  1068. package/runtime/orchestration/tracer.py +403 -0
  1069. package/runtime/orchestration/verification/__init__.py +14 -0
  1070. package/runtime/orchestration/verification/completion.py +248 -0
  1071. package/runtime/orchestration/verification/task_acceptance.py +87 -0
  1072. package/runtime/orchestration/verification/tool_result.py +38 -0
  1073. package/runtime/orchestration/verification/worker_result.py +54 -0
  1074. package/runtime/perception/README.md +24 -0
  1075. package/runtime/perception/__init__.py +5 -0
  1076. package/runtime/perception/detectors/__init__.py +1 -0
  1077. package/runtime/perception/detectors/entity.py +86 -0
  1078. package/runtime/perception/detectors/intent.py +103 -0
  1079. package/runtime/perception/input/multimodal/__init__.py +1 -0
  1080. package/runtime/perception/input/streaming/__init__.py +1 -0
  1081. package/runtime/perception/input/text/__init__.py +1 -0
  1082. package/runtime/perception/preprocess/__init__.py +1 -0
  1083. package/scripts/check_llm_layer.py +16 -0
  1084. package/scripts/check_orchestration_layer.py +15 -0
  1085. package/scripts/clean-pycache.js +56 -0
  1086. package/scripts/init.js +187 -0
  1087. package/tools/__init__.py +1 -0
  1088. package/tools/mcp/clients/__init__.py +368 -0
  1089. package/tools/mcp/registry.py +538 -0
  1090. package/tools/mcp/servers/__init__.py +46 -0
  1091. package/tools/skill/__init__.py +4 -0
  1092. package/tools/skill/curator.py +368 -0
  1093. package/tools/skill/registry/__init__.py +11 -0
  1094. package/tools/skill/registry/registry.py +367 -0
  1095. package/tools/skill/registry/source_config.py +101 -0
  1096. package/tools/skill/skills/__init__.py +1 -0
  1097. package/tools/tool/__init__.py +12 -0
  1098. package/tools/tool/advanced_tools.py +307 -0
  1099. package/tools/tool/approval_workflow.py +216 -0
  1100. package/tools/tool/builtin.py +656 -0
  1101. package/tools/tool/config.py +191 -0
  1102. package/tools/tool/hermes_migrated.py +190 -0
  1103. package/tools/tool/implementations/__init__.py +1 -0
  1104. package/tools/tool/implementations/browser_use_provider.py +691 -0
  1105. package/tools/tool/implementations/extended_tools.py +260 -0
  1106. package/tools/tool/mcp_provider.py +95 -0
  1107. package/tools/tool/policy.py +65 -0
  1108. package/tools/tool/providers/base.py +115 -0
  1109. package/tools/tool/registry/__init__.py +183 -0
  1110. package/tools/tool/runtime.py +87 -0
  1111. package/tools/tool/schema.py +99 -0
  1112. package/tools/tool/skill_provider.py +164 -0
  1113. package/tools/tool/todo_provider.py +161 -0
  1114. package/tools/tool/tools.yaml +115 -0
@@ -0,0 +1,1297 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ maps_client.py - CLI tool for maps, geocoding, routing, POI search, and more.
4
+ Uses only Python stdlib. Data from OpenStreetMap/Nominatim, Overpass API, OSRM,
5
+ and TimeAPI.io.
6
+
7
+ Commands:
8
+ search - Geocode a place name to coordinates
9
+ reverse - Reverse geocode coordinates to an address
10
+ nearby - Find nearby POIs by category
11
+ distance - Road distance and travel time between two places
12
+ directions - Turn-by-turn directions between two places
13
+ timezone - Timezone info for coordinates
14
+ bbox - Find POIs within a bounding box
15
+ area - Get bounding box and area info for a named place
16
+ """
17
+
18
+ import argparse
19
+ import json
20
+ import math
21
+ import sys
22
+ import time
23
+ import urllib.error
24
+ import urllib.parse
25
+ import urllib.request
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # 常量
29
+ # ---------------------------------------------------------------------------
30
+
31
+ USER_AGENT = "HermesAgent/1.0 (contact: hermes@agent.ai)"
32
+ DATA_SOURCE = "OpenStreetMap/Nominatim"
33
+
34
+ NOMINATIM_SEARCH = "https://nominatim.openstreetmap.org/search"
35
+ NOMINATIM_REVERSE = "https://nominatim.openstreetmap.org/reverse"
36
+ # 公共 Overpass 端点。我们按顺序尝试,这样单个服务器
37
+ # 故障不会导致技能失效 —— kumi.systems 是一个知名的镜像。
38
+ OVERPASS_URLS = [
39
+ "https://overpass-api.de/api/interpreter",
40
+ "https://overpass.kumi.systems/api/interpreter",
41
+ ]
42
+ # 为直接导入 OVERPASS_API 的调用者提供向后兼容的别名。
43
+ OVERPASS_API = OVERPASS_URLS[0]
44
+ OSRM_BASE = "https://router.project-osrm.org/route/v1"
45
+ TIMEAPI_BASE = "https://timeapi.io/api/timezone/coordinate"
46
+
47
+ # Nominatim 请求之间的休眠秒数(服务条款要求)
48
+ NOMINATIM_RATE_LIMIT = 1.0
49
+
50
+ # HTTP 错误的最大重试次数
51
+ MAX_RETRIES = 3
52
+ RETRY_DELAY = 2.0 # 秒
53
+
54
+ # 类别 -> (OSM 标签键, OSM 标签值)
55
+ CATEGORY_TAGS = {
56
+ # 餐饮
57
+ "restaurant": ("amenity", "restaurant"),
58
+ "cafe": ("amenity", "cafe"),
59
+ "bar": ("amenity", "bar"),
60
+ # 在 OSM wiki 中,bakery 被标记为 shop=bakery,但一些制图者使用
61
+ # amenity=bakery。同时搜索两者,以免遗漏小型独立面包店。
62
+ "bakery": [("shop", "bakery"), ("amenity", "bakery")],
63
+ "convenience_store": ("shop", "convenience"),
64
+ # 健康
65
+ "hospital": ("amenity", "hospital"),
66
+ "pharmacy": ("amenity", "pharmacy"),
67
+ "dentist": ("amenity", "dentist"),
68
+ "doctor": ("amenity", "doctors"),
69
+ "veterinary": ("amenity", "veterinary"),
70
+ # 住宿
71
+ "hotel": ("tourism", "hotel"),
72
+ "guest_house": ("tourism", "guest_house"),
73
+ "camp_site": ("tourism", "camp_site"),
74
+ # 购物与服务
75
+ "supermarket": ("shop", "supermarket"),
76
+ "bookshop": ("shop", "books"),
77
+ "laundry": ("shop", "laundry"),
78
+ # 金融
79
+ "atm": ("amenity", "atm"),
80
+ "bank": ("amenity", "bank"),
81
+ # 交通
82
+ "gas_station": ("amenity", "fuel"),
83
+ "parking": ("amenity", "parking"),
84
+ "airport": ("aeroway", "aerodrome"),
85
+ "train_station": ("railway", "station"),
86
+ "bus_stop": ("highway", "bus_stop"),
87
+ "taxi": ("amenity", "taxi"),
88
+ "car_wash": ("amenity", "car_wash"),
89
+ "car_rental": ("amenity", "car_rental"),
90
+ "bicycle_rental": ("amenity", "bicycle_rental"),
91
+ # 文化与娱乐
92
+ "museum": ("tourism", "museum"),
93
+ "cinema": ("amenity", "cinema"),
94
+ "theatre": ("amenity", "theatre"),
95
+ "nightclub": ("amenity", "nightclub"),
96
+ "zoo": ("tourism", "zoo"),
97
+ # 教育
98
+ "school": ("amenity", "school"),
99
+ "university": ("amenity", "university"),
100
+ "library": ("amenity", "library"),
101
+ # 公共服务
102
+ "police": ("amenity", "police"),
103
+ "fire_station": ("amenity", "fire_station"),
104
+ "post_office": ("amenity", "post_office"),
105
+ # 宗教
106
+ "church": ("amenity", "place_of_worship"), # 由 religion 标签细化
107
+ "mosque": ("amenity", "place_of_worship"),
108
+ "synagogue": ("amenity", "place_of_worship"),
109
+ # 休闲
110
+ "park": ("leisure", "park"),
111
+ "gym": ("leisure", "fitness_centre"),
112
+ "swimming_pool": ("leisure", "swimming_pool"),
113
+ "playground": ("leisure", "playground"),
114
+ "stadium": ("leisure", "stadium"),
115
+ }
116
+
117
+ # 针对宗教场所 (place_of_worship) 类别的宗教特定覆盖设置
118
+ RELIGION_FILTER = {
119
+ "church": "christian",
120
+ "mosque": "muslim",
121
+ "synagogue": "jewish",
122
+ }
123
+
124
+ VALID_CATEGORIES = sorted(CATEGORY_TAGS.keys())
125
+
126
+
127
+ def _tags_for(category):
128
+ """Return the CATEGORY_TAGS entry as a list of (key, value) pairs.
129
+
130
+ Most categories map to a single (tag_key, tag_val) tuple, but some
131
+ (e.g. ``bakery``) are tagged under more than one OSM key and are
132
+ represented as a list of tuples. Normalise both forms to a list.
133
+ """
134
+ entry = CATEGORY_TAGS[category]
135
+ if isinstance(entry, list):
136
+ return list(entry)
137
+ return [entry]
138
+
139
+ OSRM_PROFILES = {
140
+ "driving": "driving",
141
+ "walking": "foot",
142
+ "cycling": "bike",
143
+ }
144
+
145
+ # ---------------------------------------------------------------------------
146
+ # 输出辅助函数
147
+ # ---------------------------------------------------------------------------
148
+
149
+ def print_json(data):
150
+ """Print data as pretty-printed JSON to stdout."""
151
+ print(json.dumps(data, indent=2, ensure_ascii=False))
152
+
153
+
154
+ def error_exit(message, code=1):
155
+ """Print an error result as JSON and exit."""
156
+ print_json({"error": message, "status": "error"})
157
+ sys.exit(code)
158
+
159
+
160
+ # ---------------------------------------------------------------------------
161
+ # HTTP 辅助函数
162
+ # ---------------------------------------------------------------------------
163
+
164
+ def http_get(url, params=None, retries=MAX_RETRIES, silent=False):
165
+ """
166
+ Perform an HTTP GET request, returning parsed JSON.
167
+ Adds the required User-Agent header. Retries on transient errors.
168
+ If silent=True, raises RuntimeError instead of calling error_exit.
169
+ """
170
+ if params:
171
+ url = url + "?" + urllib.parse.urlencode(params)
172
+
173
+ req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
174
+
175
+ last_error = None
176
+ for attempt in range(1, retries + 1):
177
+ try:
178
+ with urllib.request.urlopen(req, timeout=15) as resp:
179
+ raw = resp.read().decode("utf-8")
180
+ return json.loads(raw)
181
+ except urllib.error.HTTPError as exc:
182
+ last_error = f"HTTP {exc.code}: {exc.reason} for {url}"
183
+ if exc.code in {429, 503, 502, 504}:
184
+ time.sleep(RETRY_DELAY * attempt)
185
+ else:
186
+ if silent:
187
+ raise RuntimeError(last_error)
188
+ error_exit(last_error)
189
+ except urllib.error.URLError as exc:
190
+ last_error = f"URL error: {exc.reason}"
191
+ time.sleep(RETRY_DELAY * attempt)
192
+ except json.JSONDecodeError as exc:
193
+ last_error = f"JSON parse error: {exc}"
194
+ time.sleep(RETRY_DELAY * attempt)
195
+
196
+ msg = f"Request failed after {retries} attempts. Last error: {last_error}"
197
+ if silent:
198
+ raise RuntimeError(msg)
199
+ error_exit(msg)
200
+
201
+
202
+ def http_get_text(url, params=None, retries=MAX_RETRIES, silent=False):
203
+ """
204
+ Like http_get but returns raw text instead of parsed JSON.
205
+ Useful for APIs that may return non-JSON responses.
206
+ """
207
+ if params:
208
+ url = url + "?" + urllib.parse.urlencode(params)
209
+
210
+ req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
211
+
212
+ last_error = None
213
+ for attempt in range(1, retries + 1):
214
+ try:
215
+ with urllib.request.urlopen(req, timeout=15) as resp:
216
+ return resp.read().decode("utf-8")
217
+ except urllib.error.HTTPError as exc:
218
+ last_error = f"HTTP {exc.code}: {exc.reason} for {url}"
219
+ if exc.code in {429, 503, 502, 504}:
220
+ time.sleep(RETRY_DELAY * attempt)
221
+ else:
222
+ if silent:
223
+ raise RuntimeError(last_error)
224
+ error_exit(last_error)
225
+ except urllib.error.URLError as exc:
226
+ last_error = f"URL error: {exc.reason}"
227
+ time.sleep(RETRY_DELAY * attempt)
228
+
229
+ msg = f"Request failed after {retries} attempts. Last error: {last_error}"
230
+ if silent:
231
+ raise RuntimeError(msg)
232
+ error_exit(msg)
233
+
234
+
235
+ def http_post(url, data_str, retries=MAX_RETRIES):
236
+ """
237
+ Perform an HTTP POST with a plain-text body (for Overpass QL).
238
+ Returns parsed JSON.
239
+ """
240
+ encoded = data_str.encode("utf-8")
241
+ req = urllib.request.Request(
242
+ url,
243
+ data=encoded,
244
+ headers={
245
+ "User-Agent": USER_AGENT,
246
+ "Content-Type": "application/x-www-form-urlencoded",
247
+ },
248
+ )
249
+
250
+ last_error = None
251
+ for attempt in range(1, retries + 1):
252
+ try:
253
+ with urllib.request.urlopen(req, timeout=30) as resp:
254
+ raw = resp.read().decode("utf-8")
255
+ return json.loads(raw)
256
+ except urllib.error.HTTPError as exc:
257
+ last_error = f"HTTP {exc.code}: {exc.reason}"
258
+ if exc.code in {429, 503, 502, 504}:
259
+ time.sleep(RETRY_DELAY * attempt)
260
+ else:
261
+ error_exit(last_error)
262
+ except urllib.error.URLError as exc:
263
+ last_error = f"URL error: {exc.reason}"
264
+ time.sleep(RETRY_DELAY * attempt)
265
+ except json.JSONDecodeError as exc:
266
+ last_error = f"JSON parse error: {exc}"
267
+ time.sleep(RETRY_DELAY * attempt)
268
+
269
+ error_exit(f"POST failed after {retries} attempts. Last error: {last_error}")
270
+
271
+
272
+ def overpass_query(query):
273
+ """POST an Overpass QL query, trying each URL in OVERPASS_URLS in turn.
274
+
275
+ A single public Overpass mirror can be rate-limited or down; trying the
276
+ next mirror before giving up turns a flaky outage into a retry. Returns
277
+ parsed JSON. Falls through to error_exit if every mirror fails.
278
+ """
279
+ post_data = "data=" + urllib.parse.quote(query)
280
+ last_error = None
281
+ for url in OVERPASS_URLS:
282
+ try:
283
+ return http_post(url, post_data, retries=1)
284
+ except SystemExit:
285
+ # http_post 内部发生 error_exit —— 继续尝试下一个镜像。
286
+ last_error = f"mirror {url} exhausted retries"
287
+ continue
288
+ except Exception as exc:
289
+ last_error = f"{url}: {exc}"
290
+ continue
291
+ error_exit(
292
+ f"All Overpass mirrors failed. Last error: {last_error or 'unknown'}"
293
+ )
294
+
295
+
296
+ # ---------------------------------------------------------------------------
297
+ # 地理数学计算
298
+ # ---------------------------------------------------------------------------
299
+
300
+ def haversine_m(lat1, lon1, lat2, lon2):
301
+ """Return distance in metres between two lat/lon points (Haversine)."""
302
+ R = 6_371_000 # 地球平均半径(以米为单位)
303
+ phi1 = math.radians(lat1)
304
+ phi2 = math.radians(lat2)
305
+ dphi = math.radians(lat2 - lat1)
306
+ dlam = math.radians(lon2 - lon1)
307
+ a = (math.sin(dphi / 2) ** 2
308
+ + math.cos(phi1) * math.cos(phi2) * math.sin(dlam / 2) ** 2)
309
+ return 2 * R * math.atan2(math.sqrt(a), math.sqrt(1 - a))
310
+
311
+
312
+ # ---------------------------------------------------------------------------
313
+ # Nominatim 辅助函数
314
+ # ---------------------------------------------------------------------------
315
+
316
+ def nominatim_search(query, limit=5):
317
+ """Geocode a free-text query. Returns list of result dicts."""
318
+ params = {
319
+ "q": query,
320
+ "format": "json",
321
+ "limit": limit,
322
+ "addressdetails": 1,
323
+ }
324
+ time.sleep(NOMINATIM_RATE_LIMIT)
325
+ return http_get(NOMINATIM_SEARCH, params=params)
326
+
327
+
328
+ def nominatim_reverse(lat, lon):
329
+ """Reverse geocode lat/lon. Returns a single result dict."""
330
+ params = {
331
+ "lat": lat,
332
+ "lon": lon,
333
+ "format": "json",
334
+ "addressdetails": 1,
335
+ }
336
+ time.sleep(NOMINATIM_RATE_LIMIT)
337
+ return http_get(NOMINATIM_REVERSE, params=params)
338
+
339
+
340
+ def geocode_single(query):
341
+ """
342
+ Geocode a query and return (lat, lon, display_name).
343
+ Exits with error if nothing found.
344
+ """
345
+ results = nominatim_search(query, limit=1)
346
+ if not results:
347
+ error_exit(f"Could not geocode: {query}")
348
+ r = results[0]
349
+ return float(r["lat"]), float(r["lon"]), r.get("display_name", query)
350
+
351
+
352
+ # ---------------------------------------------------------------------------
353
+ # Overpass 辅助函数
354
+ # ---------------------------------------------------------------------------
355
+
356
+ def build_overpass_nearby(tag_key, tag_val, lat, lon, radius, limit,
357
+ religion=None, tag_pairs=None):
358
+ """Build an Overpass QL query for nearby POIs around a point.
359
+
360
+ If ``tag_pairs`` is provided, the query unions across every
361
+ ``(key, value)`` pair (used for categories like ``bakery`` that are
362
+ tagged under more than one OSM key). Otherwise falls back to the
363
+ single ``tag_key``/``tag_val`` pair for back-compat.
364
+ """
365
+ pairs = tag_pairs if tag_pairs else [(tag_key, tag_val)]
366
+ religion_filter = ""
367
+ if religion:
368
+ religion_filter = f'["religion"="{religion}"]'
369
+ body_lines = []
370
+ for k, v in pairs:
371
+ body_lines.append(
372
+ f' node["{k}"="{v}"]{religion_filter}'
373
+ f'(around:{radius},{lat},{lon});'
374
+ )
375
+ body_lines.append(
376
+ f' way["{k}"="{v}"]{religion_filter}'
377
+ f'(around:{radius},{lat},{lon});'
378
+ )
379
+ body = "\n".join(body_lines)
380
+ return (
381
+ f'[out:json][timeout:25];\n'
382
+ f'(\n'
383
+ f'{body}\n'
384
+ f');\n'
385
+ f'out center {limit};\n'
386
+ )
387
+
388
+
389
+ def build_overpass_bbox(tag_key, tag_val, south, west, north, east, limit,
390
+ religion=None, tag_pairs=None):
391
+ """Build an Overpass QL query for POIs within a bounding box.
392
+
393
+ See ``build_overpass_nearby`` for ``tag_pairs`` semantics.
394
+ """
395
+ pairs = tag_pairs if tag_pairs else [(tag_key, tag_val)]
396
+ religion_filter = ""
397
+ if religion:
398
+ religion_filter = f'["religion"="{religion}"]'
399
+ body_lines = []
400
+ for k, v in pairs:
401
+ body_lines.append(
402
+ f' node["{k}"="{v}"]{religion_filter}'
403
+ f'({south},{west},{north},{east});'
404
+ )
405
+ body_lines.append(
406
+ f' way["{k}"="{v}"]{religion_filter}'
407
+ f'({south},{west},{north},{east});'
408
+ )
409
+ body = "\n".join(body_lines)
410
+ return (
411
+ f'[out:json][timeout:25];\n'
412
+ f'(\n'
413
+ f'{body}\n'
414
+ f');\n'
415
+ f'out center {limit};\n'
416
+ )
417
+
418
+
419
+ def parse_overpass_elements(elements, ref_lat=None, ref_lon=None):
420
+ """
421
+ Parse Overpass elements into a clean list of POI dicts.
422
+ If ref_lat/ref_lon are provided, computes distance and sorts by it.
423
+ """
424
+ places = []
425
+ for el in elements:
426
+ # Ways 包含一个 "center" 子字典;nodes 直接具有 lat/lon
427
+ if el["type"] == "way":
428
+ center = el.get("center", {})
429
+ el_lat = center.get("lat")
430
+ el_lon = center.get("lon")
431
+ else:
432
+ el_lat = el.get("lat")
433
+ el_lon = el.get("lon")
434
+
435
+ if el_lat is None or el_lon is None:
436
+ continue
437
+
438
+ tags = el.get("tags", {})
439
+ name = tags.get("name") or tags.get("name:en") or ""
440
+
441
+ # 根据可用的标签构建简短地址
442
+ addr_parts = []
443
+ for part_key in ("addr:housenumber", "addr:street", "addr:city"):
444
+ val = tags.get(part_key)
445
+ if val:
446
+ addr_parts.append(val)
447
+ address_str = ", ".join(addr_parts) if addr_parts else ""
448
+
449
+ place = {
450
+ "name": name,
451
+ "address": address_str,
452
+ "lat": el_lat,
453
+ "lon": el_lon,
454
+ "osm_type": el.get("type", ""),
455
+ "osm_id": el.get("id", ""),
456
+ # 可点击的 Google 地图链接,以便代理能够渲染一个可点击打开的
457
+ # URL 在聊天中,而无需在下游拼接生成。
458
+ "maps_url": f"https://www.google.com/maps/search/?api=1&query={el_lat},{el_lon}",
459
+ "tags": {
460
+ k: v for k, v in tags.items()
461
+ if k not in {"name", "name:en",
462
+ "addr:housenumber", "addr:street", "addr:city"}
463
+ },
464
+ }
465
+
466
+ # 将常用且实用的标签提升为顶级字段,以便代理可以
467
+ # 直接引用它们,而无需深入原始的 ``tags`` 字典。
468
+ for src_key, dst_key in (
469
+ ("cuisine", "cuisine"),
470
+ ("opening_hours", "hours"),
471
+ ("phone", "phone"),
472
+ ("website", "website"),
473
+ ):
474
+ val = tags.get(src_key)
475
+ if val:
476
+ place[dst_key] = val
477
+
478
+ if ref_lat is not None and ref_lon is not None:
479
+ dist_m = haversine_m(ref_lat, ref_lon, el_lat, el_lon)
480
+ place["distance_m"] = round(dist_m, 1)
481
+ # 如果有参考点,我们还可以返回一个路线导航 URL。
482
+ place["directions_url"] = (
483
+ f"https://www.google.com/maps/dir/?api=1"
484
+ f"&origin={ref_lat},{ref_lon}"
485
+ f"&destination={el_lat},{el_lon}"
486
+ )
487
+
488
+ places.append(place)
489
+
490
+ # 如果可用,则按距离排序
491
+ if places and "distance_m" in places[0]:
492
+ places.sort(key=lambda p: p["distance_m"])
493
+
494
+ return places
495
+
496
+
497
+ # ---------------------------------------------------------------------------
498
+ # 命令:search
499
+ # ---------------------------------------------------------------------------
500
+
501
+ def cmd_search(args):
502
+ """Geocode a place name and return top results."""
503
+ query = " ".join(args.query)
504
+ raw = nominatim_search(query, limit=5)
505
+
506
+ if not raw:
507
+ print_json({
508
+ "query": query,
509
+ "results": [],
510
+ "count": 0,
511
+ "data_source": DATA_SOURCE,
512
+ })
513
+ return
514
+
515
+ results = []
516
+ for item in raw:
517
+ bb = item.get("boundingbox", [])
518
+ results.append({
519
+ "name": item.get("name") or item.get("display_name", ""),
520
+ "display_name": item.get("display_name", ""),
521
+ "lat": float(item["lat"]),
522
+ "lon": float(item["lon"]),
523
+ "type": item.get("type", ""),
524
+ "category": item.get("category", ""),
525
+ "osm_type": item.get("osm_type", ""),
526
+ "osm_id": item.get("osm_id", ""),
527
+ "bounding_box": {
528
+ "min_lat": float(bb[0]) if len(bb) > 0 else None,
529
+ "max_lat": float(bb[1]) if len(bb) > 1 else None,
530
+ "min_lon": float(bb[2]) if len(bb) > 2 else None,
531
+ "max_lon": float(bb[3]) if len(bb) > 3 else None,
532
+ },
533
+ "importance": item.get("importance"),
534
+ })
535
+
536
+ print_json({
537
+ "query": query,
538
+ "results": results,
539
+ "count": len(results),
540
+ "data_source": DATA_SOURCE,
541
+ })
542
+
543
+
544
+ # ---------------------------------------------------------------------------
545
+ # 命令:reverse
546
+ # ---------------------------------------------------------------------------
547
+
548
+ def cmd_reverse(args):
549
+ """Reverse geocode coordinates to a human-readable address."""
550
+ try:
551
+ lat = float(args.lat)
552
+ lon = float(args.lon)
553
+ except ValueError:
554
+ error_exit("LAT and LON must be numeric values.")
555
+
556
+ if not (-90 <= lat <= 90):
557
+ error_exit("Latitude must be between -90 and 90.")
558
+ if not (-180 <= lon <= 180):
559
+ error_exit("Longitude must be between -180 and 180.")
560
+
561
+ data = nominatim_reverse(lat, lon)
562
+
563
+ if "error" in data:
564
+ error_exit(f"Reverse geocode failed: {data['error']}")
565
+
566
+ address = data.get("address", {})
567
+
568
+ print_json({
569
+ "lat": lat,
570
+ "lon": lon,
571
+ "display_name": data.get("display_name", ""),
572
+ "address": {
573
+ "house_number": address.get("house_number", ""),
574
+ "road": address.get("road", ""),
575
+ "neighbourhood": address.get("neighbourhood", ""),
576
+ "suburb": address.get("suburb", ""),
577
+ "city": (address.get("city")
578
+ or address.get("town")
579
+ or address.get("village", "")),
580
+ "county": address.get("county", ""),
581
+ "state": address.get("state", ""),
582
+ "postcode": address.get("postcode", ""),
583
+ "country": address.get("country", ""),
584
+ "country_code": address.get("country_code", ""),
585
+ },
586
+ "osm_type": data.get("osm_type", ""),
587
+ "osm_id": data.get("osm_id", ""),
588
+ "data_source": DATA_SOURCE,
589
+ })
590
+
591
+
592
+ # ---------------------------------------------------------------------------
593
+ # 命令: nearby
594
+ # ---------------------------------------------------------------------------
595
+
596
+ def cmd_nearby(args):
597
+ """Find nearby POIs using the Overpass API.
598
+
599
+ Accepts either explicit coordinates (``lat``/``lon``) or a free-form
600
+ address via ``--near`` (auto-geocoded through Nominatim). Supports
601
+ multiple categories in one call — results are merged, deduplicated
602
+ by ``osm_type+osm_id``, sorted by distance.
603
+ """
604
+ # 解析中心点。如果提供,--near 优先,这样
605
+ # 代理就可以在一个命令中询问“时代广场附近的咖啡馆”,
606
+ # 而无需先进行地理编码。
607
+ if getattr(args, "near", None):
608
+ near_query = " ".join(args.near).strip() if isinstance(args.near, list) else str(args.near).strip()
609
+ if not near_query:
610
+ error_exit("--near must be a non-empty address or place name.")
611
+ lat, lon, _ = geocode_single(near_query)
612
+ else:
613
+ try:
614
+ lat = float(args.lat)
615
+ lon = float(args.lon)
616
+ except (TypeError, ValueError):
617
+ error_exit("Provide numeric LAT and LON, or use --near \"<address>\".")
618
+
619
+ # 分类:同时支持旧版单一位置参数 ``category`` 和
620
+ # 新版可重复使用的 ``--category`` 标志。用户可以在
621
+ # 一次查询中请求多种地点类型。
622
+ categories = []
623
+ if getattr(args, "category_list", None):
624
+ categories.extend(args.category_list)
625
+ if getattr(args, "category", None):
626
+ categories.append(args.category)
627
+ # 去重,保持顺序,转换为小写。
628
+ categories = list(dict.fromkeys(c.lower() for c in categories if c))
629
+ if not categories:
630
+ error_exit("Provide at least one category (positional or --category).")
631
+ unknown = [c for c in categories if c not in CATEGORY_TAGS]
632
+ if unknown:
633
+ error_exit(
634
+ f"Unknown categor{'ies' if len(unknown) > 1 else 'y'} "
635
+ f"{', '.join(repr(c) for c in unknown)}. "
636
+ f"Valid categories: {', '.join(VALID_CATEGORIES)}"
637
+ )
638
+
639
+ radius = int(args.radius)
640
+ limit = int(args.limit)
641
+ if radius <= 0:
642
+ error_exit("Radius must be a positive integer (metres).")
643
+ if limit <= 0:
644
+ error_exit("Limit must be a positive integer.")
645
+
646
+ # 在 Overpass 回退链中查询每个分类,合并结果,
647
+ # 通过 OSM 标识去重,从而避免在多个分类下标记的 POI
648
+ # 出现两次。
649
+ merged = {}
650
+ for category in categories:
651
+ tag_pairs = _tags_for(category)
652
+ religion = RELIGION_FILTER.get(category)
653
+ query = build_overpass_nearby(None, None, lat, lon, radius, limit,
654
+ religion=religion, tag_pairs=tag_pairs)
655
+ raw = overpass_query(query)
656
+ elements = raw.get("elements", [])
657
+ for place in parse_overpass_elements(elements, ref_lat=lat, ref_lon=lon):
658
+ place["category"] = category
659
+ key = (place.get("osm_type", ""), place.get("osm_id", ""))
660
+ # 优先选择实际附有 distance_m 的条目(第一次
661
+ # 经过 ref_lat/ref_lon 分支),然后以先见者为准。
662
+ if key not in merged:
663
+ merged[key] = place
664
+
665
+ # 当有参考经纬度时,按距离对合并结果排序,然后限制在 ``limit`` 以内。
666
+ places = sorted(
667
+ merged.values(),
668
+ key=lambda p: p.get("distance_m", float("inf")),
669
+ )[:limit]
670
+
671
+ print_json({
672
+ "center_lat": lat,
673
+ "center_lon": lon,
674
+ "categories": categories,
675
+ "radius_m": radius,
676
+ "count": len(places),
677
+ "results": places,
678
+ "data_source": DATA_SOURCE,
679
+ })
680
+
681
+
682
+ # ---------------------------------------------------------------------------
683
+ # 命令: distance
684
+ # ---------------------------------------------------------------------------
685
+
686
+ def cmd_distance(args):
687
+ """Calculate road distance and travel time between two places."""
688
+ origin_query = " ".join(args.origin)
689
+ destination_query = " ".join(args.to)
690
+ mode = args.mode.lower()
691
+
692
+ if mode not in OSRM_PROFILES:
693
+ error_exit(f"Invalid mode '{mode}'. Choose from: {', '.join(OSRM_PROFILES)}")
694
+
695
+ # 对起点和终点进行地理编码
696
+ o_lat, o_lon, o_name = geocode_single(origin_query)
697
+ d_lat, d_lon, d_name = geocode_single(destination_query)
698
+
699
+ profile = OSRM_PROFILES[mode]
700
+ url = (
701
+ f"{OSRM_BASE}/{profile}/"
702
+ f"{o_lon},{o_lat};{d_lon},{d_lat}"
703
+ f"?overview=false&steps=false"
704
+ )
705
+
706
+ osrm_data = http_get(url)
707
+
708
+ if osrm_data.get("code") != "Ok":
709
+ error_exit(
710
+ f"OSRM routing failed: "
711
+ f"{osrm_data.get('message', osrm_data.get('code', 'unknown error'))}"
712
+ )
713
+
714
+ routes = osrm_data.get("routes", [])
715
+ if not routes:
716
+ error_exit("No route found between the two locations.")
717
+
718
+ route = routes[0]
719
+ distance_m = route.get("distance", 0)
720
+ duration_s = route.get("duration", 0)
721
+ distance_km = round(distance_m / 1000, 3)
722
+ duration_min = round(duration_s / 60, 2)
723
+
724
+ # 参考用的直线距离
725
+ straight_m = haversine_m(o_lat, o_lon, d_lat, d_lon)
726
+
727
+ print_json({
728
+ "origin": {
729
+ "query": origin_query,
730
+ "display_name": o_name,
731
+ "lat": o_lat,
732
+ "lon": o_lon,
733
+ },
734
+ "destination": {
735
+ "query": destination_query,
736
+ "display_name": d_name,
737
+ "lat": d_lat,
738
+ "lon": d_lon,
739
+ },
740
+ "mode": mode,
741
+ "distance_km": distance_km,
742
+ "distance_m": round(distance_m, 1),
743
+ "duration_minutes": duration_min,
744
+ "duration_seconds": round(duration_s, 1),
745
+ "straight_line_km": round(straight_m / 1000, 3),
746
+ "data_source": DATA_SOURCE,
747
+ })
748
+
749
+
750
+ # ---------------------------------------------------------------------------
751
+ # 命令: directions
752
+ # ---------------------------------------------------------------------------
753
+
754
+ def _format_duration(seconds):
755
+ """Format seconds into a human-readable string."""
756
+ if seconds < 60:
757
+ return f"{round(seconds)}s"
758
+ minutes = seconds / 60
759
+ if minutes < 60:
760
+ return f"{round(minutes, 1)} min"
761
+ hours = int(minutes // 60)
762
+ remaining = round(minutes % 60)
763
+ return f"{hours}h {remaining}min"
764
+
765
+
766
+ def _format_distance(metres):
767
+ """Format metres into a human-readable string."""
768
+ if metres < 1000:
769
+ return f"{round(metres)} m"
770
+ return f"{round(metres / 1000, 2)} km"
771
+
772
+
773
+ def cmd_directions(args):
774
+ """Get turn-by-turn directions between two places via OSRM."""
775
+ origin_query = " ".join(args.origin)
776
+ destination_query = " ".join(args.to)
777
+ mode = args.mode.lower()
778
+
779
+ if mode not in OSRM_PROFILES:
780
+ error_exit(f"Invalid mode '{mode}'. Choose from: {', '.join(OSRM_PROFILES)}")
781
+
782
+ # 对起点和终点进行地理编码
783
+ o_lat, o_lon, o_name = geocode_single(origin_query)
784
+ d_lat, d_lon, d_name = geocode_single(destination_query)
785
+
786
+ profile = OSRM_PROFILES[mode]
787
+ url = (
788
+ f"{OSRM_BASE}/{profile}/"
789
+ f"{o_lon},{o_lat};{d_lon},{d_lat}"
790
+ f"?overview=false&steps=true"
791
+ )
792
+
793
+ osrm_data = http_get(url)
794
+
795
+ if osrm_data.get("code") != "Ok":
796
+ error_exit(
797
+ f"OSRM routing failed: "
798
+ f"{osrm_data.get('message', osrm_data.get('code', 'unknown error'))}"
799
+ )
800
+
801
+ routes = osrm_data.get("routes", [])
802
+ if not routes:
803
+ error_exit("No route found between the two locations.")
804
+
805
+ route = routes[0]
806
+ distance_m = route.get("distance", 0)
807
+ duration_s = route.get("duration", 0)
808
+
809
+ # 从所有路段提取步骤
810
+ steps = []
811
+ step_num = 0
812
+ for leg in route.get("legs", []):
813
+ for step in leg.get("steps", []):
814
+ maneuver = step.get("maneuver", {})
815
+ step_dist = step.get("distance", 0)
816
+ step_dur = step.get("duration", 0)
817
+ step_name = step.get("name", "")
818
+ modifier = maneuver.get("modifier", "")
819
+ m_type = maneuver.get("type", "")
820
+
821
+ # 生成导航指令文本
822
+ if m_type == "depart":
823
+ instruction = f"Depart on {step_name}" if step_name else "Depart"
824
+ elif m_type == "arrive":
825
+ instruction = "Arrive at destination"
826
+ elif m_type == "turn":
827
+ instruction = f"Turn {modifier} onto {step_name}" if step_name else f"Turn {modifier}"
828
+ elif m_type == "new name":
829
+ instruction = f"Continue onto {step_name}" if step_name else "Continue"
830
+ elif m_type == "merge":
831
+ instruction = f"Merge {modifier} onto {step_name}" if step_name else f"Merge {modifier}"
832
+ elif m_type == "fork":
833
+ instruction = f"Take the {modifier} fork onto {step_name}" if step_name else f"Take the {modifier} fork"
834
+ elif m_type == "roundabout":
835
+ instruction = f"Enter roundabout, exit onto {step_name}" if step_name else "Enter roundabout"
836
+ elif m_type == "rotary":
837
+ instruction = f"Enter rotary, exit onto {step_name}" if step_name else "Enter rotary"
838
+ elif m_type == "end of road":
839
+ instruction = f"At end of road, turn {modifier} onto {step_name}" if step_name else f"At end of road, turn {modifier}"
840
+ elif m_type == "continue":
841
+ instruction = f"Continue {modifier} on {step_name}" if step_name else f"Continue {modifier}"
842
+ elif m_type == "on ramp":
843
+ instruction = f"Take ramp onto {step_name}" if step_name else "Take ramp"
844
+ elif m_type == "off ramp":
845
+ instruction = f"Take exit onto {step_name}" if step_name else "Take exit"
846
+ else:
847
+ instruction = f"{m_type} {modifier} {step_name}".strip()
848
+
849
+ step_num += 1
850
+ steps.append({
851
+ "step": step_num,
852
+ "instruction": instruction,
853
+ "distance": _format_distance(step_dist),
854
+ "distance_m": round(step_dist, 1),
855
+ "duration": _format_duration(step_dur),
856
+ "duration_s": round(step_dur, 1),
857
+ "road_name": step_name,
858
+ "maneuver": m_type,
859
+ })
860
+
861
+ print_json({
862
+ "origin": {
863
+ "query": origin_query,
864
+ "display_name": o_name,
865
+ "lat": o_lat,
866
+ "lon": o_lon,
867
+ },
868
+ "destination": {
869
+ "query": destination_query,
870
+ "display_name": d_name,
871
+ "lat": d_lat,
872
+ "lon": d_lon,
873
+ },
874
+ "mode": mode,
875
+ "total_distance": _format_distance(distance_m),
876
+ "total_distance_m": round(distance_m, 1),
877
+ "total_duration": _format_duration(duration_s),
878
+ "total_duration_s": round(duration_s, 1),
879
+ "steps": steps,
880
+ "step_count": len(steps),
881
+ "data_source": DATA_SOURCE,
882
+ })
883
+
884
+
885
+ # ---------------------------------------------------------------------------
886
+ # 命令: timezone
887
+ # ---------------------------------------------------------------------------
888
+
889
+ def cmd_timezone(args):
890
+ """
891
+ Get timezone information for a lat/lon coordinate.
892
+
893
+ Strategy:
894
+ 1. Try TimeAPI.io (free, no key, supports coordinate-based lookup).
895
+ 2. Fallback: derive UTC offset approximation from longitude.
896
+ """
897
+ try:
898
+ lat = float(args.lat)
899
+ lon = float(args.lon)
900
+ except ValueError:
901
+ error_exit("LAT and LON must be numeric values.")
902
+
903
+ if not (-90 <= lat <= 90):
904
+ error_exit("Latitude must be between -90 and 90.")
905
+ if not (-180 <= lon <= 180):
906
+ error_exit("Longitude must be between -180 and 180.")
907
+
908
+ timezone_str = None
909
+ timezone_src = None
910
+ current_time = None
911
+ utc_offset = None
912
+
913
+ # --- 策略 1: TimeAPI.io 坐标查找 ---
914
+ try:
915
+ params = {"latitude": lat, "longitude": lon}
916
+ tz_data = http_get(TIMEAPI_BASE, params=params, silent=True)
917
+ if isinstance(tz_data, dict):
918
+ timezone_str = tz_data.get("timeZone")
919
+ current_time = tz_data.get("currentLocalTime")
920
+ # 如果可用,根据 currentUtcOffset 构建 utc_offset
921
+ offset_info = tz_data.get("currentUtcOffset", {})
922
+ if isinstance(offset_info, dict):
923
+ oh = offset_info.get("hours", 0)
924
+ om = abs(offset_info.get("minutes", 0))
925
+ os_ = offset_info.get("seconds", 0)
926
+ sign = "+" if oh >= 0 else "-"
927
+ utc_offset = f"{sign}{abs(oh):02d}:{om:02d}"
928
+ if os_:
929
+ utc_offset = f"{utc_offset}:{os_:02d}"
930
+ elif tz_data.get("standardUtcOffset"):
931
+ offset_info2 = tz_data["standardUtcOffset"]
932
+ if isinstance(offset_info2, dict):
933
+ oh = offset_info2.get("hours", 0)
934
+ om = abs(offset_info2.get("minutes", 0))
935
+ os_ = offset_info2.get("seconds", 0)
936
+ sign = "+" if oh >= 0 else "-"
937
+ utc_offset = f"{sign}{abs(oh):02d}:{om:02d}"
938
+ if os_:
939
+ utc_offset = f"{utc_offset}:{os_:02d}"
940
+ timezone_src = "timeapi.io"
941
+ except (RuntimeError, KeyError, TypeError):
942
+ pass # API 可能已宕机;继续尝试回退策略
943
+
944
+ # --- 策略 2: 基于经度的 UTC 偏移量估算 ---
945
+ if not timezone_str:
946
+ approx_offset_h = round(lon / 15)
947
+ if approx_offset_h >= 0:
948
+ utc_offset = f"+{approx_offset_h:02d}:00"
949
+ else:
950
+ utc_offset = f"-{abs(approx_offset_h):02d}:00"
951
+ timezone_str = f"UTC{utc_offset}"
952
+ timezone_src = "longitude approximation (longitude/15)"
953
+
954
+ print_json({
955
+ "lat": lat,
956
+ "lon": lon,
957
+ "timezone": timezone_str,
958
+ "utc_offset": utc_offset,
959
+ "current_time": current_time,
960
+ "source": timezone_src,
961
+ "data_source": DATA_SOURCE,
962
+ })
963
+
964
+
965
+ # ---------------------------------------------------------------------------
966
+ # 命令: bbox
967
+ # ---------------------------------------------------------------------------
968
+
969
+ def cmd_bbox(args):
970
+ """Find POIs within a bounding box using the Overpass API."""
971
+ try:
972
+ lat1 = float(args.lat1)
973
+ lon1 = float(args.lon1)
974
+ lat2 = float(args.lat2)
975
+ lon2 = float(args.lon2)
976
+ except ValueError:
977
+ error_exit("All coordinate arguments must be numeric values.")
978
+
979
+ # 规范化:南/西 < 北/东
980
+ south = min(lat1, lat2)
981
+ north = max(lat1, lat2)
982
+ west = min(lon1, lon2)
983
+ east = max(lon1, lon2)
984
+
985
+ category = args.category.lower()
986
+ if category not in CATEGORY_TAGS:
987
+ error_exit(
988
+ f"Unknown category '{category}'. "
989
+ f"Valid categories: {', '.join(VALID_CATEGORIES)}"
990
+ )
991
+
992
+ limit = int(args.limit)
993
+ if limit <= 0:
994
+ error_exit("Limit must be a positive integer.")
995
+
996
+ tag_pairs = _tags_for(category)
997
+ religion = RELIGION_FILTER.get(category)
998
+ query = build_overpass_bbox(None, None, south, west, north, east,
999
+ limit, religion=religion, tag_pairs=tag_pairs)
1000
+
1001
+ raw = overpass_query(query)
1002
+
1003
+ elements = raw.get("elements", [])
1004
+
1005
+ # 使用 bbox 的中心作为距离排序的参考
1006
+ center_lat = (south + north) / 2
1007
+ center_lon = (west + east) / 2
1008
+ places = parse_overpass_elements(elements, ref_lat=center_lat,
1009
+ ref_lon=center_lon)
1010
+
1011
+ for p in places:
1012
+ p["category"] = category
1013
+
1014
+ print_json({
1015
+ "bounding_box": {
1016
+ "south": south,
1017
+ "west": west,
1018
+ "north": north,
1019
+ "east": east,
1020
+ },
1021
+ "category": category,
1022
+ "count": len(places),
1023
+ "results": places,
1024
+ "data_source": DATA_SOURCE,
1025
+ })
1026
+
1027
+
1028
+ # ---------------------------------------------------------------------------
1029
+ # 命令: area
1030
+ # ---------------------------------------------------------------------------
1031
+
1032
+ def cmd_area(args):
1033
+ """Get bounding box and area info for a named place."""
1034
+ query = " ".join(args.place)
1035
+ raw = nominatim_search(query, limit=1)
1036
+
1037
+ if not raw:
1038
+ error_exit(f"Could not find place: {query}")
1039
+
1040
+ item = raw[0]
1041
+ bb = item.get("boundingbox", [])
1042
+
1043
+ if len(bb) < 4:
1044
+ error_exit(f"No bounding box data available for: {query}")
1045
+
1046
+ min_lat = float(bb[0])
1047
+ max_lat = float(bb[1])
1048
+ min_lon = float(bb[2])
1049
+ max_lon = float(bb[3])
1050
+
1051
+ # 使用边界框估算面积(单位:平方公里)
1052
+ # 平均纬度处的宽度(单位:公里)
1053
+ avg_lat = (min_lat + max_lat) / 2
1054
+ height_km = haversine_m(min_lat, min_lon, max_lat, min_lon) / 1000
1055
+ width_km = haversine_m(avg_lat, min_lon, avg_lat, max_lon) / 1000
1056
+ approx_area_km2 = round(height_km * width_km, 3)
1057
+
1058
+ print_json({
1059
+ "query": query,
1060
+ "display_name": item.get("display_name", ""),
1061
+ "lat": float(item["lat"]),
1062
+ "lon": float(item["lon"]),
1063
+ "type": item.get("type", ""),
1064
+ "category": item.get("category", ""),
1065
+ "bounding_box": {
1066
+ "south": min_lat,
1067
+ "north": max_lat,
1068
+ "west": min_lon,
1069
+ "east": max_lon,
1070
+ },
1071
+ "dimensions": {
1072
+ "width_km": round(width_km, 3),
1073
+ "height_km": round(height_km, 3),
1074
+ },
1075
+ "approx_area_km2": approx_area_km2,
1076
+ "osm_type": item.get("osm_type", ""),
1077
+ "osm_id": item.get("osm_id", ""),
1078
+ "data_source": DATA_SOURCE,
1079
+ })
1080
+
1081
+
1082
+ # ---------------------------------------------------------------------------
1083
+ # CLI 设置
1084
+ # ---------------------------------------------------------------------------
1085
+
1086
+ def build_parser():
1087
+ parser = argparse.ArgumentParser(
1088
+ prog="maps_client.py",
1089
+ description=(
1090
+ "CLI maps tool: geocoding, reverse geocoding, POI search, "
1091
+ "routing, directions, timezone, and area lookup. "
1092
+ "Powered by OpenStreetMap, OSRM, Overpass, and TimeAPI.io. "
1093
+ "No API keys required."
1094
+ ),
1095
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1096
+ epilog=(
1097
+ "Examples:\n"
1098
+ " maps_client.py search Times Square\n"
1099
+ " maps_client.py reverse 40.758 -73.985\n"
1100
+ " maps_client.py nearby 40.758 -73.985 restaurant --radius 800\n"
1101
+ " maps_client.py distance New York --to Los Angeles --mode driving\n"
1102
+ " maps_client.py directions Paris --to Berlin --mode driving\n"
1103
+ " maps_client.py timezone 48.8566 2.3522\n"
1104
+ " maps_client.py bbox 40.70 -74.02 40.78 -73.95 restaurant\n"
1105
+ " maps_client.py area Manhattan"
1106
+ ),
1107
+ )
1108
+ sub = parser.add_subparsers(dest="command", required=True,
1109
+ metavar="COMMAND")
1110
+
1111
+ # -- search --
1112
+ p_search = sub.add_parser(
1113
+ "search",
1114
+ help="Geocode a place name to coordinates.",
1115
+ description="Search for a place by name and return coordinates and details.",
1116
+ )
1117
+ p_search.add_argument(
1118
+ "query", nargs="+",
1119
+ help="Place name or address to search.",
1120
+ )
1121
+
1122
+ # -- reverse --
1123
+ p_reverse = sub.add_parser(
1124
+ "reverse",
1125
+ help="Reverse geocode coordinates to an address.",
1126
+ description="Convert latitude/longitude coordinates to a human-readable address.",
1127
+ )
1128
+ p_reverse.add_argument("lat", help="Latitude (decimal degrees).")
1129
+ p_reverse.add_argument("lon", help="Longitude (decimal degrees).")
1130
+
1131
+ # -- nearby --
1132
+ p_nearby = sub.add_parser(
1133
+ "nearby",
1134
+ help="Find nearby places of a given category.",
1135
+ description=(
1136
+ "Find points of interest near a location using the Overpass API.\n"
1137
+ "Provide either LAT/LON, or use --near \"<address>\" to auto-geocode.\n"
1138
+ "Categories can be specified positionally OR repeated via --category\n"
1139
+ "to merge multiple types in one query (e.g. --category bar --category cafe).\n"
1140
+ f"Categories: {', '.join(VALID_CATEGORIES)}"
1141
+ ),
1142
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1143
+ )
1144
+ p_nearby.add_argument(
1145
+ "lat", nargs="?", default=None,
1146
+ help="Center latitude (decimal degrees). Omit if using --near.",
1147
+ )
1148
+ p_nearby.add_argument(
1149
+ "lon", nargs="?", default=None,
1150
+ help="Center longitude (decimal degrees). Omit if using --near.",
1151
+ )
1152
+ p_nearby.add_argument(
1153
+ "category", nargs="?", default=None,
1154
+ help="POI category (use --help for full list). Omit if using --category flags.",
1155
+ )
1156
+ p_nearby.add_argument(
1157
+ "--near", nargs="+", metavar="PLACE",
1158
+ help="Address, city, or landmark to search around (geocoded via Nominatim).",
1159
+ )
1160
+ p_nearby.add_argument(
1161
+ "--category", action="append", dest="category_list", default=[],
1162
+ metavar="CAT",
1163
+ help="POI category (repeatable — adds a type to the search).",
1164
+ )
1165
+ p_nearby.add_argument(
1166
+ "--radius", "-r",
1167
+ default=500, type=int, metavar="METRES",
1168
+ help="Search radius in metres (default: 500).",
1169
+ )
1170
+ p_nearby.add_argument(
1171
+ "--limit", "-n",
1172
+ default=10, type=int, metavar="N",
1173
+ help="Maximum number of results (default: 10).",
1174
+ )
1175
+
1176
+ # -- distance --
1177
+ p_dist = sub.add_parser(
1178
+ "distance",
1179
+ help="Calculate road distance and travel time.",
1180
+ description=(
1181
+ "Calculate road distance and estimated travel time between two places.\n"
1182
+ "Example: maps_client.py distance New York --to Los Angeles"
1183
+ ),
1184
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1185
+ )
1186
+ p_dist.add_argument(
1187
+ "origin", nargs="+",
1188
+ help="Origin address or place name.",
1189
+ )
1190
+ p_dist.add_argument(
1191
+ "--to", nargs="+", required=True, metavar="DEST",
1192
+ help="Destination address or place name (required).",
1193
+ )
1194
+ p_dist.add_argument(
1195
+ "--mode", "-m",
1196
+ default="driving",
1197
+ choices=list(OSRM_PROFILES.keys()),
1198
+ help="Travel mode (default: driving).",
1199
+ )
1200
+
1201
+ # -- directions --
1202
+ p_dir = sub.add_parser(
1203
+ "directions",
1204
+ help="Get turn-by-turn directions between two places.",
1205
+ description=(
1206
+ "Get step-by-step navigation directions between two places.\n"
1207
+ "Example: maps_client.py directions Paris --to Berlin --mode driving"
1208
+ ),
1209
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1210
+ )
1211
+ p_dir.add_argument(
1212
+ "origin", nargs="+",
1213
+ help="Origin address or place name.",
1214
+ )
1215
+ p_dir.add_argument(
1216
+ "--to", nargs="+", required=True, metavar="DEST",
1217
+ help="Destination address or place name (required).",
1218
+ )
1219
+ p_dir.add_argument(
1220
+ "--mode", "-m",
1221
+ default="driving",
1222
+ choices=list(OSRM_PROFILES.keys()),
1223
+ help="Travel mode (default: driving).",
1224
+ )
1225
+
1226
+ # -- timezone --
1227
+ p_tz = sub.add_parser(
1228
+ "timezone",
1229
+ help="Get timezone information for coordinates.",
1230
+ description="Look up timezone and current local time for a lat/lon coordinate.",
1231
+ )
1232
+ p_tz.add_argument("lat", help="Latitude (decimal degrees).")
1233
+ p_tz.add_argument("lon", help="Longitude (decimal degrees).")
1234
+
1235
+ # -- bbox --
1236
+ p_bbox = sub.add_parser(
1237
+ "bbox",
1238
+ help="Find POIs within a bounding box.",
1239
+ description=(
1240
+ "Search for points of interest within a geographic bounding box.\n"
1241
+ "Tip: use the 'area' command to find bounding boxes for named places.\n"
1242
+ f"Categories: {', '.join(VALID_CATEGORIES)}"
1243
+ ),
1244
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1245
+ )
1246
+ p_bbox.add_argument("lat1", help="First corner latitude.")
1247
+ p_bbox.add_argument("lon1", help="First corner longitude.")
1248
+ p_bbox.add_argument("lat2", help="Second corner latitude.")
1249
+ p_bbox.add_argument("lon2", help="Second corner longitude.")
1250
+ p_bbox.add_argument("category", help="POI category to search for.")
1251
+ p_bbox.add_argument(
1252
+ "--limit", "-n",
1253
+ default=20, type=int, metavar="N",
1254
+ help="Maximum number of results (default: 20).",
1255
+ )
1256
+
1257
+ # -- 区域 --
1258
+ p_area = sub.add_parser(
1259
+ "area",
1260
+ help="Get bounding box and area info for a named place.",
1261
+ description=(
1262
+ "Look up a place by name and return its bounding box, dimensions, "
1263
+ "and approximate area. Useful as input to the 'bbox' command."
1264
+ ),
1265
+ )
1266
+ p_area.add_argument(
1267
+ "place", nargs="+",
1268
+ help="Place name to look up (e.g., 'Manhattan' or 'downtown Seattle').",
1269
+ )
1270
+
1271
+ return parser
1272
+
1273
+
1274
+ def main():
1275
+ parser = build_parser()
1276
+ args = parser.parse_args()
1277
+
1278
+ dispatch = {
1279
+ "search": cmd_search,
1280
+ "reverse": cmd_reverse,
1281
+ "nearby": cmd_nearby,
1282
+ "distance": cmd_distance,
1283
+ "directions": cmd_directions,
1284
+ "timezone": cmd_timezone,
1285
+ "bbox": cmd_bbox,
1286
+ "area": cmd_area,
1287
+ }
1288
+
1289
+ handler = dispatch.get(args.command)
1290
+ if handler is None:
1291
+ error_exit(f"Unknown command: {args.command}")
1292
+
1293
+ handler(args)
1294
+
1295
+
1296
+ if __name__ == "__main__":
1297
+ main()