desktop-monkey 0.1.0__tar.gz

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 (370) hide show
  1. desktop_monkey-0.1.0/.github/workflows/ci.yml +37 -0
  2. desktop_monkey-0.1.0/.github/workflows/publish-npm.yml +31 -0
  3. desktop_monkey-0.1.0/.github/workflows/publish-pypi.yml +26 -0
  4. desktop_monkey-0.1.0/.gitignore +32 -0
  5. desktop_monkey-0.1.0/.python-version +1 -0
  6. desktop_monkey-0.1.0/AGENTS.md +70 -0
  7. desktop_monkey-0.1.0/CLAUDE.md +3 -0
  8. desktop_monkey-0.1.0/Dockerfile +27 -0
  9. desktop_monkey-0.1.0/LICENSE +21 -0
  10. desktop_monkey-0.1.0/NOTICE +12 -0
  11. desktop_monkey-0.1.0/PKG-INFO +164 -0
  12. desktop_monkey-0.1.0/Procfile +1 -0
  13. desktop_monkey-0.1.0/README.md +71 -0
  14. desktop_monkey-0.1.0/arcane-fly-desktop-monkey-0.1.0.tgz +0 -0
  15. desktop_monkey-0.1.0/dashboard/index.html +13 -0
  16. desktop_monkey-0.1.0/dashboard/package.json +22 -0
  17. desktop_monkey-0.1.0/dashboard/src/App.jsx +1467 -0
  18. desktop_monkey-0.1.0/dashboard/src/main.jsx +22 -0
  19. desktop_monkey-0.1.0/dashboard/src/theme.css +107 -0
  20. desktop_monkey-0.1.0/dashboard/vite.config.js +10 -0
  21. desktop_monkey-0.1.0/deploy/guard.py +205 -0
  22. desktop_monkey-0.1.0/deploy/patches/20261107-remove-copied-secrets.json +46 -0
  23. desktop_monkey-0.1.0/deploy/targets.json +80 -0
  24. desktop_monkey-0.1.0/docs/00-roadmap/20260112-master-roadmap-1.00W.md +23 -0
  25. desktop_monkey-0.1.0/docs/00-roadmap/20261107-red-team-closeout-implementation-plan-1.00W.md +37 -0
  26. desktop_monkey-0.1.0/docs/00-roadmap/README.md +6 -0
  27. desktop_monkey-0.1.0/docs/ARCHITECTURE.md +27 -0
  28. desktop_monkey-0.1.0/docs/BRIEF.md +54 -0
  29. desktop_monkey-0.1.0/docs/DONE-CONTRACT.json +287 -0
  30. desktop_monkey-0.1.0/docs/MEMORY.md +92 -0
  31. desktop_monkey-0.1.0/docs/POWER-AWARE-SCHEDULING.md +38 -0
  32. desktop_monkey-0.1.0/docs/QIG-INTEGRATION-PLAN.md +234 -0
  33. desktop_monkey-0.1.0/docs/RESERVED-FOR-OPERATOR.md +13 -0
  34. desktop_monkey-0.1.0/docs/RUNBOOK.md +49 -0
  35. desktop_monkey-0.1.0/docs/STATUS.md +24 -0
  36. desktop_monkey-0.1.0/docs/adr/0001-architecture.md +33 -0
  37. desktop_monkey-0.1.0/docs/adr/0002-honest-pooling-limits.md +30 -0
  38. desktop_monkey-0.1.0/docs/adr/0003-wire-protocol.md +56 -0
  39. desktop_monkey-0.1.0/docs/evidence/dashboard-screens.json +43 -0
  40. desktop_monkey-0.1.0/docs/evidence/deploy-impact-audit.json +9 -0
  41. desktop_monkey-0.1.0/docs/evidence/docs-complete.json +61 -0
  42. desktop_monkey-0.1.0/docs/evidence/llama-rpc-loopback.json +276 -0
  43. desktop_monkey-0.1.0/docs/evidence/llama-rpc-loopback.md +66 -0
  44. desktop_monkey-0.1.0/docs/evidence/monitor-troop.json +23 -0
  45. desktop_monkey-0.1.0/docs/evidence/packages-built.json +26 -0
  46. desktop_monkey-0.1.0/docs/evidence/probe-braden-u.json +262 -0
  47. desktop_monkey-0.1.0/docs/evidence/railway-live.json +66 -0
  48. desktop_monkey-0.1.0/docs/evidence/troop-views.json +28 -0
  49. desktop_monkey-0.1.0/docs/evidence/vercel-live.json +20 -0
  50. desktop_monkey-0.1.0/docs/lanes/COMMON.md +42 -0
  51. desktop_monkey-0.1.0/docs/lanes/agent-requests.md +22 -0
  52. desktop_monkey-0.1.0/docs/lanes/agent.md +40 -0
  53. desktop_monkey-0.1.0/docs/lanes/commander-fs-report.md +76 -0
  54. desktop_monkey-0.1.0/docs/lanes/commander-fs-requests.md +43 -0
  55. desktop_monkey-0.1.0/docs/lanes/commander-fs.md +54 -0
  56. desktop_monkey-0.1.0/docs/lanes/commander-proc.md +49 -0
  57. desktop_monkey-0.1.0/docs/lanes/hooks.md +36 -0
  58. desktop_monkey-0.1.0/docs/lanes/llama-rpc.md +55 -0
  59. desktop_monkey-0.1.0/docs/lanes/mesh-core-requests.md +33 -0
  60. desktop_monkey-0.1.0/docs/lanes/mesh-core.md +57 -0
  61. desktop_monkey-0.1.0/docs/lanes/mesh-fabric.md +32 -0
  62. desktop_monkey-0.1.0/docs/lanes/mesh-pools.md +40 -0
  63. desktop_monkey-0.1.0/docs/lanes/mesh-probe.md +47 -0
  64. desktop_monkey-0.1.0/docs/lanes/mesh-runtime.md +121 -0
  65. desktop_monkey-0.1.0/docs/lanes/relay-core.md +77 -0
  66. desktop_monkey-0.1.0/docs/lanes/relay-mcp-requests.md +52 -0
  67. desktop_monkey-0.1.0/docs/lanes/relay-mcp.md +71 -0
  68. desktop_monkey-0.1.0/docs/parity/README.md +7 -0
  69. desktop_monkey-0.1.0/docs/parity/REMOTE-SERVICE.md +137 -0
  70. desktop_monkey-0.1.0/docs/research/R1-compute-pooling.md +159 -0
  71. desktop_monkey-0.1.0/docs/research/R2-memory-disk-pooling.md +166 -0
  72. desktop_monkey-0.1.0/docs/research/R3-network-relay-mcp.md +155 -0
  73. desktop_monkey-0.1.0/docs/research/R4-qig-packages.md +369 -0
  74. desktop_monkey-0.1.0/docs/research/R5-monkey-pantheon.md +140 -0
  75. desktop_monkey-0.1.0/docs/research/R6-hooks.md +413 -0
  76. desktop_monkey-0.1.0/docs/research/R7-dc-oss-surface.md +451 -0
  77. desktop_monkey-0.1.0/docs/research/R7-qig-10x-cross-cutting-nexus.md +47 -0
  78. desktop_monkey-0.1.0/docs/research/briefs/R1-compute-pooling.brief.md +11 -0
  79. desktop_monkey-0.1.0/docs/research/briefs/R2-memory-disk-pooling.brief.md +10 -0
  80. desktop_monkey-0.1.0/docs/research/briefs/R3-network-relay-mcp.brief.md +12 -0
  81. desktop_monkey-0.1.0/docs/research/briefs/R4-qig-packages.brief.md +9 -0
  82. desktop_monkey-0.1.0/docs/research/briefs/R5-monkey-pantheon.brief.md +10 -0
  83. desktop_monkey-0.1.0/docs/research/briefs/R6-hooks.brief.md +9 -0
  84. desktop_monkey-0.1.0/docs/research/briefs/R7-dc-oss-surface.brief.md +9 -0
  85. desktop_monkey-0.1.0/nixpacks.toml +9 -0
  86. desktop_monkey-0.1.0/package.json +18 -0
  87. desktop_monkey-0.1.0/pyproject.toml +123 -0
  88. desktop_monkey-0.1.0/scripts/build_llama_rpc.sh +45 -0
  89. desktop_monkey-0.1.0/scripts/connect_relay_db.sh +73 -0
  90. desktop_monkey-0.1.0/scripts/gen_mesh_fixture.py +162 -0
  91. desktop_monkey-0.1.0/scripts/join-qig-memory.sh +12 -0
  92. desktop_monkey-0.1.0/scripts/record_llama_rpc_loopback.py +167 -0
  93. desktop_monkey-0.1.0/scripts/theme_source.py +201 -0
  94. desktop_monkey-0.1.0/scripts/verify_done_contract.py +102 -0
  95. desktop_monkey-0.1.0/src/desktop_monkey/__init__.py +3 -0
  96. desktop_monkey-0.1.0/src/desktop_monkey/agent/__init__.py +1 -0
  97. desktop_monkey-0.1.0/src/desktop_monkey/agent/cli.py +308 -0
  98. desktop_monkey-0.1.0/src/desktop_monkey/agent/daemon.py +183 -0
  99. desktop_monkey-0.1.0/src/desktop_monkey/agent/enroll.py +226 -0
  100. desktop_monkey-0.1.0/src/desktop_monkey/agent/executor.py +310 -0
  101. desktop_monkey-0.1.0/src/desktop_monkey/agent/identity.py +31 -0
  102. desktop_monkey-0.1.0/src/desktop_monkey/agent/memreport.py +106 -0
  103. desktop_monkey-0.1.0/src/desktop_monkey/agent/mesh_client.py +173 -0
  104. desktop_monkey-0.1.0/src/desktop_monkey/agent/policy.py +209 -0
  105. desktop_monkey-0.1.0/src/desktop_monkey/agent/state.py +149 -0
  106. desktop_monkey-0.1.0/src/desktop_monkey/agent/tunnel.py +275 -0
  107. desktop_monkey-0.1.0/src/desktop_monkey/cli.py +88 -0
  108. desktop_monkey-0.1.0/src/desktop_monkey/commander/__init__.py +1 -0
  109. desktop_monkey-0.1.0/src/desktop_monkey/commander/base.py +175 -0
  110. desktop_monkey-0.1.0/src/desktop_monkey/commander/cli.py +36 -0
  111. desktop_monkey-0.1.0/src/desktop_monkey/commander/config.py +543 -0
  112. desktop_monkey-0.1.0/src/desktop_monkey/commander/data/dc-oss-tools.json +868 -0
  113. desktop_monkey-0.1.0/src/desktop_monkey/commander/edit.py +326 -0
  114. desktop_monkey-0.1.0/src/desktop_monkey/commander/feedback.py +48 -0
  115. desktop_monkey-0.1.0/src/desktop_monkey/commander/fs.py +812 -0
  116. desktop_monkey-0.1.0/src/desktop_monkey/commander/history.py +193 -0
  117. desktop_monkey-0.1.0/src/desktop_monkey/commander/paths.py +93 -0
  118. desktop_monkey-0.1.0/src/desktop_monkey/commander/pdf.py +293 -0
  119. desktop_monkey-0.1.0/src/desktop_monkey/commander/process.py +761 -0
  120. desktop_monkey-0.1.0/src/desktop_monkey/commander/search.py +394 -0
  121. desktop_monkey-0.1.0/src/desktop_monkey/commander/server.py +162 -0
  122. desktop_monkey-0.1.0/src/desktop_monkey/commander/stats.py +186 -0
  123. desktop_monkey-0.1.0/src/desktop_monkey/hooks/__init__.py +65 -0
  124. desktop_monkey-0.1.0/src/desktop_monkey/hooks/adapters/__init__.py +46 -0
  125. desktop_monkey-0.1.0/src/desktop_monkey/hooks/adapters/claude.py +159 -0
  126. desktop_monkey-0.1.0/src/desktop_monkey/hooks/adapters/codex.py +121 -0
  127. desktop_monkey-0.1.0/src/desktop_monkey/hooks/adapters/cursor.py +130 -0
  128. desktop_monkey-0.1.0/src/desktop_monkey/hooks/cli.py +217 -0
  129. desktop_monkey-0.1.0/src/desktop_monkey/hooks/decisions.py +213 -0
  130. desktop_monkey-0.1.0/src/desktop_monkey/hooks/engine.py +886 -0
  131. desktop_monkey-0.1.0/src/desktop_monkey/hooks/events.py +233 -0
  132. desktop_monkey-0.1.0/src/desktop_monkey/hooks/learning_hooks.py +64 -0
  133. desktop_monkey-0.1.0/src/desktop_monkey/hooks/manifest.py +156 -0
  134. desktop_monkey-0.1.0/src/desktop_monkey/hooks/receipts.py +140 -0
  135. desktop_monkey-0.1.0/src/desktop_monkey/hooks/replay.py +70 -0
  136. desktop_monkey-0.1.0/src/desktop_monkey/hooks/schema.py +62 -0
  137. desktop_monkey-0.1.0/src/desktop_monkey/hooks/schemas/mk.decision.v1.json +170 -0
  138. desktop_monkey-0.1.0/src/desktop_monkey/hooks/schemas/mk.event.v1.json +219 -0
  139. desktop_monkey-0.1.0/src/desktop_monkey/hooks/schemas/mk.hook-manifest.v1.json +292 -0
  140. desktop_monkey-0.1.0/src/desktop_monkey/hooks/schemas/mk.receipt.v1.json +149 -0
  141. desktop_monkey-0.1.0/src/desktop_monkey/hooks/trust.py +149 -0
  142. desktop_monkey-0.1.0/src/desktop_monkey/learning/brain.py +648 -0
  143. desktop_monkey-0.1.0/src/desktop_monkey/learning/mesh_learning.py +76 -0
  144. desktop_monkey-0.1.0/src/desktop_monkey/learning/qig_memory_bridge.py +185 -0
  145. desktop_monkey-0.1.0/src/desktop_monkey/learning/re_integration.py +155 -0
  146. desktop_monkey-0.1.0/src/desktop_monkey/learning/voluntary_llm.py +250 -0
  147. desktop_monkey-0.1.0/src/desktop_monkey/learning/weight_space.py +169 -0
  148. desktop_monkey-0.1.0/src/desktop_monkey/mesh/__init__.py +35 -0
  149. desktop_monkey-0.1.0/src/desktop_monkey/mesh/api.py +111 -0
  150. desktop_monkey-0.1.0/src/desktop_monkey/mesh/calibrate.py +106 -0
  151. desktop_monkey-0.1.0/src/desktop_monkey/mesh/cli.py +249 -0
  152. desktop_monkey-0.1.0/src/desktop_monkey/mesh/cost.py +261 -0
  153. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/__init__.py +32 -0
  154. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/base.py +136 -0
  155. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/llamacpp_rpc.py +926 -0
  156. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/pipeline.py +41 -0
  157. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/single.py +32 -0
  158. desktop_monkey-0.1.0/src/desktop_monkey/mesh/engines/spec_decode.py +136 -0
  159. desktop_monkey-0.1.0/src/desktop_monkey/mesh/explain.py +81 -0
  160. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/__init__.py +104 -0
  161. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/adapters.py +152 -0
  162. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/devices.py +349 -0
  163. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/executor.py +629 -0
  164. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/graph.py +233 -0
  165. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/retry.py +53 -0
  166. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/tasks.py +173 -0
  167. desktop_monkey-0.1.0/src/desktop_monkey/mesh/fabric/verify.py +151 -0
  168. desktop_monkey-0.1.0/src/desktop_monkey/mesh/honesty.py +227 -0
  169. desktop_monkey-0.1.0/src/desktop_monkey/mesh/links.py +178 -0
  170. desktop_monkey-0.1.0/src/desktop_monkey/mesh/linksvc.py +35 -0
  171. desktop_monkey-0.1.0/src/desktop_monkey/mesh/memory.py +586 -0
  172. desktop_monkey-0.1.0/src/desktop_monkey/mesh/models.py +161 -0
  173. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/__init__.py +8 -0
  174. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/adapters.py +264 -0
  175. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/compute.py +79 -0
  176. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/disk.py +159 -0
  177. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/memory.py +114 -0
  178. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/objects.py +129 -0
  179. desktop_monkey-0.1.0/src/desktop_monkey/mesh/pools/policy.py +321 -0
  180. desktop_monkey-0.1.0/src/desktop_monkey/mesh/power.py +162 -0
  181. desktop_monkey-0.1.0/src/desktop_monkey/mesh/power_aware_scheduler.py +142 -0
  182. desktop_monkey-0.1.0/src/desktop_monkey/mesh/probe.py +617 -0
  183. desktop_monkey-0.1.0/src/desktop_monkey/mesh/qig_scheduler.py +80 -0
  184. desktop_monkey-0.1.0/src/desktop_monkey/mesh/qig_warp_adapter.py +128 -0
  185. desktop_monkey-0.1.0/src/desktop_monkey/mesh/qpu.py +256 -0
  186. desktop_monkey-0.1.0/src/desktop_monkey/mesh/quota.py +67 -0
  187. desktop_monkey-0.1.0/src/desktop_monkey/mesh/router.py +227 -0
  188. desktop_monkey-0.1.0/src/desktop_monkey/mesh/scheduler.py +1014 -0
  189. desktop_monkey-0.1.0/src/desktop_monkey/mesh/subscription.py +127 -0
  190. desktop_monkey-0.1.0/src/desktop_monkey/mesh/topology.py +391 -0
  191. desktop_monkey-0.1.0/src/desktop_monkey/mesh/troop.py +321 -0
  192. desktop_monkey-0.1.0/src/desktop_monkey/monitor/__init__.py +6 -0
  193. desktop_monkey-0.1.0/src/desktop_monkey/monitor/bridge.py +105 -0
  194. desktop_monkey-0.1.0/src/desktop_monkey/monitor/gtk_app.py +187 -0
  195. desktop_monkey-0.1.0/src/desktop_monkey/monitor/troop_page.py +271 -0
  196. desktop_monkey-0.1.0/src/desktop_monkey/protocol/__init__.py +9 -0
  197. desktop_monkey-0.1.0/src/desktop_monkey/protocol/billing.py +86 -0
  198. desktop_monkey-0.1.0/src/desktop_monkey/protocol/crypto.py +164 -0
  199. desktop_monkey-0.1.0/src/desktop_monkey/protocol/device.py +119 -0
  200. desktop_monkey-0.1.0/src/desktop_monkey/protocol/enrol.py +77 -0
  201. desktop_monkey-0.1.0/src/desktop_monkey/protocol/frames.py +343 -0
  202. desktop_monkey-0.1.0/src/desktop_monkey/protocol/jsonrpc.py +51 -0
  203. desktop_monkey-0.1.0/src/desktop_monkey/protocol/mcp.py +55 -0
  204. desktop_monkey-0.1.0/src/desktop_monkey/protocol/memory.py +112 -0
  205. desktop_monkey-0.1.0/src/desktop_monkey/protocol/versions.py +29 -0
  206. desktop_monkey-0.1.0/src/desktop_monkey/qig_nexus/__init__.py +77 -0
  207. desktop_monkey-0.1.0/src/desktop_monkey/qig_nexus/catalog.py +1195 -0
  208. desktop_monkey-0.1.0/src/desktop_monkey/qig_nexus/primitives.py +1232 -0
  209. desktop_monkey-0.1.0/src/desktop_monkey/relay/__init__.py +1 -0
  210. desktop_monkey-0.1.0/src/desktop_monkey/relay/__main__.py +21 -0
  211. desktop_monkey-0.1.0/src/desktop_monkey/relay/accounts.py +668 -0
  212. desktop_monkey-0.1.0/src/desktop_monkey/relay/app.py +132 -0
  213. desktop_monkey-0.1.0/src/desktop_monkey/relay/auth.py +300 -0
  214. desktop_monkey-0.1.0/src/desktop_monkey/relay/billing.py +363 -0
  215. desktop_monkey-0.1.0/src/desktop_monkey/relay/db.py +36 -0
  216. desktop_monkey-0.1.0/src/desktop_monkey/relay/devices_http.py +508 -0
  217. desktop_monkey-0.1.0/src/desktop_monkey/relay/devtools.py +34 -0
  218. desktop_monkey-0.1.0/src/desktop_monkey/relay/hub.py +622 -0
  219. desktop_monkey-0.1.0/src/desktop_monkey/relay/interfaces.py +78 -0
  220. desktop_monkey-0.1.0/src/desktop_monkey/relay/keys.py +123 -0
  221. desktop_monkey-0.1.0/src/desktop_monkey/relay/mcp_http.py +943 -0
  222. desktop_monkey-0.1.0/src/desktop_monkey/relay/mesh_http.py +695 -0
  223. desktop_monkey-0.1.0/src/desktop_monkey/relay/mesh_runtime.py +389 -0
  224. desktop_monkey-0.1.0/src/desktop_monkey/relay/notices.py +109 -0
  225. desktop_monkey-0.1.0/src/desktop_monkey/relay/oauth.py +762 -0
  226. desktop_monkey-0.1.0/src/desktop_monkey/relay/pages.py +258 -0
  227. desktop_monkey-0.1.0/src/desktop_monkey/relay/passwords.py +41 -0
  228. desktop_monkey-0.1.0/src/desktop_monkey/relay/schema.py +232 -0
  229. desktop_monkey-0.1.0/src/desktop_monkey/relay/security.py +260 -0
  230. desktop_monkey-0.1.0/src/desktop_monkey/relay/settings.py +77 -0
  231. desktop_monkey-0.1.0/src/desktop_monkey/relay/static.py +78 -0
  232. desktop_monkey-0.1.0/src/desktop_monkey/relay/tunnel.py +145 -0
  233. desktop_monkey-0.1.0/src/desktop_monkey/relay/usage.py +241 -0
  234. desktop_monkey-0.1.0/src/desktop_monkey/relay/wellknown.py +92 -0
  235. desktop_monkey-0.1.0/src/desktop_monkey/security/immune_response.py +71 -0
  236. desktop_monkey-0.1.0/src/desktop_monkey/security/offensive_nullification.py +42 -0
  237. desktop_monkey-0.1.0/src/desktop_monkey/security/pattern_matcher.py +46 -0
  238. desktop_monkey-0.1.0/src/desktop_monkey/security/request_extractor.py +86 -0
  239. desktop_monkey-0.1.0/src/desktop_monkey/security/request_firewall.py +59 -0
  240. desktop_monkey-0.1.0/src/desktop_monkey/security/request_validator.py +88 -0
  241. desktop_monkey-0.1.0/src/desktop_monkey/security/self_healing.py +44 -0
  242. desktop_monkey-0.1.0/src/desktop_monkey/security/threat_classifier.py +39 -0
  243. desktop_monkey-0.1.0/src/desktop_monkey/theme/__init__.py +46 -0
  244. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/SOURCES.json +67 -0
  245. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/favicon-16.ico +0 -0
  246. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/favicon-32.ico +0 -0
  247. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monitor-128.png +0 -0
  248. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monitor-32.png +0 -0
  249. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monitor-64.png +0 -0
  250. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monitor-icon-256.png +0 -0
  251. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monkey-ai-rec-dark.png +0 -0
  252. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monkey-ai-rec-light.png +0 -0
  253. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monkey-ai-sq-dark.png +0 -0
  254. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monkey-ai-sq-light.png +0 -0
  255. desktop_monkey-0.1.0/src/desktop_monkey/theme/assets/monkey-icon.png +0 -0
  256. desktop_monkey-0.1.0/src/desktop_monkey/theme/build.py +232 -0
  257. desktop_monkey-0.1.0/src/desktop_monkey/theme/color.py +161 -0
  258. desktop_monkey-0.1.0/src/desktop_monkey/theme/generated/desktop-monkey.css +165 -0
  259. desktop_monkey-0.1.0/src/desktop_monkey/theme/generated/monkey-monitor-tokens.gtk.css +134 -0
  260. desktop_monkey-0.1.0/src/desktop_monkey/theme/tokens.py +124 -0
  261. desktop_monkey-0.1.0/supabase/migrations/20261107115424_mesh_schema.sql +109 -0
  262. desktop_monkey-0.1.0/tests/__init__.py +0 -0
  263. desktop_monkey-0.1.0/tests/agent/__init__.py +0 -0
  264. desktop_monkey-0.1.0/tests/agent/fake_relay.py +263 -0
  265. desktop_monkey-0.1.0/tests/agent/test_enrol.py +220 -0
  266. desktop_monkey-0.1.0/tests/agent/test_executor.py +626 -0
  267. desktop_monkey-0.1.0/tests/agent/test_memory_integration.py +355 -0
  268. desktop_monkey-0.1.0/tests/agent/test_tunnel.py +185 -0
  269. desktop_monkey-0.1.0/tests/commander/__init__.py +0 -0
  270. desktop_monkey-0.1.0/tests/commander/conftest.py +47 -0
  271. desktop_monkey-0.1.0/tests/commander/test_config.py +213 -0
  272. desktop_monkey-0.1.0/tests/commander/test_edit.py +189 -0
  273. desktop_monkey-0.1.0/tests/commander/test_fs.py +360 -0
  274. desktop_monkey-0.1.0/tests/commander/test_history.py +162 -0
  275. desktop_monkey-0.1.0/tests/commander/test_pdf.py +137 -0
  276. desktop_monkey-0.1.0/tests/commander/test_process.py +171 -0
  277. desktop_monkey-0.1.0/tests/commander/test_search.py +209 -0
  278. desktop_monkey-0.1.0/tests/commander/test_serve_wiring.py +117 -0
  279. desktop_monkey-0.1.0/tests/commander/test_server.py +107 -0
  280. desktop_monkey-0.1.0/tests/commander/test_stats.py +88 -0
  281. desktop_monkey-0.1.0/tests/conftest.py +35 -0
  282. desktop_monkey-0.1.0/tests/deploy/__init__.py +0 -0
  283. desktop_monkey-0.1.0/tests/deploy/test_guard.py +70 -0
  284. desktop_monkey-0.1.0/tests/e2e/__init__.py +1 -0
  285. desktop_monkey-0.1.0/tests/e2e/conftest.py +188 -0
  286. desktop_monkey-0.1.0/tests/e2e/test_enrol_tunnel.py +245 -0
  287. desktop_monkey-0.1.0/tests/e2e/test_mesh_local.py +174 -0
  288. desktop_monkey-0.1.0/tests/e2e/test_mesh_two_devices.py +174 -0
  289. desktop_monkey-0.1.0/tests/fixtures/mesh/troop-two-devices.json +377 -0
  290. desktop_monkey-0.1.0/tests/hooks/__init__.py +1 -0
  291. desktop_monkey-0.1.0/tests/hooks/conftest.py +115 -0
  292. desktop_monkey-0.1.0/tests/hooks/fixtures/claude.settings.json +228 -0
  293. desktop_monkey-0.1.0/tests/hooks/fixtures/codex.hooks.json +111 -0
  294. desktop_monkey-0.1.0/tests/hooks/fixtures/cursor.hooks.json +29 -0
  295. desktop_monkey-0.1.0/tests/hooks/test_adapters.py +194 -0
  296. desktop_monkey-0.1.0/tests/hooks/test_caps.py +74 -0
  297. desktop_monkey-0.1.0/tests/hooks/test_cli.py +188 -0
  298. desktop_monkey-0.1.0/tests/hooks/test_decisions.py +136 -0
  299. desktop_monkey-0.1.0/tests/hooks/test_engine.py +267 -0
  300. desktop_monkey-0.1.0/tests/hooks/test_events.py +86 -0
  301. desktop_monkey-0.1.0/tests/hooks/test_learning_hooks.py +147 -0
  302. desktop_monkey-0.1.0/tests/hooks/test_manifest.py +109 -0
  303. desktop_monkey-0.1.0/tests/hooks/test_mesh.py +120 -0
  304. desktop_monkey-0.1.0/tests/hooks/test_receipts.py +106 -0
  305. desktop_monkey-0.1.0/tests/hooks/test_replay.py +64 -0
  306. desktop_monkey-0.1.0/tests/hooks/test_trust.py +77 -0
  307. desktop_monkey-0.1.0/tests/interop/__init__.py +1 -0
  308. desktop_monkey-0.1.0/tests/interop/test_sdk_http.py +110 -0
  309. desktop_monkey-0.1.0/tests/interop/test_stdio_sdk.py +44 -0
  310. desktop_monkey-0.1.0/tests/learning/test_brain.py +233 -0
  311. desktop_monkey-0.1.0/tests/learning/test_brain_coordizer.py +11 -0
  312. desktop_monkey-0.1.0/tests/learning/test_qig_memory_bridge.py +73 -0
  313. desktop_monkey-0.1.0/tests/learning/test_re_integration.py +56 -0
  314. desktop_monkey-0.1.0/tests/learning/test_voluntary_llm.py +148 -0
  315. desktop_monkey-0.1.0/tests/learning/test_weight_space.py +74 -0
  316. desktop_monkey-0.1.0/tests/mesh/__init__.py +1 -0
  317. desktop_monkey-0.1.0/tests/mesh/conftest.py +110 -0
  318. desktop_monkey-0.1.0/tests/mesh/test_adapters.py +161 -0
  319. desktop_monkey-0.1.0/tests/mesh/test_api_contract.py +39 -0
  320. desktop_monkey-0.1.0/tests/mesh/test_calibration.py +59 -0
  321. desktop_monkey-0.1.0/tests/mesh/test_cli_mesh.py +42 -0
  322. desktop_monkey-0.1.0/tests/mesh/test_cost.py +145 -0
  323. desktop_monkey-0.1.0/tests/mesh/test_engines.py +435 -0
  324. desktop_monkey-0.1.0/tests/mesh/test_fabric.py +539 -0
  325. desktop_monkey-0.1.0/tests/mesh/test_fabric_adapters.py +106 -0
  326. desktop_monkey-0.1.0/tests/mesh/test_honesty.py +162 -0
  327. desktop_monkey-0.1.0/tests/mesh/test_links.py +68 -0
  328. desktop_monkey-0.1.0/tests/mesh/test_llamacpp_loopback.py +608 -0
  329. desktop_monkey-0.1.0/tests/mesh/test_memory.py +480 -0
  330. desktop_monkey-0.1.0/tests/mesh/test_pools.py +319 -0
  331. desktop_monkey-0.1.0/tests/mesh/test_power.py +98 -0
  332. desktop_monkey-0.1.0/tests/mesh/test_power_aware_mesh.py +22 -0
  333. desktop_monkey-0.1.0/tests/mesh/test_power_aware_scheduler.py +31 -0
  334. desktop_monkey-0.1.0/tests/mesh/test_probe.py +267 -0
  335. desktop_monkey-0.1.0/tests/mesh/test_qig_scheduler.py +42 -0
  336. desktop_monkey-0.1.0/tests/mesh/test_qpu_replication.py +56 -0
  337. desktop_monkey-0.1.0/tests/mesh/test_router.py +250 -0
  338. desktop_monkey-0.1.0/tests/mesh/test_scheduler.py +384 -0
  339. desktop_monkey-0.1.0/tests/mesh/test_topology.py +202 -0
  340. desktop_monkey-0.1.0/tests/mesh/test_troop.py +198 -0
  341. desktop_monkey-0.1.0/tests/monitor/__init__.py +0 -0
  342. desktop_monkey-0.1.0/tests/monitor/test_monitor_troop.py +36 -0
  343. desktop_monkey-0.1.0/tests/parity/__init__.py +0 -0
  344. desktop_monkey-0.1.0/tests/parity/test_tools_snapshot.py +60 -0
  345. desktop_monkey-0.1.0/tests/protocol/__init__.py +0 -0
  346. desktop_monkey-0.1.0/tests/protocol/test_crypto_envelope.py +216 -0
  347. desktop_monkey-0.1.0/tests/qig_nexus/test_qig_nexus.py +200 -0
  348. desktop_monkey-0.1.0/tests/relay/__init__.py +1 -0
  349. desktop_monkey-0.1.0/tests/relay/_helpers.py +376 -0
  350. desktop_monkey-0.1.0/tests/relay/conftest.py +209 -0
  351. desktop_monkey-0.1.0/tests/relay/test_accounts.py +373 -0
  352. desktop_monkey-0.1.0/tests/relay/test_app_misc.py +283 -0
  353. desktop_monkey-0.1.0/tests/relay/test_auth_bearer.py +136 -0
  354. desktop_monkey-0.1.0/tests/relay/test_brand_pages.py +84 -0
  355. desktop_monkey-0.1.0/tests/relay/test_device_flow.py +366 -0
  356. desktop_monkey-0.1.0/tests/relay/test_mcp_http.py +694 -0
  357. desktop_monkey-0.1.0/tests/relay/test_mesh_api.py +227 -0
  358. desktop_monkey-0.1.0/tests/relay/test_mesh_http_routes.py +60 -0
  359. desktop_monkey-0.1.0/tests/relay/test_mesh_memory.py +133 -0
  360. desktop_monkey-0.1.0/tests/relay/test_oauth_contract.py +645 -0
  361. desktop_monkey-0.1.0/tests/relay/test_tunnel_hub.py +703 -0
  362. desktop_monkey-0.1.0/tests/relay/test_usage_billing.py +451 -0
  363. desktop_monkey-0.1.0/tests/security/test_request_firewall.py +45 -0
  364. desktop_monkey-0.1.0/tests/test_cli_surface.py +85 -0
  365. desktop_monkey-0.1.0/tests/test_smoke.py +15 -0
  366. desktop_monkey-0.1.0/tests/theme/__init__.py +0 -0
  367. desktop_monkey-0.1.0/tests/theme/test_theme.py +246 -0
  368. desktop_monkey-0.1.0/theme/tokens.json +136 -0
  369. desktop_monkey-0.1.0/uv.lock +2799 -0
  370. desktop_monkey-0.1.0/vercel.json +28 -0
