hyperclaw 5.3.45 → 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-B2Qo91lq.js +143 -0
- package/dist/banner-CZ2BfvQq.js +143 -0
- package/dist/banner-CjTRWmks.js +7 -0
- package/dist/banner-CmNA9NKE.js +7 -0
- package/dist/banner-D3-Ik5d2.js +143 -0
- package/dist/banner-D3X8tQ-0.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-BGD9AWhr.js +523 -0
- package/dist/chat-BUa1oGqj.js +528 -0
- package/dist/chat-CiuT-GTs.js +528 -0
- package/dist/chat-D8wFNN4z.js +523 -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-D-klsy3i.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-D_bYfHgn.js +421 -0
- package/dist/daemon-DcE6vcjH.js +421 -0
- package/dist/daemon-NFwpuo3L.js +7 -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-B7Q4Vx-C.js +7 -0
- package/dist/engine-BBJlKpMP.js +7 -0
- package/dist/engine-BNygJfCo.js +335 -0
- package/dist/engine-C-G3G-U7.js +7 -0
- package/dist/engine-DB4MBzki.js +7 -0
- package/dist/engine-DPi9fhMl.js +332 -0
- package/dist/engine-DRpy9Y5O.js +327 -0
- package/dist/engine-DeaqDcaT.js +7 -0
- package/dist/engine-DetHi9LP.js +327 -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-BqyZr2GM.js +516 -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-DTzP20Up.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-BAGRKfJz.js +93 -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-Dt64EewT.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-32d2Gsuy.js +14 -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-Cgj_CIrq.js +3812 -0
- package/dist/onboard-ChnsqU5z.js +14 -0
- package/dist/onboard-CjzqTYq3.js +3812 -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-Bcj7uc1F.js +189 -0
- package/dist/orchestrator-C7oLWNFW.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-Cuyqncql.js +189 -0
- package/dist/orchestrator-CxlEm5li.js +6 -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-ADgw_Gkd.js +283 -0
- package/dist/osint-B5j3IuJK.js +283 -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-BbH6eW8z.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/osint-chat-xRP672b-.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-6TIyu0mb.js +4 -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-Da_jSrfS.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/server-gai_RW1u.js +1356 -0
- package/dist/server-vbYKep6r.js +1356 -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-CHQT7c1k.js +5 -0
- package/dist/skill-runtime-CLK5HTVE.js +5 -0
- package/dist/skill-runtime-COyc3Bci.js +104 -0
- package/dist/skill-runtime-Cfd0OLkP.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/skill-runtime-Dr0fimDf.js +5 -0
- package/dist/skill-runtime-DtO4i9vK.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-CDLnbsLp.js +458 -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-D4VRanxB.js +458 -0
- package/dist/src-DFo8lVfV.js +300 -0
- package/dist/src-DJbpP4Gs.js +462 -0
- package/dist/src-DK-ayUx7.js +63 -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-H1I7JC2E.js +63 -0
- package/dist/src-TYvV_oFO.js +63 -0
- package/dist/src-lltU5gkh.js +20 -0
- package/dist/sub-agent-tools-BoMCZ6jz.js +39 -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-Dla3ZB5N.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 +147 -143
- package/scripts/fix-mojibake.mjs +166 -0
- package/static/web/assets/{index-BeAuHLb2.js → index-8bDizzaq.js} +2 -2
- package/static/web/assets/index-B5N1LHGR.css +1 -0
- package/static/web/index.html +2 -2
- package/static/web/assets/index-D2RfO0dG.css +0 -1
|
@@ -0,0 +1,167 @@
|
|
|
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 os = require_chunk.__toESM(require("os"));
|
|
5
|
+
const http = require_chunk.__toESM(require("http"));
|
|
6
|
+
const https = require_chunk.__toESM(require("https"));
|
|
7
|
+
|
|
8
|
+
//#region src/services/vision.ts
|
|
9
|
+
function inferImageMediaType(ext) {
|
|
10
|
+
return {
|
|
11
|
+
".png": "image/png",
|
|
12
|
+
".jpg": "image/jpeg",
|
|
13
|
+
".jpeg": "image/jpeg",
|
|
14
|
+
".gif": "image/gif",
|
|
15
|
+
".webp": "image/webp"
|
|
16
|
+
}[ext] ?? "image/jpeg";
|
|
17
|
+
}
|
|
18
|
+
async function readValidatedImageFile(filePath) {
|
|
19
|
+
const resolvedPath = path.default.resolve(filePath.replace(/^~/, os.default.homedir()));
|
|
20
|
+
const ext = path.default.extname(resolvedPath).toLowerCase();
|
|
21
|
+
if (!ALLOWED_IMAGE_EXTENSIONS.has(ext)) throw new Error(`Unsupported image file type: ${ext || "unknown"}`);
|
|
22
|
+
const buf = await fs_extra.default.readFile(resolvedPath);
|
|
23
|
+
if (buf.length === 0) throw new Error("Image input is empty");
|
|
24
|
+
if (buf.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
25
|
+
return {
|
|
26
|
+
data: buf.toString("base64"),
|
|
27
|
+
mediaType: inferImageMediaType(ext)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function fetchValidatedRemoteImage(urlString) {
|
|
31
|
+
const url = new URL(urlString);
|
|
32
|
+
if (!["http:", "https:"].includes(url.protocol)) throw new Error(`Unsupported image URL protocol: ${url.protocol}`);
|
|
33
|
+
const mod = url.protocol === "https:" ? https.default : http.default;
|
|
34
|
+
const buf = await new Promise((resolve, reject) => {
|
|
35
|
+
const req = mod.get(url, (res) => {
|
|
36
|
+
if ((res.statusCode ?? 0) >= 400) {
|
|
37
|
+
reject(new Error(`Image download failed with status ${res.statusCode}`));
|
|
38
|
+
res.resume();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const contentLength = Number(res.headers["content-length"] ?? 0);
|
|
42
|
+
if (contentLength > MAX_IMAGE_BYTES) {
|
|
43
|
+
reject(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
44
|
+
res.destroy();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const chunks = [];
|
|
48
|
+
let total = 0;
|
|
49
|
+
res.on("data", (c) => {
|
|
50
|
+
total += c.length;
|
|
51
|
+
if (total > MAX_IMAGE_BYTES) {
|
|
52
|
+
req.destroy(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
chunks.push(c);
|
|
56
|
+
});
|
|
57
|
+
res.on("end", () => resolve(Buffer.concat(chunks)));
|
|
58
|
+
res.on("error", reject);
|
|
59
|
+
});
|
|
60
|
+
req.on("error", reject);
|
|
61
|
+
});
|
|
62
|
+
const pathnameExt = path.default.extname(url.pathname).toLowerCase();
|
|
63
|
+
return {
|
|
64
|
+
data: buf.toString("base64"),
|
|
65
|
+
mediaType: inferImageMediaType(ALLOWED_IMAGE_EXTENSIONS.has(pathnameExt) ? pathnameExt : ".jpg")
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function imageToBase64(input) {
|
|
69
|
+
const trimmed = input.trim();
|
|
70
|
+
if (trimmed.startsWith("data:")) {
|
|
71
|
+
const match = trimmed.match(/^data:(image\/[^;]+);base64,(.+)$/);
|
|
72
|
+
if (match) {
|
|
73
|
+
const buffer = Buffer.from(match[2], "base64");
|
|
74
|
+
if (buffer.length === 0) throw new Error("Image input is empty");
|
|
75
|
+
if (buffer.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
76
|
+
return {
|
|
77
|
+
data: match[2],
|
|
78
|
+
mediaType: match[1]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (trimmed.startsWith("http")) return fetchValidatedRemoteImage(trimmed);
|
|
83
|
+
return readValidatedImageFile(trimmed);
|
|
84
|
+
}
|
|
85
|
+
async function analyzeImage(imageInput, prompt, apiKey, provider = "anthropic") {
|
|
86
|
+
const { data, mediaType } = await imageToBase64(imageInput);
|
|
87
|
+
const isAnthropic = provider === "anthropic";
|
|
88
|
+
const hostname = isAnthropic ? "api.anthropic.com" : "openrouter.ai";
|
|
89
|
+
const model = isAnthropic ? "claude-sonnet-4-20250514" : "openai/gpt-4o";
|
|
90
|
+
const body = {
|
|
91
|
+
model,
|
|
92
|
+
max_tokens: 1024,
|
|
93
|
+
messages: isAnthropic ? [{
|
|
94
|
+
role: "user",
|
|
95
|
+
content: [{
|
|
96
|
+
type: "image",
|
|
97
|
+
source: {
|
|
98
|
+
type: "base64",
|
|
99
|
+
media_type: mediaType,
|
|
100
|
+
data
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
type: "text",
|
|
104
|
+
text: prompt || "Describe this image."
|
|
105
|
+
}]
|
|
106
|
+
}] : [{
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: "[Image attached] " + (prompt || "Describe this image.")
|
|
111
|
+
}, {
|
|
112
|
+
type: "image_url",
|
|
113
|
+
image_url: { url: `data:${mediaType};base64,${data}` }
|
|
114
|
+
}]
|
|
115
|
+
}]
|
|
116
|
+
};
|
|
117
|
+
if (isAnthropic) body.anthropic_version = "2023-06-01";
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const payload = JSON.stringify(body);
|
|
120
|
+
const req = https.default.request({
|
|
121
|
+
hostname,
|
|
122
|
+
port: 443,
|
|
123
|
+
path: isAnthropic ? "/v1/messages" : "/api/v1/chat/completions",
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
127
|
+
"Content-Type": "application/json",
|
|
128
|
+
...isAnthropic ? { "anthropic-version": "2023-06-01" } : { "HTTP-Referer": "https://hyperclaw.ai" }
|
|
129
|
+
}
|
|
130
|
+
}, (res) => {
|
|
131
|
+
let raw = "";
|
|
132
|
+
res.on("data", (c) => raw += c);
|
|
133
|
+
res.on("end", () => {
|
|
134
|
+
try {
|
|
135
|
+
const j = JSON.parse(raw);
|
|
136
|
+
if (isAnthropic) {
|
|
137
|
+
const text = j.content?.[0]?.text;
|
|
138
|
+
resolve(text || j.error?.message || "(no description)");
|
|
139
|
+
} else {
|
|
140
|
+
const text = j.choices?.[0]?.message?.content;
|
|
141
|
+
resolve(text || j.error?.message || "(no description)");
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
resolve(raw || "(parse error)");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
req.on("error", reject);
|
|
149
|
+
req.write(payload);
|
|
150
|
+
req.end();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
var MAX_IMAGE_BYTES, ALLOWED_IMAGE_EXTENSIONS;
|
|
154
|
+
var init_vision = require_chunk.__esm({ "src/services/vision.ts"() {
|
|
155
|
+
MAX_IMAGE_BYTES = 15 * 1024 * 1024;
|
|
156
|
+
ALLOWED_IMAGE_EXTENSIONS = new Set([
|
|
157
|
+
".png",
|
|
158
|
+
".jpg",
|
|
159
|
+
".jpeg",
|
|
160
|
+
".gif",
|
|
161
|
+
".webp"
|
|
162
|
+
]);
|
|
163
|
+
} });
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
init_vision();
|
|
167
|
+
exports.analyzeImage = analyzeImage;
|
|
@@ -0,0 +1,167 @@
|
|
|
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 os = require_chunk.__toESM(require("os"));
|
|
5
|
+
const http = require_chunk.__toESM(require("http"));
|
|
6
|
+
const https = require_chunk.__toESM(require("https"));
|
|
7
|
+
|
|
8
|
+
//#region src/services/vision.ts
|
|
9
|
+
function inferImageMediaType(ext) {
|
|
10
|
+
return {
|
|
11
|
+
".png": "image/png",
|
|
12
|
+
".jpg": "image/jpeg",
|
|
13
|
+
".jpeg": "image/jpeg",
|
|
14
|
+
".gif": "image/gif",
|
|
15
|
+
".webp": "image/webp"
|
|
16
|
+
}[ext] ?? "image/jpeg";
|
|
17
|
+
}
|
|
18
|
+
async function readValidatedImageFile(filePath) {
|
|
19
|
+
const resolvedPath = path.default.resolve(filePath.replace(/^~/, os.default.homedir()));
|
|
20
|
+
const ext = path.default.extname(resolvedPath).toLowerCase();
|
|
21
|
+
if (!ALLOWED_IMAGE_EXTENSIONS.has(ext)) throw new Error(`Unsupported image file type: ${ext || "unknown"}`);
|
|
22
|
+
const buf = await fs_extra.default.readFile(resolvedPath);
|
|
23
|
+
if (buf.length === 0) throw new Error("Image input is empty");
|
|
24
|
+
if (buf.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
25
|
+
return {
|
|
26
|
+
data: buf.toString("base64"),
|
|
27
|
+
mediaType: inferImageMediaType(ext)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function fetchValidatedRemoteImage(urlString) {
|
|
31
|
+
const url = new URL(urlString);
|
|
32
|
+
if (!["http:", "https:"].includes(url.protocol)) throw new Error(`Unsupported image URL protocol: ${url.protocol}`);
|
|
33
|
+
const mod = url.protocol === "https:" ? https.default : http.default;
|
|
34
|
+
const buf = await new Promise((resolve, reject) => {
|
|
35
|
+
const req = mod.get(url, (res) => {
|
|
36
|
+
if ((res.statusCode ?? 0) >= 400) {
|
|
37
|
+
reject(new Error(`Image download failed with status ${res.statusCode}`));
|
|
38
|
+
res.resume();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const contentLength = Number(res.headers["content-length"] ?? 0);
|
|
42
|
+
if (contentLength > MAX_IMAGE_BYTES) {
|
|
43
|
+
reject(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
44
|
+
res.destroy();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const chunks = [];
|
|
48
|
+
let total = 0;
|
|
49
|
+
res.on("data", (c) => {
|
|
50
|
+
total += c.length;
|
|
51
|
+
if (total > MAX_IMAGE_BYTES) {
|
|
52
|
+
req.destroy(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
chunks.push(c);
|
|
56
|
+
});
|
|
57
|
+
res.on("end", () => resolve(Buffer.concat(chunks)));
|
|
58
|
+
res.on("error", reject);
|
|
59
|
+
});
|
|
60
|
+
req.on("error", reject);
|
|
61
|
+
});
|
|
62
|
+
const pathnameExt = path.default.extname(url.pathname).toLowerCase();
|
|
63
|
+
return {
|
|
64
|
+
data: buf.toString("base64"),
|
|
65
|
+
mediaType: inferImageMediaType(ALLOWED_IMAGE_EXTENSIONS.has(pathnameExt) ? pathnameExt : ".jpg")
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function imageToBase64(input) {
|
|
69
|
+
const trimmed = input.trim();
|
|
70
|
+
if (trimmed.startsWith("data:")) {
|
|
71
|
+
const match = trimmed.match(/^data:(image\/[^;]+);base64,(.+)$/);
|
|
72
|
+
if (match) {
|
|
73
|
+
const buffer = Buffer.from(match[2], "base64");
|
|
74
|
+
if (buffer.length === 0) throw new Error("Image input is empty");
|
|
75
|
+
if (buffer.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
76
|
+
return {
|
|
77
|
+
data: match[2],
|
|
78
|
+
mediaType: match[1]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (trimmed.startsWith("http")) return fetchValidatedRemoteImage(trimmed);
|
|
83
|
+
return readValidatedImageFile(trimmed);
|
|
84
|
+
}
|
|
85
|
+
async function analyzeImage(imageInput, prompt, apiKey, provider = "anthropic") {
|
|
86
|
+
const { data, mediaType } = await imageToBase64(imageInput);
|
|
87
|
+
const isAnthropic = provider === "anthropic";
|
|
88
|
+
const hostname = isAnthropic ? "api.anthropic.com" : "openrouter.ai";
|
|
89
|
+
const model = isAnthropic ? "claude-sonnet-4-20250514" : "openai/gpt-4o";
|
|
90
|
+
const body = {
|
|
91
|
+
model,
|
|
92
|
+
max_tokens: 1024,
|
|
93
|
+
messages: isAnthropic ? [{
|
|
94
|
+
role: "user",
|
|
95
|
+
content: [{
|
|
96
|
+
type: "image",
|
|
97
|
+
source: {
|
|
98
|
+
type: "base64",
|
|
99
|
+
media_type: mediaType,
|
|
100
|
+
data
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
type: "text",
|
|
104
|
+
text: prompt || "Describe this image."
|
|
105
|
+
}]
|
|
106
|
+
}] : [{
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: "[Image attached] " + (prompt || "Describe this image.")
|
|
111
|
+
}, {
|
|
112
|
+
type: "image_url",
|
|
113
|
+
image_url: { url: `data:${mediaType};base64,${data}` }
|
|
114
|
+
}]
|
|
115
|
+
}]
|
|
116
|
+
};
|
|
117
|
+
if (isAnthropic) body.anthropic_version = "2023-06-01";
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const payload = JSON.stringify(body);
|
|
120
|
+
const req = https.default.request({
|
|
121
|
+
hostname,
|
|
122
|
+
port: 443,
|
|
123
|
+
path: isAnthropic ? "/v1/messages" : "/api/v1/chat/completions",
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
127
|
+
"Content-Type": "application/json",
|
|
128
|
+
...isAnthropic ? { "anthropic-version": "2023-06-01" } : { "HTTP-Referer": "https://hyperclaw.ai" }
|
|
129
|
+
}
|
|
130
|
+
}, (res) => {
|
|
131
|
+
let raw = "";
|
|
132
|
+
res.on("data", (c) => raw += c);
|
|
133
|
+
res.on("end", () => {
|
|
134
|
+
try {
|
|
135
|
+
const j = JSON.parse(raw);
|
|
136
|
+
if (isAnthropic) {
|
|
137
|
+
const text = j.content?.[0]?.text;
|
|
138
|
+
resolve(text || j.error?.message || "(no description)");
|
|
139
|
+
} else {
|
|
140
|
+
const text = j.choices?.[0]?.message?.content;
|
|
141
|
+
resolve(text || j.error?.message || "(no description)");
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
resolve(raw || "(parse error)");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
req.on("error", reject);
|
|
149
|
+
req.write(payload);
|
|
150
|
+
req.end();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
var MAX_IMAGE_BYTES, ALLOWED_IMAGE_EXTENSIONS;
|
|
154
|
+
var init_vision = require_chunk.__esm({ "src/services/vision.ts"() {
|
|
155
|
+
MAX_IMAGE_BYTES = 15 * 1024 * 1024;
|
|
156
|
+
ALLOWED_IMAGE_EXTENSIONS = new Set([
|
|
157
|
+
".png",
|
|
158
|
+
".jpg",
|
|
159
|
+
".jpeg",
|
|
160
|
+
".gif",
|
|
161
|
+
".webp"
|
|
162
|
+
]);
|
|
163
|
+
} });
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
init_vision();
|
|
167
|
+
exports.analyzeImage = analyzeImage;
|
|
@@ -0,0 +1,167 @@
|
|
|
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 os = require_chunk.__toESM(require("os"));
|
|
5
|
+
const http = require_chunk.__toESM(require("http"));
|
|
6
|
+
const https = require_chunk.__toESM(require("https"));
|
|
7
|
+
|
|
8
|
+
//#region src/services/vision.ts
|
|
9
|
+
function inferImageMediaType(ext) {
|
|
10
|
+
return {
|
|
11
|
+
".png": "image/png",
|
|
12
|
+
".jpg": "image/jpeg",
|
|
13
|
+
".jpeg": "image/jpeg",
|
|
14
|
+
".gif": "image/gif",
|
|
15
|
+
".webp": "image/webp"
|
|
16
|
+
}[ext] ?? "image/jpeg";
|
|
17
|
+
}
|
|
18
|
+
async function readValidatedImageFile(filePath) {
|
|
19
|
+
const resolvedPath = path.default.resolve(filePath.replace(/^~/, os.default.homedir()));
|
|
20
|
+
const ext = path.default.extname(resolvedPath).toLowerCase();
|
|
21
|
+
if (!ALLOWED_IMAGE_EXTENSIONS.has(ext)) throw new Error(`Unsupported image file type: ${ext || "unknown"}`);
|
|
22
|
+
const buf = await fs_extra.default.readFile(resolvedPath);
|
|
23
|
+
if (buf.length === 0) throw new Error("Image input is empty");
|
|
24
|
+
if (buf.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
25
|
+
return {
|
|
26
|
+
data: buf.toString("base64"),
|
|
27
|
+
mediaType: inferImageMediaType(ext)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function fetchValidatedRemoteImage(urlString) {
|
|
31
|
+
const url = new URL(urlString);
|
|
32
|
+
if (!["http:", "https:"].includes(url.protocol)) throw new Error(`Unsupported image URL protocol: ${url.protocol}`);
|
|
33
|
+
const mod = url.protocol === "https:" ? https.default : http.default;
|
|
34
|
+
const buf = await new Promise((resolve, reject) => {
|
|
35
|
+
const req = mod.get(url, (res) => {
|
|
36
|
+
if ((res.statusCode ?? 0) >= 400) {
|
|
37
|
+
reject(new Error(`Image download failed with status ${res.statusCode}`));
|
|
38
|
+
res.resume();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const contentLength = Number(res.headers["content-length"] ?? 0);
|
|
42
|
+
if (contentLength > MAX_IMAGE_BYTES) {
|
|
43
|
+
reject(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
44
|
+
res.destroy();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const chunks = [];
|
|
48
|
+
let total = 0;
|
|
49
|
+
res.on("data", (c) => {
|
|
50
|
+
total += c.length;
|
|
51
|
+
if (total > MAX_IMAGE_BYTES) {
|
|
52
|
+
req.destroy(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
chunks.push(c);
|
|
56
|
+
});
|
|
57
|
+
res.on("end", () => resolve(Buffer.concat(chunks)));
|
|
58
|
+
res.on("error", reject);
|
|
59
|
+
});
|
|
60
|
+
req.on("error", reject);
|
|
61
|
+
});
|
|
62
|
+
const pathnameExt = path.default.extname(url.pathname).toLowerCase();
|
|
63
|
+
return {
|
|
64
|
+
data: buf.toString("base64"),
|
|
65
|
+
mediaType: inferImageMediaType(ALLOWED_IMAGE_EXTENSIONS.has(pathnameExt) ? pathnameExt : ".jpg")
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function imageToBase64(input) {
|
|
69
|
+
const trimmed = input.trim();
|
|
70
|
+
if (trimmed.startsWith("data:")) {
|
|
71
|
+
const match = trimmed.match(/^data:(image\/[^;]+);base64,(.+)$/);
|
|
72
|
+
if (match) {
|
|
73
|
+
const buffer = Buffer.from(match[2], "base64");
|
|
74
|
+
if (buffer.length === 0) throw new Error("Image input is empty");
|
|
75
|
+
if (buffer.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
76
|
+
return {
|
|
77
|
+
data: match[2],
|
|
78
|
+
mediaType: match[1]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (trimmed.startsWith("http")) return fetchValidatedRemoteImage(trimmed);
|
|
83
|
+
return readValidatedImageFile(trimmed);
|
|
84
|
+
}
|
|
85
|
+
async function analyzeImage(imageInput, prompt, apiKey, provider = "anthropic") {
|
|
86
|
+
const { data, mediaType } = await imageToBase64(imageInput);
|
|
87
|
+
const isAnthropic = provider === "anthropic";
|
|
88
|
+
const hostname = isAnthropic ? "api.anthropic.com" : "openrouter.ai";
|
|
89
|
+
const model = isAnthropic ? "claude-sonnet-4-20250514" : "openai/gpt-4o";
|
|
90
|
+
const body = {
|
|
91
|
+
model,
|
|
92
|
+
max_tokens: 1024,
|
|
93
|
+
messages: isAnthropic ? [{
|
|
94
|
+
role: "user",
|
|
95
|
+
content: [{
|
|
96
|
+
type: "image",
|
|
97
|
+
source: {
|
|
98
|
+
type: "base64",
|
|
99
|
+
media_type: mediaType,
|
|
100
|
+
data
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
type: "text",
|
|
104
|
+
text: prompt || "Describe this image."
|
|
105
|
+
}]
|
|
106
|
+
}] : [{
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: "[Image attached] " + (prompt || "Describe this image.")
|
|
111
|
+
}, {
|
|
112
|
+
type: "image_url",
|
|
113
|
+
image_url: { url: `data:${mediaType};base64,${data}` }
|
|
114
|
+
}]
|
|
115
|
+
}]
|
|
116
|
+
};
|
|
117
|
+
if (isAnthropic) body.anthropic_version = "2023-06-01";
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const payload = JSON.stringify(body);
|
|
120
|
+
const req = https.default.request({
|
|
121
|
+
hostname,
|
|
122
|
+
port: 443,
|
|
123
|
+
path: isAnthropic ? "/v1/messages" : "/api/v1/chat/completions",
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
127
|
+
"Content-Type": "application/json",
|
|
128
|
+
...isAnthropic ? { "anthropic-version": "2023-06-01" } : { "HTTP-Referer": "https://hyperclaw.ai" }
|
|
129
|
+
}
|
|
130
|
+
}, (res) => {
|
|
131
|
+
let raw = "";
|
|
132
|
+
res.on("data", (c) => raw += c);
|
|
133
|
+
res.on("end", () => {
|
|
134
|
+
try {
|
|
135
|
+
const j = JSON.parse(raw);
|
|
136
|
+
if (isAnthropic) {
|
|
137
|
+
const text = j.content?.[0]?.text;
|
|
138
|
+
resolve(text || j.error?.message || "(no description)");
|
|
139
|
+
} else {
|
|
140
|
+
const text = j.choices?.[0]?.message?.content;
|
|
141
|
+
resolve(text || j.error?.message || "(no description)");
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
resolve(raw || "(parse error)");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
req.on("error", reject);
|
|
149
|
+
req.write(payload);
|
|
150
|
+
req.end();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
var MAX_IMAGE_BYTES, ALLOWED_IMAGE_EXTENSIONS;
|
|
154
|
+
var init_vision = require_chunk.__esm({ "src/services/vision.ts"() {
|
|
155
|
+
MAX_IMAGE_BYTES = 15 * 1024 * 1024;
|
|
156
|
+
ALLOWED_IMAGE_EXTENSIONS = new Set([
|
|
157
|
+
".png",
|
|
158
|
+
".jpg",
|
|
159
|
+
".jpeg",
|
|
160
|
+
".gif",
|
|
161
|
+
".webp"
|
|
162
|
+
]);
|
|
163
|
+
} });
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
init_vision();
|
|
167
|
+
exports.analyzeImage = analyzeImage;
|
|
@@ -0,0 +1,167 @@
|
|
|
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 os = require_chunk.__toESM(require("os"));
|
|
5
|
+
const http = require_chunk.__toESM(require("http"));
|
|
6
|
+
const https = require_chunk.__toESM(require("https"));
|
|
7
|
+
|
|
8
|
+
//#region src/services/vision.ts
|
|
9
|
+
function inferImageMediaType(ext) {
|
|
10
|
+
return {
|
|
11
|
+
".png": "image/png",
|
|
12
|
+
".jpg": "image/jpeg",
|
|
13
|
+
".jpeg": "image/jpeg",
|
|
14
|
+
".gif": "image/gif",
|
|
15
|
+
".webp": "image/webp"
|
|
16
|
+
}[ext] ?? "image/jpeg";
|
|
17
|
+
}
|
|
18
|
+
async function readValidatedImageFile(filePath) {
|
|
19
|
+
const resolvedPath = path.default.resolve(filePath.replace(/^~/, os.default.homedir()));
|
|
20
|
+
const ext = path.default.extname(resolvedPath).toLowerCase();
|
|
21
|
+
if (!ALLOWED_IMAGE_EXTENSIONS.has(ext)) throw new Error(`Unsupported image file type: ${ext || "unknown"}`);
|
|
22
|
+
const buf = await fs_extra.default.readFile(resolvedPath);
|
|
23
|
+
if (buf.length === 0) throw new Error("Image input is empty");
|
|
24
|
+
if (buf.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
25
|
+
return {
|
|
26
|
+
data: buf.toString("base64"),
|
|
27
|
+
mediaType: inferImageMediaType(ext)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function fetchValidatedRemoteImage(urlString) {
|
|
31
|
+
const url = new URL(urlString);
|
|
32
|
+
if (!["http:", "https:"].includes(url.protocol)) throw new Error(`Unsupported image URL protocol: ${url.protocol}`);
|
|
33
|
+
const mod = url.protocol === "https:" ? https.default : http.default;
|
|
34
|
+
const buf = await new Promise((resolve, reject) => {
|
|
35
|
+
const req = mod.get(url, (res) => {
|
|
36
|
+
if ((res.statusCode ?? 0) >= 400) {
|
|
37
|
+
reject(new Error(`Image download failed with status ${res.statusCode}`));
|
|
38
|
+
res.resume();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const contentLength = Number(res.headers["content-length"] ?? 0);
|
|
42
|
+
if (contentLength > MAX_IMAGE_BYTES) {
|
|
43
|
+
reject(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
44
|
+
res.destroy();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const chunks = [];
|
|
48
|
+
let total = 0;
|
|
49
|
+
res.on("data", (c) => {
|
|
50
|
+
total += c.length;
|
|
51
|
+
if (total > MAX_IMAGE_BYTES) {
|
|
52
|
+
req.destroy(new Error(`Image download exceeds ${MAX_IMAGE_BYTES} bytes`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
chunks.push(c);
|
|
56
|
+
});
|
|
57
|
+
res.on("end", () => resolve(Buffer.concat(chunks)));
|
|
58
|
+
res.on("error", reject);
|
|
59
|
+
});
|
|
60
|
+
req.on("error", reject);
|
|
61
|
+
});
|
|
62
|
+
const pathnameExt = path.default.extname(url.pathname).toLowerCase();
|
|
63
|
+
return {
|
|
64
|
+
data: buf.toString("base64"),
|
|
65
|
+
mediaType: inferImageMediaType(ALLOWED_IMAGE_EXTENSIONS.has(pathnameExt) ? pathnameExt : ".jpg")
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function imageToBase64(input) {
|
|
69
|
+
const trimmed = input.trim();
|
|
70
|
+
if (trimmed.startsWith("data:")) {
|
|
71
|
+
const match = trimmed.match(/^data:(image\/[^;]+);base64,(.+)$/);
|
|
72
|
+
if (match) {
|
|
73
|
+
const buffer = Buffer.from(match[2], "base64");
|
|
74
|
+
if (buffer.length === 0) throw new Error("Image input is empty");
|
|
75
|
+
if (buffer.length > MAX_IMAGE_BYTES) throw new Error(`Image input exceeds ${MAX_IMAGE_BYTES} bytes`);
|
|
76
|
+
return {
|
|
77
|
+
data: match[2],
|
|
78
|
+
mediaType: match[1]
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (trimmed.startsWith("http")) return fetchValidatedRemoteImage(trimmed);
|
|
83
|
+
return readValidatedImageFile(trimmed);
|
|
84
|
+
}
|
|
85
|
+
async function analyzeImage(imageInput, prompt, apiKey, provider = "anthropic") {
|
|
86
|
+
const { data, mediaType } = await imageToBase64(imageInput);
|
|
87
|
+
const isAnthropic = provider === "anthropic";
|
|
88
|
+
const hostname = isAnthropic ? "api.anthropic.com" : "openrouter.ai";
|
|
89
|
+
const model = isAnthropic ? "claude-sonnet-4-20250514" : "openai/gpt-4o";
|
|
90
|
+
const body = {
|
|
91
|
+
model,
|
|
92
|
+
max_tokens: 1024,
|
|
93
|
+
messages: isAnthropic ? [{
|
|
94
|
+
role: "user",
|
|
95
|
+
content: [{
|
|
96
|
+
type: "image",
|
|
97
|
+
source: {
|
|
98
|
+
type: "base64",
|
|
99
|
+
media_type: mediaType,
|
|
100
|
+
data
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
type: "text",
|
|
104
|
+
text: prompt || "Describe this image."
|
|
105
|
+
}]
|
|
106
|
+
}] : [{
|
|
107
|
+
role: "user",
|
|
108
|
+
content: [{
|
|
109
|
+
type: "text",
|
|
110
|
+
text: "[Image attached] " + (prompt || "Describe this image.")
|
|
111
|
+
}, {
|
|
112
|
+
type: "image_url",
|
|
113
|
+
image_url: { url: `data:${mediaType};base64,${data}` }
|
|
114
|
+
}]
|
|
115
|
+
}]
|
|
116
|
+
};
|
|
117
|
+
if (isAnthropic) body.anthropic_version = "2023-06-01";
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const payload = JSON.stringify(body);
|
|
120
|
+
const req = https.default.request({
|
|
121
|
+
hostname,
|
|
122
|
+
port: 443,
|
|
123
|
+
path: isAnthropic ? "/v1/messages" : "/api/v1/chat/completions",
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: {
|
|
126
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
127
|
+
"Content-Type": "application/json",
|
|
128
|
+
...isAnthropic ? { "anthropic-version": "2023-06-01" } : { "HTTP-Referer": "https://hyperclaw.ai" }
|
|
129
|
+
}
|
|
130
|
+
}, (res) => {
|
|
131
|
+
let raw = "";
|
|
132
|
+
res.on("data", (c) => raw += c);
|
|
133
|
+
res.on("end", () => {
|
|
134
|
+
try {
|
|
135
|
+
const j = JSON.parse(raw);
|
|
136
|
+
if (isAnthropic) {
|
|
137
|
+
const text = j.content?.[0]?.text;
|
|
138
|
+
resolve(text || j.error?.message || "(no description)");
|
|
139
|
+
} else {
|
|
140
|
+
const text = j.choices?.[0]?.message?.content;
|
|
141
|
+
resolve(text || j.error?.message || "(no description)");
|
|
142
|
+
}
|
|
143
|
+
} catch {
|
|
144
|
+
resolve(raw || "(parse error)");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
req.on("error", reject);
|
|
149
|
+
req.write(payload);
|
|
150
|
+
req.end();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
var MAX_IMAGE_BYTES, ALLOWED_IMAGE_EXTENSIONS;
|
|
154
|
+
var init_vision = require_chunk.__esm({ "src/services/vision.ts"() {
|
|
155
|
+
MAX_IMAGE_BYTES = 15 * 1024 * 1024;
|
|
156
|
+
ALLOWED_IMAGE_EXTENSIONS = new Set([
|
|
157
|
+
".png",
|
|
158
|
+
".jpg",
|
|
159
|
+
".jpeg",
|
|
160
|
+
".gif",
|
|
161
|
+
".webp"
|
|
162
|
+
]);
|
|
163
|
+
} });
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
init_vision();
|
|
167
|
+
exports.analyzeImage = analyzeImage;
|