hypervibes 0.0.0-stage → 0.4.0
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/.build/client/assets/_authenticated-C87LKvH0.js +1 -0
- package/.build/client/assets/_authenticated.account-D-nTh_fC.js +1 -0
- package/.build/client/assets/_authenticated.agents-HwcveLyB.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId-DuE8Lv62.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.chart-Bb_XkvQx.js +4 -0
- package/.build/client/assets/_authenticated.agents._agentId.chat-ClMMKw_N.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.index-DNJwBwn9.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.indicators-BmVjLtRI.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.indicators_._indicatorId-CMqaaFQf.js +2 -0
- package/.build/client/assets/_authenticated.agents._agentId.indicators_._indicatorId-DtgkoNV5.js +6 -0
- package/.build/client/assets/_authenticated.agents._agentId.memories-O-4f6a4G.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.memories_._memoryRef-BUPtUcj3.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.notifications-2lyhXCSk.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.notifications_._notificationId-Da3ZVT4v.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.settings-C5cWHoYw.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.sub-agents-HwcveLyB.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.sub-agents._subagentId-CZ4MeRy4.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.sub-agents._subagentId_.runs._runId-dVbo5kMU.js +3 -0
- package/.build/client/assets/_authenticated.agents._agentId.sub-agents.index-DeWTOYJD.js +1 -0
- package/.build/client/assets/_authenticated.agents._agentId.sub-agents.new-D02TflCE.js +37 -0
- package/.build/client/assets/_authenticated.agents._agentId.transactions-D3a8Glgj.js +1 -0
- package/.build/client/assets/_authenticated.agents.index-CEqeDEgP.js +1 -0
- package/.build/client/assets/_authenticated.agents.new-DLRWK5Uk.js +1 -0
- package/.build/client/assets/_authenticated.providers-D0iPLXra.js +1 -0
- package/.build/client/assets/agent-chat-page-C5eYFgxw.js +1 -0
- package/.build/client/assets/agent-enablement-control-CUzOp9ce.js +1 -0
- package/.build/client/assets/agent-events-DC8eDZf3.js +1 -0
- package/.build/client/assets/agent-input-aolvZ47U.js +1 -0
- package/.build/client/assets/agent-notifications-page-B0mr-Zz8.js +1 -0
- package/.build/client/assets/agent-queries-CNMBImun.js +1 -0
- package/.build/client/assets/app-DjmsvbUC.css +2 -0
- package/.build/client/assets/artifact-content-COO4VTSZ.js +1 -0
- package/.build/client/assets/auth-client-K13li9H1.js +3 -0
- package/.build/client/assets/call-DxlGie4_.js +31 -0
- package/.build/client/assets/ccip-BgPlVPYP.js +1 -0
- package/.build/client/assets/chart-contracts-Cr5SFCbE.js +1 -0
- package/.build/client/assets/chart-queries-Bpvrgd0-.js +1 -0
- package/.build/client/assets/chat-bubble-CAJkT-vL.js +1 -0
- package/.build/client/assets/config-dialog-C9x9gKW9.js +1 -0
- package/.build/client/assets/contracts-HhAL7Tt7.js +1 -0
- package/.build/client/assets/createServerFn-DfZIp2Fu.js +3 -0
- package/.build/client/assets/custom-BeqXuIIS.js +5 -0
- package/.build/client/assets/decimal-B0DEG-1V.js +1 -0
- package/.build/client/assets/esm-BTb2nBdW.js +1 -0
- package/.build/client/assets/identicon-Lb9pS4O1.js +1 -0
- package/.build/client/assets/index-B4hvjMmI.js +10 -0
- package/.build/client/assets/indicator-input-fields-CtmrfVfS.js +1 -0
- package/.build/client/assets/indicator-queries-CzZ6u1Mh.js +1 -0
- package/.build/client/assets/indicator-renderer-CfccsIt2.js +1 -0
- package/.build/client/assets/instrument-label-BZYlWXR5.js +1 -0
- package/.build/client/assets/instrument-picker-DLPpryOm.js +1 -0
- package/.build/client/assets/journal-decimal-DBvd_Ibi.js +1 -0
- package/.build/client/assets/jsx-runtime-CIazjfqY.js +1 -0
- package/.build/client/assets/lazyRouteComponent-CJgUa7_r.js +1 -0
- package/.build/client/assets/lightweight-charts.production-BiBiFZSH.js +1 -0
- package/.build/client/assets/login-MNgYxCOY.js +3 -0
- package/.build/client/assets/memory-badge-BbN-DJQi.js +1 -0
- package/.build/client/assets/memory-contracts-Doi_Q1XJ.js +1 -0
- package/.build/client/assets/memory-queries-BttL580R.js +1 -0
- package/.build/client/assets/model-picker-YCQNNmyw.js +1 -0
- package/.build/client/assets/notification-queries-B12DG3aS.js +1 -0
- package/.build/client/assets/preload-helper-Czpn1I53.js +1 -0
- package/.build/client/assets/provider-logo-Ddb77aBD.js +1 -0
- package/.build/client/assets/provider-queries-DxPwhDOU.js +1 -0
- package/.build/client/assets/query-nvK_95Jo.js +1 -0
- package/.build/client/assets/random-uuid-DJR3ygJS.js +1 -0
- package/.build/client/assets/react-dom-C6bOPxes.js +1 -0
- package/.build/client/assets/risk-queries-D_6PHwus.js +1 -0
- package/.build/client/assets/run-subagent-dialog-B4yQe9T9.js +1 -0
- package/.build/client/assets/secp256k1-BbZnIgDP.js +1 -0
- package/.build/client/assets/setup-checklist-CUW-K484.js +1 -0
- package/.build/client/assets/sha2-hT-Q4pur.js +1 -0
- package/.build/client/assets/subagent-enabled-toggle-Bk5wfScg.js +1 -0
- package/.build/client/assets/subagent-input-TQke90I1.js +1 -0
- package/.build/client/assets/subagent-mutations-DfsDbmFu.js +1 -0
- package/.build/client/assets/subagent-queries-DVv5JCfs.js +1 -0
- package/.build/client/assets/subagent-run-history-D55Uh5VK.js +1 -0
- package/.build/client/assets/toggle-timestamp-B50FTPmA.js +1 -0
- package/.build/client/assets/useBaseQuery-Bxruo_mV.js +1 -0
- package/.build/client/assets/useMutation-DrF53EQG.js +1 -0
- package/.build/client/assets/useQuery-BMSU16jY.js +1 -0
- package/.build/client/assets/useRouter-c0I1aURm.js +1 -0
- package/.build/client/assets/useSelector-ERD9RroG.js +2 -0
- package/.build/client/assets/useSuspenseQuery-vODFwDb8.js +1 -0
- package/.build/client/assets/utils-Bpv4vmSW.js +1 -0
- package/.build/client/assets/worker-triggers-DtXyn40O.js +1 -0
- package/.build/server/assets/_authenticated-Bch0_2QH.js +264 -0
- package/.build/server/assets/_authenticated-DGV5cZYE.js +22 -0
- package/.build/server/assets/_authenticated.account-6qu6oQ1y.js +685 -0
- package/.build/server/assets/_authenticated.agents-DYDnQxli.js +5 -0
- package/.build/server/assets/_authenticated.agents._agentId-4HvB3mhd.js +17 -0
- package/.build/server/assets/_authenticated.agents._agentId-Cl608F1T.js +260 -0
- package/.build/server/assets/_authenticated.agents._agentId-G2jAHjma.js +15 -0
- package/.build/server/assets/_authenticated.agents._agentId.chart-BIA8wy73.js +2644 -0
- package/.build/server/assets/_authenticated.agents._agentId.chart-D4aj8Qy9.js +22 -0
- package/.build/server/assets/_authenticated.agents._agentId.chat-ClsVle4g.js +13 -0
- package/.build/server/assets/_authenticated.agents._agentId.chat-JV3FDsTp.js +18 -0
- package/.build/server/assets/_authenticated.agents._agentId.index-Ct4kbu2f.js +1044 -0
- package/.build/server/assets/_authenticated.agents._agentId.index-DJgrupvW.js +18 -0
- package/.build/server/assets/_authenticated.agents._agentId.indicators-DrKd0aP5.js +184 -0
- package/.build/server/assets/_authenticated.agents._agentId.indicators-wiVaY8fW.js +18 -0
- package/.build/server/assets/_authenticated.agents._agentId.indicators_._indicatorId-C4Ox2R-a.js +25 -0
- package/.build/server/assets/_authenticated.agents._agentId.indicators_._indicatorId-D8Q0hCW0.js +489 -0
- package/.build/server/assets/_authenticated.agents._agentId.memories-BUTyVLYy.js +42 -0
- package/.build/server/assets/_authenticated.agents._agentId.memories-E8-nSEMT.js +362 -0
- package/.build/server/assets/_authenticated.agents._agentId.memories_._memoryRef-C-SC6wzq.js +14 -0
- package/.build/server/assets/_authenticated.agents._agentId.memories_._memoryRef-ZCrdrc8C.js +490 -0
- package/.build/server/assets/_authenticated.agents._agentId.notifications-DQeQqTzh.js +14 -0
- package/.build/server/assets/_authenticated.agents._agentId.notifications-DlFyYyHh.js +16 -0
- package/.build/server/assets/_authenticated.agents._agentId.notifications_._notificationId-B0RosY_R.js +15 -0
- package/.build/server/assets/_authenticated.agents._agentId.notifications_._notificationId-C1NikQ9e.js +13 -0
- package/.build/server/assets/_authenticated.agents._agentId.settings-DDwjT3Ui.js +42 -0
- package/.build/server/assets/_authenticated.agents._agentId.settings-PEzEvOfo.js +751 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents-z34-J3Tu.js +5 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents._subagentId-D-6TOi1U.js +1371 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents._subagentId-DipzVdnr.js +13 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents._subagentId_.runs._runId-BZR3VLV7.js +610 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents._subagentId_.runs._runId-DsYJKfGm.js +12 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents.index-BF8Cuzcr.js +231 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents.index-D2x0qCnt.js +12 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents.new-CYm_vuDD.js +13 -0
- package/.build/server/assets/_authenticated.agents._agentId.sub-agents.new-CiVShIka.js +497 -0
- package/.build/server/assets/_authenticated.agents._agentId.transactions-BC_XfGqw.js +95 -0
- package/.build/server/assets/_authenticated.agents._agentId.transactions-WtBW3xmh.js +495 -0
- package/.build/server/assets/_authenticated.agents.index-C8zmu8T8.js +78 -0
- package/.build/server/assets/_authenticated.agents.new-Bt-tBR47.js +302 -0
- package/.build/server/assets/_authenticated.providers-C0pb-ujV.js +672 -0
- package/.build/server/assets/_tanstack-start-manifest_v-Baw5u9sk.js +354 -0
- package/.build/server/assets/account-XvMwzRXh.js +66 -0
- package/.build/server/assets/account-queries-AJJVkLAV.js +32 -0
- package/.build/server/assets/agent-chat-page-DChiz8KQ.js +686 -0
- package/.build/server/assets/agent-enablement-control-C90f0uIb.js +143 -0
- package/.build/server/assets/agent-events-DK9Yz5__.js +217 -0
- package/.build/server/assets/agent-notifications-page-BdyKAyds.js +276 -0
- package/.build/server/assets/agent-queries-Cmx8RiUx.js +51 -0
- package/.build/server/assets/agents-CZq-0mna.js +106 -0
- package/.build/server/assets/agents-CfjmtW7A.js +278 -0
- package/.build/server/assets/artifact-content-B6uHmPz7.js +35 -0
- package/.build/server/assets/artifacts-HtLwHs8q.js +42 -0
- package/.build/server/assets/auth-DTikZAVz.js +12 -0
- package/.build/server/assets/auth-client-Vb3O0v7P.js +1897 -0
- package/.build/server/assets/auth-user-DkLo8ojH.js +108 -0
- package/.build/server/assets/chart-queries-Bc3AfsEb.js +109 -0
- package/.build/server/assets/charts-C4dKuwTJ.js +130 -0
- package/.build/server/assets/chat-bubble-ik3itVbx.js +109 -0
- package/.build/server/assets/config-dialog-9gSAjwwT.js +55 -0
- package/.build/server/assets/contracts-CG-nZuYJ.js +155 -0
- package/.build/server/assets/createServerRpc-DNqhdU4z.js +12 -0
- package/.build/server/assets/decimal-BthtZ77w.js +97 -0
- package/.build/server/assets/empty-plugin-adapters-MOWBbCMw.js +5 -0
- package/.build/server/assets/errors-DaZqUftX.js +151 -0
- package/.build/server/assets/gateway-CHkruO_a.js +193 -0
- package/.build/server/assets/identicon-CyawcVnx.js +41 -0
- package/.build/server/assets/indicator-input-fields-bzuhIh6t.js +75 -0
- package/.build/server/assets/indicator-queries-4dY1-LXx.js +171 -0
- package/.build/server/assets/indicator-renderer-B2muPS-8.js +395 -0
- package/.build/server/assets/indicators-ENxAHN42.js +192 -0
- package/.build/server/assets/insight-contracts-B5rmUDfO.js +14 -0
- package/.build/server/assets/instrument-label-C-tTGGsD.js +40 -0
- package/.build/server/assets/instrument-picker-CRroLwVq.js +381 -0
- package/.build/server/assets/journal-9aE-um9f.js +107 -0
- package/.build/server/assets/journal-decimal-Bh9EL029.js +66 -0
- package/.build/server/assets/login-BsEFUvTX.js +125 -0
- package/.build/server/assets/memories-2WF2fW1G.js +100 -0
- package/.build/server/assets/memory-badge-DVYLTtRR.js +53 -0
- package/.build/server/assets/memory-contracts-DQGN2IKV.js +22 -0
- package/.build/server/assets/memory-queries--4RbPRrk.js +92 -0
- package/.build/server/assets/model-picker-CA1uYb--.js +225 -0
- package/.build/server/assets/notification-queries-0CJUkBt9.js +52 -0
- package/.build/server/assets/notifications-Cn7BiCyw.js +72 -0
- package/.build/server/assets/provider-logo-BRdbOr9I.js +32 -0
- package/.build/server/assets/provider-queries-BaZWLw8J.js +78 -0
- package/.build/server/assets/providers-CyoN_jgW.js +89 -0
- package/.build/server/assets/risk-Bqrb6hKQ.js +34 -0
- package/.build/server/assets/risk-queries-JQpByHT2.js +18 -0
- package/.build/server/assets/router-Hkr5TH_I.js +419 -0
- package/.build/server/assets/run-subagent-dialog-C7iUOZa-.js +59 -0
- package/.build/server/assets/setup-DqMlwgNr.js +30 -0
- package/.build/server/assets/setup-checklist-BICTmBo2.js +60 -0
- package/.build/server/assets/start-C-GPoWRt.js +4 -0
- package/.build/server/assets/subagent-enabled-toggle-Djte00oo.js +22 -0
- package/.build/server/assets/subagent-input-BHQKs2cW.js +57 -0
- package/.build/server/assets/subagent-mutations-dUo3B_SG.js +32 -0
- package/.build/server/assets/subagent-queries-sAwBjFxC.js +146 -0
- package/.build/server/assets/subagent-run-history-C_xmucO-.js +186 -0
- package/.build/server/assets/subagents-CIoilC66.js +180 -0
- package/.build/server/assets/toggle-timestamp-CToUVn67.js +28 -0
- package/.build/server/assets/trading-contracts-zWq1Hxnb.js +26 -0
- package/.build/server/assets/validation-BX-krL0i.js +33 -0
- package/.build/server/assets/worker-triggers-CJF5HWzR.js +51 -0
- package/.build/server/server.js +7501 -0
- package/LICENSE +661 -0
- package/README.md +145 -2
- package/bin/hypervibes.js +24 -0
- package/dist/agents/agent-enablement.js +10 -0
- package/dist/agents/agent-input.js +38 -0
- package/dist/agents/agent-service.js +1004 -0
- package/dist/agents/cancel-task-scope.js +52 -0
- package/dist/agents/candle-intervals.js +1 -0
- package/dist/agents/default-subagents.js +36 -0
- package/dist/agents/execution-context-contracts.js +1 -0
- package/dist/agents/execution-context.js +206 -0
- package/dist/agents/execution-warnings.js +33 -0
- package/dist/agents/orchestrator-insights.js +14 -0
- package/dist/agents/run-inspection.js +99 -0
- package/dist/agents/subagent-dashboard.js +1 -0
- package/dist/agents/subagent-extension.js +156 -0
- package/dist/agents/subagent-history.js +5 -0
- package/dist/agents/subagent-input.js +73 -0
- package/dist/agents/subagent-service.js +1177 -0
- package/dist/agents/subagent-templates.js +20 -0
- package/dist/agents/template-manifest.js +34 -0
- package/dist/agents/templates/basic-analysis.json +40 -0
- package/dist/agents/templates/basic-review.json +48 -0
- package/dist/agents/templates/basic-trading.json +45 -0
- package/dist/agents/templates/indicator-developer.json +16 -0
- package/dist/agents/time-guidance.js +29 -0
- package/dist/agents/worker-events.js +18 -0
- package/dist/agents/worker-inbox.js +28 -0
- package/dist/agents/worker-triggers.js +23 -0
- package/dist/auth-options.js +98 -0
- package/dist/auth-user.js +15 -0
- package/dist/auth.js +28 -0
- package/dist/cache/svg-logo-cache.js +155 -0
- package/dist/canonical.js +13 -0
- package/dist/charts/chart-service.js +236 -0
- package/dist/charts/contracts.js +118 -0
- package/dist/charts/durable-extension.js +27 -0
- package/dist/charts/trading-contracts.js +14 -0
- package/dist/config.js +85 -0
- package/dist/db/agent-schema.js +26 -0
- package/dist/db/auth-schema.js +122 -0
- package/dist/db/database.js +31 -0
- package/dist/db/exchange-schema.js +23 -0
- package/dist/db/gateway-schema.js +24 -0
- package/dist/db/indicator-schema.js +19 -0
- package/dist/db/migrations/20261015221717_auth/migration.sql +62 -0
- package/dist/db/migrations/20261015231224_agents/migration.sql +35 -0
- package/dist/db/migrations/20261016040641_provider_connections/migration.sql +19 -0
- package/dist/db/migrations/20261016061831_trade_journal/migration.sql +48 -0
- package/dist/db/migrations/20261016080320_order_execution/migration.sql +62 -0
- package/dist/db/migrations/20261016181110_subagents/migration.sql +51 -0
- package/dist/db/migrations/20261017222959_research_artifacts/migration.sql +37 -0
- package/dist/db/migrations/20261018061531_memories_and_insights/migration.sql +162 -0
- package/dist/db/migrations/20261020091156_worker_event_inbox/migration.sql +54 -0
- package/dist/db/migrations/20261021051229_chart_workspace/migration.sql +33 -0
- package/dist/db/migrations/20261021222116_gateways/migration.sql +15 -0
- package/dist/db/migrations/20261022015813_pine_indicators/migration.sql +43 -0
- package/dist/db/migrations/20261022101559_notifications/migration.sql +51 -0
- package/dist/db/migrations.js +12 -0
- package/dist/db/order-provenance-schema.js +17 -0
- package/dist/db/order-schema.js +32 -0
- package/dist/db/profile-lock.js +12 -0
- package/dist/db/provider-schema.js +16 -0
- package/dist/db/shared-database.js +128 -0
- package/dist/db/subagent-schema.js +79 -0
- package/dist/gateway/bridge-service.js +223 -0
- package/dist/gateway/gateway-store.js +77 -0
- package/dist/gateway/handlers.js +122 -0
- package/dist/gateway/telegram/connector.js +115 -0
- package/dist/gateway/telegram/transport.js +96 -0
- package/dist/hyperliquid/account-info.js +117 -0
- package/dist/hyperliquid/account-status.js +64 -0
- package/dist/hyperliquid/agent-dashboard.js +56 -0
- package/dist/hyperliquid/chart-contracts.js +9 -0
- package/dist/hyperliquid/constants.js +25 -0
- package/dist/hyperliquid/crypto.js +29 -0
- package/dist/hyperliquid/currency-logo.js +7 -0
- package/dist/hyperliquid/decimal.js +98 -0
- package/dist/hyperliquid/durable-extension.js +39 -0
- package/dist/hyperliquid/errors.js +8 -0
- package/dist/hyperliquid/exchange.js +118 -0
- package/dist/hyperliquid/journal-decimal.js +48 -0
- package/dist/hyperliquid/journal-model.js +167 -0
- package/dist/hyperliquid/journal-service.js +648 -0
- package/dist/hyperliquid/live-dashboard.js +245 -0
- package/dist/hyperliquid/logo-cache.js +27 -0
- package/dist/hyperliquid/market-charts.js +242 -0
- package/dist/hyperliquid/market-snapshot.js +45 -0
- package/dist/hyperliquid/orders/order-contracts.js +42 -0
- package/dist/hyperliquid/orders/order-math.js +89 -0
- package/dist/hyperliquid/orders/order-outcomes.js +74 -0
- package/dist/hyperliquid/orders/order-prepare.js +109 -0
- package/dist/hyperliquid/orders/order-service.js +432 -0
- package/dist/hyperliquid/orders/order-store.js +134 -0
- package/dist/hyperliquid/orders/order-tools.js +40 -0
- package/dist/hyperliquid/orders/protection.js +35 -0
- package/dist/hyperliquid/orders/risk-settings.js +44 -0
- package/dist/hyperliquid/orders/trade-admission.js +117 -0
- package/dist/hyperliquid/orders/trade-planning.js +60 -0
- package/dist/hyperliquid/service.js +529 -0
- package/dist/hyperliquid/shared-feeds.js +40 -0
- package/dist/hyperliquid/signing.js +89 -0
- package/dist/indicators/builtin-catalog.js +59 -0
- package/dist/indicators/builtins/adx.pine +22 -0
- package/dist/indicators/builtins/atr.pine +11 -0
- package/dist/indicators/builtins/bollinger.pine +10 -0
- package/dist/indicators/builtins/ema.pine +5 -0
- package/dist/indicators/builtins/macd.pine +18 -0
- package/dist/indicators/builtins/rsi.pine +18 -0
- package/dist/indicators/builtins/sma.pine +5 -0
- package/dist/indicators/candle-window.js +36 -0
- package/dist/indicators/chart-contracts.js +64 -0
- package/dist/indicators/contracts.js +14 -0
- package/dist/indicators/durable-extension.js +32 -0
- package/dist/indicators/indicator-service.js +300 -0
- package/dist/indicators/indicator-store.js +137 -0
- package/dist/indicators/normalize.js +149 -0
- package/dist/indicators/result-schema.js +79 -0
- package/dist/indicators/runtime-wrapper.js +52 -0
- package/dist/indicators/runtime.js +201 -0
- package/dist/indicators/validation.js +124 -0
- package/dist/indicators/worker-queue.js +48 -0
- package/dist/initialize-config.js +160 -0
- package/dist/main.js +59 -0
- package/dist/memory/decision-audit.js +47 -0
- package/dist/memory/durable-extension.js +40 -0
- package/dist/memory/execution-audit.js +83 -0
- package/dist/memory/insight-contracts.js +33 -0
- package/dist/memory/insight-service.js +117 -0
- package/dist/memory/memory-contracts.js +113 -0
- package/dist/memory/memory-service.js +179 -0
- package/dist/memory/operations.js +46 -0
- package/dist/memory/tool-schemas.js +44 -0
- package/dist/memory/validation.js +42 -0
- package/dist/notifications/contracts.js +1 -0
- package/dist/notifications/delivery.js +11 -0
- package/dist/notifications/durable-extension.js +20 -0
- package/dist/notifications/notification-service.js +324 -0
- package/dist/providers/credential-store.js +86 -0
- package/dist/providers/ollama-cloud.js +148 -0
- package/dist/providers/provider-logo-url.js +18 -0
- package/dist/providers/provider-logo.js +31 -0
- package/dist/providers/provider-service.js +295 -0
- package/dist/research/artifacts.js +151 -0
- package/dist/research/call-queue.js +43 -0
- package/dist/research/contracts.js +37 -0
- package/dist/research/evidence.js +43 -0
- package/dist/research/journal.js +30 -0
- package/dist/research/research-service.js +191 -0
- package/dist/research/tool-activity.js +49 -0
- package/dist/research/tool-response.js +25 -0
- package/dist/runtime.js +145 -0
- package/dist/web/agent-events.js +418 -0
- package/dist/web/app.js +206 -0
- package/dist/web/artifact-downloads.js +23 -0
- package/dist/web/middleware.js +25 -0
- package/dist/web/random-uuid.js +14 -0
- package/dist/web/start.js +56 -0
- package/package.json +93 -3
- package/scripts/check-node.mjs +24 -0
- package/static/android-chrome-192x192.png +0 -0
- package/static/android-chrome-512x512.png +0 -0
- package/static/apple-touch-icon.png +0 -0
- package/static/favicon-16x16.png +0 -0
- package/static/favicon-32x32.png +0 -0
- package/static/favicon.ico +0 -0
- package/static/github.svg +3 -0
- package/static/hypervibes.png +0 -0
- package/static/logo.png +0 -0
- package/static/site.webmanifest +1 -0
- package/static/telegram.svg +1 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
//#region src/hyperliquid/decimal.ts
|
|
2
|
+
/**
|
|
3
|
+
* Minimal string-decimal helpers for display-only exchange amounts. Values
|
|
4
|
+
* arriving from Hyperliquid are kept as strings and combined with integer
|
|
5
|
+
* arithmetic; these are never used for signed amounts or order placement.
|
|
6
|
+
*/
|
|
7
|
+
/** Splits a plain decimal string like `-12.3400`; returns null when malformed. */
|
|
8
|
+
function parseDecimal(value) {
|
|
9
|
+
if (!/^-?\d+(?:\.\d+)?$/.test(value) || value.includes("e") || value.includes("E")) return null;
|
|
10
|
+
const negative = value.startsWith("-");
|
|
11
|
+
const unsigned = negative ? value.slice(1) : value;
|
|
12
|
+
const separator = unsigned.indexOf(".");
|
|
13
|
+
const whole = separator === -1 ? unsigned : unsigned.slice(0, separator);
|
|
14
|
+
const fraction = separator === -1 ? "" : unsigned.slice(separator + 1);
|
|
15
|
+
return {
|
|
16
|
+
negative,
|
|
17
|
+
whole: BigInt(whole),
|
|
18
|
+
fraction
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Scales two parsed decimals to a common denominator and returns the parts. */
|
|
22
|
+
function commonScale(left, right) {
|
|
23
|
+
const scale = Math.max(left.fraction.length, right.fraction.length);
|
|
24
|
+
const scaleUp = (part) => BigInt(part.negative ? -1 : 1) * (part.whole * 10n ** BigInt(scale) + BigInt(part.fraction.padEnd(scale, "0") || "0"));
|
|
25
|
+
return {
|
|
26
|
+
leftScaled: scaleUp(left),
|
|
27
|
+
rightScaled: scaleUp(right),
|
|
28
|
+
scale
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Adds two plain decimal strings; returns null when either is malformed. */
|
|
32
|
+
function addDecimals(left, right) {
|
|
33
|
+
const parsedLeft = parseDecimal(left);
|
|
34
|
+
const parsedRight = parseDecimal(right);
|
|
35
|
+
if (!parsedLeft || !parsedRight) return null;
|
|
36
|
+
const { leftScaled, rightScaled, scale } = commonScale(parsedLeft, parsedRight);
|
|
37
|
+
return formatScaled(leftScaled + rightScaled, scale);
|
|
38
|
+
}
|
|
39
|
+
function formatScaled(scaled, scale) {
|
|
40
|
+
const negative = scaled < 0n;
|
|
41
|
+
const absolute = negative ? -scaled : scaled;
|
|
42
|
+
const denominator = 10n ** BigInt(scale);
|
|
43
|
+
const whole = absolute / denominator;
|
|
44
|
+
const canonical = (absolute % denominator).toString().padStart(scale, "0").replace(/0+$/, "");
|
|
45
|
+
const body = canonical ? `${whole}.${canonical}` : `${whole}`;
|
|
46
|
+
return negative && absolute !== 0n ? `-${body}` : body;
|
|
47
|
+
}
|
|
48
|
+
/** Compares two plain decimal strings; null when either is malformed. */
|
|
49
|
+
function compareDecimals(left, right) {
|
|
50
|
+
const parsedLeft = parseDecimal(left);
|
|
51
|
+
const parsedRight = parseDecimal(right);
|
|
52
|
+
if (!parsedLeft || !parsedRight) return null;
|
|
53
|
+
const { leftScaled, rightScaled } = commonScale(parsedLeft, parsedRight);
|
|
54
|
+
return leftScaled === rightScaled ? 0 : leftScaled < rightScaled ? -1 : 1;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Formats a plain decimal string with fixed precision (4 places by default),
|
|
58
|
+
* half-up rounding, thousands separators and negatives in parentheses.
|
|
59
|
+
*/
|
|
60
|
+
function formatMoneyText(value, decimalPlaces = 4) {
|
|
61
|
+
if (!value) return "-";
|
|
62
|
+
const parsed = parseDecimal(value);
|
|
63
|
+
if (!parsed) return "-";
|
|
64
|
+
const guard = BigInt(decimalPlaces + 1);
|
|
65
|
+
const scale = 10n ** guard;
|
|
66
|
+
const rounded = (parsed.whole * scale + BigInt(parsed.fraction.padEnd(Number(guard), "0").slice(0, Number(guard)) || "0") + 5n) / 10n;
|
|
67
|
+
const denominator = 10n ** BigInt(decimalPlaces);
|
|
68
|
+
const whole = rounded / denominator;
|
|
69
|
+
const fraction = (rounded % denominator).toString().padStart(decimalPlaces, "0");
|
|
70
|
+
const formatted = `${whole.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}.${fraction}`;
|
|
71
|
+
return parsed.negative && rounded !== 0n ? `(${formatted})` : formatted;
|
|
72
|
+
}
|
|
73
|
+
/** Formats an exchange amount for display: exact fraction preserved (padded to
|
|
74
|
+
* at least 2 decimals), thousands separators on the whole part, and negatives in
|
|
75
|
+
* parentheses. Never rounds; prices and sizes are exchange-exact. */
|
|
76
|
+
function formatAmountText(value) {
|
|
77
|
+
if (!value) return "-";
|
|
78
|
+
const parsed = parseDecimal(value);
|
|
79
|
+
if (!parsed) return "-";
|
|
80
|
+
const fraction = parsed.fraction.length < 2 ? parsed.fraction.padEnd(2, "0") : parsed.fraction;
|
|
81
|
+
const body = `${parsed.whole.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}.${fraction}`;
|
|
82
|
+
return parsed.negative ? `(${body})` : body;
|
|
83
|
+
}
|
|
84
|
+
/** Splits formatted money into the whole part and optional decimals. */
|
|
85
|
+
function moneyParts(value) {
|
|
86
|
+
if (!value) return {
|
|
87
|
+
whole: "-",
|
|
88
|
+
decimals: null
|
|
89
|
+
};
|
|
90
|
+
const separator = value.indexOf(".");
|
|
91
|
+
return {
|
|
92
|
+
whole: separator === -1 ? value : value.slice(0, separator),
|
|
93
|
+
decimals: separator === -1 ? null : value.slice(separator + 1)
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { moneyParts as a, formatMoneyText as i, compareDecimals as n, formatAmountText as r, addDecimals as t };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
//#region node_modules/.pnpm/@tanstack+start-server-core@1.169.43/node_modules/@tanstack/start-server-core/dist/esm/empty-plugin-adapters.js
|
|
2
|
+
var pluginSerializationAdapters = [];
|
|
3
|
+
var hasPluginAdapters = false;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { hasPluginAdapters, pluginSerializationAdapters };
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
//#region src/agents/agent-input.ts
|
|
2
|
+
var uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
|
+
var agentErrorBrand = Symbol.for("hypervibes.AgentError");
|
|
4
|
+
var AgentError = class extends Error {
|
|
5
|
+
status;
|
|
6
|
+
[agentErrorBrand] = true;
|
|
7
|
+
constructor(message, status = 400) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.status = status;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/** Fastify and Vite SSR load separate copies of this module in development. */
|
|
13
|
+
function isAgentError(error) {
|
|
14
|
+
return error instanceof Error && Reflect.get(error, agentErrorBrand) === true;
|
|
15
|
+
}
|
|
16
|
+
function requestId(value) {
|
|
17
|
+
if (!uuid.test(value) || value.trim() !== value) throw new AgentError("A valid request ID is required");
|
|
18
|
+
return value.toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/indicators/contracts.ts
|
|
22
|
+
var indicatorLimits = {
|
|
23
|
+
sourceBytes: 64 * 1024,
|
|
24
|
+
inputs: 32,
|
|
25
|
+
numericOutputs: 32,
|
|
26
|
+
markerOutputs: 32,
|
|
27
|
+
markerEvents: 1e4,
|
|
28
|
+
drawings: 500,
|
|
29
|
+
candles: 5e3,
|
|
30
|
+
chartInstances: 10,
|
|
31
|
+
memoryLimitBytes: 128 * 1024 * 1024,
|
|
32
|
+
timeoutMs: 15e3,
|
|
33
|
+
maxLoops: 1e4,
|
|
34
|
+
workers: 8,
|
|
35
|
+
queuedCalls: 64,
|
|
36
|
+
resultBytes: 8 * 1024 * 1024,
|
|
37
|
+
inlineBytes: 24 * 1024,
|
|
38
|
+
count: 1,
|
|
39
|
+
maxCount: 5e3,
|
|
40
|
+
inlineCount: 500,
|
|
41
|
+
markerLimit: 20,
|
|
42
|
+
maxMarkerLimit: 100,
|
|
43
|
+
warnings: 64,
|
|
44
|
+
listLimit: 20,
|
|
45
|
+
maxListLimit: 50,
|
|
46
|
+
cacheEntries: 64,
|
|
47
|
+
cacheBytes: 64 * 1024 * 1024,
|
|
48
|
+
cacheTtlMs: 3e4,
|
|
49
|
+
customPerAgent: 100,
|
|
50
|
+
versions: 200
|
|
51
|
+
};
|
|
52
|
+
var builtinIndicatorNames = [
|
|
53
|
+
"sma",
|
|
54
|
+
"ema",
|
|
55
|
+
"rsi",
|
|
56
|
+
"macd",
|
|
57
|
+
"bollinger",
|
|
58
|
+
"atr",
|
|
59
|
+
"adx"
|
|
60
|
+
];
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region src/indicators/validation.ts
|
|
63
|
+
var IndicatorError = class extends Error {
|
|
64
|
+
status;
|
|
65
|
+
code;
|
|
66
|
+
constructor(message, status = 400, code = "indicator_invalid") {
|
|
67
|
+
super(message);
|
|
68
|
+
this.status = status;
|
|
69
|
+
this.code = code;
|
|
70
|
+
this.name = "IndicatorError";
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
function parseIndicatorId(value) {
|
|
74
|
+
if (typeof value !== "string") throw new IndicatorError("Invalid indicator ID");
|
|
75
|
+
if (value.startsWith("builtin:")) {
|
|
76
|
+
const name = builtinIndicatorNames.find((name) => value === `builtin:${name}`);
|
|
77
|
+
if (name) return {
|
|
78
|
+
kind: "builtin",
|
|
79
|
+
name
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (/^custom:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)) return {
|
|
83
|
+
kind: "custom",
|
|
84
|
+
uuid: value.slice(7).toLowerCase()
|
|
85
|
+
};
|
|
86
|
+
throw new IndicatorError("Invalid indicator ID");
|
|
87
|
+
}
|
|
88
|
+
function safeInputKey(key) {
|
|
89
|
+
return ![
|
|
90
|
+
"__proto__",
|
|
91
|
+
"constructor",
|
|
92
|
+
"prototype"
|
|
93
|
+
].includes(key);
|
|
94
|
+
}
|
|
95
|
+
function scalarInput(value) {
|
|
96
|
+
return typeof value === "boolean" || typeof value === "string" || typeof value === "number" && Number.isFinite(value);
|
|
97
|
+
}
|
|
98
|
+
function validateInputs(value) {
|
|
99
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) throw new IndicatorError("Inputs must be a scalar-valued object");
|
|
100
|
+
const entries = Object.entries(value);
|
|
101
|
+
if (entries.length > indicatorLimits.inputs) throw new IndicatorError("Too many indicator inputs");
|
|
102
|
+
for (const [key, item] of entries) if (!safeInputKey(key) || !scalarInput(item)) throw new IndicatorError(`Invalid input: ${key}`);
|
|
103
|
+
return Object.fromEntries(entries);
|
|
104
|
+
}
|
|
105
|
+
/** Remove strings and comments while retaining newlines and token separation. Not a Pine parser. */
|
|
106
|
+
function pineCodeTokens(source) {
|
|
107
|
+
let result = "", quote = "", comment = false;
|
|
108
|
+
for (let i = 0; i < source.length; i++) {
|
|
109
|
+
const char = source[i];
|
|
110
|
+
if (comment) if (char === "\n") {
|
|
111
|
+
comment = false;
|
|
112
|
+
result += "\n";
|
|
113
|
+
} else result += " ";
|
|
114
|
+
else if (quote) if (char === "\\") {
|
|
115
|
+
result += " ";
|
|
116
|
+
i++;
|
|
117
|
+
} else {
|
|
118
|
+
if (char === quote) quote = "";
|
|
119
|
+
result += char === "\n" ? "\n" : " ";
|
|
120
|
+
}
|
|
121
|
+
else if (char === "\"" || char === "'") {
|
|
122
|
+
quote = char;
|
|
123
|
+
result += " ";
|
|
124
|
+
} else if (char === "/" && source[i + 1] === "/") {
|
|
125
|
+
comment = true;
|
|
126
|
+
result += " ";
|
|
127
|
+
i++;
|
|
128
|
+
} else result += char;
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
function validateSource(source, maxBytes = indicatorLimits.sourceBytes) {
|
|
133
|
+
if (typeof source !== "string" || new TextEncoder().encode(source).length > maxBytes) throw new IndicatorError(`Pine source exceeds ${maxBytes} bytes`);
|
|
134
|
+
if (!source.split(/\r?\n/).some((line, index, lines) => /^\s*\/\/@version=[56]\s*$/.test(line) && pineCodeTokens(lines.slice(0, index).join("\n")).trim() === "")) throw new IndicatorError("Native PineScript //@version=5 or //@version=6 is required");
|
|
135
|
+
const tokens = pineCodeTokens(source);
|
|
136
|
+
if (/\brequest\s*\./.test(tokens)) throw new IndicatorError("request.* data requests are not supported");
|
|
137
|
+
if (/\b(strategy|library)\s*\(/.test(tokens) || /^\s*import\b/m.test(tokens)) throw new IndicatorError("Strategies and imported Pine libraries are not supported");
|
|
138
|
+
if (!/\bindicator\s*\(/.test(tokens)) throw new IndicatorError("An indicator() declaration is required");
|
|
139
|
+
}
|
|
140
|
+
//#endregion
|
|
141
|
+
//#region src/hyperliquid/errors.ts
|
|
142
|
+
/** Public exchange errors surfaced to users with their HTTP status. Browser-safe. */
|
|
143
|
+
var HyperliquidError = class extends Error {
|
|
144
|
+
status;
|
|
145
|
+
constructor(message, status = 400) {
|
|
146
|
+
super(message);
|
|
147
|
+
this.status = status;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
//#endregion
|
|
151
|
+
export { validateSource as a, requestId as c, validateInputs as i, IndicatorError as n, AgentError as o, parseIndicatorId as r, isAgentError as s, HyperliquidError as t };
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { a as getRequestHeaders, t as createServerFn } from "../server.js";
|
|
2
|
+
import { n as agentUser, t as agentOperation, u as field } from "./agents-CZq-0mna.js";
|
|
3
|
+
import { o as AgentError } from "./errors-DaZqUftX.js";
|
|
4
|
+
import { n as hvUsers } from "./auth-user-DkLo8ojH.js";
|
|
5
|
+
import { t as createServerRpc } from "./createServerRpc-DNqhdU4z.js";
|
|
6
|
+
import { and, eq, sql } from "drizzle-orm";
|
|
7
|
+
import { blob, check, index, integer, primaryKey, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
|
|
8
|
+
import { Bot } from "grammy";
|
|
9
|
+
import { createCipheriv, createHash, randomBytes } from "node:crypto";
|
|
10
|
+
//#region src/gateway/telegram/transport.ts
|
|
11
|
+
/** Validates a bot token with Telegram and returns the bot's own username. */
|
|
12
|
+
async function fetchBotUsername(token) {
|
|
13
|
+
const bot = new Bot(token);
|
|
14
|
+
await bot.init();
|
|
15
|
+
return bot.botInfo.username;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/db/agent-schema.ts
|
|
19
|
+
var hvAgents = sqliteTable("hv_agents", {
|
|
20
|
+
id: text("id").primaryKey(),
|
|
21
|
+
userId: text("user_id").notNull().references(() => hvUsers.id, { onDelete: "restrict" }),
|
|
22
|
+
name: text("name").notNull(),
|
|
23
|
+
creationRequestId: text("creation_request_id").notNull(),
|
|
24
|
+
state: text("state", { enum: [
|
|
25
|
+
"provisioning",
|
|
26
|
+
"ready",
|
|
27
|
+
"failed",
|
|
28
|
+
"stopping",
|
|
29
|
+
"stopped"
|
|
30
|
+
] }).notNull().default("provisioning"),
|
|
31
|
+
enabled: integer("enabled", { mode: "boolean" }).notNull().default(true),
|
|
32
|
+
conversationId: integer("conversation_id"),
|
|
33
|
+
/** Creation intent only; current selection is owned by Durable's pi.agent. */
|
|
34
|
+
initialProvider: text("initial_provider"),
|
|
35
|
+
initialModelId: text("initial_model_id"),
|
|
36
|
+
error: text("error"),
|
|
37
|
+
/** Required for new agents by AgentService; nullable only for legacy development rows. */
|
|
38
|
+
tradingAccountAddress: text("trading_account_address"),
|
|
39
|
+
createdAt: integer("created_at").notNull(),
|
|
40
|
+
updatedAt: integer("updated_at").notNull()
|
|
41
|
+
}, (table) => [
|
|
42
|
+
index("hv_agents_owner_idx").on(table.userId),
|
|
43
|
+
uniqueIndex("hv_agents_creation_request_idx").on(table.userId, table.creationRequestId),
|
|
44
|
+
uniqueIndex("hv_agents_trading_account_idx").on(table.tradingAccountAddress),
|
|
45
|
+
check("hv_agents_name_check", sql`length(trim(${table.name})) BETWEEN 1 AND 80`),
|
|
46
|
+
check("hv_agents_state_check", sql`${table.state} IN ('provisioning', 'ready', 'failed', 'stopping', 'stopped')`)
|
|
47
|
+
]);
|
|
48
|
+
/** One external gateway per Agent and type: bridges a bound chat with the Agent's persistent main conversation. */
|
|
49
|
+
var hvGateways = sqliteTable("hv_gateways", {
|
|
50
|
+
agentId: text("agent_id").notNull().references(() => hvAgents.id, { onDelete: "cascade" }),
|
|
51
|
+
type: text("type", { enum: ["telegram"] }).notNull(),
|
|
52
|
+
/** AES-256-GCM sealed bot token; never rendered, logged, or returned to clients. */
|
|
53
|
+
botTokenCiphertext: blob("bot_token_ciphertext", { mode: "buffer" }).notNull(),
|
|
54
|
+
/** SHA-256 of the plaintext token; a unique index stops two Agents sharing one bot. */
|
|
55
|
+
botTokenHash: text("bot_token_hash").notNull(),
|
|
56
|
+
/** Encryption key id that sealed the token, for future key rotation. */
|
|
57
|
+
keyId: text("key_id").notNull(),
|
|
58
|
+
/** The bot's own username on the gateway platform. */
|
|
59
|
+
botUsername: text("bot_username").notNull(),
|
|
60
|
+
/** The external chat that completed the link flow; null until linked. */
|
|
61
|
+
chatId: integer("chat_id"),
|
|
62
|
+
chatUsername: text("chat_username"),
|
|
63
|
+
updatedAt: integer("updated_at").notNull()
|
|
64
|
+
}, (table) => [primaryKey({ columns: [table.agentId, table.type] }), uniqueIndex("hv_gateways_token_hash_idx").on(table.botTokenHash)]);
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/hyperliquid/crypto.ts
|
|
67
|
+
var NONCE_LENGTH = 12;
|
|
68
|
+
/** Encrypts a secret with AES-256-GCM: `nonce ‖ ciphertext ‖ tag`. */
|
|
69
|
+
function encryptSecret(key, plaintext) {
|
|
70
|
+
const nonce = randomBytes(NONCE_LENGTH);
|
|
71
|
+
const cipher = createCipheriv("aes-256-gcm", key.bytes, nonce);
|
|
72
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
|
|
73
|
+
return new Uint8Array(Buffer.concat([
|
|
74
|
+
nonce,
|
|
75
|
+
ciphertext,
|
|
76
|
+
cipher.getAuthTag()
|
|
77
|
+
]));
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/gateway/gateway-store.ts
|
|
81
|
+
/** Deterministic token fingerprint backing the cross-Agent uniqueness constraint. */
|
|
82
|
+
function hashBotToken(token) {
|
|
83
|
+
return createHash("sha256").update(token).digest("hex");
|
|
84
|
+
}
|
|
85
|
+
async function getGateway(db, agentId, type) {
|
|
86
|
+
return db.select().from(hvGateways).where(and(eq(hvGateways.agentId, agentId), eq(hvGateways.type, type))).get();
|
|
87
|
+
}
|
|
88
|
+
function uniqueTokenViolation(error) {
|
|
89
|
+
let current = error;
|
|
90
|
+
for (let depth = 0; current !== null && typeof current === "object" && depth < 5; depth++) {
|
|
91
|
+
const message = current.message;
|
|
92
|
+
if (typeof message === "string" && message.includes("UNIQUE constraint failed") && message.includes("bot_token_hash")) return true;
|
|
93
|
+
current = current.cause;
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
/** Stores a newly validated bot token; the token hash stops two Agents sharing one bot. */
|
|
98
|
+
async function saveGatewayToken(db, key, agentId, type, token, botUsername) {
|
|
99
|
+
const values = {
|
|
100
|
+
botTokenCiphertext: Buffer.from(encryptSecret(key, token)),
|
|
101
|
+
botTokenHash: hashBotToken(token),
|
|
102
|
+
keyId: key.id,
|
|
103
|
+
botUsername,
|
|
104
|
+
updatedAt: Date.now()
|
|
105
|
+
};
|
|
106
|
+
try {
|
|
107
|
+
await db.insert(hvGateways).values({
|
|
108
|
+
agentId,
|
|
109
|
+
type,
|
|
110
|
+
...values
|
|
111
|
+
}).run();
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (uniqueTokenViolation(error)) throw new AgentError("This bot is already linked to another Agent.", 409);
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Removes the bot token and binding; false when no gateway row exists. */
|
|
118
|
+
async function deleteGateway(db, agentId, type) {
|
|
119
|
+
if (!await getGateway(db, agentId, type)) return false;
|
|
120
|
+
await db.delete(hvGateways).where(and(eq(hvGateways.agentId, agentId), eq(hvGateways.type, type))).run();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region src/web/gateway.ts?tss-serverfn-split
|
|
125
|
+
/** All server functions target the Telegram gateway, the platform this application currently bridges. */
|
|
126
|
+
var type = "telegram";
|
|
127
|
+
var getGatewayStatus_createServerFn_handler = createServerRpc({
|
|
128
|
+
id: "10661faaa1aeb1008f42fd9e7c0c674563b5197ac9e18a45aad0d6ab25b3d377",
|
|
129
|
+
name: "getGatewayStatus",
|
|
130
|
+
filename: "src/web/gateway.ts"
|
|
131
|
+
}, (opts) => getGatewayStatus.__executeServer(opts));
|
|
132
|
+
var getGatewayStatus = createServerFn({ method: "GET" }).validator((data) => ({ id: field(data, "id") })).handler(getGatewayStatus_createServerFn_handler, async ({ context, data }) => {
|
|
133
|
+
const user = await agentUser(context.runtime, getRequestHeaders());
|
|
134
|
+
return agentOperation(async () => {
|
|
135
|
+
await context.runtime.agents.owned(user.id, data.id, true);
|
|
136
|
+
return context.runtime.gateway.status(data.id);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
var addGatewayToken_createServerFn_handler = createServerRpc({
|
|
140
|
+
id: "ba07ed3fec3c970af3b44bb80f0d77498a44614f7d8c9e5d7ff3ac99857980ce",
|
|
141
|
+
name: "addGatewayToken",
|
|
142
|
+
filename: "src/web/gateway.ts"
|
|
143
|
+
}, (opts) => addGatewayToken.__executeServer(opts));
|
|
144
|
+
var addGatewayToken = createServerFn({ method: "POST" }).validator((data) => ({
|
|
145
|
+
id: field(data, "id"),
|
|
146
|
+
token: field(data, "token")
|
|
147
|
+
})).handler(addGatewayToken_createServerFn_handler, async ({ context, data }) => {
|
|
148
|
+
const user = await agentUser(context.runtime, getRequestHeaders(), true);
|
|
149
|
+
return agentOperation(async () => {
|
|
150
|
+
await context.runtime.agents.owned(user.id, data.id);
|
|
151
|
+
const key = context.runtime.gateway.requireKey();
|
|
152
|
+
if (await getGateway(context.runtime.db, data.id, type)) throw new AgentError("Disconnect the existing Telegram bot before adding a new one.", 409);
|
|
153
|
+
const token = data.token.trim();
|
|
154
|
+
if (!token) throw new AgentError("Enter the bot token from @BotFather.");
|
|
155
|
+
let botUsername;
|
|
156
|
+
try {
|
|
157
|
+
botUsername = await fetchBotUsername(token);
|
|
158
|
+
} catch {
|
|
159
|
+
throw new AgentError("Telegram rejected this bot token. Check the token from @BotFather.");
|
|
160
|
+
}
|
|
161
|
+
await saveGatewayToken(context.runtime.db, key, data.id, type, token, botUsername);
|
|
162
|
+
await context.runtime.gateway.ensure(data.id);
|
|
163
|
+
return context.runtime.gateway.status(data.id);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
var startGatewayLink_createServerFn_handler = createServerRpc({
|
|
167
|
+
id: "cbcd092ab76fa6a883f83394a7e8dd9f7d59dfd7e2a95fd9e145e6ca94fe911b",
|
|
168
|
+
name: "startGatewayLink",
|
|
169
|
+
filename: "src/web/gateway.ts"
|
|
170
|
+
}, (opts) => startGatewayLink.__executeServer(opts));
|
|
171
|
+
var startGatewayLink = createServerFn({ method: "POST" }).validator((data) => ({ id: field(data, "id") })).handler(startGatewayLink_createServerFn_handler, async ({ context, data }) => {
|
|
172
|
+
const user = await agentUser(context.runtime, getRequestHeaders(), true);
|
|
173
|
+
return agentOperation(async () => {
|
|
174
|
+
await context.runtime.agents.owned(user.id, data.id);
|
|
175
|
+
return { link: await context.runtime.gateway.startLink(data.id, user.id) };
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
var disconnectGateway_createServerFn_handler = createServerRpc({
|
|
179
|
+
id: "c8ba021d32d5410053f8132e1123b6615d966c77f6f250cb706f2f6a6c16a92f",
|
|
180
|
+
name: "disconnectGateway",
|
|
181
|
+
filename: "src/web/gateway.ts"
|
|
182
|
+
}, (opts) => disconnectGateway.__executeServer(opts));
|
|
183
|
+
var disconnectGateway = createServerFn({ method: "POST" }).validator((data) => ({ id: field(data, "id") })).handler(disconnectGateway_createServerFn_handler, async ({ context, data }) => {
|
|
184
|
+
const user = await agentUser(context.runtime, getRequestHeaders(), true);
|
|
185
|
+
return agentOperation(async () => {
|
|
186
|
+
await context.runtime.agents.owned(user.id, data.id);
|
|
187
|
+
await deleteGateway(context.runtime.db, data.id, type);
|
|
188
|
+
await context.runtime.gateway.removed(data.id);
|
|
189
|
+
return context.runtime.gateway.status(data.id);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//#endregion
|
|
193
|
+
export { addGatewayToken_createServerFn_handler, disconnectGateway_createServerFn_handler, getGatewayStatus_createServerFn_handler, startGatewayLink_createServerFn_handler };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
//#region src/components/identicon.tsx
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic 8×8 identicon for a wallet address, as an SVG data URI.
|
|
5
|
+
* Port of the legacy application's `identicon_data_uri` so existing users keep
|
|
6
|
+
* the same identicon for their address.
|
|
7
|
+
*/
|
|
8
|
+
function identiconDataUri(address) {
|
|
9
|
+
let seed = 0;
|
|
10
|
+
for (let index = 0; index < address.length; index++) seed = seed * 32 - seed + address.charCodeAt(index) >>> 0;
|
|
11
|
+
const random = () => {
|
|
12
|
+
seed = (seed * 9301 + 49297) % 233280;
|
|
13
|
+
return seed / 233280;
|
|
14
|
+
};
|
|
15
|
+
const color = () => `hsl(${Math.floor(random() * 360)} ${Math.floor(random() * 60 + 40)}% ${Math.floor((random() + random() + random() + random()) * 25)}%)`;
|
|
16
|
+
const foreground = color();
|
|
17
|
+
const background = color();
|
|
18
|
+
const spot = color();
|
|
19
|
+
let squares = "";
|
|
20
|
+
for (let row = 0; row < 8; row++) {
|
|
21
|
+
const values = [
|
|
22
|
+
0,
|
|
23
|
+
1,
|
|
24
|
+
2,
|
|
25
|
+
3
|
|
26
|
+
].map(() => Math.floor(random() * 2.3));
|
|
27
|
+
values.push(values[3] ?? 0, values[2] ?? 0, values[1] ?? 0, values[0] ?? 0);
|
|
28
|
+
for (const [column, value] of values.entries()) if (value !== 0) squares += `<rect x="${column}" y="${row}" width="1" height="1" fill="${value === 1 ? foreground : spot}"/>`;
|
|
29
|
+
}
|
|
30
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 8"><rect width="8" height="8" fill="${background}"/>${squares}</svg>`;
|
|
31
|
+
return `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
|
32
|
+
}
|
|
33
|
+
function Identicon({ address, className }) {
|
|
34
|
+
return /* @__PURE__ */ jsx("img", {
|
|
35
|
+
src: identiconDataUri(address),
|
|
36
|
+
alt: "",
|
|
37
|
+
className
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { Identicon as t };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { r as configInput } from "./config-dialog-9gSAjwwT.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/indicator-input-fields.tsx
|
|
4
|
+
function IndicatorInputFields({ schema, value, onChange, disabled = false }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("fieldset", {
|
|
6
|
+
disabled,
|
|
7
|
+
className: "space-y-3",
|
|
8
|
+
children: schema.map((input) => {
|
|
9
|
+
const actual = Object.hasOwn(value, input.key) ? value[input.key] : input.default;
|
|
10
|
+
const change = (item) => onChange({
|
|
11
|
+
...value,
|
|
12
|
+
[input.key]: item
|
|
13
|
+
});
|
|
14
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
15
|
+
className: "space-y-1 text-sm",
|
|
16
|
+
children: [
|
|
17
|
+
/* @__PURE__ */ jsxs("label", {
|
|
18
|
+
className: "block",
|
|
19
|
+
children: [
|
|
20
|
+
input.title,
|
|
21
|
+
" ",
|
|
22
|
+
/* @__PURE__ */ jsxs("span", {
|
|
23
|
+
className: "text-xs text-zinc-500",
|
|
24
|
+
children: [
|
|
25
|
+
"(",
|
|
26
|
+
input.key,
|
|
27
|
+
"; default ",
|
|
28
|
+
String(input.default),
|
|
29
|
+
")"
|
|
30
|
+
]
|
|
31
|
+
}),
|
|
32
|
+
input.options ? /* @__PURE__ */ jsx("select", {
|
|
33
|
+
className: `${configInput} cursor-pointer`,
|
|
34
|
+
value: String(actual),
|
|
35
|
+
onChange: (e) => change(input.options.find((v) => String(v) === e.target.value)),
|
|
36
|
+
children: input.options.map((option) => /* @__PURE__ */ jsx("option", {
|
|
37
|
+
value: String(option),
|
|
38
|
+
children: String(option)
|
|
39
|
+
}, String(option)))
|
|
40
|
+
}) : input.type === "bool" ? /* @__PURE__ */ jsx("input", {
|
|
41
|
+
className: "ml-2 cursor-pointer",
|
|
42
|
+
type: "checkbox",
|
|
43
|
+
checked: actual === true,
|
|
44
|
+
onChange: (e) => change(e.target.checked)
|
|
45
|
+
}) : /* @__PURE__ */ jsx("input", {
|
|
46
|
+
className: configInput,
|
|
47
|
+
type: input.type === "int" || input.type === "float" ? "number" : "text",
|
|
48
|
+
value: String(actual),
|
|
49
|
+
min: input.min,
|
|
50
|
+
max: input.max,
|
|
51
|
+
step: input.step ?? (input.type === "int" ? 1 : "any"),
|
|
52
|
+
onChange: (e) => {
|
|
53
|
+
const next = input.type === "int" || input.type === "float" ? Number(e.target.value) : e.target.value;
|
|
54
|
+
change(next);
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
}),
|
|
59
|
+
input.tooltip && /* @__PURE__ */ jsx("p", {
|
|
60
|
+
className: "text-xs text-zinc-400",
|
|
61
|
+
children: input.tooltip
|
|
62
|
+
}),
|
|
63
|
+
Object.hasOwn(value, input.key) && /* @__PURE__ */ jsx("button", {
|
|
64
|
+
type: "button",
|
|
65
|
+
className: "cursor-pointer text-xs underline",
|
|
66
|
+
onClick: () => onChange(Object.fromEntries(Object.entries(value).filter(([key]) => key !== input.key))),
|
|
67
|
+
children: "Use source default"
|
|
68
|
+
})
|
|
69
|
+
]
|
|
70
|
+
}, input.key);
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { IndicatorInputFields as t };
|