@@ -0,0 +1,37 @@
1
+ name: ci
2
+
3
+ on:
4
+ push:
5
+ branches: [development, main]
6
+ pull_request:
7
+ branches: [development, main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ group: ci-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ test:
18
+ # 3.12 is the declared floor (pyproject requires-python); 3.14 is what the maintainers run.
19
+ # A defect that only exists on the floor (Path.read_text(newline=) is 3.13+) cannot be seen
20
+ # by a test on the newer interpreter, so both stay in the matrix.
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 20
23
+ strategy:
24
+ fail-fast: false
25
+ matrix:
26
+ python: ["3.12", "3.14"]
27
+ steps:
28
+ - uses: actions/checkout@v7
29
+ - uses: astral-sh/setup-uv@v10.3.3
30
+ with:
31
+ python-version: ${{ matrix.python }}
32
+ - run: uv sync --all-extras --frozen
33
+ - run: uv run ruff check src tests
34
+ - run: uv run ruff format --check src tests
35
+ - run: uv run mypy src
36
+ - run: uv run pytest -q
37
+ - run: uv run python scripts/verify_done_contract.py --check
@@ -0,0 +1,31 @@
1
+ name: publish-npm
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write # Required for OIDC trusted publishing
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 15
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ - name: Verify Done-Contract gate
19
+ run: python3 scripts/verify_done_contract.py --check
20
+ - uses: actions/setup-node@v6
21
+ with:
22
+ node-version: '24'
23
+ registry-url: 'https://registry.npmjs.org'
24
+ package-manager-cache: false
25
+ - name: Upgrade npm for OIDC
26
+ run: npm install -g npm@^11.15.0
27
+ # No --provenance: npm only accepts provenance from PUBLIC source repos (E422 otherwise) and
28
+ # Arcane-Fly/desktop-monkey is private. Trusted publishing (OIDC) itself works from private repos.
29
+ # Bump package.json "version" before tagging: 0.1.0 is already on the registry.
30
+ - name: Publish to npm
31
+ run: npm publish --access public
@@ -0,0 +1,26 @@
1
+ name: publish-pypi
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write # Required for OIDC trusted publishing
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 15
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ - uses: astral-sh/setup-uv@v10.3.3
19
+ with:
20
+ python-version: "3.12"
21
+ - run: uv sync --all-extras --frozen
22
+ - run: uv run python scripts/verify_done_contract.py --check
23
+ - run: uv run pytest -q
24
+ - run: uv build
25
+ - name: Publish to PyPI
26
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,32 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .mypy_cache/
7
+ node_modules/
8
+ dist/
9
+ build/
10
+ *.egg-info/
11
+ .env
12
+ .env.*
13
+ !.env.example
14
+ .vercel/
15
+ .railway/
16
+ *.log
17
+ .DS_Store
18
+ coverage/
19
+ .coverage
20
+ # operator-only secrets / local state never committed
21
+ state/
22
+ *.pem
23
+ *.key
24
+ # local databases (relay.db holds signing keys + device codes) and Supabase CLI link state
25
+ *.db
26
+ supabase/.temp/
27
+ dashboard/node_modules/
28
+ dashboard/dist/
29
+ dashboard/public/brand/
30
+ dashboard/package-lock.json
31
+ dist/
32
+ *.svg
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,70 @@
1
+ # desktop-monkey — agent rulebook
2
+
3
+ Canonical instructions for every AI agent and human working in this repo.
4
+
5
+ ## Scope and silo
6
+
7
+ * Repo: `Arcane-Fly/desktop-monkey` (private). Local: `~/Desktop/Dev/desktopmonkey`.
8
+ * Memory silo: **`_dev_`** (not `bsuite_`, not `qig_`). Cross-silo reads are fine; **cross-silo
9
+ writes are forbidden**. QIG packages are *consumed* as dependencies; this project is not QIG.
10
+ * Python 3.12+ for device-side code (matches Monkey Monitor + QIG packages). TypeScript for the
11
+ web dashboard and shared schema package only.
12
+
13
+ ## Deploy isolation (hard rules — an incident here is an incident in someone else's project)
14
+
15
+ The Railway workspace `arcane-fly`, the Vercel team `braden-pty-ltd` and the Supabase org hold many
16
+ unrelated production projects (BSuite, monkey-oauth/fastmonkey.au, muscles, practicebridge, …).
17
+
18
+ 1. Desktop Monkey only ever acts on resources **pinned by ID** in `deploy/targets.json` (Railway
19
+ project `mesh-vm-test` with services `relay` and `mesh-vm`; Supabase `supabase-monkey-one` through
20
+ role `dm_relay`; Vercel project `dashboard`, which builds `dashboard/`). Pass the IDs explicitly
21
+ on every command; never infer a target from a CLI's "current" link.
22
+ 2. Every agent-run Railway change goes through `deploy/guard.py run` (deploys, redeploys, variable
23
+ edits). It refuses unpinned services, checks the CLI link against the pinned IDs, snapshots every
24
+ *other* project's latest deployment before and after, and exits 3 if any of them changed.
25
+ `python deploy/guard.py check` and `snapshot` are read-only.
26
+ 3. **Supabase** (operator decision 2026-11-07): the relay uses `supabase-monkey-one`
27
+ (`kxdaxwvxaonnvjmqfvtj`; related to the monkey apps and to be integrated with them) **only**
28
+ through role `dm_relay`, whose search_path is pinned to schema `desktop_monkey` (not exposed to
29
+ the Data API). Never point Desktop Monkey at the shared `postgres` credentials or at monkey-one's
30
+ `public` schema; any table created in an API-exposed schema gets RLS in the same migration. The
31
+ BSuite projects (`tuybltdrdefjblnplpqo`, `yhwlnehzclclnkpxjepc`) and every other Supabase project
32
+ are off limits. Creating a Supabase project needs operator approval (cost).
33
+ 4. No `railway link`/`vercel link` against an unpinned project. No env-var edits on any project not
34
+ in `deploy/targets.json`. No domain changes on `fastmonkey.au` or any `crm7.app` host.
35
+ 5. Secrets never enter the repo, prompts, logs, tool output or screenshots. Pass them on stdin or in
36
+ the environment, never on a command line, and never print them (`railway variables --json`,
37
+ `supabase projects api-keys`, `vercel env pull` to stdout). Tokens live in the platform secret
38
+ stores or `state/` (git-ignored). A service gets only the variables its code reads
39
+ (`deploy/targets.json` → `variables_read_by_code`), never a copied bundle.
40
+ 6. Connection strings come from the provider (Supabase Connect dialog or `supabase/.temp/pooler-url`,
41
+ Railway reference variables). **Never compose or guess hostnames, ports or users.** The relay has
42
+ no IPv6 egress, so it reaches Supabase through the session pooler (IPv4, port 5432).
43
+ 7. Never retry authentication in a loop against a production database. Supabase's pooler answers
44
+ repeated failures with `ECIRCUITBREAKER` and blocks new logins. One failed login: stop and report.
45
+
46
+ ## Operator-reserved actions (do not perform; queue in `docs/RESERVED-FOR-OPERATOR.md`)
47
+
48
+ * Publishing to npm / PyPI (needs operator-held credentials).
49
+ * Setting or rotating passwords and other credentials (database roles, API keys, platform secrets).
50
+ * Creating Supabase projects, custom DNS/domains, paid GPU/model spend (Modal etc.).
51
+ * `sudo`/system-level installs, editing global agent configs (`~/.claude`, `~/.codex`, `~/.cursor`),
52
+ changing the installed Monkey Monitor system service, touching any device other than this one.
53
+ * Anything touching another project's resources.
54
+
55
+ ## Working rules
56
+
57
+ * **Evidence, not assertion.** "Done" = the command that was run + its real output. Parity claims
58
+ are checked by `docs/parity/` tests, not by prose.
59
+ * **A deploy is verified by the running service, not by a status read.** On 2026-11-07 a `SUCCESS`
60
+ status was read twice, seconds before the app crashed. Wait at least 60 s, read the deploy logs,
61
+ and check `/health`, OAuth discovery and `POST /mcp` → 401 before saying it works.
62
+ * **No fabricated output.** If a tool/network call fails, say so and use another route. Label work as
63
+ it actually ran: local vs mesh, threads vs devices.
64
+ * **Finish the whole ask.** Do not narrow scope silently; report `done/asked`.
65
+ * Commits: `type(scope): description`, GPG-signed. Branches: `main` (release) and `development`
66
+ (integration). Work lands on `development`; `main` by PR at milestones.
67
+ * Reverse engineering is **clean-room**: observe behaviour, record it in `docs/parity/`, implement
68
+ independently. Do not vendor proprietary frontend code or tokens.
69
+ * Colour/brand: bind UI to the theme tokens (`theme/`, `src/desktop_monkey/theme`) shared with
70
+ Monkey Monitor. No raw hex in UI code outside the token source.
@@ -0,0 +1,3 @@
1
+ # CLAUDE.md
2
+
3
+ See [AGENTS.md](AGENTS.md) — it is the single rulebook for this repository.
@@ -0,0 +1,27 @@
1
+ # Stage 1: Build the Dashboard SPA (React 19 + Vite + BSuite D2C Neon Electric theme)
2
+ FROM node:22-slim AS dashboard-build
3
+ WORKDIR /dashboard
4
+ COPY dashboard/package.json ./
5
+ RUN npm install --no-audit --no-fund
6
+ COPY dashboard/ ./
7
+ COPY src/desktop_monkey/theme/assets/ ./public/brand/
8
+ RUN npm run build
9
+
10
+ # Stage 2: Mesh relay + dashboard hub image for Railway
11
+ FROM python:3.13-slim
12
+
13
+ WORKDIR /app
14
+
15
+ COPY pyproject.toml README.md ./
16
+ COPY src ./src
17
+ COPY --from=dashboard-build /dashboard/dist /app/dashboard/dist
18
+
19
+ RUN python -m pip install --no-cache-dir --upgrade pip \
20
+ && python -m pip install --no-cache-dir '.[relay]'
21
+
22
+ # Relay binds 0.0.0.0:$PORT and serves the built dashboard SPA from RELAY_STATIC_DIR
23
+ ENV PORT=8787
24
+ ENV RELAY_STATIC_DIR=/app/dashboard/dist
25
+ EXPOSE 8787
26
+
27
+ CMD ["python", "-m", "desktop_monkey.relay"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Braden Pty Ltd / Arcane-Fly
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,12 @@
1
+ Desktop Monkey
2
+ Copyright (c) 2026 Braden Pty Ltd / Arcane-Fly. MIT.
3
+
4
+ Portions of src/desktop_monkey/commander/data/dc-oss-tools.json (tool names, JSON Schemas and
5
+ description strings) are derived from Desktop Commander MCP
6
+ (https://github.com/wonderwhy-er/DesktopCommanderMCP, v0.3.1, commit e701d2b),
7
+ Copyright (c) 2024-2025 Eduard Ruzga and Desktop Commander Contributors, MIT License.
8
+ Used for interface compatibility. The hosted Remote MCP service is closed source; Desktop Monkey's
9
+ relay and dashboard are independent, clean-room implementations of its observable behaviour.
10
+
11
+ integrations/monkey-monitor/ is a vendored snapshot of the operator's own Monkey Monitor project
12
+ (see integrations/monkey-monitor/UPSTREAM.md).
@@ -0,0 +1,164 @@
1
+ Metadata-Version: 2.5
2
+ Name: desktop-monkey
3
+ Version: 0.1.0
4
+ Summary: Desktop Commander-parity remote MCP plus a device mesh that pools compute, GPU, RAM and disk across your own machines.
5
+ Project-URL: Homepage, https://github.com/Arcane-Fly/desktop-monkey
6
+ Project-URL: Issues, https://github.com/Arcane-Fly/desktop-monkey/issues
7
+ Author: Braden Pty Ltd / Arcane-Fly
8
+ License: MIT
9
+ License-File: LICENSE
10
+ License-File: NOTICE
11
+ Keywords: agent-hooks,desktop-commander,distributed,llm,mcp,mesh,remote-mcp
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Operating System :: Microsoft :: Windows
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Topic :: Software Development
20
+ Classifier: Topic :: System :: Distributed Computing
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: cryptography>=44
23
+ Requires-Dist: httpx>=0.28
24
+ Requires-Dist: jsonschema>=4.23
25
+ Requires-Dist: orjson>=3.10
26
+ Requires-Dist: psutil>=6.1
27
+ Requires-Dist: pydantic>=2.11
28
+ Requires-Dist: pyhpke>=0.6.3
29
+ Requires-Dist: qig-coordizer>=0.1.0
30
+ Requires-Dist: qig-warp>=0.6.10
31
+ Requires-Dist: typer>=0.15
32
+ Requires-Dist: websockets>=15
33
+ Provides-Extra: all
34
+ Requires-Dist: aiosqlite>=0.20; extra == 'all'
35
+ Requires-Dist: argon2-cffi>=23.1; extra == 'all'
36
+ Requires-Dist: asyncpg>=0.30; extra == 'all'
37
+ Requires-Dist: charset-normalizer>=3.4; extra == 'all'
38
+ Requires-Dist: dask>=2025.1; extra == 'all'
39
+ Requires-Dist: markdown-it-py>=3.0; extra == 'all'
40
+ Requires-Dist: numpy>=2.0; extra == 'all'
41
+ Requires-Dist: nvidia-ml-py>=12.560; (sys_platform != 'darwin') and extra == 'all'
42
+ Requires-Dist: openpyxl>=3.1; extra == 'all'
43
+ Requires-Dist: pyjwt[crypto]>=2.10; extra == 'all'
44
+ Requires-Dist: pypdf>=5; extra == 'all'
45
+ Requires-Dist: pywinpty>=2.0; (sys_platform == 'win32') and extra == 'all'
46
+ Requires-Dist: qig-compute>=0.9.10; extra == 'all'
47
+ Requires-Dist: ray>=2.40; extra == 'all'
48
+ Requires-Dist: reportlab>=4.2; extra == 'all'
49
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.36; extra == 'all'
50
+ Requires-Dist: starlette>=0.46; extra == 'all'
51
+ Requires-Dist: uvicorn[standard]>=0.34; extra == 'all'
52
+ Requires-Dist: weightspace>=0.3; extra == 'all'
53
+ Requires-Dist: zeroconf>=0.140; extra == 'all'
54
+ Provides-Extra: commander
55
+ Requires-Dist: charset-normalizer>=3.4; extra == 'commander'
56
+ Requires-Dist: markdown-it-py>=3.0; extra == 'commander'
57
+ Requires-Dist: openpyxl>=3.1; extra == 'commander'
58
+ Requires-Dist: pypdf>=5; extra == 'commander'
59
+ Requires-Dist: pywinpty>=2.0; (sys_platform == 'win32') and extra == 'commander'
60
+ Requires-Dist: reportlab>=4.2; extra == 'commander'
61
+ Provides-Extra: dev
62
+ Requires-Dist: anyio>=4.8; extra == 'dev'
63
+ Requires-Dist: dask>=2025.1; extra == 'dev'
64
+ Requires-Dist: mcp>=1.9; extra == 'dev'
65
+ Requires-Dist: mypy>=1.14; extra == 'dev'
66
+ Requires-Dist: pytest-asyncio>=0.25; extra == 'dev'
67
+ Requires-Dist: pytest-timeout>=2.3; extra == 'dev'
68
+ Requires-Dist: pytest>=8.3; extra == 'dev'
69
+ Requires-Dist: qig-compute>=0.9.10; extra == 'dev'
70
+ Requires-Dist: ray>=2.40; extra == 'dev'
71
+ Requires-Dist: ruff>=0.9; extra == 'dev'
72
+ Requires-Dist: weightspace>=0.3; extra == 'dev'
73
+ Provides-Extra: fabric
74
+ Requires-Dist: dask>=2025.1; extra == 'fabric'
75
+ Requires-Dist: ray>=2.40; extra == 'fabric'
76
+ Provides-Extra: mesh
77
+ Requires-Dist: numpy>=2.0; extra == 'mesh'
78
+ Requires-Dist: nvidia-ml-py>=12.560; (sys_platform != 'darwin') and extra == 'mesh'
79
+ Requires-Dist: zeroconf>=0.140; extra == 'mesh'
80
+ Provides-Extra: qig
81
+ Requires-Dist: qig-compute>=0.9.10; extra == 'qig'
82
+ Provides-Extra: relay
83
+ Requires-Dist: aiosqlite>=0.20; extra == 'relay'
84
+ Requires-Dist: argon2-cffi>=23.1; extra == 'relay'
85
+ Requires-Dist: asyncpg>=0.30; extra == 'relay'
86
+ Requires-Dist: pyjwt[crypto]>=2.10; extra == 'relay'
87
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.36; extra == 'relay'
88
+ Requires-Dist: starlette>=0.46; extra == 'relay'
89
+ Requires-Dist: uvicorn[standard]>=0.34; extra == 'relay'
90
+ Provides-Extra: weightspace
91
+ Requires-Dist: weightspace>=0.3; extra == 'weightspace'
92
+ Description-Content-Type: text/markdown
93
+
94
+ # Desktop Monkey
95
+
96
+ > Your machines, one troop. A Desktop Commander–parity **remote MCP** plus a **device mesh** that
97
+ > pools compute, GPU, RAM and disk across the PCs and laptops you own.
98
+
99
+ **Status:** under construction — see [`docs/DONE-CONTRACT.json`](docs/DONE-CONTRACT.json) for the
100
+ machine-checkable list of what "finished" means and [`docs/STATUS.md`](docs/STATUS.md) for the live
101
+ done/asked count.
102
+
103
+ ## What it is
104
+
105
+ 1. **Commander layer** — 100% tool-surface and service parity with
106
+ [Desktop Commander Remote MCP](https://mcp.desktopcommander.app/): every MCP tool, plus the
107
+ hosted pieces (device enrolment, tunnel, per-client OAuth, usage metering, tool-call log,
108
+ revoke/share, settings). Parity is tracked in [`docs/parity/`](docs/parity/).
109
+ 2. **Troop mesh** — concurrent coordination of several machines: *primary + support*, *several
110
+ supports*, rings and chains. Work is split so that no single machine has to carry the compute,
111
+ GPU memory, RAM or disk. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
112
+ 3. **Hooks** — an improved, typed, auditable hook engine (lessons from Claude Code, Codex and
113
+ Cursor hooks) that also fires on mesh events.
114
+ 4. **Monkey Monitor entry point** — the local GTK app
115
+ ([`monkey-projects/monkey-monitor`](../monkey-projects/monkey-monitor)) is the local front door;
116
+ Desktop Monkey shares its colour tokens and logo.
117
+
118
+ ## Layout
119
+
120
+ One Python package, `src/desktop_monkey/` (the earlier `packages/` / `services/` / `apps/` split was
121
+ never built):
122
+
123
+ | Path | Purpose |
124
+ |---|---|
125
+ | `src/desktop_monkey/protocol` | MCP tool schemas + mesh wire messages |
126
+ | `src/desktop_monkey/commander` | Desktop Commander–parity MCP server |
127
+ | `src/desktop_monkey/agent` | Per-device daemon |
128
+ | `src/desktop_monkey/mesh` | Mesh scheduling, placement and pooling |
129
+ | `src/desktop_monkey/relay` | Control plane + tunnel (deployed on Railway) |
130
+ | `src/desktop_monkey/hooks` | Hook engine and adapters |
131
+ | `src/desktop_monkey/learning` | Learning experiments |
132
+ | `src/desktop_monkey/monitor` | Monkey Monitor integration |
133
+ | `src/desktop_monkey/security` | Security helpers |
134
+ | `src/desktop_monkey/theme`, `theme/` | Colour + logo tokens shared with Monkey Monitor |
135
+ | `tests/` | Test suite |
136
+ | `deploy/` | `targets.json` (pinned IDs) + `guard.py` (deploy isolation check) |
137
+ | `scripts/` | Dev and operator scripts (`connect_relay_db.sh`, …) |
138
+ | `supabase/migrations/` | Mesh schema on supabase-monkey-one (`public.mesh_*`, RLS on) |
139
+ | `docs/` | Vision, architecture, ADRs, parity matrix, research |
140
+
141
+ ## Live hub
142
+
143
+ The mesh relay is deployed on Railway as the central hub. This section lists its endpoints;
144
+ current health is in [`docs/STATUS.md`](docs/STATUS.md).
145
+
146
+ | | |
147
+ |---|---|
148
+ | **Public URL** | `https://relay-production-ef48.up.railway.app` |
149
+ | **Health** | `GET /health` → `{"status":"ok"}` |
150
+ | **MCP endpoint** | `POST /mcp` (OAuth 2.1 bearer token, PKCE S256; 401 without token) |
151
+ | **Device mesh tunnel** | `wss://relay-production-ef48.up.railway.app/tunnel` |
152
+ | **OAuth discovery** | `/.well-known/oauth-authorization-server` (issuer = public URL) |
153
+ | **JWKS** | `/.well-known/jwks.json` (ES256) |
154
+ | **Device enrolment** | `/device/start` → `/device/poll` → `/device/verify` (device-code flow) |
155
+ | **Device API** | `/api/devices` (pause / resume / revoke) |
156
+
157
+ Devices and MCP clients connect to the public URL above; `RELAY_PUBLIC_URL` is set
158
+ on the Railway `relay` service so the OAuth issuer matches. The image is built from
159
+ the repo `Dockerfile` (`pip install '.[relay]'`), which pins the relay extras the
160
+ platform builder would otherwise skip.
161
+
162
+ ## Rules of the road
163
+
164
+ Read [`AGENTS.md`](AGENTS.md) before touching anything — especially the deploy-isolation rules.
@@ -0,0 +1 @@
1
+ web: python -m desktop_monkey.relay
@@ -0,0 +1,71 @@
1
+ # Desktop Monkey
2
+
3
+ > Your machines, one troop. A Desktop Commander–parity **remote MCP** plus a **device mesh** that
4
+ > pools compute, GPU, RAM and disk across the PCs and laptops you own.
5
+
6
+ **Status:** under construction — see [`docs/DONE-CONTRACT.json`](docs/DONE-CONTRACT.json) for the
7
+ machine-checkable list of what "finished" means and [`docs/STATUS.md`](docs/STATUS.md) for the live
8
+ done/asked count.
9
+
10
+ ## What it is
11
+
12
+ 1. **Commander layer** — 100% tool-surface and service parity with
13
+ [Desktop Commander Remote MCP](https://mcp.desktopcommander.app/): every MCP tool, plus the
14
+ hosted pieces (device enrolment, tunnel, per-client OAuth, usage metering, tool-call log,
15
+ revoke/share, settings). Parity is tracked in [`docs/parity/`](docs/parity/).
16
+ 2. **Troop mesh** — concurrent coordination of several machines: *primary + support*, *several
17
+ supports*, rings and chains. Work is split so that no single machine has to carry the compute,
18
+ GPU memory, RAM or disk. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
19
+ 3. **Hooks** — an improved, typed, auditable hook engine (lessons from Claude Code, Codex and
20
+ Cursor hooks) that also fires on mesh events.
21
+ 4. **Monkey Monitor entry point** — the local GTK app
22
+ ([`monkey-projects/monkey-monitor`](../monkey-projects/monkey-monitor)) is the local front door;
23
+ Desktop Monkey shares its colour tokens and logo.
24
+
25
+ ## Layout
26
+
27
+ One Python package, `src/desktop_monkey/` (the earlier `packages/` / `services/` / `apps/` split was
28
+ never built):
29
+
30
+ | Path | Purpose |
31
+ |---|---|
32
+ | `src/desktop_monkey/protocol` | MCP tool schemas + mesh wire messages |
33
+ | `src/desktop_monkey/commander` | Desktop Commander–parity MCP server |
34
+ | `src/desktop_monkey/agent` | Per-device daemon |
35
+ | `src/desktop_monkey/mesh` | Mesh scheduling, placement and pooling |
36
+ | `src/desktop_monkey/relay` | Control plane + tunnel (deployed on Railway) |
37
+ | `src/desktop_monkey/hooks` | Hook engine and adapters |
38
+ | `src/desktop_monkey/learning` | Learning experiments |
39
+ | `src/desktop_monkey/monitor` | Monkey Monitor integration |
40
+ | `src/desktop_monkey/security` | Security helpers |
41
+ | `src/desktop_monkey/theme`, `theme/` | Colour + logo tokens shared with Monkey Monitor |
42
+ | `tests/` | Test suite |
43
+ | `deploy/` | `targets.json` (pinned IDs) + `guard.py` (deploy isolation check) |
44
+ | `scripts/` | Dev and operator scripts (`connect_relay_db.sh`, …) |
45
+ | `supabase/migrations/` | Mesh schema on supabase-monkey-one (`public.mesh_*`, RLS on) |
46
+ | `docs/` | Vision, architecture, ADRs, parity matrix, research |
47
+
48
+ ## Live hub
49
+
50
+ The mesh relay is deployed on Railway as the central hub. This section lists its endpoints;
51
+ current health is in [`docs/STATUS.md`](docs/STATUS.md).
52
+
53
+ | | |
54
+ |---|---|
55
+ | **Public URL** | `https://relay-production-ef48.up.railway.app` |
56
+ | **Health** | `GET /health` → `{"status":"ok"}` |
57
+ | **MCP endpoint** | `POST /mcp` (OAuth 2.1 bearer token, PKCE S256; 401 without token) |
58
+ | **Device mesh tunnel** | `wss://relay-production-ef48.up.railway.app/tunnel` |
59
+ | **OAuth discovery** | `/.well-known/oauth-authorization-server` (issuer = public URL) |
60
+ | **JWKS** | `/.well-known/jwks.json` (ES256) |
61
+ | **Device enrolment** | `/device/start` → `/device/poll` → `/device/verify` (device-code flow) |
62
+ | **Device API** | `/api/devices` (pause / resume / revoke) |
63
+
64
+ Devices and MCP clients connect to the public URL above; `RELAY_PUBLIC_URL` is set
65
+ on the Railway `relay` service so the OAuth issuer matches. The image is built from
66
+ the repo `Dockerfile` (`pip install '.[relay]'`), which pins the relay extras the
67
+ platform builder would otherwise skip.
68
+
69
+ ## Rules of the road
70
+
71
+ Read [`AGENTS.md`](AGENTS.md) before touching anything — especially the deploy-isolation rules.
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark" data-theme="dark">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Desktop Monkey — Remote MCP &amp; Compute Mesh</title>
7
+ <link rel="icon" href="/brand/favicon-32.ico" sizes="32x32" />
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.jsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "desktop-monkey-dashboard",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "dependencies": {
6
+ "react": "^19.0.0",
7
+ "react-dom": "^19.0.0",
8
+ "@tanstack/react-query": "^5.0.0",
9
+ "tailwindcss": "^4.0.0",
10
+ "@tailwindcss/vite": "^4.0.0",
11
+ "@bsuite/theme": "latest"
12
+ },
13
+ "devDependencies": {
14
+ "vite": "^6.0.0",
15
+ "@vitejs/plugin-react": "^4.0.0"
16
+ },
17
+ "scripts": {
18
+ "dev": "vite",
19
+ "build": "vite build",
20
+ "preview": "vite preview"
21
+ }
22
+ }