hyperclaw 5.4.0 → 5.4.1
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.
- package/README.md +1 -0
- package/dist/a2ui-protocol-CibzbTxL.js +75 -0
- package/dist/a2ui-protocol-Dtb8zlog.js +75 -0
- package/dist/a2ui-protocol-ORP2Etw0.js +75 -0
- package/dist/a2ui-protocol-whRZHdBk.js +75 -0
- package/dist/abort-controller-B55O1IgK.js +47995 -0
- package/dist/agents-routing-Ai2BQVpU.js +7 -0
- package/dist/agents-routing-B0RBl1B8.js +424 -0
- package/dist/agents-routing-BSUaOpce.js +7 -0
- package/dist/agents-routing-C4PVN8G6.js +7 -0
- package/dist/agents-routing-Dcr29-JV.js +424 -0
- package/dist/agents-routing-EwzORQQv.js +424 -0
- package/dist/agents-routing-Fd-uQ4R_.js +7 -0
- package/dist/agents-routing-eLjVYBAk.js +424 -0
- package/dist/api-key-validation-BANgbsfO.js +66 -0
- package/dist/api-key-validation-Bnz-0MMK.js +66 -0
- package/dist/api-key-validation-D_fMCaO5.js +66 -0
- package/dist/api-key-validation-Db7rG3JU.js +66 -0
- package/dist/api-keys-guide-B6AJ1V5D.js +149 -0
- package/dist/api-keys-guide-C75JQOdH.js +149 -0
- package/dist/api-keys-guide-CFJPrgsL.js +149 -0
- package/dist/api-keys-guide-DDz08BJQ.js +149 -0
- package/dist/audit-BLMB8qp7.js +445 -0
- package/dist/audit-Cb2TvqYZ.js +445 -0
- package/dist/audit-D7koAKvj.js +445 -0
- package/dist/audit-xP_175jB.js +445 -0
- package/dist/backup-7l3iovkX.js +86 -0
- package/dist/backup-BKLTHh62.js +86 -0
- package/dist/backup-CspxXk78.js +86 -0
- package/dist/backup-D8dFYDXV.js +86 -0
- package/dist/banner-CZ2BfvQq.js +143 -0
- package/dist/banner-CjTRWmks.js +7 -0
- package/dist/banner-Dpygks0H.js +143 -0
- package/dist/banner-ZX1WLr44.js +7 -0
- package/dist/bounty-tools-Cq-oC9gk.js +211 -0
- package/dist/bounty-tools-DZ-WtRdE.js +211 -0
- package/dist/bounty-tools-DhpmjF5Y.js +211 -0
- package/dist/bounty-tools-NGuBWI55.js +211 -0
- package/dist/browser-tools-5Fl1hP_2.js +5 -0
- package/dist/browser-tools-Ay-wU_a4.js +5 -0
- package/dist/browser-tools-BMgBB2fK.js +179 -0
- package/dist/browser-tools-kcViDwk5.js +179 -0
- package/dist/chat-BUa1oGqj.js +528 -0
- package/dist/chat-CiuT-GTs.js +528 -0
- package/dist/chat-DfI8uOzF.js +528 -0
- package/dist/chat-Dz5rmUSs.js +528 -0
- package/dist/chat-RTmX1F16.js +528 -0
- package/dist/claw-tasks-Cio1Q7eA.js +80 -0
- package/dist/claw-tasks-DzxNWVcz.js +80 -0
- package/dist/claw-tasks-L7vQSGlt.js +80 -0
- package/dist/claw-tasks-dndWneZW.js +80 -0
- package/dist/config-B-W-Mz4X.js +7 -0
- package/dist/config-BAwkTUJC.js +261 -0
- package/dist/config-CYPw2v4l.js +261 -0
- package/dist/config-DN9fdLL3.js +261 -0
- package/dist/config-FejpHHTz.js +261 -0
- package/dist/config-Tq_GJHf7.js +7 -0
- package/dist/config-n4qy5jIy.js +7 -0
- package/dist/config-qJUYRMzx.js +7 -0
- package/dist/connector-CwT7KZm2.js +309 -0
- package/dist/connector-DX4k-lGd.js +442 -0
- package/dist/cost-tracker-C2q5zKic.js +103 -0
- package/dist/cost-tracker-CsRQAOEr.js +103 -0
- package/dist/cost-tracker-DAXWN5YT.js +103 -0
- package/dist/cost-tracker-bySvehH6.js +103 -0
- package/dist/credentials-store-BAW87r6f.js +7 -0
- package/dist/credentials-store-BHtk7_H_.js +7 -0
- package/dist/credentials-store-CESgFvFU.js +89 -0
- package/dist/credentials-store-CR4WSDGl.js +7 -0
- package/dist/credentials-store-CXq4kZub.js +89 -0
- package/dist/credentials-store-DUp8dtaS.js +89 -0
- package/dist/credentials-store-hiSga8qn.js +89 -0
- package/dist/credentials-store-kLdrmqSt.js +7 -0
- package/dist/cron-tasks-BFsaCKxE.js +89 -0
- package/dist/cron-tasks-BelA2aUW.js +89 -0
- package/dist/cron-tasks-D1T9fWAb.js +89 -0
- package/dist/cron-tasks-f_ieXSG2.js +89 -0
- package/dist/daemon-BTYhQvD_.js +7 -0
- package/dist/daemon-BoaFnmdF.js +421 -0
- package/dist/daemon-BrHxr4ut.js +421 -0
- package/dist/daemon-BzdeLgON.js +421 -0
- package/dist/daemon-BzqWIC4v.js +7 -0
- package/dist/daemon-C3OczPR1.js +7 -0
- package/dist/daemon-D57KIIA3.js +421 -0
- package/dist/daemon-D8uyH9et.js +7 -0
- package/dist/daemon-DBTtYx6E.js +421 -0
- package/dist/daemon-srcdhzUG.js +7 -0
- package/dist/delivery-Bt0xW6L9.js +4 -0
- package/dist/delivery-C2sAERN7.js +4 -0
- package/dist/delivery-CF2Q4hb1.js +95 -0
- package/dist/delivery-CfMljOwk.js +95 -0
- package/dist/delivery-DP0d4_A4.js +95 -0
- package/dist/delivery-DXYt4aMO.js +4 -0
- package/dist/delivery-DXxP2UL4.js +4 -0
- package/dist/delivery-jT2UIDlU.js +95 -0
- package/dist/destructive-gate-5LYh6brt.js +116 -0
- package/dist/destructive-gate-B_hNKtu6.js +116 -0
- package/dist/destructive-gate-DvxPSDMR.js +116 -0
- package/dist/destructive-gate-Qd2y7x1B.js +116 -0
- package/dist/dist-B1qvBUax.js +30541 -0
- package/dist/engine-BBJlKpMP.js +7 -0
- package/dist/engine-BNygJfCo.js +335 -0
- package/dist/engine-DB4MBzki.js +7 -0
- package/dist/engine-DPi9fhMl.js +332 -0
- package/dist/engine-DeaqDcaT.js +7 -0
- package/dist/engine-DuvXJrUP.js +335 -0
- package/dist/engine-HkyTC_xl.js +332 -0
- package/dist/engine-JysunhPR.js +7 -0
- package/dist/engine-MzEUw7qb.js +7 -0
- package/dist/engine-j9Yaqt_-.js +332 -0
- package/dist/env-resolve--MaE2kFF.js +167 -0
- package/dist/env-resolve-BYWG94tK.js +11 -0
- package/dist/env-resolve-Bop7KbNq.js +167 -0
- package/dist/env-resolve-Buos635Y.js +167 -0
- package/dist/env-resolve-D3dP1-Xt.js +11 -0
- package/dist/env-resolve-DvsbhPKl.js +11 -0
- package/dist/env-resolve-NNM3F6Eo.js +167 -0
- package/dist/env-resolve-dTjn-g8X.js +11 -0
- package/dist/extraction-tools-Bh5F0ENP.js +91 -0
- package/dist/extraction-tools-BjzXD9LW.js +5 -0
- package/dist/extraction-tools-D1lrDYhe.js +5 -0
- package/dist/extraction-tools-FBwtT2Bx.js +91 -0
- package/dist/fileFromPath-CodL6KXh.js +85 -0
- package/dist/gmail-watch-setup--eQ8raeb.js +42 -0
- package/dist/gmail-watch-setup-9t14gy1B.js +42 -0
- package/dist/gmail-watch-setup-B9fx_OLg.js +42 -0
- package/dist/gmail-watch-setup-DP3kDRx1.js +42 -0
- package/dist/heartbeat-engine-5iOlL7Dj.js +89 -0
- package/dist/heartbeat-engine-Bu4q18GH.js +89 -0
- package/dist/heartbeat-engine-CF_JjNJ4.js +89 -0
- package/dist/heartbeat-engine-CLADYZxE.js +89 -0
- package/dist/hub-CZeGrS20.js +6 -0
- package/dist/hub-DAkEVTEy.js +545 -0
- package/dist/hyperclawbot-CNVUtvYC.js +516 -0
- package/dist/hyperclawbot-D5ofLNgm.js +516 -0
- package/dist/hyperclawbot-D61zVMyQ.js +516 -0
- package/dist/hyperclawbot-DwScttSx.js +516 -0
- package/dist/hyperclawbot-v65eL2U0.js +516 -0
- package/dist/inference-BEvs7s3c.js +2854 -0
- package/dist/inference-C4b9YqXk.js +8 -0
- package/dist/inference-CRF6HyyH.js +2854 -0
- package/dist/inference-CfhTACI8.js +2854 -0
- package/dist/inference-DGsy36Ru.js +8 -0
- package/dist/inference-Da7Hw4J3.js +8 -0
- package/dist/inference-DhJ-SHZn.js +8 -0
- package/dist/inference-K7Jrnzre.js +2854 -0
- package/dist/isFile-CSxoSB8X.js +2274 -0
- package/dist/knowledge-graph-BdsJ5KEL.js +134 -0
- package/dist/knowledge-graph-CFRBepzr.js +134 -0
- package/dist/knowledge-graph-CeDeahui.js +134 -0
- package/dist/knowledge-graph-DoYFZnUr.js +134 -0
- package/dist/loader-C2qtNbtF.js +6 -0
- package/dist/loader-D6yjBYo4.js +410 -0
- package/dist/loader-DBO6yRNh.js +6 -0
- package/dist/loader-DUhmG3V9.js +410 -0
- package/dist/loader-Dl8LNycw.js +6 -0
- package/dist/loader-UpOYxgZv.js +6 -0
- package/dist/loader-hXv2mZjK.js +410 -0
- package/dist/loader-nDBcv3Tm.js +410 -0
- package/dist/logger-BD316YbA.js +86 -0
- package/dist/logger-BnXZkfsp.js +86 -0
- package/dist/logger-CmphFNmW.js +86 -0
- package/dist/logger-DkHzhh56.js +86 -0
- package/dist/manager-3-q8zuAW.js +250 -0
- package/dist/manager-BkMzc-EJ.js +250 -0
- package/dist/manager-Bq5LApdR.js +6 -0
- package/dist/manager-CNgdJunf.js +250 -0
- package/dist/manager-CozyZSDG.js +250 -0
- package/dist/manager-D4mDWXph.js +120 -0
- package/dist/manager-DuS-WQhZ.js +120 -0
- package/dist/manager-Dz2eKYqo.js +116 -0
- package/dist/manager-R0TlRMZy.js +120 -0
- package/dist/manager-aJfY7rt6.js +120 -0
- package/dist/mcp-BH7HtOQ8.js +142 -0
- package/dist/mcp-CAJSA_ee.js +142 -0
- package/dist/mcp-CD-iIQa2.js +142 -0
- package/dist/mcp-DGo37Ifb.js +142 -0
- package/dist/mcp-loader-Ct1NQKnX.js +93 -0
- package/dist/mcp-loader-D1T6UX73.js +93 -0
- package/dist/mcp-loader-DJk6MEof.js +93 -0
- package/dist/mcp-loader-DdXvU63s.js +93 -0
- package/dist/mcp-loader-gMliiJ7R.js +93 -0
- package/dist/memory-CyonlkTy.js +6 -0
- package/dist/memory-DPSWQBc0.js +276 -0
- package/dist/memory-auto-B0QOqaUD.js +306 -0
- package/dist/memory-auto-BSxYJugl.js +5 -0
- package/dist/memory-auto-CcFRxMj-.js +306 -0
- package/dist/memory-auto-CifT5aj_.js +5 -0
- package/dist/memory-auto-Cp2Jwx3Y.js +306 -0
- package/dist/memory-auto-DjK_D8CA.js +306 -0
- package/dist/memory-auto-N57dp4Do.js +5 -0
- package/dist/memory-auto-n0kOcU7F.js +5 -0
- package/dist/memory-integration-D8shLJwp.js +91 -0
- package/dist/memory-integration-DLmzJ62L.js +91 -0
- package/dist/memory-integration-DMXDbMIL.js +91 -0
- package/dist/memory-integration-Dgr-mjue.js +91 -0
- package/dist/moltbook-CIeOshK6.js +81 -0
- package/dist/moltbook-CX5XWn06.js +81 -0
- package/dist/moltbook-DUfiE4NY.js +81 -0
- package/dist/moltbook-YEiNI8Cm.js +81 -0
- package/dist/multi-agent-tools-jzfvT4zP.js +87 -0
- package/dist/multimodal-zZdwqISl.js +77 -0
- package/dist/node-BYrxELx2.js +251 -0
- package/dist/node-CLWgPlAk.js +251 -0
- package/dist/node-Czz8Y85D.js +251 -0
- package/dist/node-Du2H2Ddi.js +226 -0
- package/dist/node-domexception-v89b0Nwz.js +21 -0
- package/dist/node-pending-queue-DUXCbYkp.js +32 -0
- package/dist/node-pending-queue-DZp7cdfo.js +32 -0
- package/dist/node-pending-queue-iYpoWqxe.js +32 -0
- package/dist/nodes-registry-BTy7Sc7D.js +52 -0
- package/dist/nodes-registry-BYjmmJBU.js +52 -0
- package/dist/nodes-registry-C8GeEGq0.js +52 -0
- package/dist/nodes-registry-Du6Klz0l.js +52 -0
- package/dist/oauth-flow-BA0yMrHx.js +148 -0
- package/dist/oauth-flow-C4QSMsbl.js +148 -0
- package/dist/oauth-flow-CIuDBDsp.js +148 -0
- package/dist/oauth-flow-CniM4jlJ.js +148 -0
- package/dist/oauth-provider-BA4GVFKg.js +111 -0
- package/dist/oauth-provider-Bnul5A_Z.js +111 -0
- package/dist/oauth-provider-DqPXPiiC.js +111 -0
- package/dist/oauth-provider-MEgHjij2.js +111 -0
- package/dist/observability-0spm7MPz.js +89 -0
- package/dist/observability-BOMYgHUh.js +89 -0
- package/dist/observability-CDqHr-_o.js +89 -0
- package/dist/observability-ah2a7sh1.js +89 -0
- package/dist/onboard-BJ78s3NT.js +3854 -0
- package/dist/onboard-C55YXd_e.js +14 -0
- package/dist/onboard-CNnm4yYp.js +3841 -0
- package/dist/onboard-CXSVPnP7.js +3854 -0
- package/dist/onboard-CwvXXOR1.js +14 -0
- package/dist/onboard-CxlIsNhX.js +3854 -0
- package/dist/onboard-DPmufMqX.js +14 -0
- package/dist/onboard-F9lKA2ie.js +14 -0
- package/dist/onboard-UTQXzlPD.js +3854 -0
- package/dist/onboard-hK098kjl.js +14 -0
- package/dist/openai-CrdtuLxw.js +6292 -0
- package/dist/orchestrator-5M-6MB7r.js +6 -0
- package/dist/orchestrator-B3BjP1dy.js +6 -0
- package/dist/orchestrator-BZS62iDS.js +6 -0
- package/dist/orchestrator-CTMbjgH_.js +6 -0
- package/dist/orchestrator-Crn4fgbI.js +189 -0
- package/dist/orchestrator-Cs6s-QmS.js +189 -0
- package/dist/orchestrator-DGqwsLmO.js +189 -0
- package/dist/orchestrator-UUHsFKiH.js +6 -0
- package/dist/orchestrator-oa7HbCnF.js +189 -0
- package/dist/orchestrator-tUKag7pG.js +189 -0
- package/dist/osint-BJvOCmVk.js +283 -0
- package/dist/osint-CK9xVUUm.js +283 -0
- package/dist/osint-D6vQXCWh.js +283 -0
- package/dist/osint-DLYZsp1k.js +283 -0
- package/dist/osint-cAAdO-cx.js +283 -0
- package/dist/osint-chat-B0lc0Y6r.js +789 -0
- package/dist/osint-chat-BUhiSpf9.js +789 -0
- package/dist/osint-chat-C-9FVAkU.js +789 -0
- package/dist/osint-chat-CWET8Fno.js +789 -0
- package/dist/osint-chat-Cgdzg3lh.js +789 -0
- package/dist/pc-access-BCaF5mRs.js +858 -0
- package/dist/pc-access-BOcXappE.js +858 -0
- package/dist/pc-access-BgZNmAdB.js +8 -0
- package/dist/pc-access-CAoM6WN4.js +8 -0
- package/dist/pc-access-D2HdoziZ.js +8 -0
- package/dist/pc-access-D4g0fjQb.js +858 -0
- package/dist/pending-approval-CJPyt8U5.js +22 -0
- package/dist/pending-approval-CzMNCTfZ.js +22 -0
- package/dist/pending-approval-DaXi7otO.js +22 -0
- package/dist/pending-approval-KcyeiifE.js +22 -0
- package/dist/providers-DrZP0NeR.js +5 -0
- package/dist/providers-dHhpJo9j.js +1120 -0
- package/dist/reminders-store-B58LldEG.js +58 -0
- package/dist/reminders-store-C4gWckLa.js +58 -0
- package/dist/reminders-store-DT0o6a60.js +58 -0
- package/dist/renderer-B8c22rbg.js +228 -0
- package/dist/renderer-BS0ETL20.js +228 -0
- package/dist/renderer-Cg3c41A5.js +228 -0
- package/dist/renderer-UoPcgaAd.js +228 -0
- package/dist/rules-D0v5nuSE.js +106 -0
- package/dist/rules-DCKPgwLb.js +106 -0
- package/dist/rules-Zn9j4PnO.js +106 -0
- package/dist/rules-oAgOSPHC.js +106 -0
- package/dist/run-main.js +457 -131
- package/dist/runner-BaZ2V27T.js +1307 -0
- package/dist/runner-Bgl7UTbV.js +1307 -0
- package/dist/runner-DOKp3-v5.js +1307 -0
- package/dist/runner-voYdfM_f.js +1307 -0
- package/dist/search-tools-BBwMa8VX.js +107 -0
- package/dist/search-tools-CEUOO9Jf.js +107 -0
- package/dist/search-tools-VHP3xVyC.js +107 -0
- package/dist/search-tools-w_zT7-dr.js +107 -0
- package/dist/server-BAdJwMM9.js +4 -0
- package/dist/server-BD9FLc7S.js +1384 -0
- package/dist/server-BlqWBbS7.js +4 -0
- package/dist/server-BzwPvTbD.js +1447 -0
- package/dist/server-CBvSfG4w.js +4 -0
- package/dist/server-CbNBcB41.js +4 -0
- package/dist/server-DPTXaJJF.js +4 -0
- package/dist/server-Dv2zHHy-.js +1447 -0
- package/dist/server-MDmdWHob.js +1447 -0
- package/dist/server-N9LnLQCS.js +1447 -0
- package/dist/session-store-C6Otslf9.js +5 -0
- package/dist/session-store-Cmfnvuw9.js +141 -0
- package/dist/session-store-CuR9DgRf.js +5 -0
- package/dist/session-store-Cx1RMBhS.js +5 -0
- package/dist/session-store-DPPHkJBn.js +5 -0
- package/dist/session-store-DWLCWQFS.js +141 -0
- package/dist/session-store-qGufR_m5.js +141 -0
- package/dist/session-store-sUpA509O.js +141 -0
- package/dist/sessions-tools-9Z8TtdmP.js +5 -0
- package/dist/sessions-tools-BAZnoQLp.js +95 -0
- package/dist/sessions-tools-Bb_zF947.js +95 -0
- package/dist/sessions-tools-ClrKqLII.js +131 -0
- package/dist/sessions-tools-DFe23ZDD.js +5 -0
- package/dist/sessions-tools-JHSZ6Bns.js +5 -0
- package/dist/sessions-tools-TsRdeFb7.js +95 -0
- package/dist/sessions-tools-nYP3Agfs.js +5 -0
- package/dist/skill-loader-9jg876RH.js +160 -0
- package/dist/skill-loader-CM4KWQ7_.js +160 -0
- package/dist/skill-loader-CS3OP4Lr.js +160 -0
- package/dist/skill-loader-CnJDLNbY.js +7 -0
- package/dist/skill-loader-DRLgt5V2.js +160 -0
- package/dist/skill-loader-DVpEgYV2.js +7 -0
- package/dist/skill-loader-Df5T_UFl.js +7 -0
- package/dist/skill-loader-DxE-gZkT.js +7 -0
- package/dist/skill-runtime-8Xh5874w.js +104 -0
- package/dist/skill-runtime-B3aUdWKh.js +104 -0
- package/dist/skill-runtime-BKyhYvpW.js +5 -0
- package/dist/skill-runtime-BP0kZfmM.js +5 -0
- package/dist/skill-runtime-CLK5HTVE.js +5 -0
- package/dist/skill-runtime-COyc3Bci.js +104 -0
- package/dist/skill-runtime-CvDXX7wN.js +5 -0
- package/dist/skill-runtime-D4REZnhY.js +104 -0
- package/dist/skill-runtime-DQRi9sIf.js +5 -0
- package/dist/skill-runtime-DRd56NWK.js +104 -0
- package/dist/src-9GyYED0T.js +63 -0
- package/dist/src-B9L6qb-Z.js +462 -0
- package/dist/src-BEjIVOmq.js +63 -0
- package/dist/src-BY3On_zO.js +462 -0
- package/dist/src-BdgKAlMQ.js +20 -0
- package/dist/src-C52A3OwC.js +301 -0
- package/dist/src-C8cbfjat.js +173 -0
- package/dist/src-CQ2lZvdF.js +462 -0
- package/dist/src-Cdwn9xpG.js +462 -0
- package/dist/src-CyCLoqIP.js +63 -0
- package/dist/src-D-OND_62.js +301 -0
- package/dist/src-DFo8lVfV.js +300 -0
- package/dist/src-DJbpP4Gs.js +462 -0
- package/dist/src-DPfnArdr.js +300 -0
- package/dist/src-DTft7Qvt.js +63 -0
- package/dist/src-DgvFah8g.js +153 -0
- package/dist/src-TYvV_oFO.js +63 -0
- package/dist/src-lltU5gkh.js +20 -0
- package/dist/sub-agent-tools-CE8pVUdb.js +39 -0
- package/dist/sub-agent-tools-CQWNfYn_.js +39 -0
- package/dist/sub-agent-tools-CViiqebO.js +39 -0
- package/dist/sub-agent-tools-DgT4jUHC.js +39 -0
- package/dist/sub-agent-tools-Lbin_4S3.js +39 -0
- package/dist/tool-policy-1EBdJkSG.js +190 -0
- package/dist/tool-policy-B1bL0X-E.js +189 -0
- package/dist/tool-policy-NLbucl5-.js +189 -0
- package/dist/tool-policy-yNVTLNDY.js +189 -0
- package/dist/tts-elevenlabs-Bk24wQ2V.js +64 -0
- package/dist/tts-elevenlabs-CHrJZuNW.js +64 -0
- package/dist/tts-elevenlabs-DHqQsqMz.js +64 -0
- package/dist/tts-elevenlabs-TUKPkSV2.js +64 -0
- package/dist/vision-CW1YCKed.js +167 -0
- package/dist/vision-DPLmrwUA.js +167 -0
- package/dist/vision-Q4EOcBS6.js +167 -0
- package/dist/vision-XyAGO5La.js +167 -0
- package/dist/vision-tools-B5DNR28M.js +5 -0
- package/dist/vision-tools-CC9HSuvN.js +51 -0
- package/dist/vision-tools-Ca3OhtdX.js +51 -0
- package/dist/vision-tools-CpU2fSRv.js +51 -0
- package/dist/vision-tools-Ct52djW8.js +51 -0
- package/dist/vision-tools-DF7N2DDI.js +5 -0
- package/dist/vision-tools-DyP6lRA5.js +5 -0
- package/dist/vision-tools-RIVKEUeY.js +5 -0
- package/dist/voice-transcription-Bz2y0nPK.js +170 -0
- package/dist/voice-transcription-CVFcHpPF.js +170 -0
- package/dist/voice-transcription-CvQuWPYK.js +170 -0
- package/dist/voice-transcription-YqndiLA7.js +170 -0
- package/dist/website-watch-tools-B036Y8OQ.js +176 -0
- package/dist/website-watch-tools-B8CHie8v.js +5 -0
- package/dist/website-watch-tools-Brk5oIEv.js +176 -0
- package/dist/website-watch-tools-CJqRj_GB.js +5 -0
- package/dist/website-watch-tools-CSSEu3Qy.js +5 -0
- package/dist/website-watch-tools-D92dkYZa.js +176 -0
- package/dist/website-watch-tools-Du_a8lXq.js +176 -0
- package/dist/website-watch-tools-UdTBGgRk.js +5 -0
- package/package.json +5 -3
- package/static/web/assets/{index-Bf8pf7Wg.js → index-8bDizzaq.js} +2 -2
- package/static/web/index.html +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const http = require_chunk.__toESM(require("http"));
|
|
3
|
+
const https = require_chunk.__toESM(require("https"));
|
|
4
|
+
|
|
5
|
+
//#region packages/core/src/agent/multi-agent-tools.ts
|
|
6
|
+
function postChat(baseUrl, message, authToken, agentId) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const u = new URL(baseUrl);
|
|
9
|
+
const isHttps = u.protocol === "https:";
|
|
10
|
+
const lib = isHttps ? https.default : http.default;
|
|
11
|
+
const body = JSON.stringify({
|
|
12
|
+
message,
|
|
13
|
+
...agentId ? { agentId } : {}
|
|
14
|
+
});
|
|
15
|
+
const headers = {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
"Content-Length": Buffer.byteLength(body).toString()
|
|
18
|
+
};
|
|
19
|
+
if (authToken) headers["Authorization"] = `Bearer ${authToken}`;
|
|
20
|
+
const opts = {
|
|
21
|
+
hostname: u.hostname,
|
|
22
|
+
port: u.port || (isHttps ? 443 : 80),
|
|
23
|
+
path: (u.pathname || "/").replace(/\/$/, "") + "/api/chat",
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers
|
|
26
|
+
};
|
|
27
|
+
const req = lib.request(opts, (res) => {
|
|
28
|
+
let data = "";
|
|
29
|
+
res.on("data", (c) => data += c);
|
|
30
|
+
res.on("end", () => {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(data || "{}");
|
|
33
|
+
if (res.statusCode && res.statusCode >= 400) resolve({ error: parsed.error || `HTTP ${res.statusCode}` });
|
|
34
|
+
else resolve({ response: parsed.response });
|
|
35
|
+
} catch {
|
|
36
|
+
resolve({ error: data || `HTTP ${res.statusCode}` });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
req.on("error", (e) => reject(e));
|
|
41
|
+
req.write(body);
|
|
42
|
+
req.end();
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function getMultiAgentTools(cfg) {
|
|
46
|
+
const remotes = cfg?.multiAgent?.remotes;
|
|
47
|
+
if (!remotes || Object.keys(remotes).length === 0) return [];
|
|
48
|
+
const ids = Object.keys(remotes);
|
|
49
|
+
const tool = {
|
|
50
|
+
name: "call_remote_agent",
|
|
51
|
+
description: `Call another HyperClaw instance for collaborative tasks. Available remotes: ${ids.join(", ")}. Use when the user wants to delegate to a different agent or get help from another HyperClaw node.`,
|
|
52
|
+
input_schema: {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
remote_id: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: `Remote agent ID. One of: ${ids.join(", ")}`
|
|
58
|
+
},
|
|
59
|
+
message: {
|
|
60
|
+
type: "string",
|
|
61
|
+
description: "Message to send to the remote agent"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
required: ["remote_id", "message"]
|
|
65
|
+
},
|
|
66
|
+
handler: async (input) => {
|
|
67
|
+
const remoteId = String(input.remote_id || "").trim();
|
|
68
|
+
const message = String(input.message || "");
|
|
69
|
+
if (!remotes[remoteId]) return `Error: Unknown remote "${remoteId}". Available: ${ids.join(", ")}. Configure via multiAgent.remotes in hyperclaw.json.`;
|
|
70
|
+
if (!message) return "Error: message is required.";
|
|
71
|
+
const r = remotes[remoteId];
|
|
72
|
+
try {
|
|
73
|
+
const res = await postChat(r.url, message, r.token, remoteId);
|
|
74
|
+
if (res.error) return `Remote ${remoteId}: ${res.error}`;
|
|
75
|
+
return res.response ?? "(empty response)";
|
|
76
|
+
} catch (e) {
|
|
77
|
+
return `Remote ${remoteId}: ${e.message}`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return [tool];
|
|
82
|
+
}
|
|
83
|
+
var init_multi_agent_tools = require_chunk.__esm({ "packages/core/src/agent/multi-agent-tools.ts"() {} });
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
init_multi_agent_tools();
|
|
87
|
+
exports.getMultiAgentTools = getMultiAgentTools;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
3
|
+
const path = require_chunk.__toESM(require("path"));
|
|
4
|
+
const crypto = require_chunk.__toESM(require("crypto"));
|
|
5
|
+
|
|
6
|
+
//#region packages/memory-lancedb/src/multimodal.ts
|
|
7
|
+
const GEMINI_EMBED_MODEL = "models/gemini-embedding-2-preview";
|
|
8
|
+
function createGeminiMultimodalEmbedder(apiKey) {
|
|
9
|
+
const base = "https://generativelanguage.googleapis.com/v1beta";
|
|
10
|
+
async function embedContent(parts) {
|
|
11
|
+
const res = await fetch(`${base}/${GEMINI_EMBED_MODEL}:embedContent?key=${encodeURIComponent(apiKey)}`, {
|
|
12
|
+
method: "POST",
|
|
13
|
+
headers: { "Content-Type": "application/json" },
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
model: GEMINI_EMBED_MODEL,
|
|
16
|
+
content: { parts },
|
|
17
|
+
taskType: "RETRIEVAL_DOCUMENT"
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
const err = await res.text();
|
|
22
|
+
throw new Error(`Gemini multimodal embed failed: ${res.status} ${err}`);
|
|
23
|
+
}
|
|
24
|
+
const j = await res.json();
|
|
25
|
+
const vec = j.embedding?.values;
|
|
26
|
+
if (!Array.isArray(vec)) throw new Error("Gemini embed: missing embedding.values");
|
|
27
|
+
return vec;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
embedText: (text) => embedContent([{ text }]),
|
|
31
|
+
embedImage: (data, mimeType) => embedContent([{ inlineData: {
|
|
32
|
+
mimeType,
|
|
33
|
+
data
|
|
34
|
+
} }]),
|
|
35
|
+
embedAudio: (data, mimeType) => embedContent([{ inlineData: {
|
|
36
|
+
mimeType,
|
|
37
|
+
data
|
|
38
|
+
} }])
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function addImageToMemory(store, embedder, imagePath, caption) {
|
|
42
|
+
const buf = await fs_extra.default.readFile(imagePath);
|
|
43
|
+
const base64 = buf.toString("base64");
|
|
44
|
+
const ext = path.default.extname(imagePath).toLowerCase();
|
|
45
|
+
const mimeType = ext === ".png" ? "image/png" : ext === ".webp" ? "image/webp" : "image/jpeg";
|
|
46
|
+
const embedding = await embedder.embedImage(base64, mimeType);
|
|
47
|
+
const text = caption || `[image: ${path.default.basename(imagePath)}]`;
|
|
48
|
+
const item = {
|
|
49
|
+
id: (0, crypto.randomUUID)(),
|
|
50
|
+
text,
|
|
51
|
+
category: "image",
|
|
52
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
53
|
+
embedding
|
|
54
|
+
};
|
|
55
|
+
await store.add([item]);
|
|
56
|
+
}
|
|
57
|
+
async function addAudioToMemory(store, embedder, audioPath, transcript) {
|
|
58
|
+
const buf = await fs_extra.default.readFile(audioPath);
|
|
59
|
+
const base64 = buf.toString("base64");
|
|
60
|
+
const ext = path.default.extname(audioPath).toLowerCase();
|
|
61
|
+
const mimeType = ext === ".mp3" ? "audio/mpeg" : ext === ".wav" ? "audio/wav" : ext === ".webm" ? "audio/webm" : "audio/mpeg";
|
|
62
|
+
const embedding = await embedder.embedAudio(base64, mimeType);
|
|
63
|
+
const text = transcript || `[audio: ${path.default.basename(audioPath)}]`;
|
|
64
|
+
const item = {
|
|
65
|
+
id: (0, crypto.randomUUID)(),
|
|
66
|
+
text,
|
|
67
|
+
category: "audio",
|
|
68
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
69
|
+
embedding
|
|
70
|
+
};
|
|
71
|
+
await store.add([item]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
exports.addAudioToMemory = addAudioToMemory;
|
|
76
|
+
exports.addImageToMemory = addImageToMemory;
|
|
77
|
+
exports.createGeminiMultimodalEmbedder = createGeminiMultimodalEmbedder;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const require_paths = require('./paths-AIyBxIzm.js');
|
|
3
|
+
const require_paths$1 = require('./paths-DPovhojT.js');
|
|
4
|
+
const chalk = require_chunk.__toESM(require("chalk"));
|
|
5
|
+
const inquirer = require_chunk.__toESM(require("inquirer"));
|
|
6
|
+
const ora = require_chunk.__toESM(require("ora"));
|
|
7
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
8
|
+
const path = require_chunk.__toESM(require("path"));
|
|
9
|
+
const os = require_chunk.__toESM(require("os"));
|
|
10
|
+
|
|
11
|
+
//#region src/commands/node.ts
|
|
12
|
+
require_paths$1.init_paths();
|
|
13
|
+
const getNodesFile = () => path.default.join(require_paths.getHyperClawDir(), "nodes.json");
|
|
14
|
+
async function loadNodes() {
|
|
15
|
+
try {
|
|
16
|
+
return await fs_extra.default.readJson(getNodesFile());
|
|
17
|
+
} catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function saveNodes(nodes) {
|
|
22
|
+
const nodesFile = getNodesFile();
|
|
23
|
+
await fs_extra.default.ensureDir(path.default.dirname(nodesFile));
|
|
24
|
+
await fs_extra.default.writeJson(nodesFile, nodes, { spaces: 2 });
|
|
25
|
+
}
|
|
26
|
+
const TYPE_EMOJI = {
|
|
27
|
+
local: "💻",
|
|
28
|
+
remote: "🖥️",
|
|
29
|
+
android: "📱",
|
|
30
|
+
raspberrypi: "🍓",
|
|
31
|
+
docker: "🐳",
|
|
32
|
+
vm: "☁️"
|
|
33
|
+
};
|
|
34
|
+
const STATUS_COLOR = {
|
|
35
|
+
online: chalk.default.green,
|
|
36
|
+
offline: chalk.default.red,
|
|
37
|
+
unknown: chalk.default.gray,
|
|
38
|
+
degraded: chalk.default.yellow
|
|
39
|
+
};
|
|
40
|
+
async function nodeList() {
|
|
41
|
+
const nodes = await loadNodes();
|
|
42
|
+
console.log(chalk.default.bold.cyan("\n 📱 HYPERCLAW NODES\n"));
|
|
43
|
+
console.log(` ${chalk.default.green("●")} ${chalk.default.white("Local (this machine)".padEnd(22))} ${chalk.default.cyan("[local]")} ${chalk.default.green("online")}`);
|
|
44
|
+
console.log(` ${chalk.default.gray(`Node.js ${process.version} ${os.default.platform()} ${os.default.arch()} port 18789`)}`);
|
|
45
|
+
console.log();
|
|
46
|
+
if (nodes.length === 0) {
|
|
47
|
+
console.log(chalk.default.gray(" No additional nodes registered."));
|
|
48
|
+
console.log(chalk.default.gray(" Add a remote node: hyperclaw node add\n"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const node of nodes) {
|
|
52
|
+
const dot = STATUS_COLOR[node.status]("●");
|
|
53
|
+
const emoji = TYPE_EMOJI[node.type];
|
|
54
|
+
const status = STATUS_COLOR[node.status](node.status);
|
|
55
|
+
console.log(` ${dot} ${chalk.default.white(node.name.padEnd(22))} ${chalk.default.cyan(`[${node.type}]`)} ${status}`);
|
|
56
|
+
if (node.host) console.log(` ${chalk.default.gray(`${node.host}:${node.port || 18789}`)}`);
|
|
57
|
+
if (node.androidDeviceId) console.log(` ${chalk.default.gray(`adb: ${node.androidDeviceId}`)}`);
|
|
58
|
+
if (node.capabilities.length > 0) console.log(` ${chalk.default.gray("caps:")} ${node.capabilities.join(", ")}`);
|
|
59
|
+
if (node.lastSeenAt) {
|
|
60
|
+
const ago = Math.round((Date.now() - new Date(node.lastSeenAt).getTime()) / 1e3 / 60);
|
|
61
|
+
console.log(` ${chalk.default.gray(`last seen: ${ago}m ago`)}`);
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function nodeAdd() {
|
|
67
|
+
console.log(chalk.default.bold.cyan("\n ➕ ADD NODE\n"));
|
|
68
|
+
const { type } = await inquirer.default.prompt([{
|
|
69
|
+
type: "list",
|
|
70
|
+
name: "type",
|
|
71
|
+
message: "Node type:",
|
|
72
|
+
choices: [
|
|
73
|
+
{
|
|
74
|
+
name: "🖥️ Remote server (SSH)",
|
|
75
|
+
value: "remote"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "📱 Android device (ADB)",
|
|
79
|
+
value: "android"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "🍓 Raspberry Pi",
|
|
83
|
+
value: "raspberrypi"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "🐳 Docker container",
|
|
87
|
+
value: "docker"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "☁️ VM / cloud instance",
|
|
91
|
+
value: "vm"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
}]);
|
|
95
|
+
const { name } = await inquirer.default.prompt([{
|
|
96
|
+
type: "input",
|
|
97
|
+
name: "name",
|
|
98
|
+
message: "Node name:",
|
|
99
|
+
validate: (v) => !!v.trim() || "Required"
|
|
100
|
+
}]);
|
|
101
|
+
let extras = {};
|
|
102
|
+
if (type === "android") {
|
|
103
|
+
const { deviceId } = await inquirer.default.prompt([{
|
|
104
|
+
type: "input",
|
|
105
|
+
name: "deviceId",
|
|
106
|
+
message: "ADB device ID (run: adb devices):",
|
|
107
|
+
validate: (v) => !!v.trim() || "Required"
|
|
108
|
+
}]);
|
|
109
|
+
extras.androidDeviceId = deviceId;
|
|
110
|
+
extras.capabilities = ["channel:host", "always-on"];
|
|
111
|
+
} else {
|
|
112
|
+
const { host, port } = await inquirer.default.prompt([{
|
|
113
|
+
type: "input",
|
|
114
|
+
name: "host",
|
|
115
|
+
message: "Hostname or IP:",
|
|
116
|
+
validate: (v) => !!v.trim() || "Required"
|
|
117
|
+
}, {
|
|
118
|
+
type: "number",
|
|
119
|
+
name: "port",
|
|
120
|
+
message: "Gateway port:",
|
|
121
|
+
default: 18789
|
|
122
|
+
}]);
|
|
123
|
+
const { caps } = await inquirer.default.prompt([{
|
|
124
|
+
type: "checkbox",
|
|
125
|
+
name: "caps",
|
|
126
|
+
message: "Capabilities:",
|
|
127
|
+
choices: [
|
|
128
|
+
{
|
|
129
|
+
name: "Run agent inference",
|
|
130
|
+
value: "agent:run",
|
|
131
|
+
checked: true
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "Host channel connections",
|
|
135
|
+
value: "channel:host"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "Execute code",
|
|
139
|
+
value: "code:execute"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "GPU acceleration",
|
|
143
|
+
value: "gpu"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "Always-on (24/7)",
|
|
147
|
+
value: "always-on"
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
}]);
|
|
151
|
+
extras = {
|
|
152
|
+
host,
|
|
153
|
+
port,
|
|
154
|
+
capabilities: caps
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const node = {
|
|
158
|
+
id: name.toLowerCase().replace(/\s+/g, "-"),
|
|
159
|
+
name,
|
|
160
|
+
type,
|
|
161
|
+
status: "unknown",
|
|
162
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
163
|
+
capabilities: extras.capabilities || [],
|
|
164
|
+
...extras
|
|
165
|
+
};
|
|
166
|
+
const nodes = await loadNodes();
|
|
167
|
+
nodes.push(node);
|
|
168
|
+
await saveNodes(nodes);
|
|
169
|
+
console.log(chalk.default.green(`\n ✔ Node added: ${name}`));
|
|
170
|
+
console.log(chalk.default.gray(" Run: hyperclaw node probe to test the connection\n"));
|
|
171
|
+
}
|
|
172
|
+
async function nodeProbe(id) {
|
|
173
|
+
const nodes = await loadNodes();
|
|
174
|
+
const targets = id ? nodes.filter((n) => n.id === id) : nodes;
|
|
175
|
+
console.log(chalk.default.bold.cyan("\n 🔍 PROBING NODES\n"));
|
|
176
|
+
console.log(` ${chalk.default.cyan("○")} Local...`);
|
|
177
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
178
|
+
console.log(` ${chalk.default.green("✔")} Local — online (${os.default.platform()} ${os.default.arch()})\n`);
|
|
179
|
+
for (const node of targets) {
|
|
180
|
+
const spinner = (0, ora.default)(` Probing ${node.name} (${node.host || node.androidDeviceId || node.type})...`).start();
|
|
181
|
+
await new Promise((r) => setTimeout(r, 1e3));
|
|
182
|
+
try {
|
|
183
|
+
if (node.host) {
|
|
184
|
+
const axios = (await import("axios")).default;
|
|
185
|
+
const res = await axios.get(`http://${node.host}:${node.port || 18789}/api/status`, { timeout: 3e3 });
|
|
186
|
+
node.status = "online";
|
|
187
|
+
node.version = res.data?.version;
|
|
188
|
+
node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
189
|
+
spinner.succeed(`${node.name} — online${node.version ? ` (v${node.version})` : ""}`);
|
|
190
|
+
} else if (node.type === "android") {
|
|
191
|
+
const { exec } = await import("child_process");
|
|
192
|
+
const { promisify } = await import("util");
|
|
193
|
+
const execAsync = promisify(exec);
|
|
194
|
+
await execAsync(`adb -s ${node.androidDeviceId} shell echo ok`);
|
|
195
|
+
node.status = "online";
|
|
196
|
+
node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
197
|
+
spinner.succeed(`${node.name} — online (ADB connected)`);
|
|
198
|
+
} else {
|
|
199
|
+
node.status = "unknown";
|
|
200
|
+
spinner.warn(`${node.name} — probe not supported for ${node.type}`);
|
|
201
|
+
}
|
|
202
|
+
} catch {
|
|
203
|
+
node.status = "offline";
|
|
204
|
+
spinner.fail(`${node.name} — offline / unreachable`);
|
|
205
|
+
}
|
|
206
|
+
console.log();
|
|
207
|
+
}
|
|
208
|
+
await saveNodes(nodes);
|
|
209
|
+
}
|
|
210
|
+
async function nodeRemove(id) {
|
|
211
|
+
const nodes = await loadNodes();
|
|
212
|
+
const idx = nodes.findIndex((n) => n.id === id);
|
|
213
|
+
if (idx === -1) {
|
|
214
|
+
console.log(chalk.default.red(`\n ✖ Node not found: ${id}\n`));
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
nodes.splice(idx, 1);
|
|
218
|
+
await saveNodes(nodes);
|
|
219
|
+
console.log(chalk.default.green(`\n ✔ Node removed: ${id}\n`));
|
|
220
|
+
}
|
|
221
|
+
/** Show pending work queued for dormant nodes. */
|
|
222
|
+
async function nodeQueue(nodeId) {
|
|
223
|
+
const { listPending } = await Promise.resolve().then(() => require("./node-pending-queue-iYpoWqxe.js"));
|
|
224
|
+
const pending = listPending(nodeId);
|
|
225
|
+
console.log(chalk.default.bold.cyan("\n 📋 NODE PENDING QUEUE\n"));
|
|
226
|
+
if (pending.length === 0) {
|
|
227
|
+
console.log(chalk.default.gray(" No pending work."));
|
|
228
|
+
if (nodeId) console.log(chalk.default.gray(` (filter: ${nodeId})`));
|
|
229
|
+
console.log(chalk.default.gray("\n Work is queued when a node is offline. Run `hyperclaw node probe` and the queue drains on success.\n"));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const byNode = pending.reduce((acc, i) => {
|
|
233
|
+
if (!acc[i.nodeId]) acc[i.nodeId] = [];
|
|
234
|
+
acc[i.nodeId].push(i);
|
|
235
|
+
return acc;
|
|
236
|
+
}, {});
|
|
237
|
+
for (const [nid, items] of Object.entries(byNode)) {
|
|
238
|
+
console.log(` ${chalk.default.yellow("●")} ${chalk.default.white(nid)} — ${items.length} pending`);
|
|
239
|
+
for (const i of items.slice(0, 5)) console.log(` ${chalk.default.gray(i.id)} ${i.type} ${chalk.default.gray(i.createdAt)}`);
|
|
240
|
+
if (items.length > 5) console.log(chalk.default.gray(` ... +${items.length - 5} more`));
|
|
241
|
+
console.log();
|
|
242
|
+
}
|
|
243
|
+
console.log(chalk.default.gray(" Drain on node online: hyperclaw node probe <nodeId>\n"));
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
//#endregion
|
|
247
|
+
exports.nodeAdd = nodeAdd;
|
|
248
|
+
exports.nodeList = nodeList;
|
|
249
|
+
exports.nodeProbe = nodeProbe;
|
|
250
|
+
exports.nodeQueue = nodeQueue;
|
|
251
|
+
exports.nodeRemove = nodeRemove;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-jS-bbMI5.js');
|
|
2
|
+
const require_paths = require('./paths-AIyBxIzm.js');
|
|
3
|
+
const require_paths$1 = require('./paths-DPovhojT.js');
|
|
4
|
+
const chalk = require_chunk.__toESM(require("chalk"));
|
|
5
|
+
const inquirer = require_chunk.__toESM(require("inquirer"));
|
|
6
|
+
const ora = require_chunk.__toESM(require("ora"));
|
|
7
|
+
const fs_extra = require_chunk.__toESM(require("fs-extra"));
|
|
8
|
+
const path = require_chunk.__toESM(require("path"));
|
|
9
|
+
const os = require_chunk.__toESM(require("os"));
|
|
10
|
+
|
|
11
|
+
//#region src/commands/node.ts
|
|
12
|
+
require_paths$1.init_paths();
|
|
13
|
+
const getNodesFile = () => path.default.join(require_paths.getHyperClawDir(), "nodes.json");
|
|
14
|
+
async function loadNodes() {
|
|
15
|
+
try {
|
|
16
|
+
return await fs_extra.default.readJson(getNodesFile());
|
|
17
|
+
} catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function saveNodes(nodes) {
|
|
22
|
+
const nodesFile = getNodesFile();
|
|
23
|
+
await fs_extra.default.ensureDir(path.default.dirname(nodesFile));
|
|
24
|
+
await fs_extra.default.writeJson(nodesFile, nodes, { spaces: 2 });
|
|
25
|
+
}
|
|
26
|
+
const TYPE_EMOJI = {
|
|
27
|
+
local: "💻",
|
|
28
|
+
remote: "🖥️",
|
|
29
|
+
android: "📱",
|
|
30
|
+
raspberrypi: "🍓",
|
|
31
|
+
docker: "🐳",
|
|
32
|
+
vm: "☁️"
|
|
33
|
+
};
|
|
34
|
+
const STATUS_COLOR = {
|
|
35
|
+
online: chalk.default.green,
|
|
36
|
+
offline: chalk.default.red,
|
|
37
|
+
unknown: chalk.default.gray,
|
|
38
|
+
degraded: chalk.default.yellow
|
|
39
|
+
};
|
|
40
|
+
async function nodeList() {
|
|
41
|
+
const nodes = await loadNodes();
|
|
42
|
+
console.log(chalk.default.bold.cyan("\n 📱 HYPERCLAW NODES\n"));
|
|
43
|
+
console.log(` ${chalk.default.green("●")} ${chalk.default.white("Local (this machine)".padEnd(22))} ${chalk.default.cyan("[local]")} ${chalk.default.green("online")}`);
|
|
44
|
+
console.log(` ${chalk.default.gray(`Node.js ${process.version} ${os.default.platform()} ${os.default.arch()} port 18789`)}`);
|
|
45
|
+
console.log();
|
|
46
|
+
if (nodes.length === 0) {
|
|
47
|
+
console.log(chalk.default.gray(" No additional nodes registered."));
|
|
48
|
+
console.log(chalk.default.gray(" Add a remote node: hyperclaw node add\n"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const node of nodes) {
|
|
52
|
+
const dot = STATUS_COLOR[node.status]("●");
|
|
53
|
+
const emoji = TYPE_EMOJI[node.type];
|
|
54
|
+
const status = STATUS_COLOR[node.status](node.status);
|
|
55
|
+
console.log(` ${dot} ${chalk.default.white(node.name.padEnd(22))} ${chalk.default.cyan(`[${node.type}]`)} ${status}`);
|
|
56
|
+
if (node.host) console.log(` ${chalk.default.gray(`${node.host}:${node.port || 18789}`)}`);
|
|
57
|
+
if (node.androidDeviceId) console.log(` ${chalk.default.gray(`adb: ${node.androidDeviceId}`)}`);
|
|
58
|
+
if (node.capabilities.length > 0) console.log(` ${chalk.default.gray("caps:")} ${node.capabilities.join(", ")}`);
|
|
59
|
+
if (node.lastSeenAt) {
|
|
60
|
+
const ago = Math.round((Date.now() - new Date(node.lastSeenAt).getTime()) / 1e3 / 60);
|
|
61
|
+
console.log(` ${chalk.default.gray(`last seen: ${ago}m ago`)}`);
|
|
62
|
+
}
|
|
63
|
+
console.log();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function nodeAdd() {
|
|
67
|
+
console.log(chalk.default.bold.cyan("\n ➕ ADD NODE\n"));
|
|
68
|
+
const { type } = await inquirer.default.prompt([{
|
|
69
|
+
type: "list",
|
|
70
|
+
name: "type",
|
|
71
|
+
message: "Node type:",
|
|
72
|
+
choices: [
|
|
73
|
+
{
|
|
74
|
+
name: "🖥️ Remote server (SSH)",
|
|
75
|
+
value: "remote"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: "📱 Android device (ADB)",
|
|
79
|
+
value: "android"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "🍓 Raspberry Pi",
|
|
83
|
+
value: "raspberrypi"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "🐳 Docker container",
|
|
87
|
+
value: "docker"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "☁️ VM / cloud instance",
|
|
91
|
+
value: "vm"
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
}]);
|
|
95
|
+
const { name } = await inquirer.default.prompt([{
|
|
96
|
+
type: "input",
|
|
97
|
+
name: "name",
|
|
98
|
+
message: "Node name:",
|
|
99
|
+
validate: (v) => !!v.trim() || "Required"
|
|
100
|
+
}]);
|
|
101
|
+
let extras = {};
|
|
102
|
+
if (type === "android") {
|
|
103
|
+
const { deviceId } = await inquirer.default.prompt([{
|
|
104
|
+
type: "input",
|
|
105
|
+
name: "deviceId",
|
|
106
|
+
message: "ADB device ID (run: adb devices):",
|
|
107
|
+
validate: (v) => !!v.trim() || "Required"
|
|
108
|
+
}]);
|
|
109
|
+
extras.androidDeviceId = deviceId;
|
|
110
|
+
extras.capabilities = ["channel:host", "always-on"];
|
|
111
|
+
} else {
|
|
112
|
+
const { host, port } = await inquirer.default.prompt([{
|
|
113
|
+
type: "input",
|
|
114
|
+
name: "host",
|
|
115
|
+
message: "Hostname or IP:",
|
|
116
|
+
validate: (v) => !!v.trim() || "Required"
|
|
117
|
+
}, {
|
|
118
|
+
type: "number",
|
|
119
|
+
name: "port",
|
|
120
|
+
message: "Gateway port:",
|
|
121
|
+
default: 18789
|
|
122
|
+
}]);
|
|
123
|
+
const { caps } = await inquirer.default.prompt([{
|
|
124
|
+
type: "checkbox",
|
|
125
|
+
name: "caps",
|
|
126
|
+
message: "Capabilities:",
|
|
127
|
+
choices: [
|
|
128
|
+
{
|
|
129
|
+
name: "Run agent inference",
|
|
130
|
+
value: "agent:run",
|
|
131
|
+
checked: true
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "Host channel connections",
|
|
135
|
+
value: "channel:host"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: "Execute code",
|
|
139
|
+
value: "code:execute"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: "GPU acceleration",
|
|
143
|
+
value: "gpu"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "Always-on (24/7)",
|
|
147
|
+
value: "always-on"
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
}]);
|
|
151
|
+
extras = {
|
|
152
|
+
host,
|
|
153
|
+
port,
|
|
154
|
+
capabilities: caps
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const node = {
|
|
158
|
+
id: name.toLowerCase().replace(/\s+/g, "-"),
|
|
159
|
+
name,
|
|
160
|
+
type,
|
|
161
|
+
status: "unknown",
|
|
162
|
+
addedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
163
|
+
capabilities: extras.capabilities || [],
|
|
164
|
+
...extras
|
|
165
|
+
};
|
|
166
|
+
const nodes = await loadNodes();
|
|
167
|
+
nodes.push(node);
|
|
168
|
+
await saveNodes(nodes);
|
|
169
|
+
console.log(chalk.default.green(`\n ✔ Node added: ${name}`));
|
|
170
|
+
console.log(chalk.default.gray(" Run: hyperclaw node probe to test the connection\n"));
|
|
171
|
+
}
|
|
172
|
+
async function nodeProbe(id) {
|
|
173
|
+
const nodes = await loadNodes();
|
|
174
|
+
const targets = id ? nodes.filter((n) => n.id === id) : nodes;
|
|
175
|
+
console.log(chalk.default.bold.cyan("\n 🔍 PROBING NODES\n"));
|
|
176
|
+
console.log(` ${chalk.default.cyan("○")} Local...`);
|
|
177
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
178
|
+
console.log(` ${chalk.default.green("✔")} Local — online (${os.default.platform()} ${os.default.arch()})\n`);
|
|
179
|
+
for (const node of targets) {
|
|
180
|
+
const spinner = (0, ora.default)(` Probing ${node.name} (${node.host || node.androidDeviceId || node.type})...`).start();
|
|
181
|
+
await new Promise((r) => setTimeout(r, 1e3));
|
|
182
|
+
try {
|
|
183
|
+
if (node.host) {
|
|
184
|
+
const axios = (await import("axios")).default;
|
|
185
|
+
const res = await axios.get(`http://${node.host}:${node.port || 18789}/api/status`, { timeout: 3e3 });
|
|
186
|
+
node.status = "online";
|
|
187
|
+
node.version = res.data?.version;
|
|
188
|
+
node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
189
|
+
spinner.succeed(`${node.name} — online${node.version ? ` (v${node.version})` : ""}`);
|
|
190
|
+
} else if (node.type === "android") {
|
|
191
|
+
const { exec } = await import("child_process");
|
|
192
|
+
const { promisify } = await import("util");
|
|
193
|
+
const execAsync = promisify(exec);
|
|
194
|
+
await execAsync(`adb -s ${node.androidDeviceId} shell echo ok`);
|
|
195
|
+
node.status = "online";
|
|
196
|
+
node.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
197
|
+
spinner.succeed(`${node.name} — online (ADB connected)`);
|
|
198
|
+
} else {
|
|
199
|
+
node.status = "unknown";
|
|
200
|
+
spinner.warn(`${node.name} — probe not supported for ${node.type}`);
|
|
201
|
+
}
|
|
202
|
+
} catch {
|
|
203
|
+
node.status = "offline";
|
|
204
|
+
spinner.fail(`${node.name} — offline / unreachable`);
|
|
205
|
+
}
|
|
206
|
+
console.log();
|
|
207
|
+
}
|
|
208
|
+
await saveNodes(nodes);
|
|
209
|
+
}
|
|
210
|
+
async function nodeRemove(id) {
|
|
211
|
+
const nodes = await loadNodes();
|
|
212
|
+
const idx = nodes.findIndex((n) => n.id === id);
|
|
213
|
+
if (idx === -1) {
|
|
214
|
+
console.log(chalk.default.red(`\n ✖ Node not found: ${id}\n`));
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
nodes.splice(idx, 1);
|
|
218
|
+
await saveNodes(nodes);
|
|
219
|
+
console.log(chalk.default.green(`\n ✔ Node removed: ${id}\n`));
|
|
220
|
+
}
|
|
221
|
+
/** Show pending work queued for dormant nodes. */
|
|
222
|
+
async function nodeQueue(nodeId) {
|
|
223
|
+
const { listPending } = await Promise.resolve().then(() => require("./node-pending-queue-DZp7cdfo.js"));
|
|
224
|
+
const pending = listPending(nodeId);
|
|
225
|
+
console.log(chalk.default.bold.cyan("\n 📋 NODE PENDING QUEUE\n"));
|
|
226
|
+
if (pending.length === 0) {
|
|
227
|
+
console.log(chalk.default.gray(" No pending work."));
|
|
228
|
+
if (nodeId) console.log(chalk.default.gray(` (filter: ${nodeId})`));
|
|
229
|
+
console.log(chalk.default.gray("\n Work is queued when a node is offline. Run `hyperclaw node probe` and the queue drains on success.\n"));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const byNode = pending.reduce((acc, i) => {
|
|
233
|
+
if (!acc[i.nodeId]) acc[i.nodeId] = [];
|
|
234
|
+
acc[i.nodeId].push(i);
|
|
235
|
+
return acc;
|
|
236
|
+
}, {});
|
|
237
|
+
for (const [nid, items] of Object.entries(byNode)) {
|
|
238
|
+
console.log(` ${chalk.default.yellow("●")} ${chalk.default.white(nid)} — ${items.length} pending`);
|
|
239
|
+
for (const i of items.slice(0, 5)) console.log(` ${chalk.default.gray(i.id)} ${i.type} ${chalk.default.gray(i.createdAt)}`);
|
|
240
|
+
if (items.length > 5) console.log(chalk.default.gray(` ... +${items.length - 5} more`));
|
|
241
|
+
console.log();
|
|
242
|
+
}
|
|
243
|
+
console.log(chalk.default.gray(" Drain on node online: hyperclaw node probe <nodeId>\n"));
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
//#endregion
|
|
247
|
+
exports.nodeAdd = nodeAdd;
|
|
248
|
+
exports.nodeList = nodeList;
|
|
249
|
+
exports.nodeProbe = nodeProbe;
|
|
250
|
+
exports.nodeQueue = nodeQueue;
|
|
251
|
+
exports.nodeRemove = nodeRemove;
|