locus-assistant 1.0.3__py3-none-any.whl

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 (1053) hide show
  1. _deploy/windows/README.md +126 -0
  2. _deploy/windows/install.ps1 +626 -0
  3. _deploy/windows/locus-service.ps1 +208 -0
  4. _install_scripts/bg-orchestrator.sh +49 -0
  5. _install_scripts/build-extension.sh +60 -0
  6. _install_scripts/install-rust.sh +23 -0
  7. _install_scripts/install.sh +856 -0
  8. _install_scripts/locus-uninstall.sh +133 -0
  9. _install_scripts/locus-wrapper.sh +14 -0
  10. _install_scripts/pull-model.sh +57 -0
  11. _node_modules/claude_code_runner/index.mjs +131 -0
  12. _node_modules/claude_code_runner/package.json +8 -0
  13. _node_modules/whatsapp_baileys_bridge/package-lock.json +1351 -0
  14. _node_modules/whatsapp_baileys_bridge/package.json +17 -0
  15. _node_modules/whatsapp_baileys_bridge/src/bridge.ts +156 -0
  16. _node_modules/whatsapp_baileys_bridge/tsconfig.json +13 -0
  17. locus/__init__.py +35 -0
  18. locus/_rust_bridge.py +194 -0
  19. locus/a2a/__init__.py +16 -0
  20. locus/a2a/client.py +115 -0
  21. locus/a2a/protocol.py +116 -0
  22. locus/a2a/server.py +168 -0
  23. locus/a2a/tool.py +81 -0
  24. locus/agents/__init__.py +104 -0
  25. locus/agents/_stubs.py +510 -0
  26. locus/agents/channel_agent.py +154 -0
  27. locus/agents/claude_code.py +275 -0
  28. locus/agents/deep_research.py +382 -0
  29. locus/agents/digest_store.py +155 -0
  30. locus/agents/errors.py +116 -0
  31. locus/agents/executor.py +991 -0
  32. locus/agents/hybrid/README.md +101 -0
  33. locus/agents/hybrid/__init__.py +44 -0
  34. locus/agents/hybrid/_base.py +1478 -0
  35. locus/agents/hybrid/_energy.py +175 -0
  36. locus/agents/hybrid/_openai_retry.py +360 -0
  37. locus/agents/hybrid/_prices.py +73 -0
  38. locus/agents/hybrid/_prompts.py +68 -0
  39. locus/agents/hybrid/advisors.py +467 -0
  40. locus/agents/hybrid/archon.py +706 -0
  41. locus/agents/hybrid/baseline_cloud.py +192 -0
  42. locus/agents/hybrid/baseline_local.py +159 -0
  43. locus/agents/hybrid/conductor.py +1115 -0
  44. locus/agents/hybrid/mini_swe_agent.py +1598 -0
  45. locus/agents/hybrid/minions.py +802 -0
  46. locus/agents/hybrid/registry/advisors.toml +41 -0
  47. locus/agents/hybrid/registry/archon.toml +94 -0
  48. locus/agents/hybrid/registry/baseline_local.toml +82 -0
  49. locus/agents/hybrid/registry/conductor.toml +105 -0
  50. locus/agents/hybrid/registry/mini_swe_agent.toml +33 -0
  51. locus/agents/hybrid/registry/minions.toml +96 -0
  52. locus/agents/hybrid/registry/skillorchestra.toml +59 -0
  53. locus/agents/hybrid/registry/swe_agent_loop.toml +70 -0
  54. locus/agents/hybrid/registry/toolorchestra.toml +229 -0
  55. locus/agents/hybrid/runner.py +932 -0
  56. locus/agents/hybrid/scripts/new_experiment.sh +108 -0
  57. locus/agents/hybrid/skillorchestra/README.md +48 -0
  58. locus/agents/hybrid/skillorchestra/__init__.py +22 -0
  59. locus/agents/hybrid/skillorchestra/agent.py +186 -0
  60. locus/agents/hybrid/skillorchestra/handbook_seed.json +500 -0
  61. locus/agents/hybrid/skillorchestra/orchestrator.py +433 -0
  62. locus/agents/hybrid/skillorchestra/pool.py +176 -0
  63. locus/agents/hybrid/skillorchestra/prompts/__init__.py +49 -0
  64. locus/agents/hybrid/skillorchestra/prompts/eval_orchestrator.py +233 -0
  65. locus/agents/hybrid/skillorchestra/prompts/learning.py +448 -0
  66. locus/agents/hybrid/skillorchestra/prompts/model_routing.py +134 -0
  67. locus/agents/hybrid/skillorchestra/stage_router.py +530 -0
  68. locus/agents/hybrid/skillorchestra/tools.py +469 -0
  69. locus/agents/hybrid/skillorchestra/types.py +434 -0
  70. locus/agents/hybrid/skillorchestra.py +434 -0
  71. locus/agents/hybrid/toolorchestra.py +1979 -0
  72. locus/agents/loop_guard.py +243 -0
  73. locus/agents/manager.py +872 -0
  74. locus/agents/monitor_operative.py +758 -0
  75. locus/agents/morning_digest.py +243 -0
  76. locus/agents/native_openhands.py +439 -0
  77. locus/agents/native_react.py +367 -0
  78. locus/agents/opencode.py +610 -0
  79. locus/agents/openhands.py +96 -0
  80. locus/agents/operative.py +328 -0
  81. locus/agents/orchestrator.py +544 -0
  82. locus/agents/proactive_agent.py +693 -0
  83. locus/agents/prompt_loader.py +84 -0
  84. locus/agents/research_loop.py +885 -0
  85. locus/agents/rlm.py +520 -0
  86. locus/agents/rlm_repl.py +247 -0
  87. locus/agents/scheduler.py +325 -0
  88. locus/agents/simple.py +36 -0
  89. locus/agents/templates/__init__.py +0 -0
  90. locus/agents/templates/code_reviewer.toml +48 -0
  91. locus/agents/templates/inbox_triager.toml +44 -0
  92. locus/agents/templates/personal_deep_research.toml +12 -0
  93. locus/agents/templates/research_monitor.toml +45 -0
  94. locus/agents/tool_resolver.py +508 -0
  95. locus/analytics/__init__.py +33 -0
  96. locus/analytics/aggregator.py +186 -0
  97. locus/analytics/bridge.py +222 -0
  98. locus/analytics/client.py +146 -0
  99. locus/analytics/events.py +407 -0
  100. locus/analytics/identity.py +49 -0
  101. locus/analytics/redaction.py +106 -0
  102. locus/bench/__init__.py +29 -0
  103. locus/bench/_stats.py +35 -0
  104. locus/bench/_stubs.py +156 -0
  105. locus/bench/energy.py +184 -0
  106. locus/bench/latency.py +92 -0
  107. locus/bench/throughput.py +100 -0
  108. locus/channels/__init__.py +58 -0
  109. locus/channels/_stubs.py +98 -0
  110. locus/channels/bluebubbles.py +134 -0
  111. locus/channels/discord_channel.py +340 -0
  112. locus/channels/email_channel.py +243 -0
  113. locus/channels/feishu.py +165 -0
  114. locus/channels/gmail.py +305 -0
  115. locus/channels/google_chat.py +127 -0
  116. locus/channels/imessage_daemon.py +205 -0
  117. locus/channels/irc_channel.py +145 -0
  118. locus/channels/line_channel.py +156 -0
  119. locus/channels/mastodon_channel.py +157 -0
  120. locus/channels/matrix_channel.py +141 -0
  121. locus/channels/mattermost.py +138 -0
  122. locus/channels/messenger_channel.py +136 -0
  123. locus/channels/nostr_channel.py +164 -0
  124. locus/channels/reddit_channel.py +171 -0
  125. locus/channels/rocketchat_channel.py +169 -0
  126. locus/channels/sendblue.py +228 -0
  127. locus/channels/signal_channel.py +133 -0
  128. locus/channels/slack.py +226 -0
  129. locus/channels/slack_daemon.py +225 -0
  130. locus/channels/teams.py +145 -0
  131. locus/channels/telegram.py +456 -0
  132. locus/channels/twilio_sms.py +140 -0
  133. locus/channels/twitch_channel.py +164 -0
  134. locus/channels/twitter_channel.py +343 -0
  135. locus/channels/viber_channel.py +146 -0
  136. locus/channels/webchat.py +114 -0
  137. locus/channels/webhook.py +143 -0
  138. locus/channels/whatsapp.py +143 -0
  139. locus/channels/whatsapp_baileys.py +341 -0
  140. locus/channels/whatsapp_baileys_bridge/package-lock.json +1351 -0
  141. locus/channels/whatsapp_baileys_bridge/package.json +17 -0
  142. locus/channels/whatsapp_baileys_bridge/src/bridge.ts +156 -0
  143. locus/channels/whatsapp_baileys_bridge/tsconfig.json +13 -0
  144. locus/channels/xmpp_channel.py +153 -0
  145. locus/channels/zulip_channel.py +169 -0
  146. locus/cli/__init__.py +221 -0
  147. locus/cli/__main__.py +6 -0
  148. locus/cli/_analytics_consent.py +66 -0
  149. locus/cli/_banner.py +39 -0
  150. locus/cli/_bg_state.py +88 -0
  151. locus/cli/_bootstrap.py +249 -0
  152. locus/cli/_chat_banner.py +29 -0
  153. locus/cli/_chat_notifications.py +48 -0
  154. locus/cli/_first_run.py +48 -0
  155. locus/cli/_install_detect.py +88 -0
  156. locus/cli/_model_switch.py +138 -0
  157. locus/cli/_runtime_panel.py +167 -0
  158. locus/cli/_screen.py +79 -0
  159. locus/cli/_tool_names.py +40 -0
  160. locus/cli/_version_check.py +223 -0
  161. locus/cli/_voice_chat.py +214 -0
  162. locus/cli/add_cmd.py +138 -0
  163. locus/cli/agent_cmd.py +884 -0
  164. locus/cli/ask.py +1248 -0
  165. locus/cli/auth_cmd.py +71 -0
  166. locus/cli/bench_cmd.py +489 -0
  167. locus/cli/channel_cmd.py +266 -0
  168. locus/cli/channels_cmd.py +163 -0
  169. locus/cli/chat_cmd.py +520 -0
  170. locus/cli/compose_cmd.py +483 -0
  171. locus/cli/config_cmd.py +405 -0
  172. locus/cli/connect_cmd.py +227 -0
  173. locus/cli/daemon_cmd.py +563 -0
  174. locus/cli/dashboard.py +167 -0
  175. locus/cli/deep_research_setup_cmd.py +458 -0
  176. locus/cli/digest_cmd.py +292 -0
  177. locus/cli/doctor_cmd.py +464 -0
  178. locus/cli/eval_cmd.py +620 -0
  179. locus/cli/feedback_cmd.py +198 -0
  180. locus/cli/gateway_cmd.py +103 -0
  181. locus/cli/gui_cmd.py +611 -0
  182. locus/cli/hints.py +52 -0
  183. locus/cli/host_cmd.py +415 -0
  184. locus/cli/init_cmd.py +581 -0
  185. locus/cli/log_config.py +87 -0
  186. locus/cli/memory_cmd.py +335 -0
  187. locus/cli/mine_cmd.py +993 -0
  188. locus/cli/model.py +720 -0
  189. locus/cli/operators_cmd.py +286 -0
  190. locus/cli/optimize_cmd.py +513 -0
  191. locus/cli/pearl_cmd.py +149 -0
  192. locus/cli/quickstart_cmd.py +160 -0
  193. locus/cli/registry_cmd.py +146 -0
  194. locus/cli/scan_cmd.py +670 -0
  195. locus/cli/scheduler_cmd.py +336 -0
  196. locus/cli/self_update_cmd.py +166 -0
  197. locus/cli/serve.py +801 -0
  198. locus/cli/skill_cmd.py +733 -0
  199. locus/cli/telemetry_cmd.py +232 -0
  200. locus/cli/tool_cmd.py +107 -0
  201. locus/cli/tunnel_cmd.py +71 -0
  202. locus/cli/vault_cmd.py +140 -0
  203. locus/cli/workflow_cmd.py +70 -0
  204. locus/connectors/__init__.py +144 -0
  205. locus/connectors/_stubs.py +115 -0
  206. locus/connectors/apple_calendar.py +441 -0
  207. locus/connectors/apple_contacts.py +482 -0
  208. locus/connectors/apple_health.py +419 -0
  209. locus/connectors/apple_music.py +251 -0
  210. locus/connectors/apple_notes.py +313 -0
  211. locus/connectors/attachment_store.py +180 -0
  212. locus/connectors/chunker.py +398 -0
  213. locus/connectors/dropbox.py +375 -0
  214. locus/connectors/embedding_store.py +179 -0
  215. locus/connectors/embeddings.py +186 -0
  216. locus/connectors/gcalendar.py +563 -0
  217. locus/connectors/gcontacts.py +360 -0
  218. locus/connectors/gdrive.py +383 -0
  219. locus/connectors/github_notifications.py +126 -0
  220. locus/connectors/gmail.py +687 -0
  221. locus/connectors/gmail_imap.py +523 -0
  222. locus/connectors/google_auth.py +130 -0
  223. locus/connectors/google_tasks.py +133 -0
  224. locus/connectors/granola.py +460 -0
  225. locus/connectors/hackernews.py +91 -0
  226. locus/connectors/hybrid_search.py +778 -0
  227. locus/connectors/imap.py +282 -0
  228. locus/connectors/imessage.py +286 -0
  229. locus/connectors/news_rss.py +379 -0
  230. locus/connectors/notion.py +439 -0
  231. locus/connectors/oauth.py +739 -0
  232. locus/connectors/obsidian.py +235 -0
  233. locus/connectors/oura.py +103 -0
  234. locus/connectors/outlook.py +58 -0
  235. locus/connectors/pipeline.py +318 -0
  236. locus/connectors/retriever.py +301 -0
  237. locus/connectors/scheduler.py +149 -0
  238. locus/connectors/slack_connector.py +703 -0
  239. locus/connectors/spotify.py +163 -0
  240. locus/connectors/store.py +585 -0
  241. locus/connectors/strava.py +181 -0
  242. locus/connectors/sync_engine.py +288 -0
  243. locus/connectors/weather.py +248 -0
  244. locus/connectors/whatsapp.py +299 -0
  245. locus/core/__init__.py +47 -0
  246. locus/core/config.py +2524 -0
  247. locus/core/credentials.py +231 -0
  248. locus/core/events.py +212 -0
  249. locus/core/paths.py +122 -0
  250. locus/core/registry.py +189 -0
  251. locus/core/types.py +317 -0
  252. locus/core/utils.py +193 -0
  253. locus/daemon/__init__.py +1 -0
  254. locus/daemon/gateway.py +39 -0
  255. locus/daemon/service.py +57 -0
  256. locus/daemon/session_expiry.py +33 -0
  257. locus/engine/__init__.py +50 -0
  258. locus/engine/_apple_fm_support.py +151 -0
  259. locus/engine/_async_loop.py +60 -0
  260. locus/engine/_base.py +130 -0
  261. locus/engine/_discovery.py +265 -0
  262. locus/engine/_http_async.py +128 -0
  263. locus/engine/_openai_compat.py +341 -0
  264. locus/engine/_stubs.py +140 -0
  265. locus/engine/apple_fm.py +580 -0
  266. locus/engine/apple_fm_shim.py +268 -0
  267. locus/engine/cloud.py +2116 -0
  268. locus/engine/gemma_cpp.py +179 -0
  269. locus/engine/litellm.py +150 -0
  270. locus/engine/multi.py +139 -0
  271. locus/engine/nexa_shim.py +164 -0
  272. locus/engine/nim.py +283 -0
  273. locus/engine/ollama.py +554 -0
  274. locus/engine/openai_compat_engines.py +61 -0
  275. locus/evals/__init__.py +1 -0
  276. locus/evals/__main__.py +6 -0
  277. locus/evals/backends/__init__.py +1 -0
  278. locus/evals/backends/_commit_util.py +34 -0
  279. locus/evals/backends/_endpoint_util.py +52 -0
  280. locus/evals/backends/external/__init__.py +6 -0
  281. locus/evals/backends/external/_runners/__init__.py +6 -0
  282. locus/evals/backends/external/_runners/hermes_runner.py +200 -0
  283. locus/evals/backends/external/_runners/openclaw_runner.mjs +142 -0
  284. locus/evals/backends/external/_subprocess_runner.py +324 -0
  285. locus/evals/backends/external/hermes_agent.py +134 -0
  286. locus/evals/backends/external/openclaw.py +122 -0
  287. locus/evals/backends/jarvis_agent.py +223 -0
  288. locus/evals/backends/jarvis_direct.py +147 -0
  289. locus/evals/backends/tb_agent.py +32 -0
  290. locus/evals/backends/terminalbench_native.py +277 -0
  291. locus/evals/cli.py +1800 -0
  292. locus/evals/comparison/__init__.py +5 -0
  293. locus/evals/comparison/make_configs.py +207 -0
  294. locus/evals/comparison/table_gen.py +424 -0
  295. locus/evals/comparison/third_party.py +170 -0
  296. locus/evals/configs/deepplanning-monitor-operative.toml +42 -0
  297. locus/evals/configs/framework_comparison/_template.toml +49 -0
  298. locus/evals/configs/framework_comparison/_third_party.toml +27 -0
  299. locus/evals/configs/full-suite.toml +63 -0
  300. locus/evals/configs/gaia-gemini-31-pro.toml +29 -0
  301. locus/evals/configs/gaia-gemma4-26b.toml +31 -0
  302. locus/evals/configs/gaia-gpt54.toml +29 -0
  303. locus/evals/configs/gaia-nemotron-nano.toml +30 -0
  304. locus/evals/configs/gaia-nemotron-super.toml +30 -0
  305. locus/evals/configs/gaia-nemotron3-super.toml +31 -0
  306. locus/evals/configs/gaia-qwen-122b.toml +30 -0
  307. locus/evals/configs/gaia-qwen-27b.toml +30 -0
  308. locus/evals/configs/gaia-qwen-2b.toml +31 -0
  309. locus/evals/configs/gaia-qwen-35b.toml +30 -0
  310. locus/evals/configs/gaia-qwen-9b.toml +31 -0
  311. locus/evals/configs/gaia-qwen122b.toml +30 -0
  312. locus/evals/configs/gaia-qwen35b.toml +30 -0
  313. locus/evals/configs/gaia-rerun-claude-opus.toml +29 -0
  314. locus/evals/configs/gaia-rerun-claude-sonnet.toml +29 -0
  315. locus/evals/configs/gaia-rerun-glm47flash.toml +30 -0
  316. locus/evals/configs/gaia-rerun-gpt5mini.toml +29 -0
  317. locus/evals/configs/gaia-rerun-minimax-m25.toml +30 -0
  318. locus/evals/configs/gaia-rerun-qwen122b.toml +32 -0
  319. locus/evals/configs/gaia-rerun-qwen35b.toml +30 -0
  320. locus/evals/configs/gaia-rerun-qwen397b.toml +30 -0
  321. locus/evals/configs/gaia-trinity-large.toml +34 -0
  322. locus/evals/configs/glm-4.7-flash-openhands-remaining.toml +60 -0
  323. locus/evals/configs/glm-4.7-flash-openhands.toml +69 -0
  324. locus/evals/configs/glm-4.7-fp8-openhands-gaia.toml +43 -0
  325. locus/evals/configs/glm5-fp8-monitor-operative.toml +74 -0
  326. locus/evals/configs/kimi-k2.5-monitor-operative.toml +74 -0
  327. locus/evals/configs/livecodebench-claude-opus.toml +30 -0
  328. locus/evals/configs/livecodebench-gemma4-26b.toml +30 -0
  329. locus/evals/configs/livecodebench-gemma4-e4b.toml +30 -0
  330. locus/evals/configs/livecodebench-kimi-k25.toml +39 -0
  331. locus/evals/configs/livecodebench-minimax-m25.toml +36 -0
  332. locus/evals/configs/livecodebench-nemotron-nano.toml +30 -0
  333. locus/evals/configs/livecodebench-nemotron-super.toml +28 -0
  334. locus/evals/configs/livecodebench-qwen-122b.toml +28 -0
  335. locus/evals/configs/livecodebench-qwen-27b.toml +30 -0
  336. locus/evals/configs/livecodebench-qwen-2b.toml +30 -0
  337. locus/evals/configs/livecodebench-qwen-35b.toml +28 -0
  338. locus/evals/configs/livecodebench-qwen-9b.toml +30 -0
  339. locus/evals/configs/liveresearch-claude-opus.toml +29 -0
  340. locus/evals/configs/liveresearch-gemini-31-pro.toml +29 -0
  341. locus/evals/configs/liveresearch-gemma4-26b.toml +31 -0
  342. locus/evals/configs/liveresearch-gemma4-31b.toml +30 -0
  343. locus/evals/configs/liveresearch-gpt54.toml +29 -0
  344. locus/evals/configs/liveresearch-granite-3.3-8b-lora.toml +30 -0
  345. locus/evals/configs/liveresearch-granite-3.3-8b.toml +30 -0
  346. locus/evals/configs/liveresearch-granite-4.0-h-small.toml +30 -0
  347. locus/evals/configs/liveresearch-granite-4.0-micro.toml +30 -0
  348. locus/evals/configs/liveresearch-nemotron-nano.toml +30 -0
  349. locus/evals/configs/liveresearch-nemotron-super.toml +30 -0
  350. locus/evals/configs/liveresearch-qwen-122b.toml +30 -0
  351. locus/evals/configs/liveresearch-qwen-27b-lora-r32.toml +30 -0
  352. locus/evals/configs/liveresearch-qwen-27b.toml +30 -0
  353. locus/evals/configs/liveresearch-qwen-2b-lora-r16.toml +31 -0
  354. locus/evals/configs/liveresearch-qwen-2b-lora-r32.toml +31 -0
  355. locus/evals/configs/liveresearch-qwen-2b-mixed.toml +31 -0
  356. locus/evals/configs/liveresearch-qwen-2b-trackb.toml +31 -0
  357. locus/evals/configs/liveresearch-qwen-2b.toml +31 -0
  358. locus/evals/configs/liveresearch-qwen-35b.toml +30 -0
  359. locus/evals/configs/liveresearch-qwen-9b-lora-r32.toml +31 -0
  360. locus/evals/configs/liveresearch-qwen-9b-mixed.toml +31 -0
  361. locus/evals/configs/liveresearch-qwen-9b-trackb.toml +31 -0
  362. locus/evals/configs/liveresearch-qwen-9b.toml +31 -0
  363. locus/evals/configs/liveresearch-trinity-large.toml +34 -0
  364. locus/evals/configs/liveresearchbench-qwen-27b.toml +31 -0
  365. locus/evals/configs/liveresearchbench-qwen-2b.toml +31 -0
  366. locus/evals/configs/liveresearchbench-qwen-9b.toml +31 -0
  367. locus/evals/configs/long-horizon-claude-opus.toml +51 -0
  368. locus/evals/configs/long-horizon-claude-sonnet.toml +51 -0
  369. locus/evals/configs/long-horizon-glm47flash.toml +58 -0
  370. locus/evals/configs/long-horizon-gpt5mini.toml +51 -0
  371. locus/evals/configs/long-horizon-kimik25.toml +60 -0
  372. locus/evals/configs/long-horizon-minimax-m25.toml +58 -0
  373. locus/evals/configs/long-horizon-qwen122b.toml +58 -0
  374. locus/evals/configs/long-horizon-qwen35b.toml +58 -0
  375. locus/evals/configs/long-horizon-qwen397b.toml +58 -0
  376. locus/evals/configs/minimal.toml +7 -0
  377. locus/evals/configs/paperarena-monitor-operative.toml +42 -0
  378. locus/evals/configs/pinchbench-claude-opus.toml +35 -0
  379. locus/evals/configs/pinchbench-gemini-31-pro.toml +35 -0
  380. locus/evals/configs/pinchbench-gemma4-26b.toml +35 -0
  381. locus/evals/configs/pinchbench-gemma4-e4b.toml +35 -0
  382. locus/evals/configs/pinchbench-gpt54.toml +34 -0
  383. locus/evals/configs/pinchbench-kimi-k25.toml +44 -0
  384. locus/evals/configs/pinchbench-minimax-m25.toml +41 -0
  385. locus/evals/configs/pinchbench-nemotron-nano.toml +35 -0
  386. locus/evals/configs/pinchbench-nemotron-super.toml +34 -0
  387. locus/evals/configs/pinchbench-nemotron3-super.toml +35 -0
  388. locus/evals/configs/pinchbench-qwen-122b.toml +34 -0
  389. locus/evals/configs/pinchbench-qwen-27b.toml +35 -0
  390. locus/evals/configs/pinchbench-qwen-2b.toml +35 -0
  391. locus/evals/configs/pinchbench-qwen-35b.toml +34 -0
  392. locus/evals/configs/pinchbench-qwen-9b.toml +35 -0
  393. locus/evals/configs/pinchbench-qwen122b.toml +35 -0
  394. locus/evals/configs/pinchbench-qwen35b.toml +35 -0
  395. locus/evals/configs/pinchbench-qwen397b.toml +35 -0
  396. locus/evals/configs/pinchbench.toml +26 -0
  397. locus/evals/configs/qwen3.5-122b-kg-agentic.toml +42 -0
  398. locus/evals/configs/qwen3.5-122b-kg-hightoken.toml +38 -0
  399. locus/evals/configs/qwen3.5-122b-reasoning-suite.toml +51 -0
  400. locus/evals/configs/qwen3.5-35b-kg.toml +38 -0
  401. locus/evals/configs/qwen3.5-35b-monitor-operative.toml +57 -0
  402. locus/evals/configs/qwen3.5-397b-monitor-operative.toml +42 -0
  403. locus/evals/configs/single-run.toml +31 -0
  404. locus/evals/configs/smoke_amd.toml +106 -0
  405. locus/evals/configs/smoke_apple.toml +79 -0
  406. locus/evals/configs/smoke_nvidia.toml +112 -0
  407. locus/evals/configs/taubench-claude-opus.toml +29 -0
  408. locus/evals/configs/taubench-gemini-31-pro.toml +30 -0
  409. locus/evals/configs/taubench-gemma4-26b.toml +31 -0
  410. locus/evals/configs/taubench-gemma4-e4b.toml +31 -0
  411. locus/evals/configs/taubench-gpt54.toml +29 -0
  412. locus/evals/configs/taubench-kimi-k25.toml +40 -0
  413. locus/evals/configs/taubench-minimax-m25.toml +37 -0
  414. locus/evals/configs/taubench-nemotron-nano.toml +31 -0
  415. locus/evals/configs/taubench-nemotron-super.toml +29 -0
  416. locus/evals/configs/taubench-nemotron3-super.toml +29 -0
  417. locus/evals/configs/taubench-qwen-122b.toml +29 -0
  418. locus/evals/configs/taubench-qwen-27b.toml +31 -0
  419. locus/evals/configs/taubench-qwen-2b.toml +31 -0
  420. locus/evals/configs/taubench-qwen-35b.toml +29 -0
  421. locus/evals/configs/taubench-qwen-9b.toml +31 -0
  422. locus/evals/configs/taubench-qwen122b.toml +28 -0
  423. locus/evals/configs/taubench-qwen35b.toml +28 -0
  424. locus/evals/configs/taubench-qwen397b.toml +30 -0
  425. locus/evals/configs/taubench-telecom-claude.toml +27 -0
  426. locus/evals/configs/taubench-telecom-gemma4-26b.toml +29 -0
  427. locus/evals/configs/taubench-telecom-gpt54.toml +27 -0
  428. locus/evals/configs/taubench-telecom-nemotron-nano.toml +28 -0
  429. locus/evals/configs/taubench-telecom-nemotron-super.toml +29 -0
  430. locus/evals/configs/taubench-telecom-nemotron.toml +28 -0
  431. locus/evals/configs/taubench-telecom-qwen-122b.toml +29 -0
  432. locus/evals/configs/taubench-telecom-qwen-27b.toml +28 -0
  433. locus/evals/configs/taubench-telecom-qwen-35b.toml +29 -0
  434. locus/evals/configs/taubench-telecom-qwen27b.toml +29 -0
  435. locus/evals/configs/taubench-telecom-qwen2b.toml +29 -0
  436. locus/evals/configs/taubench-telecom-qwen9b.toml +29 -0
  437. locus/evals/configs/taubench-telecom-trinity-large.toml +28 -0
  438. locus/evals/configs/terminalbench-native-qwen122b.toml +30 -0
  439. locus/evals/configs/terminalbench-qwen122b.toml +30 -0
  440. locus/evals/configs/toolcall15-claude-opus.toml +28 -0
  441. locus/evals/configs/toolcall15-gemma4-26b.toml +29 -0
  442. locus/evals/configs/toolcall15-gemma4-e4b.toml +29 -0
  443. locus/evals/configs/toolcall15-kimi-k25.toml +38 -0
  444. locus/evals/configs/toolcall15-minimax-m25.toml +35 -0
  445. locus/evals/configs/toolcall15-nemotron-nano.toml +29 -0
  446. locus/evals/configs/toolcall15-nemotron-super.toml +28 -0
  447. locus/evals/configs/toolcall15-qwen-122b.toml +28 -0
  448. locus/evals/configs/toolcall15-qwen-27b.toml +29 -0
  449. locus/evals/configs/toolcall15-qwen-2b.toml +29 -0
  450. locus/evals/configs/toolcall15-qwen-35b.toml +28 -0
  451. locus/evals/configs/toolcall15-qwen-9b.toml +29 -0
  452. locus/evals/configs/use_case_cloud_comparison.toml +78 -0
  453. locus/evals/configs/use_case_cloud_openhands.toml +93 -0
  454. locus/evals/configs/use_case_cloud_orchestrator.toml +93 -0
  455. locus/evals/configs/use_case_direct.toml +47 -0
  456. locus/evals/configs/use_case_ibm_granite.toml +56 -0
  457. locus/evals/configs/use_case_openhands.toml +57 -0
  458. locus/evals/configs/use_case_opensource_openhands.toml +101 -0
  459. locus/evals/configs/use_case_opensource_orchestrator.toml +101 -0
  460. locus/evals/configs/use_case_orchestrator.toml +57 -0
  461. locus/evals/configs/use_case_react.toml +57 -0
  462. locus/evals/configs/use_case_suite.toml +48 -0
  463. locus/evals/configs/use_case_v2_cloud.toml +64 -0
  464. locus/evals/configs/use_case_v2_granite.toml +52 -0
  465. locus/evals/configs/use_case_v2_local.toml +60 -0
  466. locus/evals/configs/use_case_v2_suite.toml +57 -0
  467. locus/evals/core/__init__.py +1 -0
  468. locus/evals/core/agentic_runner.py +904 -0
  469. locus/evals/core/backend.py +55 -0
  470. locus/evals/core/config.py +367 -0
  471. locus/evals/core/dataset.py +62 -0
  472. locus/evals/core/display.py +453 -0
  473. locus/evals/core/environment.py +67 -0
  474. locus/evals/core/event_recorder.py +98 -0
  475. locus/evals/core/export.py +505 -0
  476. locus/evals/core/pricing.py +17 -0
  477. locus/evals/core/runner.py +1423 -0
  478. locus/evals/core/scorer.py +55 -0
  479. locus/evals/core/splits.py +40 -0
  480. locus/evals/core/trace.py +355 -0
  481. locus/evals/core/tracker.py +34 -0
  482. locus/evals/core/types.py +328 -0
  483. locus/evals/datasets/__init__.py +1 -0
  484. locus/evals/datasets/adp.py +207 -0
  485. locus/evals/datasets/ama_bench.py +272 -0
  486. locus/evals/datasets/browser_assistant.py +445 -0
  487. locus/evals/datasets/coding_assistant.py +1632 -0
  488. locus/evals/datasets/coding_task.py +284 -0
  489. locus/evals/datasets/daily_digest.py +688 -0
  490. locus/evals/datasets/deepplanning.py +236 -0
  491. locus/evals/datasets/doc_qa.py +1106 -0
  492. locus/evals/datasets/email_triage.py +334 -0
  493. locus/evals/datasets/frames.py +141 -0
  494. locus/evals/datasets/gaia.py +179 -0
  495. locus/evals/datasets/generalthoughts.py +118 -0
  496. locus/evals/datasets/gpqa.py +146 -0
  497. locus/evals/datasets/hle.py +135 -0
  498. locus/evals/datasets/ipw_mixed.py +195 -0
  499. locus/evals/datasets/knowledge_base.py +227 -0
  500. locus/evals/datasets/lifelong_agent.py +517 -0
  501. locus/evals/datasets/livecodebench.py +286 -0
  502. locus/evals/datasets/liveresearch.py +198 -0
  503. locus/evals/datasets/liveresearchbench.py +190 -0
  504. locus/evals/datasets/loghub.py +259 -0
  505. locus/evals/datasets/math500.py +110 -0
  506. locus/evals/datasets/mmlu_pro.py +115 -0
  507. locus/evals/datasets/morning_brief.py +217 -0
  508. locus/evals/datasets/natural_reasoning.py +115 -0
  509. locus/evals/datasets/paperarena.py +170 -0
  510. locus/evals/datasets/pinchbench.py +220 -0
  511. locus/evals/datasets/research_mining.py +266 -0
  512. locus/evals/datasets/security_scanner.py +1074 -0
  513. locus/evals/datasets/simpleqa.py +129 -0
  514. locus/evals/datasets/supergpqa.py +128 -0
  515. locus/evals/datasets/swebench.py +174 -0
  516. locus/evals/datasets/swefficiency.py +173 -0
  517. locus/evals/datasets/taubench.py +275 -0
  518. locus/evals/datasets/terminalbench.py +123 -0
  519. locus/evals/datasets/terminalbench_native.py +187 -0
  520. locus/evals/datasets/terminalbench_v2_1.py +242 -0
  521. locus/evals/datasets/toolcall15.py +723 -0
  522. locus/evals/datasets/toolorchestra.py +171 -0
  523. locus/evals/datasets/webchorearena.py +267 -0
  524. locus/evals/datasets/wildchat.py +111 -0
  525. locus/evals/datasets/workarena.py +257 -0
  526. locus/evals/environments/__init__.py +5 -0
  527. locus/evals/environments/base.py +154 -0
  528. locus/evals/environments/lifelong_agent_env.py +1185 -0
  529. locus/evals/execution/__init__.py +1 -0
  530. locus/evals/execution/pinchbench_env.py +161 -0
  531. locus/evals/execution/taubench_env.py +409 -0
  532. locus/evals/execution/terminalbench_env.py +300 -0
  533. locus/evals/execution/terminalbench_v2_1_env.py +123 -0
  534. locus/evals/execution/webchorearena_env.py +777 -0
  535. locus/evals/execution/workarena_env.py +496 -0
  536. locus/evals/scorers/__init__.py +1 -0
  537. locus/evals/scorers/_checklist.py +172 -0
  538. locus/evals/scorers/ama_bench_judge.py +159 -0
  539. locus/evals/scorers/browser_assistant.py +236 -0
  540. locus/evals/scorers/coding_assistant.py +172 -0
  541. locus/evals/scorers/coding_task.py +142 -0
  542. locus/evals/scorers/daily_digest.py +169 -0
  543. locus/evals/scorers/deepplanning_scorer.py +89 -0
  544. locus/evals/scorers/doc_qa.py +186 -0
  545. locus/evals/scorers/email_triage.py +136 -0
  546. locus/evals/scorers/frames_judge.py +105 -0
  547. locus/evals/scorers/gaia_exact.py +167 -0
  548. locus/evals/scorers/gpqa_mcq.py +106 -0
  549. locus/evals/scorers/hle_judge.py +102 -0
  550. locus/evals/scorers/ipw_mixed.py +111 -0
  551. locus/evals/scorers/knowledge_base.py +118 -0
  552. locus/evals/scorers/lifelong_agent_scorer.py +931 -0
  553. locus/evals/scorers/livecodebench.py +256 -0
  554. locus/evals/scorers/liveresearch.py +432 -0
  555. locus/evals/scorers/liveresearchbench.py +228 -0
  556. locus/evals/scorers/loghub_scorer.py +83 -0
  557. locus/evals/scorers/mmlu_pro_mcq.py +106 -0
  558. locus/evals/scorers/morning_brief.py +128 -0
  559. locus/evals/scorers/paperarena_judge.py +162 -0
  560. locus/evals/scorers/pinchbench.py +578 -0
  561. locus/evals/scorers/reasoning_judge.py +166 -0
  562. locus/evals/scorers/research_mining.py +109 -0
  563. locus/evals/scorers/security_scanner.py +263 -0
  564. locus/evals/scorers/simpleqa_judge.py +142 -0
  565. locus/evals/scorers/supergpqa_mcq.py +106 -0
  566. locus/evals/scorers/swebench_harness.py +574 -0
  567. locus/evals/scorers/swebench_structural.py +71 -0
  568. locus/evals/scorers/swefficiency_structural.py +72 -0
  569. locus/evals/scorers/taubench.py +48 -0
  570. locus/evals/scorers/terminalbench_judge.py +109 -0
  571. locus/evals/scorers/terminalbench_native_structural.py +69 -0
  572. locus/evals/scorers/terminalbench_v2_1.py +258 -0
  573. locus/evals/scorers/toolcall15.py +606 -0
  574. locus/evals/scorers/webchorearena_scorer.py +94 -0
  575. locus/evals/scorers/wildchat_judge.py +173 -0
  576. locus/evals/scorers/workarena_scorer.py +88 -0
  577. locus/evals/skill_benchmark.py +508 -0
  578. locus/evals/tests/__init__.py +1 -0
  579. locus/evals/tests/conftest.py +154 -0
  580. locus/evals/tests/test_backends.py +287 -0
  581. locus/evals/tests/test_cli_endpoint.py +190 -0
  582. locus/evals/tests/test_cli_flags.py +19 -0
  583. locus/evals/tests/test_config.py +719 -0
  584. locus/evals/tests/test_display.py +152 -0
  585. locus/evals/tests/test_frames.py +111 -0
  586. locus/evals/tests/test_gaia.py +138 -0
  587. locus/evals/tests/test_runner.py +465 -0
  588. locus/evals/tests/test_supergpqa.py +105 -0
  589. locus/evals/tests/test_types.py +444 -0
  590. locus/evals/tests/test_wildchat.py +117 -0
  591. locus/evals/trackers/__init__.py +23 -0
  592. locus/evals/trackers/sheets_tracker.py +164 -0
  593. locus/evals/trackers/wandb_tracker.py +157 -0
  594. locus/intelligence/__init__.py +17 -0
  595. locus/intelligence/model_catalog.py +1233 -0
  596. locus/learning/__init__.py +90 -0
  597. locus/learning/_stubs.py +78 -0
  598. locus/learning/agents/__init__.py +3 -0
  599. locus/learning/agents/ace_optimizer.py +243 -0
  600. locus/learning/agents/agent_evolver.py +365 -0
  601. locus/learning/agents/dspy_optimizer.py +211 -0
  602. locus/learning/agents/gepa_optimizer.py +326 -0
  603. locus/learning/agents/skill_discovery.py +204 -0
  604. locus/learning/agents/skill_optimizer.py +314 -0
  605. locus/learning/intelligence/__init__.py +13 -0
  606. locus/learning/intelligence/grpo_trainer.py +373 -0
  607. locus/learning/intelligence/orchestrator/__init__.py +87 -0
  608. locus/learning/intelligence/orchestrator/environment.py +129 -0
  609. locus/learning/intelligence/orchestrator/grpo_trainer.py +491 -0
  610. locus/learning/intelligence/orchestrator/policy_model.py +280 -0
  611. locus/learning/intelligence/orchestrator/prompt_registry.py +345 -0
  612. locus/learning/intelligence/orchestrator/reward.py +217 -0
  613. locus/learning/intelligence/orchestrator/sft_trainer.py +415 -0
  614. locus/learning/intelligence/orchestrator/types.py +334 -0
  615. locus/learning/intelligence/sft_trainer.py +147 -0
  616. locus/learning/learning_orchestrator.py +256 -0
  617. locus/learning/optimize/__init__.py +61 -0
  618. locus/learning/optimize/config.py +102 -0
  619. locus/learning/optimize/configs/qwen3-235b-dry-run.toml +90 -0
  620. locus/learning/optimize/configs/qwen3.5-joint-agentic.toml +91 -0
  621. locus/learning/optimize/feedback/__init__.py +6 -0
  622. locus/learning/optimize/feedback/collector.py +120 -0
  623. locus/learning/optimize/feedback/judge.py +119 -0
  624. locus/learning/optimize/llm_optimizer.py +661 -0
  625. locus/learning/optimize/optimizer.py +437 -0
  626. locus/learning/optimize/personal/__init__.py +17 -0
  627. locus/learning/optimize/personal/dataset.py +54 -0
  628. locus/learning/optimize/personal/scorer.py +50 -0
  629. locus/learning/optimize/personal/synthesizer.py +119 -0
  630. locus/learning/optimize/search_space.py +200 -0
  631. locus/learning/optimize/store.py +508 -0
  632. locus/learning/optimize/trial_runner.py +403 -0
  633. locus/learning/optimize/types.py +253 -0
  634. locus/learning/routing/__init__.py +3 -0
  635. locus/learning/routing/_utils.py +34 -0
  636. locus/learning/routing/complexity.py +281 -0
  637. locus/learning/routing/heuristic_policy.py +15 -0
  638. locus/learning/routing/heuristic_reward.py +56 -0
  639. locus/learning/routing/learned_router.py +236 -0
  640. locus/learning/routing/router.py +201 -0
  641. locus/learning/spec_search/__init__.py +1 -0
  642. locus/learning/spec_search/checkpoint/__init__.py +1 -0
  643. locus/learning/spec_search/checkpoint/store.py +255 -0
  644. locus/learning/spec_search/composite_reward.py +97 -0
  645. locus/learning/spec_search/diagnose/__init__.py +1 -0
  646. locus/learning/spec_search/diagnose/runner.py +318 -0
  647. locus/learning/spec_search/diagnose/teacher_agent.py +269 -0
  648. locus/learning/spec_search/diagnose/tools.py +544 -0
  649. locus/learning/spec_search/diagnose/types.py +129 -0
  650. locus/learning/spec_search/execute/__init__.py +1 -0
  651. locus/learning/spec_search/execute/appliers/__init__.py +6 -0
  652. locus/learning/spec_search/execute/appliers/agent.py +226 -0
  653. locus/learning/spec_search/execute/appliers/intelligence.py +117 -0
  654. locus/learning/spec_search/execute/appliers/lora_stub.py +38 -0
  655. locus/learning/spec_search/execute/appliers/tools.py +159 -0
  656. locus/learning/spec_search/execute/base.py +95 -0
  657. locus/learning/spec_search/execute/loop.py +194 -0
  658. locus/learning/spec_search/external_adapter.py +70 -0
  659. locus/learning/spec_search/gate/__init__.py +1 -0
  660. locus/learning/spec_search/gate/benchmark_gate.py +131 -0
  661. locus/learning/spec_search/gate/cold_start.py +109 -0
  662. locus/learning/spec_search/gate/regression.py +60 -0
  663. locus/learning/spec_search/models.py +372 -0
  664. locus/learning/spec_search/multi_session.py +129 -0
  665. locus/learning/spec_search/orchestrator.py +463 -0
  666. locus/learning/spec_search/pending_queue.py +75 -0
  667. locus/learning/spec_search/plan/__init__.py +1 -0
  668. locus/learning/spec_search/plan/planner.py +282 -0
  669. locus/learning/spec_search/plan/prompt_diff.py +170 -0
  670. locus/learning/spec_search/plan/risk_tier.py +63 -0
  671. locus/learning/spec_search/storage/__init__.py +1 -0
  672. locus/learning/spec_search/storage/paths.py +98 -0
  673. locus/learning/spec_search/storage/session_store.py +304 -0
  674. locus/learning/spec_search/student_runner.py +135 -0
  675. locus/learning/spec_search/triggers.py +66 -0
  676. locus/learning/training/__init__.py +15 -0
  677. locus/learning/training/data.py +221 -0
  678. locus/learning/training/lora.py +435 -0
  679. locus/mcp/__init__.py +26 -0
  680. locus/mcp/client.py +154 -0
  681. locus/mcp/loader.py +150 -0
  682. locus/mcp/protocol.py +145 -0
  683. locus/mcp/server.py +325 -0
  684. locus/mcp/transport.py +406 -0
  685. locus/memory/__init__.py +35 -0
  686. locus/memory/extractor.py +155 -0
  687. locus/memory/service.py +332 -0
  688. locus/memory/store.py +456 -0
  689. locus/mining/__init__.py +60 -0
  690. locus/mining/_collector.py +78 -0
  691. locus/mining/_constants.py +55 -0
  692. locus/mining/_discovery.py +176 -0
  693. locus/mining/_docker.py +461 -0
  694. locus/mining/_install.py +62 -0
  695. locus/mining/_metrics.py +96 -0
  696. locus/mining/_miner_loop_main.py +231 -0
  697. locus/mining/_models.py +92 -0
  698. locus/mining/_mps_miner_loop_main.py +311 -0
  699. locus/mining/_pearl_subprocess.py +206 -0
  700. locus/mining/_stubs.py +177 -0
  701. locus/mining/apple_mps_pearl.py +103 -0
  702. locus/mining/cpu_pearl.py +214 -0
  703. locus/mining/pools/__init__.py +9 -0
  704. locus/mining/vllm_pearl.py +152 -0
  705. locus/operators/__init__.py +7 -0
  706. locus/operators/data/knowledge_curator.toml +45 -0
  707. locus/operators/data/news_digest.toml +47 -0
  708. locus/operators/data/researcher.toml +43 -0
  709. locus/operators/data/system_monitor.toml +42 -0
  710. locus/operators/loader.py +71 -0
  711. locus/operators/manager.py +317 -0
  712. locus/operators/types.py +36 -0
  713. locus/prompt/__init__.py +1 -0
  714. locus/prompt/builder.py +290 -0
  715. locus/recipes/__init__.py +21 -0
  716. locus/recipes/composer.py +143 -0
  717. locus/recipes/data/coding_assistant.toml +25 -0
  718. locus/recipes/data/coding_benchmark.toml +36 -0
  719. locus/recipes/data/gaia_orchestrator.toml +35 -0
  720. locus/recipes/data/general_assistant.toml +24 -0
  721. locus/recipes/data/monitor_assistant.toml +25 -0
  722. locus/recipes/data/operators/correspondent.toml +14 -0
  723. locus/recipes/data/operators/correspondent_prompt.md +52 -0
  724. locus/recipes/data/operators/inbox_triage.toml +57 -0
  725. locus/recipes/data/operators/locus_twitter_bot.toml +22 -0
  726. locus/recipes/data/operators/locus_twitter_bot_prompt.md +73 -0
  727. locus/recipes/data/operators/news_briefing.toml +57 -0
  728. locus/recipes/data/operators/repo_watcher.toml +64 -0
  729. locus/recipes/data/operators/researcher.toml +14 -0
  730. locus/recipes/data/operators/researcher_prompt.md +45 -0
  731. locus/recipes/data/operators/sentinel.toml +14 -0
  732. locus/recipes/data/operators/sentinel_prompt.md +74 -0
  733. locus/recipes/data/operators/twitter_sentinel.toml +50 -0
  734. locus/recipes/data/research_assistant.toml +24 -0
  735. locus/recipes/data/swebench_openhands.toml +41 -0
  736. locus/recipes/data/terminalbench_react.toml +35 -0
  737. locus/recipes/loader.py +335 -0
  738. locus/sandbox/__init__.py +18 -0
  739. locus/sandbox/mount_security.py +195 -0
  740. locus/sandbox/runner.py +361 -0
  741. locus/sandbox/wasm_runner.py +159 -0
  742. locus/scheduler/__init__.py +6 -0
  743. locus/scheduler/scheduler.py +341 -0
  744. locus/scheduler/store.py +167 -0
  745. locus/scheduler/tools.py +350 -0
  746. locus/sdk.py +677 -0
  747. locus/security/__init__.py +197 -0
  748. locus/security/_stubs.py +28 -0
  749. locus/security/audit.py +328 -0
  750. locus/security/boundary.py +139 -0
  751. locus/security/capabilities.py +345 -0
  752. locus/security/credential_stripper.py +31 -0
  753. locus/security/data_boundary_audit.py +1880 -0
  754. locus/security/file_policy.py +98 -0
  755. locus/security/file_utils.py +87 -0
  756. locus/security/guardrails.py +330 -0
  757. locus/security/injection_scanner.py +196 -0
  758. locus/security/rate_limiter.py +107 -0
  759. locus/security/runtime.py +206 -0
  760. locus/security/scanner.py +148 -0
  761. locus/security/severity_policy.py +22 -0
  762. locus/security/signing.py +132 -0
  763. locus/security/ssrf.py +187 -0
  764. locus/security/subprocess_sandbox.py +127 -0
  765. locus/security/taint.py +143 -0
  766. locus/security/types.py +105 -0
  767. locus/server/__init__.py +3 -0
  768. locus/server/agent_manager_routes.py +2593 -0
  769. locus/server/analytics_routes.py +151 -0
  770. locus/server/api_routes.py +1364 -0
  771. locus/server/app.py +567 -0
  772. locus/server/approval_routes.py +79 -0
  773. locus/server/auth_middleware.py +205 -0
  774. locus/server/channel_bridge.py +379 -0
  775. locus/server/cloud_router.py +438 -0
  776. locus/server/comparison.py +451 -0
  777. locus/server/connectors_router.py +1020 -0
  778. locus/server/cost_calculator.py +137 -0
  779. locus/server/daemon.py +41 -0
  780. locus/server/dashboard.py +435 -0
  781. locus/server/digest_routes.py +130 -0
  782. locus/server/middleware.py +75 -0
  783. locus/server/model_capabilities.py +34 -0
  784. locus/server/models.py +134 -0
  785. locus/server/research_router.py +600 -0
  786. locus/server/routes.py +1472 -0
  787. locus/server/savings.py +210 -0
  788. locus/server/session_store.py +211 -0
  789. locus/server/static/apple-touch-icon.png +0 -0
  790. locus/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  791. locus/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  792. locus/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  793. locus/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  794. locus/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  795. locus/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  796. locus/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  797. locus/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  798. locus/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  799. locus/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  800. locus/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  801. locus/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  802. locus/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  803. locus/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  804. locus/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  805. locus/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  806. locus/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  807. locus/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  808. locus/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  809. locus/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  810. locus/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  811. locus/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  812. locus/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  813. locus/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  814. locus/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  815. locus/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  816. locus/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  817. locus/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  818. locus/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  819. locus/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  820. locus/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  821. locus/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  822. locus/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  823. locus/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  824. locus/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  825. locus/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  826. locus/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  827. locus/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  828. locus/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  829. locus/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  830. locus/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  831. locus/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  832. locus/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  833. locus/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  834. locus/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  835. locus/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  836. locus/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  837. locus/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  838. locus/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  839. locus/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  840. locus/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  841. locus/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  842. locus/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  843. locus/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  844. locus/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  845. locus/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  846. locus/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  847. locus/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  848. locus/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  849. locus/server/static/assets/charts-CgaVJh2T.js +53 -0
  850. locus/server/static/assets/core-CwzlLDl1.js +1 -0
  851. locus/server/static/assets/dist-js-AaHWkS67.js +1 -0
  852. locus/server/static/assets/dist-js-CUUjExGR.js +1 -0
  853. locus/server/static/assets/dist-js-CXsqSGI-.js +1 -0
  854. locus/server/static/assets/index-CgLHBZpX.js +292 -0
  855. locus/server/static/assets/index-ggdOTIZK.css +1 -0
  856. locus/server/static/assets/markdown-MBikyAkv.js +35 -0
  857. locus/server/static/assets/react-eQGPSLkk.js +9 -0
  858. locus/server/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  859. locus/server/static/assets/router-DJD7g8rS.js +1 -0
  860. locus/server/static/favicon.ico +0 -0
  861. locus/server/static/index.html +22 -0
  862. locus/server/static/manifest.webmanifest +1 -0
  863. locus/server/static/pwa-192x192.png +0 -0
  864. locus/server/static/pwa-512x512.png +0 -0
  865. locus/server/static/registerSW.js +1 -0
  866. locus/server/static/sw.js +1 -0
  867. locus/server/static/workbox-9c191d2f.js +1 -0
  868. locus/server/stream_bridge.py +330 -0
  869. locus/server/upload_router.py +218 -0
  870. locus/server/webhook_routes.py +467 -0
  871. locus/server/ws_bridge.py +122 -0
  872. locus/sessions/__init__.py +5 -0
  873. locus/sessions/compression.py +102 -0
  874. locus/sessions/session.py +363 -0
  875. locus/skills/__init__.py +46 -0
  876. locus/skills/data/backup-files.toml +20 -0
  877. locus/skills/data/calendar-prep.toml +20 -0
  878. locus/skills/data/code-lint.toml +20 -0
  879. locus/skills/data/code-test-gen.toml +25 -0
  880. locus/skills/data/compare-docs.toml +25 -0
  881. locus/skills/data/daily-digest.toml +20 -0
  882. locus/skills/data/data-analyze.toml +25 -0
  883. locus/skills/data/dependency-audit.toml +25 -0
  884. locus/skills/data/email-draft.toml +20 -0
  885. locus/skills/data/file-deduplicator.toml +20 -0
  886. locus/skills/data/file-organizer.toml +25 -0
  887. locus/skills/data/knowledge-extract.toml +20 -0
  888. locus/skills/data/meeting-notes.toml +20 -0
  889. locus/skills/data/pdf-summarize.toml +20 -0
  890. locus/skills/data/search-and-index.toml +25 -0
  891. locus/skills/data/security-scan.toml +20 -0
  892. locus/skills/data/todo-from-notes.toml +20 -0
  893. locus/skills/data/topic-research.toml +25 -0
  894. locus/skills/data/translate-doc.toml +25 -0
  895. locus/skills/data/web-summarize.toml +20 -0
  896. locus/skills/dependency.py +194 -0
  897. locus/skills/executor.py +219 -0
  898. locus/skills/importer.py +273 -0
  899. locus/skills/index.py +99 -0
  900. locus/skills/loader.py +322 -0
  901. locus/skills/manager.py +476 -0
  902. locus/skills/overlay.py +151 -0
  903. locus/skills/parser.py +231 -0
  904. locus/skills/security.py +65 -0
  905. locus/skills/sources/__init__.py +16 -0
  906. locus/skills/sources/base.py +93 -0
  907. locus/skills/sources/github.py +111 -0
  908. locus/skills/sources/hermes.py +120 -0
  909. locus/skills/sources/openclaw.py +120 -0
  910. locus/skills/tool_adapter.py +196 -0
  911. locus/skills/tool_translator.py +114 -0
  912. locus/skills/types.py +62 -0
  913. locus/speech/__init__.py +17 -0
  914. locus/speech/_discovery.py +86 -0
  915. locus/speech/_stubs.py +55 -0
  916. locus/speech/_tts_discovery.py +86 -0
  917. locus/speech/cartesia_tts.py +115 -0
  918. locus/speech/deepgram.py +97 -0
  919. locus/speech/elevenlabs_tts.py +194 -0
  920. locus/speech/faster_whisper.py +175 -0
  921. locus/speech/kokoro_tts.py +338 -0
  922. locus/speech/openai_tts.py +82 -0
  923. locus/speech/openai_whisper.py +64 -0
  924. locus/speech/tts.py +53 -0
  925. locus/speech/voice_io.py +126 -0
  926. locus/system/__init__.py +23 -0
  927. locus/system/_channel_kwargs.py +203 -0
  928. locus/system/builder.py +753 -0
  929. locus/system/bundles.py +60 -0
  930. locus/system/core.py +335 -0
  931. locus/system/orchestrator.py +366 -0
  932. locus/system/protocols.py +41 -0
  933. locus/telemetry/__init__.py +111 -0
  934. locus/telemetry/aggregator.py +489 -0
  935. locus/telemetry/batch.py +126 -0
  936. locus/telemetry/efficiency.py +129 -0
  937. locus/telemetry/energy_amd.py +137 -0
  938. locus/telemetry/energy_apple.py +409 -0
  939. locus/telemetry/energy_monitor.py +242 -0
  940. locus/telemetry/energy_nvidia.py +267 -0
  941. locus/telemetry/energy_rapl.py +197 -0
  942. locus/telemetry/flops.py +112 -0
  943. locus/telemetry/gpu_monitor.py +357 -0
  944. locus/telemetry/instrumented_engine.py +654 -0
  945. locus/telemetry/itl.py +47 -0
  946. locus/telemetry/phase_metrics.py +44 -0
  947. locus/telemetry/session.py +160 -0
  948. locus/telemetry/steady_state.py +129 -0
  949. locus/telemetry/store.py +437 -0
  950. locus/telemetry/vllm_metrics.py +182 -0
  951. locus/telemetry/wrapper.py +57 -0
  952. locus/templates/__init__.py +9 -0
  953. locus/templates/agent_templates.py +108 -0
  954. locus/templates/data/architect.toml +10 -0
  955. locus/templates/data/assistant.toml +10 -0
  956. locus/templates/data/code-reviewer.toml +10 -0
  957. locus/templates/data/data-analyst.toml +10 -0
  958. locus/templates/data/debugger.toml +10 -0
  959. locus/templates/data/deep-researcher.toml +10 -0
  960. locus/templates/data/fact-checker.toml +10 -0
  961. locus/templates/data/inbox-triager.toml +10 -0
  962. locus/templates/data/meeting-prep.toml +10 -0
  963. locus/templates/data/monitor.toml +25 -0
  964. locus/templates/data/note-taker.toml +10 -0
  965. locus/templates/data/security-auditor.toml +10 -0
  966. locus/templates/data/summarizer.toml +10 -0
  967. locus/templates/data/translator.toml +10 -0
  968. locus/templates/data/tutor.toml +10 -0
  969. locus/templates/data/writer.toml +10 -0
  970. locus/tools/__init__.py +186 -0
  971. locus/tools/_paths.py +38 -0
  972. locus/tools/_stubs.py +657 -0
  973. locus/tools/agent_tools.py +324 -0
  974. locus/tools/apple_calendar.py +99 -0
  975. locus/tools/apply_patch.py +340 -0
  976. locus/tools/approval_store.py +406 -0
  977. locus/tools/audio_tool.py +180 -0
  978. locus/tools/browser.py +696 -0
  979. locus/tools/browser_axtree.py +137 -0
  980. locus/tools/calculator.py +173 -0
  981. locus/tools/channel_tools.py +189 -0
  982. locus/tools/code_interpreter.py +231 -0
  983. locus/tools/code_interpreter_docker.py +142 -0
  984. locus/tools/db_query.py +357 -0
  985. locus/tools/description_loader.py +79 -0
  986. locus/tools/digest_collect.py +583 -0
  987. locus/tools/docker_shell_exec.py +172 -0
  988. locus/tools/file_read.py +144 -0
  989. locus/tools/file_write.py +213 -0
  990. locus/tools/fx_macro.py +398 -0
  991. locus/tools/git_tool.py +399 -0
  992. locus/tools/http_request.py +254 -0
  993. locus/tools/image_tool.py +151 -0
  994. locus/tools/knowledge_search.py +206 -0
  995. locus/tools/knowledge_sql.py +145 -0
  996. locus/tools/knowledge_tools.py +294 -0
  997. locus/tools/llm_tool.py +95 -0
  998. locus/tools/mcp_adapter.py +75 -0
  999. locus/tools/memory_manage.py +142 -0
  1000. locus/tools/pdf_tool.py +176 -0
  1001. locus/tools/proactive_tools.py +622 -0
  1002. locus/tools/repl.py +336 -0
  1003. locus/tools/retrieval.py +92 -0
  1004. locus/tools/scan_chunks.py +191 -0
  1005. locus/tools/shell_exec.py +241 -0
  1006. locus/tools/skill_manage.py +155 -0
  1007. locus/tools/storage/__init__.py +49 -0
  1008. locus/tools/storage/_stubs.py +93 -0
  1009. locus/tools/storage/bm25.py +98 -0
  1010. locus/tools/storage/chunking.py +178 -0
  1011. locus/tools/storage/colbert_backend.py +251 -0
  1012. locus/tools/storage/context.py +245 -0
  1013. locus/tools/storage/dense.py +769 -0
  1014. locus/tools/storage/embeddings.py +173 -0
  1015. locus/tools/storage/faiss_backend.py +161 -0
  1016. locus/tools/storage/hybrid.py +184 -0
  1017. locus/tools/storage/ingest.py +246 -0
  1018. locus/tools/storage/knowledge_graph.py +316 -0
  1019. locus/tools/storage/sqlite.py +165 -0
  1020. locus/tools/storage_tools.py +315 -0
  1021. locus/tools/templates/__init__.py +5 -0
  1022. locus/tools/templates/builtin/base64_encode.toml +11 -0
  1023. locus/tools/templates/builtin/date_info.toml +8 -0
  1024. locus/tools/templates/builtin/hash_compute.toml +11 -0
  1025. locus/tools/templates/builtin/json_transform.toml +11 -0
  1026. locus/tools/templates/builtin/regex_extract.toml +14 -0
  1027. locus/tools/templates/builtin/text_length.toml +11 -0
  1028. locus/tools/templates/builtin/text_lower.toml +11 -0
  1029. locus/tools/templates/builtin/text_reverse.toml +11 -0
  1030. locus/tools/templates/builtin/text_upper.toml +11 -0
  1031. locus/tools/templates/builtin/unit_convert.toml +17 -0
  1032. locus/tools/templates/loader.py +367 -0
  1033. locus/tools/text_to_speech.py +147 -0
  1034. locus/tools/think.py +58 -0
  1035. locus/tools/user_profile_manage.py +140 -0
  1036. locus/tools/weather.py +316 -0
  1037. locus/tools/web_search.py +820 -0
  1038. locus/traces/__init__.py +15 -0
  1039. locus/traces/analyzer.py +328 -0
  1040. locus/traces/collector.py +283 -0
  1041. locus/traces/store.py +348 -0
  1042. locus/workflow/__init__.py +23 -0
  1043. locus/workflow/builder.py +150 -0
  1044. locus/workflow/engine.py +346 -0
  1045. locus/workflow/graph.py +127 -0
  1046. locus/workflow/loader.py +84 -0
  1047. locus/workflow/types.py +66 -0
  1048. locus_assistant-1.0.3.dist-info/METADATA +376 -0
  1049. locus_assistant-1.0.3.dist-info/RECORD +1053 -0
  1050. locus_assistant-1.0.3.dist-info/WHEEL +4 -0
  1051. locus_assistant-1.0.3.dist-info/entry_points.txt +3 -0
  1052. locus_assistant-1.0.3.dist-info/licenses/LICENSE +191 -0
  1053. locus_assistant-1.0.3.dist-info/licenses/NOTICE +15 -0
