@rubytech/create-maxy-code 0.1.186 → 0.1.188

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 (199) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/graph-mcp/dist/index.js +4 -3
  3. package/payload/platform/lib/graph-mcp/dist/index.js.map +1 -1
  4. package/payload/platform/lib/graph-mcp/src/index.ts +4 -3
  5. package/payload/platform/package.json +1 -0
  6. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  7. package/payload/platform/plugins/admin/PLUGIN.md +1 -0
  8. package/payload/platform/plugins/admin/hooks/lib/maxy-mcp-plugins.txt +16 -0
  9. package/payload/platform/plugins/admin/hooks/mcp-tool-missing.sh +94 -0
  10. package/payload/platform/plugins/admin/hooks/turn-completed-graph-write.sh +7 -0
  11. package/payload/platform/plugins/admin/skills/a4-print-documents/SKILL.md +14 -14
  12. package/payload/platform/plugins/admin/skills/deck-pages/SKILL.md +9 -23
  13. package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +1 -1
  14. package/payload/platform/plugins/admin/skills/publish-site/SKILL.md +3 -3
  15. package/payload/platform/plugins/admin/skills/skill-builder/SKILL.md +1 -1
  16. package/payload/platform/plugins/admin/skills/skill-builder/references/pdf-generation.md +4 -4
  17. package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +11 -7
  18. package/payload/platform/plugins/browser/.claude-plugin/plugin.json +1 -1
  19. package/payload/platform/plugins/browser/PLUGIN.md +78 -8
  20. package/payload/platform/plugins/browser/mcp/dist/index.js +111 -7
  21. package/payload/platform/plugins/browser/mcp/dist/index.js.map +1 -1
  22. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.d.ts +98 -0
  23. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.d.ts.map +1 -0
  24. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.js +455 -0
  25. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-actions.js.map +1 -0
  26. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.d.ts +9 -31
  27. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.d.ts.map +1 -1
  28. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.js +6 -165
  29. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-render.js.map +1 -1
  30. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.d.ts +153 -0
  31. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.d.ts.map +1 -0
  32. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.js +401 -0
  33. package/payload/platform/plugins/browser/mcp/dist/lib/cdp-session.js.map +1 -0
  34. package/payload/platform/plugins/docs/references/admin-ui.md +3 -4
  35. package/payload/platform/plugins/docs/references/deployment.md +1 -1
  36. package/payload/platform/plugins/docs/references/internals.md +6 -4
  37. package/payload/platform/plugins/docs/references/plugins-guide.md +2 -2
  38. package/payload/platform/plugins/email/.claude-plugin/plugin.json +1 -1
  39. package/payload/platform/plugins/email/PLUGIN.md +6 -2
  40. package/payload/platform/plugins/email/mcp/dist/index.js +38 -0
  41. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  42. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts +28 -0
  43. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts.map +1 -1
  44. package/payload/platform/plugins/email/mcp/dist/lib/providers.js +106 -0
  45. package/payload/platform/plugins/email/mcp/dist/lib/providers.js.map +1 -1
  46. package/payload/platform/plugins/email/references/email-reference.md +19 -15
  47. package/payload/platform/plugins/graph/.claude-plugin/plugin.json +8 -0
  48. package/payload/platform/plugins/graph/PLUGIN.md +37 -0
  49. package/payload/platform/plugins/memory/PLUGIN.md +2 -0
  50. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.d.ts +1 -1
  51. package/payload/platform/plugins/memory/mcp/dist/tools/conversation-archive-derive-insights.js +1 -1
  52. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.d.ts.map +1 -1
  53. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js +3 -2
  54. package/payload/platform/plugins/memory/mcp/dist/tools/memory-brain-capture-recent.js.map +1 -1
  55. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.d.ts.map +1 -1
  56. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js +2 -1
  57. package/payload/platform/plugins/memory/mcp/dist/tools/memory-compiled-truth-history.js.map +1 -1
  58. package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.d.ts.map +1 -1
  59. package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.js +2 -1
  60. package/payload/platform/plugins/memory/mcp/dist/tools/memory-review-queue.js.map +1 -1
  61. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts +1 -1
  62. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.d.ts.map +1 -1
  63. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js +3 -2
  64. package/payload/platform/plugins/memory/mcp/dist/tools/session-retrospective-skip-rate.js.map +1 -1
  65. package/payload/platform/plugins/memory/references/graph-primitives.md +36 -27
  66. package/payload/platform/plugins/obsidian-import/PLUGIN.md +1 -1
  67. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js +1 -1
  68. package/payload/platform/plugins/telegram/mcp/dist/tools/message-history.js.map +1 -1
  69. package/payload/platform/scripts/check-canonical-tool-names.mjs +110 -0
  70. package/payload/platform/scripts/check-cypher-int-params.mjs +277 -0
  71. package/payload/platform/scripts/generate-canonical-tool-names.mjs +63 -0
  72. package/payload/platform/scripts/lib/canonical-tool-names.mjs +88 -0
  73. package/payload/platform/scripts/setup-account.sh +6 -0
  74. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.d.ts +7 -0
  75. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.d.ts.map +1 -0
  76. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts +5 -0
  77. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -0
  78. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +204 -0
  79. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -0
  80. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.js +23 -0
  81. package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.js.map +1 -0
  82. package/payload/platform/services/claude-session-manager/dist/index.js +30 -6
  83. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  84. package/payload/platform/services/claude-session-manager/dist/mcp-tools-probe.d.ts +6 -4
  85. package/payload/platform/services/claude-session-manager/dist/mcp-tools-probe.d.ts.map +1 -1
  86. package/payload/platform/services/claude-session-manager/dist/mcp-tools-probe.js.map +1 -1
  87. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +1 -0
  88. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  89. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +50 -26
  90. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  91. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +40 -0
  92. package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -0
  93. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +200 -0
  94. package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -0
  95. package/payload/platform/services/claude-session-manager/dist/specialist-drift.d.ts.map +1 -1
  96. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js +50 -34
  97. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js.map +1 -1
  98. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
  99. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +23 -13
  100. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
  101. package/payload/platform/templates/specialists/agents/content-producer.md +4 -4
  102. package/payload/platform/templates/specialists/agents/librarian.md +2 -2
  103. package/payload/platform/templates/specialists/agents/personal-assistant.md +6 -2
  104. package/payload/platform/templates/specialists/agents/project-manager.md +1 -1
  105. package/payload/platform/templates/specialists/agents/research-assistant.md +1 -1
  106. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.d.ts.map +1 -1
  107. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js +33 -1
  108. package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js.map +1 -1
  109. package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-retrieve-conditioning.ts +5 -2
  110. package/payload/server/{chunk-L2YK2VK3.js → chunk-WWD4TCJJ.js} +3 -17
  111. package/payload/server/maxy-edge.js +1 -1
  112. package/payload/server/public/assets/Checkbox-ChWmQ7if.js +1 -0
  113. package/payload/server/public/assets/admin-BLi_fAKQ.js +216 -0
  114. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DZoOzmjE.js → architectureDiagram-Q4EWVU46-DSqzB21V.js} +1 -1
  115. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DG3yufCR.js → blockDiagram-DXYQGD6D--otTO_UB.js} +1 -1
  116. package/payload/server/public/assets/brand-Djtb-tLQ.js +9 -0
  117. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-BBx5wXuZ.js → c4Diagram-AHTNJAMY-CBszqa9W.js} +1 -1
  118. package/payload/server/public/assets/channel-C-SJYogg.js +1 -0
  119. package/payload/server/public/assets/{chunk-336JU56O-DwP7g5ns.js → chunk-336JU56O-ClAJP2KY.js} +2 -2
  120. package/payload/server/public/assets/{chunk-426QAEUC-DXzGdc22.js → chunk-426QAEUC-CgLucS4H.js} +1 -1
  121. package/payload/server/public/assets/{chunk-4TB4RGXK-1LDRjk0E.js → chunk-4TB4RGXK-BvOX6mSk.js} +1 -1
  122. package/payload/server/public/assets/{chunk-5FUZZQ4R-BHjWhwhn.js → chunk-5FUZZQ4R-uyN4XtrW.js} +1 -1
  123. package/payload/server/public/assets/{chunk-5PVQY5BW-CwPHRVN8.js → chunk-5PVQY5BW-B6xHEzh2.js} +1 -1
  124. package/payload/server/public/assets/{chunk-EDXVE4YY-7443hrYZ.js → chunk-EDXVE4YY-9objw8tW.js} +1 -1
  125. package/payload/server/public/assets/{chunk-ENJZ2VHE-BTnmmnmX.js → chunk-ENJZ2VHE-pQpbHIJL.js} +1 -1
  126. package/payload/server/public/assets/{chunk-ICPOFSXX-CPnMJplL.js → chunk-ICPOFSXX-qS23jC3x.js} +1 -1
  127. package/payload/server/public/assets/{chunk-OYMX7WX6-DCQ5Q4RS.js → chunk-OYMX7WX6-C9YUwGqp.js} +1 -1
  128. package/payload/server/public/assets/{chunk-U2HBQHQK-BmfZG8e4.js → chunk-U2HBQHQK-D_pYedRJ.js} +1 -1
  129. package/payload/server/public/assets/{chunk-X2U36JSP-Da2yJL2u.js → chunk-X2U36JSP-nxf6GHD-.js} +1 -1
  130. package/payload/server/public/assets/{chunk-YZCP3GAM-BdUmMUJ6.js → chunk-YZCP3GAM-DqKT124V.js} +1 -1
  131. package/payload/server/public/assets/{chunk-ZZ45TVLE-abkGirrZ.js → chunk-ZZ45TVLE-CLwvpbvu.js} +1 -1
  132. package/payload/server/public/assets/classDiagram-6PBFFD2Q-OBkxl5to.js +1 -0
  133. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-CkTyus-1.js +1 -0
  134. package/payload/server/public/assets/clone-VufdPzJ-.js +1 -0
  135. package/payload/server/public/assets/{dagre-BVVuAEsU.js → dagre-COCXt23n.js} +1 -1
  136. package/payload/server/public/assets/{dagre-KV5264BT-VG2kNj19.js → dagre-KV5264BT-DmuVMrt4.js} +1 -1
  137. package/payload/server/public/assets/data-TlJbMIfa.js +1 -0
  138. package/payload/server/public/assets/{diagram-5BDNPKRD-DRiVy69K.js → diagram-5BDNPKRD-DOiLSgj_.js} +1 -1
  139. package/payload/server/public/assets/{diagram-G4DWMVQ6-DtpiRTYX.js → diagram-G4DWMVQ6-quY6PSZQ.js} +1 -1
  140. package/payload/server/public/assets/{diagram-MMDJMWI5-Da3t99fY.js → diagram-MMDJMWI5-tN2yiz0C.js} +1 -1
  141. package/payload/server/public/assets/{diagram-TYMM5635-BzQmLTJQ.js → diagram-TYMM5635-CjrRQNQ0.js} +1 -1
  142. package/payload/server/public/assets/{erDiagram-SMLLAGMA-D3Ll-GDw.js → erDiagram-SMLLAGMA-CrNNMxkA.js} +1 -1
  143. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-D17bje6d.js → flowDiagram-DWJPFMVM-CCUsJph7.js} +1 -1
  144. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BjeQ-Bun.js → ganttDiagram-T4ZO3ILL-18276bri.js} +1 -1
  145. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-LtX4pvZS.js → gitGraphDiagram-UUTBAWPF-CsLsKMjN.js} +1 -1
  146. package/payload/server/public/assets/graph-D2Yvni5R.js +1 -0
  147. package/payload/server/public/assets/graph-labels-uksnCgSC.js +1 -0
  148. package/payload/server/public/assets/{graphlib-CzwsfZOw.js → graphlib-CmtUzIni.js} +1 -1
  149. package/payload/server/public/assets/{infoDiagram-42DDH7IO-DOgH4i52.js → infoDiagram-42DDH7IO-Dny_ZNz3.js} +1 -1
  150. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DYqy5BFj.js → ishikawaDiagram-UXIWVN3A-kUhIUQE-.js} +1 -1
  151. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CsFpIULJ.js → journeyDiagram-VCZTEJTY-DekMvAKB.js} +1 -1
  152. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-5uZuArw7.js → kanban-definition-6JOO6SKY-st0HNZZo.js} +1 -1
  153. package/payload/server/public/assets/lib-Ca7uCvl9.js +33 -0
  154. package/payload/server/public/assets/{line-BY8PmCSW.js → line-BaNk-I7J.js} +1 -1
  155. package/payload/server/public/assets/{mermaid-parser.core-CJ_9xqwK.js → mermaid-parser.core-CRCHYQ_F.js} +1 -1
  156. package/payload/server/public/assets/{mermaid.core-CXznBkX7.js → mermaid.core-BaIYEciF.js} +3 -3
  157. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DZbHBud5.js → mindmap-definition-QFDTVHPH-D4u4KU2v.js} +1 -1
  158. package/payload/server/public/assets/{page-CfN7nw1J.js → page-DayPduMN.js} +2 -2
  159. package/payload/server/public/assets/page-QQmuB04w.js +1 -0
  160. package/payload/server/public/assets/{pieDiagram-DEJITSTG-QmOi4DRG.js → pieDiagram-DEJITSTG-BItWEilY.js} +1 -1
  161. package/payload/server/public/assets/public-Dze4yArS.js +7 -0
  162. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-Cpidq6Xj.js → quadrantDiagram-34T5L4WZ-CeWDBvmH.js} +1 -1
  163. package/payload/server/public/assets/{requirementDiagram-MS252O5E-CBqtfbzR.js → requirementDiagram-MS252O5E-CcosjedW.js} +1 -1
  164. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-4BiY4dV9.js → sankeyDiagram-XADWPNL6-DNGeFpUj.js} +1 -1
  165. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DVlL-l2u.js → sequenceDiagram-FGHM5R23-Cqy_deB6.js} +1 -1
  166. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-CAm9dW68.js → stateDiagram-FHFEXIEX-2yoAqEsA.js} +1 -1
  167. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Dc5siYvu.js +1 -0
  168. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-CD-tZc4y.js → timeline-definition-GMOUNBTQ-Dmeghpw1.js} +1 -1
  169. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Davcm0TF.js → vennDiagram-DHZGUBPP-TX5D-Zzp.js} +1 -1
  170. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-40LBYw_Y.js → wardleyDiagram-NUSXRM2D-B7mcpl5E.js} +1 -1
  171. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DEPT-__v.js → xychartDiagram-5P7HB3ND-DH77CxKf.js} +1 -1
  172. package/payload/server/public/brand/Archive/favicon.ico +0 -0
  173. package/payload/server/public/brand/Archive/maxy-black.png +0 -0
  174. package/payload/server/public/brand/Archive/maxy-horizontal.png +0 -0
  175. package/payload/server/public/brand/Archive/maxy-monochrome.png +0 -0
  176. package/payload/server/public/brand/Archive/maxy-square.png +0 -0
  177. package/payload/server/public/brand/Archive/maxy.png +0 -0
  178. package/payload/server/public/brand/Archive/star.png +0 -0
  179. package/payload/server/public/brand/Archive.zip +0 -0
  180. package/payload/server/public/data.html +5 -5
  181. package/payload/server/public/graph.html +6 -6
  182. package/payload/server/public/index.html +8 -8
  183. package/payload/server/public/public.html +5 -5
  184. package/payload/server/server.js +312 -793
  185. package/payload/server/public/assets/ChatInput-CvRaT05l.js +0 -13
  186. package/payload/server/public/assets/Checkbox-BJKNkUYu.js +0 -1
  187. package/payload/server/public/assets/admin-BNy4N2d6.js +0 -217
  188. package/payload/server/public/assets/channel-DdtUtt5g.js +0 -1
  189. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CKk2DFZe.js +0 -1
  190. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E--YvfDQCh.js +0 -1
  191. package/payload/server/public/assets/clone-Cw6UfPGM.js +0 -1
  192. package/payload/server/public/assets/data-uBpwaldK.js +0 -1
  193. package/payload/server/public/assets/graph-labels-Cn9jAE6I.js +0 -1
  194. package/payload/server/public/assets/graph-tvTPvBaz.js +0 -1
  195. package/payload/server/public/assets/lib-p4ylk2XS.js +0 -29
  196. package/payload/server/public/assets/page-B3VYaBcf.js +0 -1
  197. package/payload/server/public/assets/public-Bbew78md.js +0 -7
  198. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-B2EzXi50.js +0 -1
  199. /package/payload/server/public/assets/{ChatInput-DzacFNMk.css → brand-DzacFNMk.css} +0 -0
