@oracle-agent/oracle 0.10.0 → 0.12.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/LICENSE +115 -201
- package/README.md +82 -91
- package/SECURITY.md +37 -12
- package/SETUP.md +207 -272
- package/dist/action-receipts.mjs +1 -0
- package/dist/action-semantics.mjs +1 -0
- package/dist/address-book.mjs +2 -0
- package/dist/bin/desk-server.mjs +14 -0
- package/dist/bin/oracle-data-mcp.mjs +8 -0
- package/dist/bin/oracle-init.mjs +24 -0
- package/dist/bin/oracle-public-server.mjs +5 -0
- package/dist/bin/oracle-route.mjs +22 -0
- package/dist/bin/oracle-scan.mjs +18 -0
- package/dist/bin/oracle-upgrade.mjs +21 -0
- package/dist/bin/oracle.mjs +68 -0
- package/dist/chains.mjs +1 -0
- package/dist/cli/commands/auth.mjs +16 -0
- package/dist/cli/commands/bootstrap.mjs +18 -0
- package/dist/cli/commands/chain.mjs +21 -0
- package/dist/cli/commands/chat.mjs +35 -0
- package/dist/cli/commands/credential.mjs +1 -0
- package/dist/cli/commands/data-mcp.mjs +2 -0
- package/dist/cli/commands/data.mjs +12 -0
- package/dist/cli/commands/doctor.mjs +5 -0
- package/dist/cli/commands/gate.mjs +13 -0
- package/dist/cli/commands/help.mjs +1 -0
- package/dist/cli/commands/init.mjs +3 -0
- package/dist/cli/commands/mcp.mjs +33 -0
- package/dist/cli/commands/model.mjs +44 -0
- package/dist/cli/commands/prepare.mjs +2 -0
- package/dist/cli/commands/public.mjs +3 -0
- package/dist/cli/commands/route.mjs +2 -0
- package/dist/cli/commands/runner.mjs +1 -0
- package/dist/cli/commands/scan.mjs +2 -0
- package/dist/cli/commands/setup.mjs +34 -0
- package/dist/cli/commands/sign.mjs +4 -0
- package/dist/cli/commands/signer.mjs +1 -0
- package/dist/cli/commands/upgrade.mjs +2 -0
- package/dist/cli/commands/vault.mjs +1 -0
- package/dist/cli/commands/version.mjs +2 -0
- package/dist/data/desk-data.mjs +12 -0
- package/dist/index.mjs +17 -0
- package/dist/nft-gas-war-guard.mjs +1 -0
- package/dist/onboarding/harness-configs.mjs +4 -0
- package/dist/portfolio-risk.mjs +1 -0
- package/dist/prepare-envelope.mjs +1 -0
- package/dist/public-control/policy-schema.mjs +1 -0
- package/dist/router/index.mjs +2 -0
- package/dist/scanner/index.mjs +4 -0
- package/dist/signals/index.mjs +1 -0
- package/dist/watch-preferences.mjs +1 -0
- package/package.json +27 -65
- package/public/oracle-splash/assets/cli-chain-hyperliquid.jpg +0 -0
- package/public/oracle-splash/brand/aave.webp +0 -0
- package/public/oracle-splash/brand/aavev2.webp +0 -0
- package/public/oracle-splash/brand/aborean.webp +0 -0
- package/public/oracle-splash/brand/across.webp +0 -0
- package/public/oracle-splash/brand/aerodrome.webp +0 -0
- package/public/oracle-splash/brand/afi.webp +0 -0
- package/public/oracle-splash/brand/arcus.webp +0 -0
- package/public/oracle-splash/brand/aster.webp +0 -0
- package/public/oracle-splash/brand/avant.webp +0 -0
- package/public/oracle-splash/brand/balancer.webp +0 -0
- package/public/oracle-splash/brand/beefy.webp +0 -0
- package/public/oracle-splash/brand/benqi.webp +0 -0
- package/public/oracle-splash/brand/bestinslot.ico +0 -0
- package/public/oracle-splash/brand/bitfi.webp +0 -0
- package/public/oracle-splash/brand/bonkswap.webp +0 -0
- package/public/oracle-splash/brand/bouncebit.webp +0 -0
- package/public/oracle-splash/brand/camelot.webp +0 -0
- package/public/oracle-splash/brand/compound.webp +0 -0
- package/public/oracle-splash/brand/concrete.webp +0 -0
- package/public/oracle-splash/brand/cow.webp +0 -0
- package/public/oracle-splash/brand/curve.webp +0 -0
- package/public/oracle-splash/brand/derive.webp +0 -0
- package/public/oracle-splash/brand/dolomite.webp +0 -0
- package/public/oracle-splash/brand/eigenlayer.webp +0 -0
- package/public/oracle-splash/brand/ekubo.webp +0 -0
- package/public/oracle-splash/brand/ethena.webp +0 -0
- package/public/oracle-splash/brand/etherfi.webp +0 -0
- package/public/oracle-splash/brand/etherfiborrow.webp +0 -0
- package/public/oracle-splash/brand/felix.webp +0 -0
- package/public/oracle-splash/brand/fluid.webp +0 -0
- package/public/oracle-splash/brand/fluxbeam.webp +0 -0
- package/public/oracle-splash/brand/folks.webp +0 -0
- package/public/oracle-splash/brand/fortyacres.webp +0 -0
- package/public/oracle-splash/brand/gainsnetwork.webp +0 -0
- package/public/oracle-splash/brand/gassss.webp +0 -0
- package/public/oracle-splash/brand/gmx.webp +0 -0
- package/public/oracle-splash/brand/harmonix.webp +0 -0
- package/public/oracle-splash/brand/hlorderbook.webp +0 -0
- package/public/oracle-splash/brand/hlp.webp +0 -0
- package/public/oracle-splash/brand/hop.webp +0 -0
- package/public/oracle-splash/brand/hyperbeat.webp +0 -0
- package/public/oracle-splash/brand/hyperlend.webp +0 -0
- package/public/oracle-splash/brand/hyperliquid.webp +0 -0
- package/public/oracle-splash/brand/hyperliquidhpl.webp +0 -0
- package/public/oracle-splash/brand/hyperliquidspot.webp +0 -0
- package/public/oracle-splash/brand/hyperswap.webp +0 -0
- package/public/oracle-splash/brand/hypha.webp +0 -0
- package/public/oracle-splash/brand/joedex.webp +0 -0
- package/public/oracle-splash/brand/jupiter.webp +0 -0
- package/public/oracle-splash/brand/kelp.webp +0 -0
- package/public/oracle-splash/brand/kinetiq.webp +0 -0
- package/public/oracle-splash/brand/kmhype.webp +0 -0
- package/public/oracle-splash/brand/kona.webp +0 -0
- package/public/oracle-splash/brand/konalend.webp +0 -0
- package/public/oracle-splash/brand/lfj.webp +0 -0
- package/public/oracle-splash/brand/lido.webp +0 -0
- package/public/oracle-splash/brand/lifi.webp +0 -0
- package/public/oracle-splash/brand/lighter.webp +0 -0
- package/public/oracle-splash/brand/lista.webp +0 -0
- package/public/oracle-splash/brand/loopedhype.webp +0 -0
- package/public/oracle-splash/brand/lorenzo.webp +0 -0
- package/public/oracle-splash/brand/magic-eden.webp +0 -0
- package/public/oracle-splash/brand/magiceden.webp +0 -0
- package/public/oracle-splash/brand/mempool.png +0 -0
- package/public/oracle-splash/brand/meteora.webp +0 -0
- package/public/oracle-splash/brand/morpho.webp +0 -0
- package/public/oracle-splash/brand/myriad.webp +0 -0
- package/public/oracle-splash/brand/noxa.webp +0 -0
- package/public/oracle-splash/brand/odos.webp +0 -0
- package/public/oracle-splash/brand/oneinch.webp +0 -0
- package/public/oracle-splash/brand/openbook.webp +0 -0
- package/public/oracle-splash/brand/opensea.webp +0 -0
- package/public/oracle-splash/brand/orca.webp +0 -0
- package/public/oracle-splash/brand/ordinals.png +0 -0
- package/public/oracle-splash/brand/ostium.webp +0 -0
- package/public/oracle-splash/brand/pancakeswap.webp +0 -0
- package/public/oracle-splash/brand/pendle.webp +0 -0
- package/public/oracle-splash/brand/perena.webp +0 -0
- package/public/oracle-splash/brand/pharaoh.webp +0 -0
- package/public/oracle-splash/brand/phoenix.webp +0 -0
- package/public/oracle-splash/brand/polymarket.webp +0 -0
- package/public/oracle-splash/brand/polynomial.webp +0 -0
- package/public/oracle-splash/brand/projectx.webp +0 -0
- package/public/oracle-splash/brand/pumpfun.webp +0 -0
- package/public/oracle-splash/brand/quickswap.webp +0 -0
- package/public/oracle-splash/brand/rain.webp +0 -0
- package/public/oracle-splash/brand/raydium.webp +0 -0
- package/public/oracle-splash/brand/relay.webp +0 -0
- package/public/oracle-splash/brand/rocketpool.webp +0 -0
- package/public/oracle-splash/brand/saber.webp +0 -0
- package/public/oracle-splash/brand/sakuraswap.webp +0 -0
- package/public/oracle-splash/brand/sanctum.webp +0 -0
- package/public/oracle-splash/brand/satflow.png +0 -0
- package/public/oracle-splash/brand/sierra.webp +0 -0
- package/public/oracle-splash/brand/sky.webp +0 -0
- package/public/oracle-splash/brand/solv.webp +0 -0
- package/public/oracle-splash/brand/spark.webp +0 -0
- package/public/oracle-splash/brand/sparksavings.webp +0 -0
- package/public/oracle-splash/brand/sphere.webp +0 -0
- package/public/oracle-splash/brand/ssv.webp +0 -0
- package/public/oracle-splash/brand/stabble.webp +0 -0
- package/public/oracle-splash/brand/stableswap.webp +0 -0
- package/public/oracle-splash/brand/stakewise.webp +0 -0
- package/public/oracle-splash/brand/stargate.webp +0 -0
- package/public/oracle-splash/brand/sthype.webp +0 -0
- package/public/oracle-splash/brand/sushiswap.webp +0 -0
- package/public/oracle-splash/brand/unisat.png +0 -0
- package/public/oracle-splash/brand/uniswap.webp +0 -0
- package/public/oracle-splash/brand/uniswapv2.webp +0 -0
- package/public/oracle-splash/brand/uniswapv4.webp +0 -0
- package/public/oracle-splash/brand/unit.webp +0 -0
- package/public/oracle-splash/brand/velodrome.webp +0 -0
- package/public/oracle-splash/brand/velora.webp +0 -0
- package/public/oracle-splash/brand/venus.webp +0 -0
- package/public/oracle-splash/brand/wbeth.webp +0 -0
- package/public/oracle-splash/brand/xsy.webp +0 -0
- package/public/oracle-splash/brand/yieldyak.webp +0 -0
- package/public/oracle-splash/brand/zerobase.webp +0 -0
- package/public/oracle-splash/brand/zerox.webp +0 -0
- package/public/oracle-splash/index.html +246 -169
- package/CONTRIBUTING.md +0 -98
- package/bin/desk-server.mjs +0 -440
- package/bin/oracle-data-mcp.mjs +0 -1010
- package/bin/oracle-init.mjs +0 -496
- package/bin/oracle-public-server.mjs +0 -36
- package/bin/oracle-route.mjs +0 -254
- package/bin/oracle-scan.mjs +0 -192
- package/bin/oracle-upgrade.mjs +0 -42
- package/bin/oracle.mjs +0 -33
- package/docs/adding-a-chain.md +0 -229
- package/docs/architecture.md +0 -136
- package/docs/cli.md +0 -47
- package/docs/connectors.md +0 -13
- package/docs/oracle-pack-standard.md +0 -29
- package/docs/profiles.md +0 -154
- package/examples/add-a-chain.mjs +0 -65
- package/examples/oracle-pack-template.mjs +0 -38
- package/examples/research-a-token.mjs +0 -70
- package/plugins/oracle-owner-gate/__init__.py +0 -227
- package/plugins/oracle-owner-gate/plugin.yaml +0 -9
- package/profiles/_template/SOUL.md +0 -54
- package/profiles/_template/profile.json +0 -22
- package/profiles/bitcoin-agent/SOUL.md +0 -31
- package/profiles/bitcoin-agent/profile.json +0 -32
- package/profiles/hyperliquid-agent/SOUL.md +0 -34
- package/profiles/hyperliquid-agent/profile.json +0 -37
- package/profiles/oracle/SOUL.md +0 -107
- package/profiles/oracle/profile.json +0 -39
- package/profiles/polymarket-agent/SOUL.md +0 -35
- package/profiles/polymarket-agent/profile.json +0 -34
- package/profiles/profile.schema.json +0 -90
- package/profiles/protocol-builder/SOUL.md +0 -57
- package/profiles/protocol-builder/profile.json +0 -39
- package/profiles/robinhood-agent/SOUL.md +0 -53
- package/profiles/robinhood-agent/profile.json +0 -40
- package/profiles/solana-agent/SOUL.md +0 -37
- package/profiles/solana-agent/profile.json +0 -37
- package/profiles/stable-agent/SOUL.md +0 -43
- package/profiles/stable-agent/profile.json +0 -37
- package/protocols/templates/safe-erc20/SECURITY.md +0 -16
- package/protocols/templates/safe-erc20/foundry.toml +0 -12
- package/protocols/templates/safe-erc20/remappings.txt +0 -2
- package/protocols/templates/safe-erc20/src/SafeERC20.sol +0 -53
- package/protocols/templates/safe-erc20/test/SafeERC20.t.sol +0 -72
- package/scripts/adversarial-bench.mjs +0 -114
- package/scripts/build-inscription.py +0 -230
- package/scripts/check-doc-drift.mjs +0 -112
- package/scripts/check-test-count.mjs +0 -105
- package/scripts/e2e-hl-markets.mjs +0 -21
- package/scripts/e2e-hl-perps.mjs +0 -48
- package/scripts/e2e-hypercore-staking.mjs +0 -128
- package/scripts/e2e-solana-bitcoin.mjs +0 -183
- package/scripts/protocol-template-gate.mjs +0 -15
- package/scripts/public-api-scan.mjs +0 -23
- package/scripts/secret-scan.mjs +0 -181
- package/scripts/verify-v3-venues.mjs +0 -192
- package/skills/balance/SKILL.md +0 -176
- package/skills/oracle-action-semantics/SKILL.md +0 -40
- package/skills/oracle-best-execution/SKILL.md +0 -127
- package/skills/oracle-bitcoin/SKILL.md +0 -53
- package/skills/oracle-chain-graphs-telegram-cards/SKILL.md +0 -59
- package/skills/oracle-chat/SKILL.md +0 -61
- package/skills/oracle-chat/chain.SKILL.md +0 -31
- package/skills/oracle-chat/setup.SKILL.md +0 -37
- package/skills/oracle-circuit-breaker/SKILL.md +0 -51
- package/skills/oracle-contract-research/SKILL.md +0 -55
- package/skills/oracle-desk/SKILL.md +0 -58
- package/skills/oracle-dex-launch/SKILL.md +0 -38
- package/skills/oracle-grants/SKILL.md +0 -69
- package/skills/oracle-hypercore-staking/SKILL.md +0 -57
- package/skills/oracle-hyperliquid/SKILL.md +0 -56
- package/skills/oracle-meme-token-sniper/SKILL.md +0 -73
- package/skills/oracle-multichain-nft-launch/SKILL.md +0 -338
- package/skills/oracle-multichain-token-launch/SKILL.md +0 -300
- package/skills/oracle-nft-gacha-launch/SKILL.md +0 -48
- package/skills/oracle-nft-mint-gas-war/SKILL.md +0 -63
- package/skills/oracle-polymarket/SKILL.md +0 -60
- package/skills/oracle-protocol-builder/SKILL.md +0 -59
- package/skills/oracle-protocol-security/SKILL.md +0 -60
- package/skills/oracle-public-product/SKILL.md +0 -44
- package/skills/oracle-receipts/SKILL.md +0 -52
- package/skills/oracle-rfq-tokenized-assets/SKILL.md +0 -69
- package/skills/oracle-smart-wallet-scanner/SKILL.md +0 -49
- package/skills/oracle-solana/SKILL.md +0 -65
- package/skills/oracle-solana-nft/SKILL.md +0 -54
- package/skills/oracle-token-research/SKILL.md +0 -67
- package/skins/oracle.yaml +0 -56
- package/src/action-receipts.mjs +0 -168
- package/src/action-semantics.mjs +0 -62
- package/src/address-book.mjs +0 -208
- package/src/agent-auth.mjs +0 -206
- package/src/approval-guard.mjs +0 -282
- package/src/attestation-secret.mjs +0 -88
- package/src/audit-log.mjs +0 -196
- package/src/auth/oauth.mjs +0 -672
- package/src/auto-slippage.mjs +0 -378
- package/src/capability-posture.mjs +0 -125
- package/src/chains.mjs +0 -62
- package/src/cli/chain-catalog.mjs +0 -215
- package/src/cli/chain-state.mjs +0 -74
- package/src/cli/commands/auth.mjs +0 -193
- package/src/cli/commands/bootstrap.mjs +0 -87
- package/src/cli/commands/chain.mjs +0 -143
- package/src/cli/commands/chat.mjs +0 -434
- package/src/cli/commands/credential.mjs +0 -9
- package/src/cli/commands/data-mcp.mjs +0 -18
- package/src/cli/commands/data.mjs +0 -73
- package/src/cli/commands/doctor.mjs +0 -126
- package/src/cli/commands/help.mjs +0 -7
- package/src/cli/commands/init.mjs +0 -27
- package/src/cli/commands/mcp.mjs +0 -142
- package/src/cli/commands/model.mjs +0 -99
- package/src/cli/commands/prepare.mjs +0 -12
- package/src/cli/commands/public.mjs +0 -20
- package/src/cli/commands/route.mjs +0 -12
- package/src/cli/commands/runner.mjs +0 -9
- package/src/cli/commands/scan.mjs +0 -12
- package/src/cli/commands/setup.mjs +0 -275
- package/src/cli/commands/sign.mjs +0 -21
- package/src/cli/commands/signer.mjs +0 -9
- package/src/cli/commands/upgrade.mjs +0 -12
- package/src/cli/commands/vault.mjs +0 -9
- package/src/cli/commands/version.mjs +0 -22
- package/src/cli/first-run.mjs +0 -23
- package/src/cli/kernel.mjs +0 -239
- package/src/cli/mcp-targets/chatgpt.mjs +0 -51
- package/src/cli/mcp-targets/claude-code.mjs +0 -39
- package/src/cli/mcp-targets/claude-desktop.mjs +0 -24
- package/src/cli/mcp-targets/codex.mjs +0 -41
- package/src/cli/mcp-targets/shared.mjs +0 -61
- package/src/cli/messaging-platforms.mjs +0 -209
- package/src/cli/model-config.mjs +0 -70
- package/src/cli/operator-dispatch.mjs +0 -258
- package/src/cli/oracle-harness.py +0 -415
- package/src/cli/paths.mjs +0 -83
- package/src/cli/runtime.mjs +0 -351
- package/src/cli/setup-state.mjs +0 -168
- package/src/cli/spawn-child.mjs +0 -43
- package/src/data/catalog.mjs +0 -554
- package/src/data/desk-data.mjs +0 -683
- package/src/data/http.mjs +0 -253
- package/src/data/provider-endpoint.mjs +0 -94
- package/src/data/providers/aerodrome.mjs +0 -245
- package/src/data/providers/balancer.mjs +0 -209
- package/src/data/providers/bitcoin-esplora.mjs +0 -216
- package/src/data/providers/bitcoin-meta.mjs +0 -378
- package/src/data/providers/blockscout.mjs +0 -14
- package/src/data/providers/bridges.mjs +0 -242
- package/src/data/providers/cowswap.mjs +0 -415
- package/src/data/providers/curve.mjs +0 -201
- package/src/data/providers/defillama.mjs +0 -88
- package/src/data/providers/dexscreener.mjs +0 -43
- package/src/data/providers/evm-rpc.mjs +0 -222
- package/src/data/providers/geckoterminal.mjs +0 -34
- package/src/data/providers/gmx.mjs +0 -496
- package/src/data/providers/hl-assets.mjs +0 -165
- package/src/data/providers/hl-info.mjs +0 -108
- package/src/data/providers/hl-markets.mjs +0 -210
- package/src/data/providers/hl-outcome.mjs +0 -61
- package/src/data/providers/hl-perps.mjs +0 -387
- package/src/data/providers/hl-staking.mjs +0 -353
- package/src/data/providers/hl-ws.mjs +0 -119
- package/src/data/providers/hyperevm-dex.mjs +0 -49
- package/src/data/providers/jupiter.mjs +0 -183
- package/src/data/providers/lifi.mjs +0 -151
- package/src/data/providers/magiceden-sol.mjs +0 -393
- package/src/data/providers/morpho.mjs +0 -173
- package/src/data/providers/nft-gallery.mjs +0 -163
- package/src/data/providers/nft-portfolio.mjs +0 -494
- package/src/data/providers/odos.mjs +0 -156
- package/src/data/providers/oneinch.mjs +0 -174
- package/src/data/providers/opensea-multichain.mjs +0 -136
- package/src/data/providers/opensea-nft.mjs +0 -371
- package/src/data/providers/paraswap.mjs +0 -118
- package/src/data/providers/pendle.mjs +0 -187
- package/src/data/providers/poly-clob.mjs +0 -283
- package/src/data/providers/poly-public.mjs +0 -96
- package/src/data/providers/poly-ws.mjs +0 -103
- package/src/data/providers/portfolio-history.mjs +0 -394
- package/src/data/providers/portfolio.mjs +0 -594
- package/src/data/providers/rfq.mjs +0 -15
- package/src/data/providers/rh-agent.mjs +0 -59
- package/src/data/providers/satflow.mjs +0 -338
- package/src/data/providers/solana-rpc.mjs +0 -197
- package/src/data/providers/uniswap-v3.mjs +0 -320
- package/src/data/providers/zerox.mjs +0 -167
- package/src/data/public-api-scan.mjs +0 -61
- package/src/data/quote-placeholder.mjs +0 -31
- package/src/exact-integer.mjs +0 -72
- package/src/exec-policy.mjs +0 -455
- package/src/flags.mjs +0 -15
- package/src/fresh-window.mjs +0 -76
- package/src/gmx-attestation.mjs +0 -176
- package/src/index.mjs +0 -100
- package/src/nft-gas-war-guard.mjs +0 -139
- package/src/onboarding/agent-keys.mjs +0 -161
- package/src/onboarding/harness-configs.mjs +0 -102
- package/src/onboarding/index.mjs +0 -18
- package/src/onboarding/tiers.mjs +0 -139
- package/src/oracle-env.mjs +0 -47
- package/src/portfolio-risk.mjs +0 -170
- package/src/prepare-envelope.mjs +0 -186
- package/src/profile-upgrade.mjs +0 -277
- package/src/protocol-execution.mjs +0 -84
- package/src/protocol-templates/gate.mjs +0 -179
- package/src/protocol-templates/prepare-deploy.mjs +0 -81
- package/src/public-api/buzz-integration.mjs +0 -256
- package/src/public-api/connect-agent.mjs +0 -416
- package/src/public-api/grants.mjs +0 -142
- package/src/public-api/http.mjs +0 -389
- package/src/public-control/aa-adapter.mjs +0 -402
- package/src/public-control/build-registry.mjs +0 -227
- package/src/public-control/bundler-client.mjs +0 -357
- package/src/public-control/grant-indexer.mjs +0 -296
- package/src/public-control/policy-render.mjs +0 -69
- package/src/public-control/policy-schema.mjs +0 -318
- package/src/public-control/runtime-config.mjs +0 -275
- package/src/public-control/session-key-model.mjs +0 -374
- package/src/public-control/session-orchestrator.mjs +0 -412
- package/src/rfq/intent.mjs +0 -180
- package/src/rfq/sources.mjs +0 -181
- package/src/route-attestation.mjs +0 -132
- package/src/router/best-execution.mjs +0 -326
- package/src/router/index.mjs +0 -226
- package/src/router/prepare-bridge.mjs +0 -289
- package/src/router/prepare-route.mjs +0 -381
- package/src/router/proposal.mjs +0 -311
- package/src/router/risk-classifier.mjs +0 -119
- package/src/router/route-sources.mjs +0 -329
- package/src/scanner/chains.config.mjs +0 -430
- package/src/scanner/contract.mjs +0 -270
- package/src/scanner/evm-scanner.mjs +0 -394
- package/src/scanner/index.mjs +0 -9
- package/src/scanner/v2-venue.mjs +0 -335
- package/src/scanner/v3-venue.mjs +0 -290
- package/src/scopes.mjs +0 -44
- package/src/sell-simulation.mjs +0 -167
- package/src/signals/engine.mjs +0 -146
- package/src/signals/index.mjs +0 -1
- package/src/token-transfer-guard.mjs +0 -188
- package/src/tui/app.mjs +0 -438
- package/src/tui/backend.mjs +0 -145
- package/src/tui/format.mjs +0 -272
- package/src/tui/gateway-client.mjs +0 -177
- package/src/tui/input.mjs +0 -501
- package/src/tui/renderer.mjs +0 -443
- package/src/tui/standalone-client.mjs +0 -666
- package/src/tui/theme.mjs +0 -81
- package/src/vault-attestation.mjs +0 -146
- package/src/venues.mjs +0 -206
- package/src/watch-preferences.mjs +0 -85
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { renderNextSteps } from "../first-run.mjs";
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
name: "init",
|
|
7
|
-
summary: "install agent lanes + read plane (dry-run by default)",
|
|
8
|
-
group: "read",
|
|
9
|
-
usage: "oracle init [--apply --force --only <lane> --json --yes]",
|
|
10
|
-
async run(ctx) {
|
|
11
|
-
const argv = [...ctx.argv];
|
|
12
|
-
if (argv.includes("--yes") && !argv.includes("--apply")) argv.push("--apply");
|
|
13
|
-
const bin = path.join(ctx.root, "bin", "oracle-init.mjs");
|
|
14
|
-
const r = spawnSync(process.execPath, [bin, ...argv], { encoding: "utf8", env: process.env });
|
|
15
|
-
if (r.error) {
|
|
16
|
-
process.stderr.write(`oracle: failed to spawn oracle-init: ${r.error.message}\n`);
|
|
17
|
-
return 1;
|
|
18
|
-
}
|
|
19
|
-
if (r.stdout) process.stdout.write(r.stdout);
|
|
20
|
-
if (r.stderr) process.stderr.write(r.stderr);
|
|
21
|
-
const code = typeof r.status === "number" ? r.status : 1;
|
|
22
|
-
if (code === 0 && argv.includes("--apply") && !argv.includes("--json")) {
|
|
23
|
-
process.stdout.write(renderNextSteps());
|
|
24
|
-
}
|
|
25
|
-
return code;
|
|
26
|
-
},
|
|
27
|
-
};
|
package/src/cli/commands/mcp.mjs
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { parseArgs } from "node:util";
|
|
2
|
-
import { printOperatorNotInstalled } from "../operator-dispatch.mjs";
|
|
3
|
-
import { installClaudeCode } from "../mcp-targets/claude-code.mjs";
|
|
4
|
-
import { installClaudeDesktop } from "../mcp-targets/claude-desktop.mjs";
|
|
5
|
-
import { installCodex } from "../mcp-targets/codex.mjs";
|
|
6
|
-
import { installChatgpt } from "../mcp-targets/chatgpt.mjs";
|
|
7
|
-
import { buildServerSpecs } from "../mcp-targets/shared.mjs";
|
|
8
|
-
|
|
9
|
-
function usage() {
|
|
10
|
-
process.stderr.write(
|
|
11
|
-
"usage: oracle mcp <install|print> [target] [flags]\n" +
|
|
12
|
-
" targets: claude-code | claude-desktop | codex | chatgpt | generic\n" +
|
|
13
|
-
" flags: --with-control --project --print --json\n",
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function emitResult(result, { json = false } = {}) {
|
|
18
|
-
if (result.print && !result.instructions) {
|
|
19
|
-
process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
|
|
20
|
-
} else if (result.printText) {
|
|
21
|
-
process.stdout.write(result.printText);
|
|
22
|
-
}
|
|
23
|
-
if (result.instructions) {
|
|
24
|
-
process.stdout.write(result.instructions + "\n");
|
|
25
|
-
if (result.print && json) process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
|
|
26
|
-
}
|
|
27
|
-
if (!result.print && !result.printText && !result.instructions) {
|
|
28
|
-
const line = {
|
|
29
|
-
status: result.status,
|
|
30
|
-
path: result.path || null,
|
|
31
|
-
backup: result.backup || null,
|
|
32
|
-
method: result.method || null,
|
|
33
|
-
};
|
|
34
|
-
process.stdout.write(
|
|
35
|
-
(json ? JSON.stringify(line, null, 2) : `${line.status}${line.path ? " " + line.path : ""}`) + "\n",
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export default {
|
|
41
|
-
name: "mcp",
|
|
42
|
-
summary: "wire Oracle into AI clients",
|
|
43
|
-
group: "read",
|
|
44
|
-
usage: "oracle mcp install <target> | oracle mcp print [--target <t>]",
|
|
45
|
-
async run(ctx) {
|
|
46
|
-
const verb = ctx.argv[0];
|
|
47
|
-
if (!verb || verb === "--help" || verb === "-h") {
|
|
48
|
-
usage();
|
|
49
|
-
return verb ? 0 : 1;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
let values, positionals;
|
|
53
|
-
try {
|
|
54
|
-
({ values, positionals } = parseArgs({
|
|
55
|
-
args: ctx.argv.slice(1),
|
|
56
|
-
options: {
|
|
57
|
-
"with-control": { type: "boolean", default: false },
|
|
58
|
-
project: { type: "boolean", default: false },
|
|
59
|
-
print: { type: "boolean", default: false },
|
|
60
|
-
json: { type: "boolean", default: false },
|
|
61
|
-
target: { type: "string" },
|
|
62
|
-
},
|
|
63
|
-
allowPositionals: true,
|
|
64
|
-
strict: false,
|
|
65
|
-
}));
|
|
66
|
-
} catch (err) {
|
|
67
|
-
process.stderr.write(`oracle mcp: ${err.message}\n`);
|
|
68
|
-
usage();
|
|
69
|
-
return 1;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const withControl = !!values["with-control"];
|
|
73
|
-
const project = !!values.project;
|
|
74
|
-
const json = !!values.json;
|
|
75
|
-
const operator = ctx.resolveOperator ? ctx.resolveOperator() : { ok: false };
|
|
76
|
-
|
|
77
|
-
if (withControl && (!operator || !operator.ok)) {
|
|
78
|
-
printOperatorNotInstalled(process.stderr);
|
|
79
|
-
return 3;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const opts = { oracleRoot: ctx.root, operator, withControl, project, cwd: process.cwd() };
|
|
83
|
-
|
|
84
|
-
if (verb === "print") {
|
|
85
|
-
const target = values.target || positionals[0] || "claude-code";
|
|
86
|
-
if (target === "generic" || target === "claude-code") {
|
|
87
|
-
const built = buildServerSpecs(opts);
|
|
88
|
-
if (!built.ok) { printOperatorNotInstalled(process.stderr); return 3; }
|
|
89
|
-
process.stdout.write(JSON.stringify({ mcpServers: built.specs }, null, 2) + "\n");
|
|
90
|
-
return 0;
|
|
91
|
-
}
|
|
92
|
-
if (target === "chatgpt") {
|
|
93
|
-
const r = await installChatgpt({ printOnly: true });
|
|
94
|
-
emitResult(r, { json });
|
|
95
|
-
return 0;
|
|
96
|
-
}
|
|
97
|
-
if (target === "codex") {
|
|
98
|
-
emitResult(await installCodex({ ...opts, printOnly: true }), { json });
|
|
99
|
-
return 0;
|
|
100
|
-
}
|
|
101
|
-
if (target === "claude-desktop") {
|
|
102
|
-
emitResult(await installClaudeDesktop({ ...opts, printOnly: true }), { json });
|
|
103
|
-
return 0;
|
|
104
|
-
}
|
|
105
|
-
process.stderr.write(`oracle mcp: unknown target '${target}'\n`);
|
|
106
|
-
return 1;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (verb === "install") {
|
|
110
|
-
const target = positionals[0] || values.target;
|
|
111
|
-
if (!target) { usage(); return 1; }
|
|
112
|
-
const printOnly = !!values.print;
|
|
113
|
-
let result;
|
|
114
|
-
if (target === "claude-code") result = await installClaudeCode({ ...opts, printOnly });
|
|
115
|
-
else if (target === "claude-desktop") result = await installClaudeDesktop({ ...opts, printOnly });
|
|
116
|
-
else if (target === "codex") result = await installCodex({ ...opts, printOnly });
|
|
117
|
-
else if (target === "chatgpt") result = await installChatgpt({ printOnly });
|
|
118
|
-
else if (target === "generic") {
|
|
119
|
-
const built = buildServerSpecs(opts);
|
|
120
|
-
if (!built.ok) { printOperatorNotInstalled(process.stderr); return 3; }
|
|
121
|
-
process.stdout.write(JSON.stringify({ mcpServers: built.specs }, null, 2) + "\n");
|
|
122
|
-
return 0;
|
|
123
|
-
} else {
|
|
124
|
-
process.stderr.write(`oracle mcp: unknown target '${target}'\n`);
|
|
125
|
-
return 1;
|
|
126
|
-
}
|
|
127
|
-
if (!result.ok) {
|
|
128
|
-
if (result.code === 3) printOperatorNotInstalled(process.stderr);
|
|
129
|
-
else process.stderr.write(`oracle mcp: ${result.reason || "failed"}\n`);
|
|
130
|
-
return result.code || 1;
|
|
131
|
-
}
|
|
132
|
-
emitResult(result, { json });
|
|
133
|
-
if (result.status && String(result.status).startsWith("printed") && result.print) {
|
|
134
|
-
process.stdout.write(JSON.stringify(result.print, null, 2) + "\n");
|
|
135
|
-
}
|
|
136
|
-
return 0;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
usage();
|
|
140
|
-
return 1;
|
|
141
|
-
},
|
|
142
|
-
};
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { spawnChild } from "../spawn-child.mjs";
|
|
2
|
-
import { resolveHermes } from "../runtime.mjs";
|
|
3
|
-
import { readModelConfig, writeModelConfig } from "../model-config.mjs";
|
|
4
|
-
import { oracleHarnessInvocation } from "./chat.mjs";
|
|
5
|
-
|
|
6
|
-
function option(args, name) {
|
|
7
|
-
const index = args.indexOf(name);
|
|
8
|
-
return index >= 0 && args[index + 1] ? args[index + 1] : null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function standalonePatch(args) {
|
|
12
|
-
const backend = option(args, "--backend");
|
|
13
|
-
const provider = option(args, "--provider");
|
|
14
|
-
const model = option(args, "--model") || option(args, "-m");
|
|
15
|
-
const baseUrl = option(args, "--base-url");
|
|
16
|
-
const apiKeyEnv = option(args, "--api-key-env");
|
|
17
|
-
const contextLength = option(args, "--context-length");
|
|
18
|
-
const reasoningEffort = option(args, "--reasoning-effort");
|
|
19
|
-
const hasStandaloneField = Boolean(provider || model || baseUrl || apiKeyEnv || contextLength || reasoningEffort);
|
|
20
|
-
if (!backend && !hasStandaloneField) return null;
|
|
21
|
-
const current = { ...(readModelConfig() || {}) };
|
|
22
|
-
if (provider) {
|
|
23
|
-
delete current.apiKeyEnv;
|
|
24
|
-
if (provider !== "custom" || provider !== current.provider) delete current.baseUrl;
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
...current,
|
|
28
|
-
backend: backend || "standalone",
|
|
29
|
-
...(provider ? { provider } : {}),
|
|
30
|
-
...(model ? { model } : {}),
|
|
31
|
-
...(baseUrl ? { baseUrl } : {}),
|
|
32
|
-
...(apiKeyEnv ? { apiKeyEnv } : {}),
|
|
33
|
-
...(contextLength ? { contextLength } : {}),
|
|
34
|
-
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function usage() {
|
|
39
|
-
return [
|
|
40
|
-
"oracle model, choose standalone model settings or open Hermes' picker",
|
|
41
|
-
"",
|
|
42
|
-
" oracle model",
|
|
43
|
-
" oracle model --show",
|
|
44
|
-
" oracle model --backend standalone --provider openrouter --model openrouter/auto",
|
|
45
|
-
" oracle model --backend auto",
|
|
46
|
-
"",
|
|
47
|
-
"standalone keys stay in environment variables, never model.json:",
|
|
48
|
-
" OPENROUTER_API_KEY, OPENAI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY",
|
|
49
|
-
].join("\n");
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export default {
|
|
53
|
-
name: "model",
|
|
54
|
-
summary: "choose Oracle's standalone model or existing Hermes provider",
|
|
55
|
-
group: "read",
|
|
56
|
-
usage: usage(),
|
|
57
|
-
async run(ctx) {
|
|
58
|
-
const args = [...ctx.argv];
|
|
59
|
-
if (args.includes("--show")) {
|
|
60
|
-
process.stdout.write(`${JSON.stringify(readModelConfig() || { backend: "auto" }, null, 2)}\n`);
|
|
61
|
-
return 0;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const patch = standalonePatch(args);
|
|
65
|
-
if (patch) {
|
|
66
|
-
try {
|
|
67
|
-
const saved = writeModelConfig(patch);
|
|
68
|
-
process.stdout.write(`oracle model: ${saved.backend}`);
|
|
69
|
-
if (saved.provider) process.stdout.write(` / ${saved.provider}`);
|
|
70
|
-
if (saved.model) process.stdout.write(` / ${saved.model}`);
|
|
71
|
-
process.stdout.write("\n");
|
|
72
|
-
if (saved.backend === "standalone" && saved.apiKeyEnv) {
|
|
73
|
-
process.stdout.write(`key source: ${saved.apiKeyEnv}\n`);
|
|
74
|
-
}
|
|
75
|
-
return 0;
|
|
76
|
-
} catch (error) {
|
|
77
|
-
process.stderr.write(`oracle model: ${error.message}\n`);
|
|
78
|
-
return 1;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const found = resolveHermes();
|
|
83
|
-
if (!found.ok) {
|
|
84
|
-
process.stderr.write(
|
|
85
|
-
"Oracle standalone chat does not require Hermes.\n" +
|
|
86
|
-
"Configure a provider with: oracle model --backend standalone --provider openrouter --model openrouter/auto\n" +
|
|
87
|
-
"Then set OPENROUTER_API_KEY.\n",
|
|
88
|
-
);
|
|
89
|
-
return 1;
|
|
90
|
-
}
|
|
91
|
-
const launch = oracleHarnessInvocation(found.bin, ["-p", "oracle", "model", ...args]);
|
|
92
|
-
return spawnChild(
|
|
93
|
-
launch.command,
|
|
94
|
-
launch.args,
|
|
95
|
-
{ stdio: "inherit", env: process.env },
|
|
96
|
-
"oracle-model",
|
|
97
|
-
);
|
|
98
|
-
},
|
|
99
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export default {
|
|
4
|
-
name: "prepare", summary: "build an unsigned swap (alias of route prepare)", group: "read",
|
|
5
|
-
usage: "oracle prepare <chain> <tokenIn> <tokenOut> <taker> [amt]",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
const bin = path.join(ctx.root, "bin", "oracle-route.mjs");
|
|
8
|
-
const r = spawnSync(process.execPath, [bin, "prepare", ...ctx.argv], { stdio: "inherit" });
|
|
9
|
-
if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}\n`); return 1; }
|
|
10
|
-
return typeof r.status === "number" ? r.status : 1;
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { parseArgs } from "node:util";
|
|
3
|
-
import { spawnChild } from "../spawn-child.mjs";
|
|
4
|
-
export default {
|
|
5
|
-
name: "public", summary: "secret-free public HTTP surface", group: "read",
|
|
6
|
-
usage: "oracle public serve [--port N]",
|
|
7
|
-
async run(ctx) {
|
|
8
|
-
const verb = ctx.argv[0] || "serve";
|
|
9
|
-
if (verb !== "serve") { process.stderr.write("usage: oracle public serve [--port N]\n"); return 1; }
|
|
10
|
-
let port = null;
|
|
11
|
-
try {
|
|
12
|
-
const { values } = parseArgs({ args: ctx.argv.slice(1), options: { port: { type: "string" } }, allowPositionals: true, strict: false });
|
|
13
|
-
port = values.port || null;
|
|
14
|
-
} catch {}
|
|
15
|
-
const env = { ...process.env };
|
|
16
|
-
if (port) env.ORACLE_PUBLIC_PORT = String(port);
|
|
17
|
-
const bin = path.join(ctx.root, "bin", "oracle-public-server.mjs");
|
|
18
|
-
return spawnChild(process.execPath, [bin], { stdio: "inherit", env }, "oracle-public-server");
|
|
19
|
-
},
|
|
20
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export default {
|
|
4
|
-
name: "route", summary: "swap/bridge prepare helpers", group: "read",
|
|
5
|
-
usage: "oracle route <swap|bridge|prepare|prepare-bridge> ...",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
const bin = path.join(ctx.root, "bin", "oracle-route.mjs");
|
|
8
|
-
const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
|
|
9
|
-
if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}\n`); return 1; }
|
|
10
|
-
return typeof r.status === "number" ? r.status : 1;
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export default {
|
|
4
|
-
name: "scan", summary: "chain scanner", group: "read",
|
|
5
|
-
usage: "oracle scan <chains|head|token|pools|risk|quote|sell> ...",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
const bin = path.join(ctx.root, "bin", "oracle-scan.mjs");
|
|
8
|
-
const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
|
|
9
|
-
if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-scan: ${r.error.message}\n`); return 1; }
|
|
10
|
-
return typeof r.status === "number" ? r.status : 1;
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import readline from "node:readline/promises";
|
|
3
|
-
import { stdin as input, stdout as output } from "node:process";
|
|
4
|
-
import {
|
|
5
|
-
findMessagingPlatform,
|
|
6
|
-
listMessagingPlatforms,
|
|
7
|
-
renderSetupMenu,
|
|
8
|
-
} from "../messaging-platforms.mjs";
|
|
9
|
-
import {
|
|
10
|
-
platformStatus,
|
|
11
|
-
renderStatus,
|
|
12
|
-
setPlatformToken,
|
|
13
|
-
touchSetupState,
|
|
14
|
-
} from "../setup-state.mjs";
|
|
15
|
-
import { hermesRoot } from "../paths.mjs";
|
|
16
|
-
import { installManagedHermes, resolveHermes } from "../runtime.mjs";
|
|
17
|
-
|
|
18
|
-
function usage() {
|
|
19
|
-
return [
|
|
20
|
-
"oracle setup — wire messaging + local agent surface",
|
|
21
|
-
"",
|
|
22
|
-
" oracle setup menu + platform status",
|
|
23
|
-
" oracle setup status same, machine-friendly with --json",
|
|
24
|
-
" oracle setup messaging open hermes gateway setup wizard",
|
|
25
|
-
" oracle setup telegram set TELEGRAM_BOT_TOKEN for profile",
|
|
26
|
-
" oracle setup discord set DISCORD_BOT_TOKEN for profile",
|
|
27
|
-
" oracle setup slack set slack tokens",
|
|
28
|
-
" oracle setup <platform> any supported hermes platform",
|
|
29
|
-
" oracle setup gateway [status|restart|start|stop]",
|
|
30
|
-
" oracle setup profile [name] default: oracle",
|
|
31
|
-
"",
|
|
32
|
-
"chat:",
|
|
33
|
-
" /setup",
|
|
34
|
-
" /setup telegram",
|
|
35
|
-
" /setup status",
|
|
36
|
-
"",
|
|
37
|
-
"tokens stay local in ~/.hermes/profiles/<profile>/.env",
|
|
38
|
-
"oracle never prints secrets.",
|
|
39
|
-
].join("\n");
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function profileFromArgs(args) {
|
|
43
|
-
const i = args.indexOf("--profile");
|
|
44
|
-
if (i >= 0 && args[i + 1]) return args[i + 1];
|
|
45
|
-
const j = args.indexOf("-p");
|
|
46
|
-
if (j >= 0 && args[j + 1]) return args[j + 1];
|
|
47
|
-
return process.env.ORACLE_PROFILE || "oracle";
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function stripProfileArgs(args) {
|
|
51
|
-
const out = [];
|
|
52
|
-
for (let i = 0; i < args.length; i++) {
|
|
53
|
-
if (args[i] === "--profile" || args[i] === "-p") {
|
|
54
|
-
i += 1;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
out.push(args[i]);
|
|
58
|
-
}
|
|
59
|
-
return out;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function runHermes(argv, { inherit = true, env = process.env } = {}) {
|
|
63
|
-
let resolved = resolveHermes();
|
|
64
|
-
if (!resolved.ok && process.stdin.isTTY && process.stdout.isTTY && process.env.ORACLE_NO_BOOTSTRAP !== "1") {
|
|
65
|
-
process.stdout.write("setting up oracle's local messaging runtime (one time)\n\n");
|
|
66
|
-
const installed = installManagedHermes();
|
|
67
|
-
if (installed.ok) resolved = { ok: true, bin: installed.bin };
|
|
68
|
-
}
|
|
69
|
-
if (!resolved.ok) {
|
|
70
|
-
process.stderr.write("oracle setup needs the local runtime\nrun: oracle bootstrap\n");
|
|
71
|
-
return 1;
|
|
72
|
-
}
|
|
73
|
-
const r = spawnSync(resolved.bin, argv, {
|
|
74
|
-
stdio: inherit ? "inherit" : "pipe",
|
|
75
|
-
encoding: "utf8",
|
|
76
|
-
env,
|
|
77
|
-
});
|
|
78
|
-
if (r.error) {
|
|
79
|
-
process.stderr.write(`oracle setup: failed to run hermes: ${r.error.message}\n`);
|
|
80
|
-
return 1;
|
|
81
|
-
}
|
|
82
|
-
if (!inherit) {
|
|
83
|
-
if (r.stdout) process.stdout.write(r.stdout);
|
|
84
|
-
if (r.stderr) process.stderr.write(r.stderr);
|
|
85
|
-
}
|
|
86
|
-
return typeof r.status === "number" ? r.status : 1;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function promptSecret(label) {
|
|
90
|
-
if (!process.stdin.isTTY) {
|
|
91
|
-
const err = new Error("interactive token entry requires a tty");
|
|
92
|
-
err.code = "NO_TTY";
|
|
93
|
-
throw err;
|
|
94
|
-
}
|
|
95
|
-
const rl = readline.createInterface({ input, output });
|
|
96
|
-
try {
|
|
97
|
-
// readline cannot hide input portably without raw mode; still avoid echo by
|
|
98
|
-
// asking user to paste and not logging it ourselves.
|
|
99
|
-
const value = (await rl.question(`${label}: `)).trim();
|
|
100
|
-
return value;
|
|
101
|
-
} finally {
|
|
102
|
-
rl.close();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function configurePlatform(profile, platformKey, inlineArgs = []) {
|
|
107
|
-
const platform = findMessagingPlatform(platformKey);
|
|
108
|
-
if (!platform) {
|
|
109
|
-
process.stderr.write(`oracle setup: unknown platform '${platformKey}'\n`);
|
|
110
|
-
process.stderr.write(
|
|
111
|
-
`known: ${listMessagingPlatforms()
|
|
112
|
-
.map((p) => p.key)
|
|
113
|
-
.join(", ")}\n`,
|
|
114
|
-
);
|
|
115
|
-
return 1;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Platforms without simple token keys go through Hermes interactive setup.
|
|
119
|
-
if (!platform.required.length) {
|
|
120
|
-
process.stdout.write(
|
|
121
|
-
`opening hermes setup for ${platform.key} (interactive)\n`,
|
|
122
|
-
);
|
|
123
|
-
touchSetupState({ lastPlatform: platform.key, profile });
|
|
124
|
-
return runHermes(["-p", profile, ...(platform.hermes || ["gateway", "setup"])]);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const flags = {};
|
|
128
|
-
const positionals = [];
|
|
129
|
-
for (let i = 0; i < inlineArgs.length; i++) {
|
|
130
|
-
const a = inlineArgs[i];
|
|
131
|
-
if (a === "--token" && inlineArgs[i + 1]) {
|
|
132
|
-
flags.token = inlineArgs[++i];
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
if (a === "--allowed-users" && inlineArgs[i + 1]) {
|
|
136
|
-
flags.allowedUsers = inlineArgs[++i];
|
|
137
|
-
continue;
|
|
138
|
-
}
|
|
139
|
-
if (a === "--app-token" && inlineArgs[i + 1]) {
|
|
140
|
-
flags.appToken = inlineArgs[++i];
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
if (a.startsWith("-")) {
|
|
144
|
-
process.stderr.write(`oracle setup: unknown flag ${a}\n`);
|
|
145
|
-
return 1;
|
|
146
|
-
}
|
|
147
|
-
positionals.push(a);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
let token = flags.token || positionals[0] || "";
|
|
151
|
-
if (!token) {
|
|
152
|
-
try {
|
|
153
|
-
token = await promptSecret(`${platform.key} bot token`);
|
|
154
|
-
} catch (err) {
|
|
155
|
-
if (err?.code === "NO_TTY") {
|
|
156
|
-
process.stderr.write(
|
|
157
|
-
`oracle setup ${platform.key}: pass --token <value> in non-interactive mode\n`,
|
|
158
|
-
);
|
|
159
|
-
return 1;
|
|
160
|
-
}
|
|
161
|
-
throw err;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (!token) {
|
|
165
|
-
process.stderr.write("aborted: empty token\n");
|
|
166
|
-
return 1;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const extra = {};
|
|
170
|
-
if (flags.allowedUsers) {
|
|
171
|
-
if (platform.key === "telegram") extra.TELEGRAM_ALLOWED_USERS = flags.allowedUsers;
|
|
172
|
-
if (platform.key === "discord") extra.DISCORD_ALLOWED_USERS = flags.allowedUsers;
|
|
173
|
-
if (platform.key === "slack") extra.SLACK_ALLOWED_USERS = flags.allowedUsers;
|
|
174
|
-
}
|
|
175
|
-
if (flags.appToken && platform.key === "slack") {
|
|
176
|
-
extra.SLACK_APP_TOKEN = flags.appToken;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Slack needs two tokens.
|
|
180
|
-
if (platform.key === "slack" && !extra.SLACK_APP_TOKEN) {
|
|
181
|
-
let app = flags.appToken || positionals[1] || "";
|
|
182
|
-
if (!app && process.stdin.isTTY) {
|
|
183
|
-
app = await promptSecret("slack app token (xapp-...)");
|
|
184
|
-
}
|
|
185
|
-
if (!app) {
|
|
186
|
-
process.stderr.write("slack needs bot token + app token\n");
|
|
187
|
-
return 1;
|
|
188
|
-
}
|
|
189
|
-
extra.SLACK_APP_TOKEN = app;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
try {
|
|
193
|
-
const result = setPlatformToken(profile, platform.key, token, extra);
|
|
194
|
-
touchSetupState({ lastPlatform: platform.key, profile, ready: true });
|
|
195
|
-
process.stdout.write(
|
|
196
|
-
`saved ${platform.key} credentials for profile '${profile}'\n` +
|
|
197
|
-
`path: ${result.path}\n` +
|
|
198
|
-
`next: oracle setup gateway restart\n`,
|
|
199
|
-
);
|
|
200
|
-
return 0;
|
|
201
|
-
} catch (err) {
|
|
202
|
-
process.stderr.write(`oracle setup: ${err.message}\n`);
|
|
203
|
-
return 1;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export default {
|
|
208
|
-
name: "setup",
|
|
209
|
-
summary: "configure telegram/discord/slack messaging platforms",
|
|
210
|
-
group: "read",
|
|
211
|
-
usage: usage(),
|
|
212
|
-
async run(ctx) {
|
|
213
|
-
const args = [...ctx.argv];
|
|
214
|
-
const json = args.includes("--json");
|
|
215
|
-
const profile = profileFromArgs(args);
|
|
216
|
-
const clean = stripProfileArgs(args).filter((a) => a !== "--json");
|
|
217
|
-
const verb = (clean[0] || "menu").toLowerCase();
|
|
218
|
-
const rest = clean.slice(1);
|
|
219
|
-
|
|
220
|
-
if (["-h", "--help", "help"].includes(verb)) {
|
|
221
|
-
process.stdout.write(usage() + "\n");
|
|
222
|
-
return 0;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (["menu", "list", "ls"].includes(verb)) {
|
|
226
|
-
if (json) {
|
|
227
|
-
process.stdout.write(JSON.stringify(platformStatus(profile), null, 2) + "\n");
|
|
228
|
-
} else {
|
|
229
|
-
process.stdout.write(renderStatus(profile));
|
|
230
|
-
}
|
|
231
|
-
return 0;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (["status", "show"].includes(verb)) {
|
|
235
|
-
const st = platformStatus(profile);
|
|
236
|
-
if (json) {
|
|
237
|
-
process.stdout.write(JSON.stringify(st, null, 2) + "\n");
|
|
238
|
-
} else {
|
|
239
|
-
process.stdout.write(renderStatus(profile));
|
|
240
|
-
process.stdout.write(`hermes root: ${hermesRoot()}\n`);
|
|
241
|
-
}
|
|
242
|
-
return 0;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
if (["messaging", "gateway-setup", "platforms"].includes(verb)) {
|
|
246
|
-
touchSetupState({ lastAction: "messaging", profile });
|
|
247
|
-
process.stdout.write("opening hermes gateway setup wizard...\n");
|
|
248
|
-
return runHermes(["-p", profile, "gateway", "setup"]);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
if (verb === "gateway") {
|
|
252
|
-
const action = (rest[0] || "status").toLowerCase();
|
|
253
|
-
if (!["status", "start", "stop", "restart", "run", "install"].includes(action)) {
|
|
254
|
-
process.stderr.write("usage: oracle setup gateway [status|start|stop|restart|run|install]\n");
|
|
255
|
-
return 1;
|
|
256
|
-
}
|
|
257
|
-
return runHermes(["-p", profile, "gateway", action]);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
if (verb === "profile") {
|
|
261
|
-
const name = rest[0] || profile;
|
|
262
|
-
process.stdout.write(`profile: ${name}\nhermes: ${hermesRoot()}/profiles/${name}\n`);
|
|
263
|
-
process.stdout.write(renderStatus(name));
|
|
264
|
-
return 0;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// oracle setup telegram|discord|...
|
|
268
|
-
if (findMessagingPlatform(verb)) {
|
|
269
|
-
return configurePlatform(profile, verb, rest);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
process.stderr.write(`oracle setup: unknown verb '${verb}'\n${usage()}\n`);
|
|
273
|
-
return 1;
|
|
274
|
-
},
|
|
275
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
name: "sign",
|
|
3
|
-
summary: "provision / check the local signer (opt-in)",
|
|
4
|
-
group: "sign",
|
|
5
|
-
usage: "oracle sign <init|doctor> ...",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
const verb = ctx.argv[0];
|
|
8
|
-
if (verb === "init") {
|
|
9
|
-
return ctx.dispatchOperator("oracle-agentic-init", ctx.argv.slice(1), { appendHintOnError: true });
|
|
10
|
-
}
|
|
11
|
-
if (verb === "doctor") {
|
|
12
|
-
return ctx.dispatchOperator("oracle-agentic-doctor", ctx.argv.slice(1), { appendHintOnError: true });
|
|
13
|
-
}
|
|
14
|
-
process.stderr.write(
|
|
15
|
-
"usage: oracle sign <init|doctor> ...\n" +
|
|
16
|
-
" oracle sign init provision keys + policy (interactive)\n" +
|
|
17
|
-
" oracle sign doctor check local signer readiness\n",
|
|
18
|
-
);
|
|
19
|
-
return 1;
|
|
20
|
-
},
|
|
21
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from "node:child_process";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
export default {
|
|
4
|
-
name: "upgrade", summary: "upgrade installed Hermes lanes", group: "read",
|
|
5
|
-
usage: "oracle upgrade [--apply ...]",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
const bin = path.join(ctx.root, "bin", "oracle-upgrade.mjs");
|
|
8
|
-
const r = spawnSync(process.execPath, [bin, ...ctx.argv], { stdio: "inherit" });
|
|
9
|
-
if (r.error) { process.stderr.write(`oracle: failed to spawn oracle-upgrade: ${r.error.message}\n`); return 1; }
|
|
10
|
-
return typeof r.status === "number" ? r.status : 1;
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
name: "vault",
|
|
3
|
-
summary: "encrypt local key files at rest",
|
|
4
|
-
group: "sign",
|
|
5
|
-
usage: "oracle vault <encrypt|rekey|inspect|decrypt> ...",
|
|
6
|
-
async run(ctx) {
|
|
7
|
-
return ctx.dispatchOperator("oracle-vault", ctx.argv, { appendHintOnError: true });
|
|
8
|
-
},
|
|
9
|
-
};
|