@@ -0,0 +1,126 @@
1
+ # Locus on native Windows
2
+
3
+ Phase-1 of the native-Windows-support RFC (#298). Mirrors the Linux
4
+ (`deploy/systemd/`) and macOS (`deploy/launchd/`) deployments — but for
5
+ PowerShell, without WSL2 or Docker.
6
+
7
+ ## One-liner install
8
+
9
+ In an elevated-or-regular PowerShell:
10
+
11
+ ```powershell
12
+ irm https://aryanjsx.github.io/Locus/install.ps1 | iex
13
+ ```
14
+
15
+ What it does:
16
+
17
+ 1. Refuses non-Windows hosts and Windows < 10 1809.
18
+ 2. Checks Python 3.10 – 3.13 (3.14 has no numpy wheels yet — see #432).
19
+ 3. Checks `git` on PATH.
20
+ 4. Installs `uv` (https://astral.sh/uv) if absent.
21
+ 5. Clones the Locus repository to `%LOCALAPPDATA%\Locus`
22
+ (override with `$env:LOCUS_HOME`).
23
+ 6. Runs `uv sync --extra desktop --group desktop-native` so the FastAPI server,
24
+ speech backend, and native extension are importable.
25
+ 7. Optionally prompts to register a scheduled task that auto-starts the
26
+ server at logon.
27
+
28
+ Flags (when invoked directly rather than via `irm | iex`):
29
+
30
+ | Flag | Effect |
31
+ |------|--------|
32
+ | `-Service` | Register the scheduled task without prompting |
33
+ | `-SkipService` | Don't prompt; don't register |
34
+ | `-Force` | Re-run all steps even if already done |
35
+
36
+ `irm | iex` can't pass `param()` args into a piped script string, so
37
+ the same knobs are honored via env vars when the corresponding flag is
38
+ absent:
39
+
40
+ ```powershell
41
+ $env:LOCUS_SKIP_SERVICE = '1'
42
+ irm https://aryanjsx.github.io/Locus/install.ps1 | iex
43
+ ```
44
+
45
+ The available env vars: `LOCUS_SKIP_SERVICE`, `LOCUS_SERVICE`,
46
+ `LOCUS_FORCE`. If you need richer control, save the script first
47
+ (`irm ... -OutFile install.ps1; .\install.ps1 -Force`).
48
+
49
+ ## Manual scheduled-task setup
50
+
51
+ If you skipped the prompt during install, you can register / inspect /
52
+ remove the task with `locus-service.ps1`:
53
+
54
+ ```powershell
55
+ $srv = "$env:LOCALAPPDATA\Locus\src\deploy\windows\locus-service.ps1"
56
+
57
+ # install (idempotent — replaces existing)
58
+ powershell -ExecutionPolicy Bypass -File $srv install
59
+
60
+ # status
61
+ powershell -ExecutionPolicy Bypass -File $srv status
62
+
63
+ # remove
64
+ powershell -ExecutionPolicy Bypass -File $srv uninstall
65
+ ```
66
+
67
+ The task runs as the current user with `LogonType=Interactive` and
68
+ `RunLevel=Limited`. It restarts up to 3 times on failure (1-minute
69
+ gap), has no execution-time limit, and starts when available (catches
70
+ up if missed).
71
+
72
+ ## Loopback vs LAN-exposed
73
+
74
+ By default the scheduled task binds `127.0.0.1` — reachable only from
75
+ this machine, no API key required. This matches launchd parity (see
76
+ `deploy/launchd/com.locus.plist`).
77
+
78
+ To expose on your LAN:
79
+
80
+ ```powershell
81
+ # 1. Generate an API key. The server REFUSES to bind 0.0.0.0 without one.
82
+ $env:LOCUS_API_KEY = (uv run locus auth generate-key)
83
+
84
+ # 2. Re-register the task with -ListenHost 0.0.0.0.
85
+ powershell -ExecutionPolicy Bypass -File $srv install -ListenHost 0.0.0.0
86
+ ```
87
+
88
+ `locus-service.ps1 install` refuses `-ListenHost 0.0.0.0` if
89
+ `$env:LOCUS_API_KEY` is unset — same guard as the systemd unit's
90
+ `EnvironmentFile=/etc/locus/env`.
91
+
92
+ ## Parity table
93
+
94
+ | Concern | systemd | launchd | Windows |
95
+ |---------|---------|---------|---------|
96
+ | Service definition | `deploy/systemd/locus.service` | `deploy/launchd/com.locus.plist` | `deploy/windows/locus-service.ps1` (cmdlet-driven) |
97
+ | Default bind | `0.0.0.0` (with API key) | `127.0.0.1` (no API key) | `127.0.0.1` (no API key) |
98
+ | Restart on failure | `Restart=on-failure RestartSec=5` | `KeepAlive=true` | `RestartCount=3 RestartInterval=PT1M` |
99
+ | Auto-start | `multi-user.target` | `RunAtLoad=true` | `AtLogOn` trigger |
100
+
101
+ ## Updating
102
+
103
+ To pull the latest:
104
+
105
+ ```powershell
106
+ cd "$env:LOCALAPPDATA\Locus\src"
107
+ git pull --ff-only
108
+ uv sync --extra desktop --group desktop-native
109
+ ```
110
+
111
+ Or re-run the installer with `-Force`:
112
+
113
+ ```powershell
114
+ irm https://aryanjsx.github.io/Locus/install.ps1 | iex
115
+ # (then re-run with the file directly, passing -Force)
116
+ ```
117
+
118
+ ## Uninstall
119
+
120
+ ```powershell
121
+ powershell -ExecutionPolicy Bypass -File "$env:LOCALAPPDATA\Locus\src\deploy\windows\locus-service.ps1" uninstall
122
+ Remove-Item -Recurse -Force "$env:LOCALAPPDATA\Locus"
123
+ ```
124
+
125
+ Uninstalling does NOT remove `uv` (it's a separate tool — you may have
126
+ other Python projects using it).