@@ -89,10 +89,14 @@ These indicate something broke and the agent could not complete the intended act
89
89
  | **MCP tool failure** | `[tool-result] name=mcp__* error=true` | Tool-specific — read the `output` for the error message |
90
90
  | **Neo4j LIMIT float** | `error=true` + output contains `'50.0' is not a valid value` | LIMIT parameter passed as float instead of integer. Fix: wrap with `neo4j.int()` |
91
91
  | **Bash command not found** | `error=true` + `command not found` | Missing system tool (e.g. `dig`, `nslookup` on Pi). The Pi may not have DNS utilities installed |
92
- | **Playwright DNS failure** | `error=true` + `net::ERR_NAME_NOT_RESOLVED` | Domain not resolving DNS not propagated, tunnel not running, or domain misconfigured |
93
- | **Playwright protocol blocked** | `error=true` + `Access to "file:" URL is blocked` | Agent tried to browse a local file path. Playwright only allows http/https |
94
- | **Playwright stale ref** | `error=true` + `Ref e* not found in the current page snapshot` | Agent clicked an element reference from an old snapshot without re-snapshotting |
95
- | **Playwright timeout** | `error=true` + `Timeout *ms exceeded` | Page too slow to render (common on Pi) or font loading stall |
92
+ | **Browser CDP unreachable** | `error=true` + output contains `failed: cdp-unreachable` or `failed: websocket-unavailable` | The VNC Chromium's debug port isn't answering, or the CDP websocket wouldn't attach. Chromium isn't running or `CDP_PORT` is wrong — check `vnc-boot.log` |
93
+ | **Browser session lost** | `error=true` + output contains `failed: session-lost` | Agent ran an action (click/type/read) before `browser-navigate`; no live page is attached. Fix: navigate first |
94
+ | **Browser navigate failed** | `error=true` + output contains `failed: navigate-failed` | Navigation to the URL failed bad URL, DNS not resolving, or the tunnel isn't running. The outcome's `detail` carries the underlying CDP error |
95
+ | **Browser timeout** | `error=true` + output contains `failed: load-timeout`, `failed: wait-timeout`, or `failed: command-timeout` | Page load, an awaited element, or a CDP command was too slow (common on Pi) |
96
+ | **Browser selector not found** | `error=true` + output contains `failed: selector-not-found` or `failed: option-not-found` | The CSS selector (or `<select>` option) matched nothing on the current page |
97
+ | **Browser evaluate failed** | `error=true` + output contains `failed: evaluate-failed` | In-page JavaScript threw — the agent's `browser-evaluate` expression, or an internal snapshot/probe script the page's JS context rejected |
98
+ | **Browser capture failed** | `error=true` + output contains `failed: pdf-failed` or `failed: screenshot-failed` | PDF or screenshot capture failed on the page |
99
+ | **Browser unsupported key** | `error=true` + output contains `failed: unsupported-key` | `browser-press-key` got a key name it can't map |
96
100
  | **Tool hallucination** | `error=true` + `No such tool available` | Agent invented a tool name that doesn't exist (e.g. missing double underscore in MCP tool name) |
97
101
  | **MCP validation error** | `error=true` + `Input validation error` | Agent passed wrong types or missing required fields to an MCP tool |
98
102
  | **Cloudflare cert error** | `error=true` + `Could not read certificate` | Cloudflare auth certificate missing or corrupt |
@@ -124,15 +128,15 @@ These indicate degraded behaviour or potential problems that didn't cause outrig
124
128
 
125
129
  When multiple errors appear in the same session, look for causal chains:
126
130
 
127
- - **DNS failure → retry loop**: If `ERR_NAME_NOT_RESOLVED` is followed by multiple attempts with different DNS resolution strategies (Bash dig, nslookup, DoH), the agent is trying to diagnose DNS itself. Root cause is always the tunnel or DNS config.
131
+ - **navigate-failed → retry loop**: If `failed: navigate-failed` is followed by multiple attempts with different DNS resolution strategies (Bash dig, nslookup, DoH), the agent is trying to diagnose DNS itself. Root cause is usually the tunnel or DNS config; the outcome's `detail` string carries the underlying CDP error.
128
132
 
129
133
  - **Contact-list LIMIT error → retry loop**: If `contact-list error=true` repeats 3+ times in one session, the agent is retrying with the same float parameter. This is a known Neo4j integer bug — the fix is in the MCP server, not the agent's behaviour.
130
134
 
131
135
  - **Context overflow → degraded behaviour**: If a session has `context-overflow` above 150% AND errors after that point, the overflow likely caused the errors (truncated instructions, lost context).
132
136
 
133
- - **Stale ref → re-snapshot → stale ref**: If `Ref not found` repeats, the agent may not be re-snapshotting between clicks, or the page is dynamically changing.
137
+ - **selector-not-found loop**: If `failed: selector-not-found` repeats, the agent is querying an element that isn't on the page — it hasn't loaded yet (needs a `browser-wait` first) or the selector is wrong. The on-device tools use CSS selectors, not snapshot refs, so re-snapshotting is not the fix.
134
138
 
135
- - **Screenshot timeout cluster**: Multiple `page.screenshot: Timeout` errors indicate Pi performance issues, not agent bugs. The Pi's limited CPU struggles with Playwright rendering.
139
+ - **Timeout cluster**: Multiple `failed: load-timeout` or `failed: screenshot-failed` errors indicate Pi performance issues, not agent bugs. The Pi's limited CPU struggles to render heavy pages in the VNC Chromium.
136
140
 
137
141
  ## Report Format
138
142
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser",
3
- "description": "Headless browser rendering for JavaScript-heavy pages. Provides browser-render, which drives the device's existing Chromium over the Chrome DevTools Protocol and returns a page's fully rendered DOM (HTML + visible text). This is the JS-rendering leg of the three-tool retrieval story: WebFetch (lossy summary) / url-get (verbatim, server-rendered) / browser-render (JS-rendered). Use it for client-rendered SPAs and pages that WebFetch or url-get return empty or as a shell.",
3
+ "description": "Drives the device's existing Chromium over the Chrome DevTools Protocol for both retrieval and interactive automation. browser-render reads a JS-rendered page's DOM (the JS-rendering leg of WebFetch / url-get / browser-render retrieval). The browser-navigate family keeps one page alive across calls for click/fill/snapshot automation, and browser-pdf-save / browser-screenshot turn the rendered page into PDF or PNG files on device. Use it for client-rendered SPAs, form automation, and generating A4 PDFs.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,10 +1,61 @@
1
1
  ---
2
2
  name: browser
3
- description: "Headless browser rendering for JavaScript-heavy pages. Provides browser-render, which drives the device's existing Chromium over the Chrome DevTools Protocol and returns a page's fully rendered DOM (HTML + visible text). This is the JS-rendering leg of the three-tool retrieval story: WebFetch (lossy summary) / url-get (verbatim, server-rendered) / browser-render (JS-rendered). Use it for client-rendered SPAs and pages that WebFetch or url-get return empty or as a shell."
3
+ description: "Drives the device's existing Chromium over the Chrome DevTools Protocol for both retrieval and interactive automation. browser-render reads a JS-rendered page's DOM (the JS-rendering leg of WebFetch / url-get / browser-render retrieval). The browser-navigate family keeps one page alive across calls for click/fill/snapshot automation, and browser-pdf-save / browser-screenshot turn the rendered page into PDF or PNG files on device. Use it for client-rendered SPAs, form automation, and generating A4 PDFs."
4
4
  tools:
5
5
  - name: browser-render
6
6
  publicAllowlist: false
7
7
  adminAllowlist: true
8
+ - name: browser-navigate
9
+ publicAllowlist: false
10
+ adminAllowlist: true
11
+ - name: browser-snapshot
12
+ publicAllowlist: false
13
+ adminAllowlist: true
14
+ - name: browser-click
15
+ publicAllowlist: false
16
+ adminAllowlist: true
17
+ - name: browser-fill
18
+ publicAllowlist: false
19
+ adminAllowlist: true
20
+ - name: browser-fill-form
21
+ publicAllowlist: false
22
+ adminAllowlist: true
23
+ - name: browser-type
24
+ publicAllowlist: false
25
+ adminAllowlist: true
26
+ - name: browser-press-key
27
+ publicAllowlist: false
28
+ adminAllowlist: true
29
+ - name: browser-hover
30
+ publicAllowlist: false
31
+ adminAllowlist: true
32
+ - name: browser-select-option
33
+ publicAllowlist: false
34
+ adminAllowlist: true
35
+ - name: browser-wait-for
36
+ publicAllowlist: false
37
+ adminAllowlist: true
38
+ - name: browser-handle-dialog
39
+ publicAllowlist: false
40
+ adminAllowlist: true
41
+ - name: browser-evaluate
42
+ publicAllowlist: false
43
+ adminAllowlist: true
44
+ - name: browser-console-messages
45
+ publicAllowlist: false
46
+ adminAllowlist: true
47
+ - name: browser-tabs
48
+ publicAllowlist: false
49
+ adminAllowlist: true
50
+ - name: browser-pdf-save
51
+ publicAllowlist: false
52
+ adminAllowlist: true
53
+ - name: browser-screenshot
54
+ publicAllowlist: false
55
+ adminAllowlist: true
56
+ - name: browser-resize
57
+ publicAllowlist: false
58
+ adminAllowlist: true
8
59
  always: true
9
60
  embed: false
10
61
  metadata: {"platform":{}}
@@ -23,22 +74,41 @@ mcp-manifest: auto
23
74
 
24
75
  # Browser
25
76
 
26
- Renders JavaScript-heavy web pages and returns the rendered DOM, so the agent can read content that only exists after the page's scripts run.
77
+ Drives the device's Chromium over the Chrome DevTools Protocol for three things: reading JS-rendered pages, automating a page (click/fill/snapshot), and turning a page into a PDF or PNG file on device.
27
78
 
28
79
  ## Why it exists
29
80
 
30
- `WebFetch` summarises and refuses verbatim output; `url-get` returns the verbatim source but does not execute JavaScript. Client-rendered pages (SPAs, content injected by in-page scripts) come back from both as an empty shell. `browser-render` is the only retrieval path that runs the page's JavaScript and reads the resulting DOM.
81
+ `WebFetch` summarises and refuses verbatim output; `url-get` returns the verbatim source but does not execute JavaScript. Client-rendered pages come back from both as an empty shell. `browser-render` runs the page's JavaScript and reads the resulting DOM. The automation and output tools exist because the specialists previously named a Playwright tool surface (interaction + `browser_pdf_save`) that never actually shipped on a Pi — these tools provide the same capabilities backed by the on-device CDP connection instead.
31
82
 
32
83
  ## How it works
33
84
 
34
- The device already runs a per-brand Chromium for the VNC surface, launched by `platform/scripts/vnc.sh` with `--remote-debugging-port=${CDP_PORT}`. `browser-render` attaches to that running browser over the Chrome DevTools Protocol — it never launches its own browser, so nothing extra ships on device and there is no on-demand download.
85
+ The device already runs a per-brand Chromium for the VNC surface, launched by `platform/scripts/vnc.sh` with `--remote-debugging-port=${CDP_PORT}`. Every tool attaches to that running browser over the Chrome DevTools Protocol — it never launches its own browser, so nothing extra ships on device and there is no on-demand download. The brand's CDP port reaches this server through the `CDP_PORT` spawn placeholder.
86
+
87
+ `browser-render` is **stateless**: each call opens a fresh background target, navigates, reads the DOM, and closes it. The automation tools share **one persistent page**: `browser-navigate` creates (or reuses) a single live target, and the action tools drive it across calls. If that page dies (operator closes the tab, crash, browser restart) the action tools return `session-lost` and the agent calls `browser-navigate` again — only navigate re-attaches, so a dead page is never silently replaced mid-action. `browser-tabs` opens/switches/closes pages.
88
+
89
+ ## Tools
90
+
91
+ Retrieval (stateless):
92
+ - `browser-render` — `url`, optional `loadTimeoutMs`. Returns rendered HTML + visible text.
35
93
 
36
- For each call it opens a fresh background target, navigates to the URL, waits for the page load event, reads `document.documentElement.outerHTML` and the visible `body.innerText`, then closes the target. The brand's CDP port reaches this server through the `CDP_PORT` spawn placeholder.
94
+ Automation (shared persistent page; selectors come from `browser-snapshot`):
95
+ - `browser-navigate` — open a URL and keep the page alive. Entry point for automation.
96
+ - `browser-snapshot` — accessibility snapshot: each interactive/landmark node as role, name, and a unique CSS selector to use with click/fill/hover.
97
+ - `browser-click`, `browser-fill`, `browser-fill-form`, `browser-hover`, `browser-select-option` — act on a CSS selector.
98
+ - `browser-type`, `browser-press-key` — real keyboard input (`Input.*`).
99
+ - `browser-wait-for` — wait for a selector or text to appear.
100
+ - `browser-handle-dialog` — pre-arm how the next JS dialog(s) are answered (CDP dialogs block, so policy must be set before the triggering action).
101
+ - `browser-evaluate` — run a JS expression in the page and return its value.
102
+ - `browser-console-messages` — drain buffered console output + uncaught errors.
103
+ - `browser-tabs` — list / new / select / close pages.
37
104
 
38
- ## Tool
105
+ Output (to a file on device):
106
+ - `browser-pdf-save` — `Page.printToPDF` of the current page; the on-device replacement for the old Playwright `browser_pdf_save`.
107
+ - `browser-screenshot` — PNG of the page or one element (CSS selector clip), e.g. glassmorphism print-fallback images.
108
+ - `browser-resize` — set the viewport size.
39
109
 
40
- - `browser-render` input: `url` (absolute http(s)), optional `loadTimeoutMs`. Returns the rendered HTML and visible text, or a structured failure (`cdp-unreachable`, `navigate-failed`, `load-timeout`, `evaluate-failed`, `websocket-unavailable`). Admin-allowlisted; not exposed to public chat.
110
+ All tools are admin-allowlisted; none are exposed to public chat.
41
111
 
42
112
  ## Observability
43
113
 
44
- A successful render emits `[browser-render] url=… rendered=true domBytes=…` on the server's stderr (captured by the mcp-spawn-tee log). Failures emit `rendered=false outcome=… detail=…`. On a device with no running Chromium (e.g. a laptop native-display install with no VNC browser) the tool returns `cdp-unreachable` rather than hanging.
114
+ A successful render emits `[browser-render] url=… rendered=true domBytes=…` on the server's stderr (captured by the mcp-spawn-tee log). Every other tool returns a structured outcome: `ok`, or one of `cdp-unreachable`, `session-lost`, `selector-not-found`, `option-not-found`, `wait-timeout`, `navigate-failed`, `load-timeout`, `evaluate-failed`, `command-timeout`, `pdf-failed`, `screenshot-failed`, `unsupported-key`. On a device with no running Chromium (e.g. a laptop native-display install with no VNC browser) the tools return `cdp-unreachable` rather than hanging.
@@ -4,7 +4,10 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
  import { eagerTool } from "../../../../lib/mcp-eager/dist/index.js";
6
6
  import { z } from "zod";
7
+ import { writeFile } from "node:fs/promises";
7
8
  import { renderPage } from "./lib/cdp-render.js";
9
+ import { BrowserSession, DEFAULT_COMMAND_TIMEOUT_MS, DEFAULT_LOAD_TIMEOUT_MS, } from "./lib/cdp-session.js";
10
+ import * as actions from "./lib/cdp-actions.js";
8
11
  // Cast to `any` to avoid TS2589 the same way the other plugin servers do.
9
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
13
  const server = new McpServer({ name: "maxy-browser", version: "0.1.0" });
@@ -14,6 +17,9 @@ const cdpPortRaw = process.env.CDP_PORT ?? "";
14
17
  const cdpPort = Number.parseInt(cdpPortRaw, 10);
15
18
  process.stderr.write(`[browser] boot cdpPort=${cdpPortRaw || "-"}\n`);
16
19
  const log = (line) => process.stderr.write(`${line}\n`);
20
+ const WebSocketImpl = typeof WebSocket !== "undefined"
21
+ ? WebSocket
22
+ : undefined;
17
23
  // Cap what we hand back to the model so a large SPA cannot blow the agent's
18
24
  // context window. domBytes in the header always reports the true size.
19
25
  const MAX_TEXT_CHARS = 200_000;
@@ -27,13 +33,7 @@ eagerTool(server, "browser-render", "Render a JavaScript-heavy web page in the d
27
33
  url: z.string().url().describe("Absolute http(s) URL to render"),
28
34
  loadTimeoutMs: z.number().int().positive().optional().describe("Max wait for the page load event (default 30000)"),
29
35
  }, async (params) => {
30
- const result = await renderPage(params.url, { loadTimeoutMs: params.loadTimeoutMs }, {
31
- fetchImpl: fetch,
32
- WebSocketImpl: typeof WebSocket !== "undefined" ? WebSocket : undefined,
33
- cdpHost: "127.0.0.1",
34
- cdpPort,
35
- log,
36
- });
36
+ const result = await renderPage(params.url, { loadTimeoutMs: params.loadTimeoutMs }, { fetchImpl: fetch, WebSocketImpl, cdpHost: "127.0.0.1", cdpPort, log });
37
37
  if (!result.rendered) {
38
38
  return {
39
39
  content: [{
@@ -55,6 +55,110 @@ eagerTool(server, "browser-render", "Render a JavaScript-heavy web page in the d
55
55
  }],
56
56
  };
57
57
  });
58
+ // ── Interactive automation + output tools ────────────────────────────────────
59
+ //
60
+ // All of these drive ONE persistent page held in `browserSession`, against the
61
+ // same device Chromium over CDP. The page is created by browser-navigate and
62
+ // reused across calls; browser-tabs opens/switches/closes pages. A dead page
63
+ // (operator closed the tab, crash, browser restart) yields a `session-lost`
64
+ // outcome telling the agent to navigate again — only navigate re-attaches.
65
+ const cdpDeps = { fetchImpl: fetch, WebSocketImpl, cdpHost: "127.0.0.1", cdpPort, log };
66
+ const browserSession = new BrowserSession(cdpDeps);
67
+ const actionCtx = {
68
+ deps: cdpDeps,
69
+ commandTimeoutMs: DEFAULT_COMMAND_TIMEOUT_MS,
70
+ loadTimeoutMs: DEFAULT_LOAD_TIMEOUT_MS,
71
+ writeFile: (path, data) => writeFile(path, data),
72
+ };
73
+ function reply(label, r, successText) {
74
+ if (!r.ok) {
75
+ return {
76
+ content: [{ type: "text", text: `${label} failed: ${r.outcome}${r.detail ? ` — ${r.detail}` : ""}` }],
77
+ isError: true,
78
+ };
79
+ }
80
+ return { content: [{ type: "text", text: successText ?? `${label}: ok` }] };
81
+ }
82
+ eagerTool(server, "browser-navigate", "Open a URL in the device's Chromium and keep the page alive for follow-up automation (click, fill, snapshot, pdf-save, screenshot). This is the entry point for interactive browser work — call it before any other browser-* automation tool. Reuses the one live automation page; use browser-tabs to open a separate page. For one-shot read-only retrieval of a JS page use browser-render instead.", {
83
+ url: z.string().url().describe("Absolute http(s) URL to open"),
84
+ loadTimeoutMs: z.number().int().positive().optional().describe("Max wait for the page load event (default 30000)"),
85
+ }, async (params) => reply("browser-navigate", await actions.navigate(browserSession, params, actionCtx), `Navigated to ${params.url}`));
86
+ eagerTool(server, "browser-snapshot", "Return an accessibility snapshot of the current page: each interactive or landmark element as role, accessible name, and a unique CSS selector. Use the returned selector verbatim with browser-click / browser-fill / browser-hover — it targets exactly the element you saw. Call this after browser-navigate (or after an action changes the page) to know what is on the page.", {}, async () => {
87
+ const r = await actions.snapshot(browserSession, {}, actionCtx);
88
+ return reply("browser-snapshot", r, r.data?.text);
89
+ });
90
+ eagerTool(server, "browser-click", "Click the element matching a CSS selector on the current page. Use a selector from browser-snapshot. Returns selector-not-found if nothing matches.", { selector: z.string().describe("CSS selector of the element to click") }, async (params) => reply("browser-click", await actions.click(browserSession, params, actionCtx), `Clicked ${params.selector}`));
91
+ eagerTool(server, "browser-fill", "Set the value of one input, textarea, or contenteditable matching a CSS selector, firing input/change events. For multiple fields in one call use browser-fill-form.", {
92
+ selector: z.string().describe("CSS selector of the field"),
93
+ value: z.string().describe("Value to set"),
94
+ }, async (params) => reply("browser-fill", await actions.fill(browserSession, params, actionCtx), `Filled ${params.selector}`));
95
+ eagerTool(server, "browser-fill-form", "Fill several fields in one call. Each field is a CSS selector and the value to set. Reports every selector that matched nothing.", {
96
+ fields: z.array(z.object({
97
+ selector: z.string().describe("CSS selector of the field"),
98
+ value: z.string().describe("Value to set"),
99
+ })).describe("Fields to fill"),
100
+ }, async (params) => reply("browser-fill-form", await actions.fillForm(browserSession, params, actionCtx), `Filled ${params.fields.length} field(s)`));
101
+ eagerTool(server, "browser-type", "Type text into the focused element via real keyboard input. Pass a selector to focus that element first. Use this when setting value directly (browser-fill) does not trigger the page's keystroke handlers (autocompletes, rich editors).", {
102
+ text: z.string().describe("Text to type"),
103
+ selector: z.string().optional().describe("Optional CSS selector to focus before typing"),
104
+ }, async (params) => reply("browser-type", await actions.type(browserSession, params, actionCtx), "Typed text"));
105
+ eagerTool(server, "browser-press-key", "Press a single key on the focused element (Enter, Tab, Escape, Backspace, Delete, Arrow keys, Home, End, PageUp, PageDown, Space, or a single character). Use for submitting forms (Enter) or keyboard navigation.", { key: z.string().describe("Key name or single character") }, async (params) => reply("browser-press-key", await actions.pressKey(browserSession, params, actionCtx), `Pressed ${params.key}`));
106
+ eagerTool(server, "browser-hover", "Hover the pointer over the element matching a CSS selector, firing pointer/mouse-over events. Use to reveal hover menus or tooltips before reading or clicking.", { selector: z.string().describe("CSS selector of the element to hover") }, async (params) => reply("browser-hover", await actions.hover(browserSession, params, actionCtx), `Hovered ${params.selector}`));
107
+ eagerTool(server, "browser-select-option", "Choose an option in a <select> dropdown by option value or visible label, firing a change event.", {
108
+ selector: z.string().describe("CSS selector of the <select>"),
109
+ value: z.string().optional().describe("Option value to select"),
110
+ label: z.string().optional().describe("Option visible text/label to select"),
111
+ }, async (params) => reply("browser-select-option", await actions.selectOption(browserSession, params, actionCtx), `Selected option in ${params.selector}`));
112
+ eagerTool(server, "browser-wait-for", "Wait until an element (CSS selector) appears or some text is present on the page, up to a timeout. Use after an action that loads content asynchronously, before reading or interacting.", {
113
+ selector: z.string().optional().describe("CSS selector to wait for"),
114
+ text: z.string().optional().describe("Visible text to wait for"),
115
+ timeoutMs: z.number().int().positive().optional().describe("Max wait (default 30000)"),
116
+ }, async (params) => reply("browser-wait-for", await actions.waitFor(browserSession, params, actionCtx), "Condition met"));
117
+ eagerTool(server, "browser-handle-dialog", "Arm how the next JavaScript dialog(s) — alert, confirm, prompt — on the current page are answered. Set this BEFORE the action that triggers the dialog, because dialogs block the page and cannot be answered after the fact. The policy stands until changed. Unarmed dialogs are auto-dismissed and reported by browser-console-messages.", {
118
+ accept: z.boolean().describe("true to accept/OK, false to dismiss/Cancel"),
119
+ promptText: z.string().optional().describe("Text to enter into a prompt() dialog when accepting"),
120
+ }, async (params) => reply("browser-handle-dialog", actions.handleDialog(browserSession, params), `Dialog policy armed: accept=${params.accept}`));
121
+ eagerTool(server, "browser-evaluate", "Run a JavaScript expression in the current page and return its value (awaits a returned promise). Use for reading page state or driving behaviour that no other tool covers. The expression runs in the page, not in Node.", { expression: z.string().describe("JavaScript expression to evaluate in the page") }, async (params) => {
122
+ const r = await actions.evaluate(browserSession, params, actionCtx);
123
+ return reply("browser-evaluate", r, `Result: ${JSON.stringify(r.data?.value ?? null)}`);
124
+ });
125
+ eagerTool(server, "browser-console-messages", "Return and clear the buffered console output and uncaught errors from the current page (captured since navigation). Use to debug why a page or interaction did not behave as expected.", {}, async () => {
126
+ const r = actions.consoleMessages(browserSession);
127
+ return reply("browser-console-messages", r, r.data?.text);
128
+ });
129
+ eagerTool(server, "browser-tabs", "Manage browser tabs/pages: list open pages, open a new page (optionally at a URL and switch to it), select an existing page by id, or close a page by id. Use 'new' or 'select' to get a fresh page so stale state from a prior task does not leak in.", {
130
+ action: z.enum(["list", "new", "select", "close"]).describe("Tab action"),
131
+ id: z.string().optional().describe("Target id (required for select/close)"),
132
+ url: z.string().optional().describe("URL to open (optional for new)"),
133
+ }, async (params) => {
134
+ const r = await actions.tabs(browserSession, params, actionCtx);
135
+ const text = params.action === "list"
136
+ ? "Tabs:\n" + (r.data?.tabs ?? [])
137
+ .map((t) => `${t.active ? "* " : " "}${t.id} — ${t.title || "(untitled)"} — ${t.url}`).join("\n")
138
+ : `tabs ${params.action}: ok`;
139
+ return reply("browser-tabs", r, text);
140
+ });
141
+ eagerTool(server, "browser-pdf-save", "Render the current page to a PDF file on the device using Chromium's print pipeline (honours @page/@media print CSS, prints backgrounds). Pass an absolute output path. This is the on-device replacement for the old Playwright browser_pdf_save: navigate to the HTML (served over http, or a file path the browser can open), then call this.", {
142
+ path: z.string().describe("Absolute output path for the .pdf file"),
143
+ landscape: z.boolean().optional().describe("Landscape orientation (default false)"),
144
+ scale: z.number().optional().describe("Scale of the page rendering (default 1)"),
145
+ printBackground: z.boolean().optional().describe("Print background graphics (default true)"),
146
+ }, async (params) => {
147
+ const r = await actions.pdfSave(browserSession, params, actionCtx);
148
+ return reply("browser-pdf-save", r, `Saved PDF to ${params.path} (${r.data?.bytes ?? 0} bytes)`);
149
+ });
150
+ eagerTool(server, "browser-screenshot", "Capture a PNG of the current page (or one element, via a CSS selector clip) to a file on the device. Pass an absolute output path. Use selector clips to capture glassmorphism/blur sections as print fallback images for A4 PDFs.", {
151
+ path: z.string().describe("Absolute output path for the .png file"),
152
+ selector: z.string().optional().describe("CSS selector to clip to a single element"),
153
+ fullPage: z.boolean().optional().describe("Capture beyond the viewport (default false)"),
154
+ }, async (params) => {
155
+ const r = await actions.screenshot(browserSession, params, actionCtx);
156
+ return reply("browser-screenshot", r, `Saved screenshot to ${params.path} (${r.data?.bytes ?? 0} bytes)`);
157
+ });
158
+ eagerTool(server, "browser-resize", "Set the current page's viewport size in CSS pixels. Use before a screenshot to control the rendered dimensions (e.g. match an element's measured size to avoid scrollbars).", {
159
+ width: z.number().int().positive().describe("Viewport width in CSS pixels"),
160
+ height: z.number().int().positive().describe("Viewport height in CSS pixels"),
161
+ }, async (params) => reply("browser-resize", await actions.resize(browserSession, params, actionCtx), `Resized to ${params.width}x${params.height}`));
58
162
  process.on("SIGINT", () => process.exit(0));
59
163
  const transport = new StdioServerTransport();
60
164
  await server.connect(transport);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Interactive automation + output operations for the browser plugin.
3
+ *
4
+ * Every function here drives the one persistent page held by a BrowserSession
5
+ * (cdp-session.ts). They never throw to the MCP layer — each returns a
6
+ * structured ActionResult so the agent always sees a named outcome instead of a
7
+ * 500. Element targeting is by CSS selector run through Runtime.evaluate (raw
8
+ * CDP has no Playwright selector engine); the snapshot tool emits a unique CSS
9
+ * selector per interactive node so the agent clicks exactly what it read.
10
+ *
11
+ * ensure() live? ──no──▶ outcome "session-lost" ("call browser-navigate first")
12
+ * │yes (only navigate() re-attaches a dead page)
13
+ * ▼
14
+ * Runtime.evaluate / Input.* / Page.* ──▶ structured ActionResult
15
+ */
16
+ import { BrowserSession, type CdpDeps, type CdpOutcome } from "./cdp-session.js";
17
+ export type ActionOutcome = CdpOutcome | "selector-not-found" | "option-not-found" | "wait-timeout" | "pdf-failed" | "screenshot-failed" | "unsupported-key";
18
+ export interface ActionResult {
19
+ ok: boolean;
20
+ outcome: ActionOutcome;
21
+ detail?: string;
22
+ /** Tool-specific payload (snapshot tree, console lines, tab list, file bytes…). */
23
+ data?: unknown;
24
+ }
25
+ export interface ActionCtx {
26
+ deps: CdpDeps;
27
+ commandTimeoutMs: number;
28
+ loadTimeoutMs: number;
29
+ /** Injected so pdf-save / screenshot are testable without touching disk. */
30
+ writeFile: (path: string, data: Buffer) => Promise<void>;
31
+ }
32
+ export declare function navigate(session: BrowserSession, params: {
33
+ url: string;
34
+ loadTimeoutMs?: number;
35
+ }, ctx: ActionCtx): Promise<ActionResult>;
36
+ export declare function snapshot(session: BrowserSession, _params: Record<string, never>, ctx: ActionCtx): Promise<ActionResult>;
37
+ export declare function click(session: BrowserSession, params: {
38
+ selector: string;
39
+ }, ctx: ActionCtx): Promise<ActionResult>;
40
+ export declare function fill(session: BrowserSession, params: {
41
+ selector: string;
42
+ value: string;
43
+ }, ctx: ActionCtx): Promise<ActionResult>;
44
+ export declare function fillForm(session: BrowserSession, params: {
45
+ fields: Array<{
46
+ selector: string;
47
+ value: string;
48
+ }>;
49
+ }, ctx: ActionCtx): Promise<ActionResult>;
50
+ export declare function hover(session: BrowserSession, params: {
51
+ selector: string;
52
+ }, ctx: ActionCtx): Promise<ActionResult>;
53
+ export declare function selectOption(session: BrowserSession, params: {
54
+ selector: string;
55
+ value?: string;
56
+ label?: string;
57
+ }, ctx: ActionCtx): Promise<ActionResult>;
58
+ export declare function type(session: BrowserSession, params: {
59
+ text: string;
60
+ selector?: string;
61
+ }, ctx: ActionCtx): Promise<ActionResult>;
62
+ export declare function pressKey(session: BrowserSession, params: {
63
+ key: string;
64
+ }, ctx: ActionCtx): Promise<ActionResult>;
65
+ export declare function waitFor(session: BrowserSession, params: {
66
+ selector?: string;
67
+ text?: string;
68
+ timeoutMs?: number;
69
+ }, ctx: ActionCtx): Promise<ActionResult>;
70
+ export declare function handleDialog(session: BrowserSession, params: {
71
+ accept: boolean;
72
+ promptText?: string;
73
+ }): ActionResult;
74
+ export declare function evaluate(session: BrowserSession, params: {
75
+ expression: string;
76
+ }, ctx: ActionCtx): Promise<ActionResult>;
77
+ export declare function consoleMessages(session: BrowserSession): ActionResult;
78
+ export declare function tabs(session: BrowserSession, params: {
79
+ action: "list" | "new" | "select" | "close";
80
+ id?: string;
81
+ url?: string;
82
+ }, ctx: ActionCtx): Promise<ActionResult>;
83
+ export declare function pdfSave(session: BrowserSession, params: {
84
+ path: string;
85
+ landscape?: boolean;
86
+ scale?: number;
87
+ printBackground?: boolean;
88
+ }, ctx: ActionCtx): Promise<ActionResult>;
89
+ export declare function screenshot(session: BrowserSession, params: {
90
+ path: string;
91
+ selector?: string;
92
+ fullPage?: boolean;
93
+ }, ctx: ActionCtx): Promise<ActionResult>;
94
+ export declare function resize(session: BrowserSession, params: {
95
+ width: number;
96
+ height: number;
97
+ }, ctx: ActionCtx): Promise<ActionResult>;
98
+ //# sourceMappingURL=cdp-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-actions.d.ts","sourceRoot":"","sources":["../../src/lib/cdp-actions.ts"],"names":[],"mappings":"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"}