@oracle-agent/oracle 0.14.1 → 0.16.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/README.md +2 -2
- package/SETUP.md +4 -4
- 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 +60 -0
- package/dist/bin/oracle-data-mcp.mjs +9 -0
- package/dist/bin/oracle-equities.mjs +20 -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 +63 -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 +45 -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/equities.mjs +15 -0
- package/dist/cli/commands/farm.mjs +59 -0
- package/dist/cli/commands/fees.mjs +10 -0
- package/dist/cli/commands/follow.mjs +28 -0
- package/dist/cli/commands/harness.mjs +15 -0
- package/dist/cli/commands/help.mjs +1 -0
- package/dist/cli/commands/init.mjs +3 -0
- package/dist/cli/commands/mcp.mjs +36 -0
- package/dist/cli/commands/model.mjs +54 -0
- package/dist/cli/commands/plugins.mjs +43 -0
- package/dist/cli/commands/prepare.mjs +2 -0
- package/dist/cli/commands/public.mjs +3 -0
- package/dist/cli/commands/resolve.mjs +23 -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/strategy.mjs +18 -0
- package/dist/cli/commands/swap.mjs +36 -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 +55 -0
- package/dist/data/names.mjs +2 -0
- package/dist/data/providers/farming.mjs +2 -0
- package/dist/equities/index.mjs +1 -0
- package/dist/index.mjs +60 -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-api/agent-grants.mjs +3 -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/strategy/index.mjs +3 -0
- package/dist/watch-preferences.mjs +1 -0
- package/package.json +33 -78
- package/public/oracle-splash/_variants/ice.html +5 -18
- package/public/oracle-splash/_variants/ivory.html +5 -18
- package/public/oracle-splash/downloads/index.html +4 -4
- package/public/oracle-splash/index.html +113 -34
- package/CONTRIBUTING.md +0 -99
- package/bin/desk-server.mjs +0 -473
- package/bin/oracle-data-mcp.mjs +0 -1252
- package/bin/oracle-equities.mjs +0 -168
- package/bin/oracle-init.mjs +0 -525
- 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 -34
- package/docs/adding-a-chain.md +0 -229
- package/docs/architecture.md +0 -139
- package/docs/buzz-integration.md +0 -115
- package/docs/cli.md +0 -143
- package/docs/connectors.md +0 -13
- package/docs/hyperliquid-builder-code.md +0 -50
- package/docs/locals-only-fee-waiver.md +0 -34
- package/docs/oracle-pack-standard.md +0 -29
- package/docs/profiles.md +0 -151
- package/docs/public-surface.md +0 -206
- 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 -288
- package/plugins/oracle-owner-gate/plugin.yaml +0 -9
- 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-dist.mjs +0 -119
- package/scripts/build-inscription.py +0 -230
- package/scripts/check-doc-drift.mjs +0 -123
- 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/guard-publish.mjs +0 -22
- package/scripts/protocol-template-gate.mjs +0 -15
- package/scripts/public-api-scan.mjs +0 -23
- package/scripts/publish-dist.mjs +0 -67
- package/scripts/record-hero-cli.sh +0 -80
- package/scripts/secret-scan.mjs +0 -169
- package/scripts/smoke-dist-bins.mjs +0 -89
- package/scripts/verify-dist.mjs +0 -29
- package/scripts/verify-v3-venues.mjs +0 -233
- package/skins/oracle.yaml +0 -56
- package/src/action-receipts.mjs +0 -265
- 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 -94
- 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/cards.mjs +0 -422
- 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 -465
- package/src/cli/commands/credential.mjs +0 -9
- package/src/cli/commands/data-mcp.mjs +0 -18
- package/src/cli/commands/data.mjs +0 -75
- package/src/cli/commands/doctor.mjs +0 -136
- package/src/cli/commands/equities.mjs +0 -41
- package/src/cli/commands/farm.mjs +0 -129
- package/src/cli/commands/fees.mjs +0 -109
- package/src/cli/commands/follow.mjs +0 -130
- package/src/cli/commands/harness.mjs +0 -63
- package/src/cli/commands/help.mjs +0 -7
- package/src/cli/commands/init.mjs +0 -27
- package/src/cli/commands/mcp.mjs +0 -154
- package/src/cli/commands/model.mjs +0 -106
- package/src/cli/commands/plugins.mjs +0 -275
- package/src/cli/commands/prepare.mjs +0 -12
- package/src/cli/commands/public.mjs +0 -20
- package/src/cli/commands/resolve.mjs +0 -64
- 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 -294
- package/src/cli/commands/sign.mjs +0 -21
- package/src/cli/commands/signer.mjs +0 -9
- package/src/cli/commands/swap.mjs +0 -102
- 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 -262
- 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/cursor.mjs +0 -32
- package/src/cli/mcp-targets/shared.mjs +0 -71
- package/src/cli/mcp-targets/vscode.mjs +0 -39
- package/src/cli/messaging-platforms.mjs +0 -217
- package/src/cli/model-config.mjs +0 -78
- package/src/cli/operator-dispatch.mjs +0 -194
- package/src/cli/oracle-harness.py +0 -415
- package/src/cli/paths.mjs +0 -107
- 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 -858
- package/src/data/desk-data.mjs +0 -877
- package/src/data/http.mjs +0 -253
- package/src/data/names.mjs +0 -188
- package/src/data/provider-endpoint.mjs +0 -94
- package/src/data/providers/aave-v3.mjs +0 -139
- package/src/data/providers/across-bridge.mjs +0 -41
- package/src/data/providers/aerodrome.mjs +0 -245
- package/src/data/providers/aevo.mjs +0 -33
- package/src/data/providers/approval-indexer.mjs +0 -133
- package/src/data/providers/approvals.mjs +0 -594
- package/src/data/providers/babylon-staking.mjs +0 -149
- package/src/data/providers/balancer.mjs +0 -209
- package/src/data/providers/beefy-yields.mjs +0 -45
- package/src/data/providers/birdeye-tokens.mjs +0 -33
- package/src/data/providers/bisq-markets.mjs +0 -145
- 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/bob-rootstock.mjs +0 -198
- package/src/data/providers/braiins-insights.mjs +0 -103
- package/src/data/providers/bridge-aggregator.mjs +0 -259
- package/src/data/providers/bridges.mjs +0 -242
- package/src/data/providers/bungee.mjs +0 -29
- package/src/data/providers/celestia-da.mjs +0 -38
- package/src/data/providers/changenow.mjs +0 -135
- package/src/data/providers/compound.mjs +0 -32
- package/src/data/providers/connext.mjs +0 -28
- package/src/data/providers/convex.mjs +0 -30
- package/src/data/providers/cow-protocol.mjs +0 -110
- package/src/data/providers/cowswap.mjs +0 -415
- package/src/data/providers/curve.mjs +0 -201
- package/src/data/providers/das-assets.mjs +0 -59
- package/src/data/providers/debridge.mjs +0 -109
- package/src/data/providers/defillama.mjs +0 -88
- package/src/data/providers/dexscreener.mjs +0 -43
- package/src/data/providers/drift.mjs +0 -32
- package/src/data/providers/dydx.mjs +0 -41
- package/src/data/providers/evm-rpc.mjs +0 -225
- package/src/data/providers/farming.mjs +0 -291
- package/src/data/providers/geckoterminal.mjs +0 -34
- package/src/data/providers/gmx.mjs +0 -496
- package/src/data/providers/hiro-stacks.mjs +0 -150
- 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 -419
- 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/jito-mev.mjs +0 -117
- package/src/data/providers/jupiter-venues.mjs +0 -119
- package/src/data/providers/jupiter.mjs +0 -315
- package/src/data/providers/kamino-strategies.mjs +0 -143
- package/src/data/providers/l2beat-tvl.mjs +0 -42
- package/src/data/providers/lifi.mjs +0 -166
- package/src/data/providers/liquid-esplora.mjs +0 -152
- package/src/data/providers/magiceden-ordinals.mjs +0 -141
- package/src/data/providers/magiceden-sol.mjs +0 -406
- package/src/data/providers/mempool-lightning.mjs +0 -144
- package/src/data/providers/mempool-mining.mjs +0 -142
- package/src/data/providers/meteora-dlmm.mjs +0 -168
- package/src/data/providers/morpho.mjs +0 -177
- 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/ondo.mjs +0 -31
- 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/orca.mjs +0 -29
- package/src/data/providers/ordinals-runes.mjs +0 -180
- package/src/data/providers/pancakeswap.mjs +0 -28
- package/src/data/providers/paraswap.mjs +0 -125
- package/src/data/providers/pendle.mjs +0 -188
- 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/polygon-staking.mjs +0 -227
- package/src/data/providers/portfolio-history.mjs +0 -394
- package/src/data/providers/portfolio.mjs +0 -600
- package/src/data/providers/pyth-price-feeds.mjs +0 -172
- package/src/data/providers/raydium.mjs +0 -35
- package/src/data/providers/relayscan-mev.mjs +0 -72
- package/src/data/providers/rfq.mjs +0 -15
- package/src/data/providers/rh-agent.mjs +0 -59
- package/src/data/providers/sanctum-lst.mjs +0 -180
- package/src/data/providers/satflow.mjs +0 -341
- package/src/data/providers/signed-material-guard.mjs +0 -108
- package/src/data/providers/solana-rpc.mjs +0 -197
- package/src/data/providers/solend-lending.mjs +0 -166
- package/src/data/providers/spark-lend.mjs +0 -42
- package/src/data/providers/squid-router.mjs +0 -29
- package/src/data/providers/stargate.mjs +0 -29
- package/src/data/providers/sushiswap.mjs +0 -30
- package/src/data/providers/symbiotic-restaking.mjs +0 -41
- package/src/data/providers/thorchain.mjs +0 -36
- package/src/data/providers/traderjoe.mjs +0 -28
- package/src/data/providers/twap.mjs +0 -152
- package/src/data/providers/uniswap-v3.mjs +0 -457
- package/src/data/providers/uniswap-v4.mjs +0 -414
- package/src/data/providers/vertex.mjs +0 -41
- package/src/data/providers/wallet-watch.mjs +0 -264
- package/src/data/providers/wormhole.mjs +0 -28
- package/src/data/providers/yearn.mjs +0 -31
- 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/desk/swap-prepare.mjs +0 -194
- package/src/equities/bridge.mjs +0 -388
- package/src/equities/fixtures/bridge_routes.json +0 -159
- package/src/equities/fixtures/dst_transitions.json +0 -29
- package/src/equities/fixtures/equity_dex_pools.json +0 -154
- package/src/equities/fixtures/hip3_l2books.json +0 -2711
- package/src/equities/fixtures/nyse_holidays.json +0 -1
- package/src/equities/fixtures/oracles.json +0 -100
- package/src/equities/fixtures/rh_pool_state.json +0 -244
- package/src/equities/fixtures/solana_xstocks.json +0 -704
- package/src/equities/fixtures/ton_xstocks.json +0 -35
- package/src/equities/fixtures/universe.json +0 -411
- package/src/equities/fixtures/venues.json +0 -3542
- package/src/equities/fixtures.mjs +0 -405
- package/src/equities/funding.mjs +0 -142
- package/src/equities/index.mjs +0 -166
- package/src/equities/liveness.mjs +0 -148
- package/src/equities/marketHours.mjs +0 -249
- package/src/equities/normalize.mjs +0 -295
- package/src/equities/num.mjs +0 -146
- package/src/equities/prepare.mjs +0 -95
- package/src/equities/rank.mjs +0 -260
- package/src/equities/sourceNum.mjs +0 -69
- package/src/equities/types.mjs +0 -220
- package/src/equities/venues/arcus-perp.mjs +0 -84
- package/src/equities/venues/arcus-spot.mjs +0 -105
- package/src/equities/venues/hyperliquid-hip3.mjs +0 -224
- package/src/equities/venues/rh-uniswap.mjs +0 -216
- package/src/equities/venues/solana-xstocks.mjs +0 -139
- package/src/equities/venues/ton-stonfi.mjs +0 -139
- package/src/exact-integer.mjs +0 -72
- package/src/exec-policy.mjs +0 -419
- 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 -107
- package/src/licensing/locals-only.mjs +0 -25
- 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 -55
- package/src/package-manifest.mjs +0 -42
- package/src/plugins/agent-plugin-loader.mjs +0 -225
- package/src/portfolio-risk.mjs +0 -170
- package/src/prepare-envelope.mjs +0 -204
- 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/agent-grants.mjs +0 -57
- package/src/public-api/buzz-integration.mjs +0 -267
- package/src/public-api/connect-agent.mjs +0 -424
- package/src/public-api/grants.mjs +0 -142
- package/src/public-api/http.mjs +0 -707
- package/src/public-api/metering.mjs +0 -111
- 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 -322
- package/src/public-control/runtime-config.mjs +0 -275
- package/src/public-control/session-key-model.mjs +0 -379
- package/src/public-control/session-orchestrator.mjs +0 -418
- 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 -250
- package/src/router/integrator-fee.mjs +0 -135
- package/src/router/prepare-bridge.mjs +0 -293
- package/src/router/prepare-route.mjs +0 -398
- package/src/router/proposal.mjs +0 -311
- package/src/router/risk-classifier.mjs +0 -119
- package/src/router/route-sources.mjs +0 -364
- package/src/scanner/chains.config.mjs +0 -543
- 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 -351
- package/src/scanner/v3-venue.mjs +0 -308
- 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 -215
- 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/memory.mjs +0 -105
- package/src/tui/meta-learn.mjs +0 -85
- package/src/tui/renderer.mjs +0 -443
- package/src/tui/scheduler.mjs +0 -205
- package/src/tui/skills-loader.mjs +0 -140
- package/src/tui/standalone-client.mjs +0 -752
- 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
- /package/{profiles → dist/assets/profiles}/_template/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/_template/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/bitcoin-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/bitcoin-agent/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/hyperliquid-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/hyperliquid-agent/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/oracle/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/oracle/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/polymarket-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/polymarket-agent/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/profile.schema.json +0 -0
- /package/{profiles → dist/assets/profiles}/protocol-builder/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/protocol-builder/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/robinhood-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/robinhood-agent/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/solana-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/solana-agent/profile.json +0 -0
- /package/{profiles → dist/assets/profiles}/stable-agent/SOUL.md +0 -0
- /package/{profiles → dist/assets/profiles}/stable-agent/profile.json +0 -0
- /package/{skills → dist/assets/skills}/balance/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/bitcoin-l1.md +0 -0
- /package/{skills → dist/assets/skills}/chain-defi-ecosystem-profiling.md +0 -0
- /package/{skills → dist/assets/skills}/evm-contract-research.md +0 -0
- /package/{skills → dist/assets/skills}/hyperliquid.md +0 -0
- /package/{skills → dist/assets/skills}/multichain-exec-desk.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-action-semantics/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-best-execution/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-best-execution.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-bitcoin/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-chain-graphs-telegram-cards/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-chat/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-chat/chain.SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-chat/setup.SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-circuit-breaker/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-contract-research/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-desk/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-desk.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-dex-launch/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-equities/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-grants/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-hypercore-staking/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-hyperliquid/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-meme-token-sniper/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-multichain-nft-launch/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-multichain-token-launch/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-nft-gacha-launch/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-nft-mint-gas-war/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-polymarket/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-protocol-builder/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-protocol-security/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-public-product/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-receipts/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-receipts.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-rfq-tokenized-assets/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-smart-wallet-scanner/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-solana/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-solana-nft/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/oracle-token-research/SKILL.md +0 -0
- /package/{skills → dist/assets/skills}/solana.md +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{readFileSync as w,existsSync as j}from"node:fs";import{Contract as x,JsonRpcProvider as g}from"ethers";var u="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",f=999,y="https://rpc.hyperliquid.xyz/evm",A=["function balanceOf(address owner) view returns (uint256)"],C=/^0x[a-fA-F0-9]{40}$/;function l(r){return C.test(String(r||""))}async function d(r,{contract:t=u,rpc:e=y,chainId:s=f,balanceOf:a}={}){if(!l(r))throw new Error("invalid-address");if(a)return BigInt(await a(r));let o=new g(e,s,{staticNetwork:!0}),c=new x(t,A,o);return BigInt(await c.balanceOf(r))}import L from"node:os";import i from"node:path";import{fileURLToPath as E}from"node:url";var _=i.dirname(E(import.meta.url)),H=i.resolve(_,"../..");function h(){return process.env.ORACLE_FAKE_HOME||L.homedir()}function v(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function b(){return v()?process.env.ORACLE_CONFIG_DIR||i.join(h(),".config","oracle"):i.join(h(),".config","oracle")}function O(){return i.join(b(),"exec.env")}var m=`oracle fees \u2014 Oracle fee-waiver status
|
|
2
|
+
|
|
3
|
+
oracle fees status check the configured agent wallet
|
|
4
|
+
oracle fees check <address> check any address
|
|
5
|
+
oracle fees info show the Locals Only collection
|
|
6
|
+
|
|
7
|
+
Oracle is public to everyone. A Locals Only NFT only waives Oracle's integrator
|
|
8
|
+
fee. This command reads balanceOf on HyperEVM; it does not sign or request keys.`;function R(r=O()){if(!j(r))return null;try{let t=w(r,"utf8");for(let e of t.split(`
|
|
9
|
+
`)){let s=e.match(/^\s*(?:export\s+)?ORACLE_EVM_ADDRESS\s*=\s*(.+)\s*$/);if(!s)continue;let a=s[1].trim().replace(/^["']|["']$/g,"");if(l(a))return a}}catch{return null}return null}function n(r,t){r.write(t+`
|
|
10
|
+
`)}async function S(r=[],t={}){let e=t.out??process.stdout,s=t.err??process.stderr,a=t.balanceOf??d,o=r[0];if(!o||o==="--help"||o==="-h"||o==="help")return n(e,m),0;if(o==="info")return n(e,`contract: ${u}`),n(e,`chain: HyperEVM (${f})`),n(e,"benefit: 0% Oracle integrator fee"),n(e,"access: public to everyone"),0;let c;if(o==="status"){if(c=t.agentAddress?t.agentAddress():R(),!c)return n(e,"wallet: not configured"),n(e,"Locals Only fee-waiver status: unavailable"),n(e,"standard Oracle fee applies when configured"),n(e,"Oracle access remains public to everyone."),0}else if(o==="check"){if(c=r[1],!l(c))return n(s,"usage: oracle fees check <0x address>"),2}else return n(s,`oracle fees: unknown subcommand '${o}'`),2;try{let p=await a(c);return n(e,`wallet: ${c}`),BigInt(p)>0n?(n(e,`Locals Only balance: ${p}`),n(e,"Oracle integrator fee: 0%")):(n(e,"Locals Only balance: 0"),n(e,"standard Oracle fee applies when configured")),n(e,"Oracle access remains public to everyone."),0}catch{return n(e,"Locals Only fee-waiver status: unavailable"),n(e,"standard Oracle fee applies when configured"),n(e,"Oracle access remains public to everyone."),0}}var $="check Locals Only zero-fee eligibility",Y={name:"fees",summary:"check Locals Only zero-fee eligibility",group:"read",usage:m,async run(r){return S(r.argv??[])}};export{R as agentAddress,Y as default,$ as help,S as run};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var G="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",H={1:["https://mainnet.gateway.tenderly.co","https://eth.drpc.org","https://rpc.flashbots.net"],8453:["https://base.gateway.tenderly.co","https://mainnet.base.org","https://base.drpc.org"],42161:["https://arbitrum.gateway.tenderly.co","https://arb1.arbitrum.io/rpc","https://arbitrum.drpc.org"]},yt=1e4,gt=t=>new Promise(e=>setTimeout(e,t)),Y=t=>"0x"+BigInt(t).toString(16),Et=t=>"0x"+"0".repeat(24)+t.slice(2).toLowerCase(),J=t=>"0x"+t.slice(26).toLowerCase(),xt=/timeout|timed out|too many requests|rate.?limit|429|502|503|504|internal error|temporarily|aborted|fetch failed|ECONNRESET|socket hang up/i,St=/too many|exceeds|limited to|not supported on free plan|response too large|range must not exceed|narrow your filter/i,E=class extends Error{constructor(e,{transient:n=!1,tooBig:r=!1,http:s=0}={}){super(e),this.transient=n,this.tooBig=r,this.http=s}};async function kt(t,e,n,r){let s=new AbortController,i=setTimeout(()=>s.abort(),r),a,c;try{a=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:n}),signal:s.signal}),c=await a.text()}catch(l){throw new E(`${e} network: ${l.message}`,{transient:!0})}finally{clearTimeout(i)}let o;try{o=JSON.parse(c)}catch{throw new E(`${e} non-JSON http=${a.status}: ${c.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status})}if(o.error){let l=o.error.message||"rpc error";throw new E(`${e} rpc: ${l}`,{transient:xt.test(l),tooBig:St.test(l),http:a.status})}if(a.status!==200)throw new E(`${e} http=${a.status}: ${c.slice(0,80)}`,{transient:a.status>=500||a.status===429,http:a.status});return o.result}async function q(t,e,n,{retries:r,timeoutMs:s,onWarn:i}){let a;for(let c of t){for(let o=0;o<=r;o++)try{return{result:await kt(c,e,n,s),url:c}}catch(l){if(a=l,l.tooBig)throw l;if(!l.transient||o===r)break;let f=Math.min(2e3*2**o,8e3)+Math.random()*250;i?.(`retry ${c} (${l.message.slice(0,70)}) in ${Math.round(f)}ms`),await gt(f)}i?.(`endpoint exhausted: ${c} -> ${a?.message.slice(0,70)}`)}throw a??new E("no endpoints available")}async function P(t,e,n,r,s,i){let a=[{...e,fromBlock:Y(n),toBlock:Y(r)}];try{let{result:o}=await q(t,"eth_getLogs",a,s);Array.isArray(o)&&i.push(...o);return}catch(o){if(!o.tooBig||r<=n)throw o;s.onWarn?.(`splitting ${n}-${r} (${o.message.slice(0,60)})`)}let c=n+Math.floor((r-n)/2);await P(t,e,n,c,s,i),await P(t,e,c+1,r,s,i)}async function K(t,e={}){if(!/^0x[0-9a-fA-F]{40}$/.test(t||""))throw new Error(`invalid address: ${t}`);let{chains:n=[1,8453,42161],lookback:r=1e5,fromBlock:s,toBlock:i,chunkSize:a=yt,tokens:c,direction:o="both",retries:l=3,timeoutMs:f=2e4,concurrency:u=4,endpoints:m=H,onWarn:d}=e,p={retries:l,timeoutMs:f,onWarn:d},w=Et(t),y=[],k=[],T={},N=new Set;return await Promise.all(n.map(async b=>{let R=m[b];if(!R?.length){k.push({chainId:b,stage:"config",error:"no endpoints configured"});return}try{let _=i;if(_==null){let{result:h}=await q(R,"eth_blockNumber",[],p);_=parseInt(h,16)}let $=Math.max(0,s??_-r+1),v=Math.max($,_);T[b]={fromBlock:$,toBlock:v,blocks:v-$+1};let j=[];for(let h=$;h<=v;h+=a)j.push([h,Math.min(h+a-1,v)]);let B=[],V=c?.length?{address:c}:{};(o==="in"||o==="both")&&B.push({...V,topics:[G,null,w]}),(o==="out"||o==="both")&&B.push({...V,topics:[G,w,null]});let I=[];for(let h of B)for(let g of j)I.push([h,g]);let z=[],W=0,wt=Array.from({length:Math.min(u,I.length)},async()=>{for(;W<I.length;){let[h,[g,A]]=I[W++];try{await P(R,h,g,A,p,z)}catch(bt){k.push({chainId:b,stage:"getLogs",range:[g,A],error:bt.message})}}});await Promise.all(wt);for(let h of z){if(!h?.topics||h.topics.length<3)continue;let g=parseInt(h.logIndex,16),A=`${b}|${h.transactionHash}|${g}`;N.has(A)||(N.add(A),y.push({chainId:b,token:h.address.toLowerCase(),from:J(h.topics[1]),to:J(h.topics[2]),value:BigInt(h.data==="0x"?"0x0":h.data).toString(),blockNumber:parseInt(h.blockNumber,16),txHash:h.transactionHash,logIndex:g}))}}catch(_){k.push({chainId:b,stage:"range",error:_.message})}})),y.sort((b,R)=>R.blockNumber-b.blockNumber||R.logIndex-b.logIndex),{events:y,errors:k,ranges:T}}import{keccak_256 as M}from"@noble/hashes/sha3.js";import{createHash as Rt}from"node:crypto";var _t=new Set([408,425,429,500,502,503,504]),X=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),At=2,Z=4e3,tt=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Ct=new Set([301,302,303,307,308]),Q=3;function Tt(t){let e=String(t||"").toLowerCase();return tt.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function Nt(t){let e={};for(let[n,r]of Object.entries(t||{}))Tt(n)||(e[n]=r);return e}function $t(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let n=new URL(String(t),String(e));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${n.protocol}`);return n.toString()}function vt(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var O=new Map;function It(t,e,n){let r={};for(let[o,l]of Object.entries(n||{}))r[o.toLowerCase()]=l;let s=Object.keys(r).filter(o=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(o)),a=[...new Set([...tt,...s])].sort().map(o=>`${o}=${r[o]??""}`).join(`
|
|
2
|
+
`),c=Rt("sha256").update(a).digest("hex").slice(0,32);return`${t} ${e} ${c}`}function Lt(t,e){let n=Number(e);return Number.isFinite(n)&&n>0?Math.min(n*1e3,Z):Math.min(250*2**t,Z)+Math.floor(Math.random()*100)}var Bt=t=>new Promise(e=>setTimeout(e,t));async function Pt(t,{fetchImpl:e,method:n,headers:r,body:s,timeoutMs:i}){let a=new AbortController,c=setTimeout(()=>a.abort(),i);try{let o=String(t),l={...r||{}};for(let f=0;f<=Q;f+=1){let u=await e(o,{method:n,headers:l,body:s,signal:a.signal,redirect:"manual"}),m=await u.text(),d=null;if(m)try{d=JSON.parse(m)}catch{d=null}if(Ct.has(u.status)){if(n!=="GET"&&n!=="HEAD"){let w=new Error(`HTTP ${u.status} ${n} ${o} redirected non-idempotent request`);throw w.status=u.status,w.body=d??m.slice(0,300),w}if(f===Q)throw new Error(`HTTP redirect loop for ${t}`);let p=$t(u.headers?.get?.("location"),o);vt(p,o)||(l=Nt(l)),o=p;continue}if(!u.ok){let p=new Error(`HTTP ${u.status} ${n} ${o}`);throw p.status=u.status,p.retryAfter=u.headers?.get?.("retry-after")??null,p.body=d??m.slice(0,300),p}return d??m}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(c)}}async function et(t,e={}){let n=e.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=e.timeoutMs??12e3,s=(e.method||"GET").toUpperCase(),i={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(i["Content-Type"]=i["Content-Type"]||"application/json",a=JSON.stringify(a));let c=Number.isInteger(e.retries)?Math.max(e.retries,0):At,o=async()=>{let d;for(let p=0;p<=c;p++)try{return await Pt(t,{fetchImpl:n,method:s,headers:i,body:a,timeoutMs:r})}catch(w){d=w;let y=w?.status,k=w?.name==="AbortError",T=new Set([408,425,429]),N=y!=null?T.has(y)||_t.has(y)&&X.has(s):!k&&X.has(s);if(p===c||!N)throw w;await Bt(Lt(p,w?.retryAfter))}throw d};if(!(e.dedupe!==!1&&s==="GET"&&a==null))return o();let f=It(s,t,i),u=O.get(f);if(u)return u;let m=o().finally(()=>O.delete(f));return O.set(f,m),m}var nt={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},Ht=new Map(Object.values(nt).map(t=>[t.chainId,t]));function rt(t){return Ht.get(Number(t))||null}function ot(t,e=process.env){let n=rt(t);if(!n)return null;for(let r of n.rpcEnv){let s=(e[r]||"").trim();if(s)return s}return null}import{Interface as Ot,getAddress as ue}from"ethers";var de=new Ot(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var Mt={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function Ut(t,{rpcUrl:e,env:n=process.env}={}){if(e)return e;let r=ot(t,n);return r||Mt[Number(t)]||null}var Dt=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function Ft(t){let e=String(t||""),n=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!Dt.test(n))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function st(t,e,n=[],r={}){let s=String(e||"");Ft(s);let i=Ut(t,r);if(!i)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let c=await et(i,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(c?.error){let o=new Error(c.error.message||JSON.stringify(c.error));throw o.code=c.error.code,o}return c.result}var D=999,U=1,jt=8453,at="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",Vt="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",ct="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",zt="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",Wt=".80002105.reverse",it=/^0x[a-fA-F0-9]{40}$/,lt=new TextEncoder,ut=t=>"0x"+Buffer.from(t).toString("hex"),x=t=>ut(M(lt.encode(t))).slice(0,10),dt=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function L(t){let e=new Uint8Array(32);if(t)for(let n of String(t).split(".").reverse()){let r=M(lt.encode(n)),s=new Uint8Array(64);s.set(e,0),s.set(r,32),e=M(s)}return ut(e)}function F(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),n=parseInt(e.slice(0,64),16)*2,r=parseInt(e.slice(n,n+64),16);if(!Number.isFinite(r)||r<=0)return"";let s=e.slice(n+64,n+64+r*2);return Buffer.from(s,"hex").toString("utf8")}catch{return""}}async function S(t,e,n){try{return await st(t,"eth_call",[{to:e,data:n},"latest"])}catch{return null}}async function Gt(t){let e=await S(D,at,x("primaryName(address)")+dt(t)),n=F(e);return n?n.endsWith(".hl")?n:`${n}.hl`:null}async function Yt(t){let e=await S(D,Vt,x("getName(address)")+dt(t)),n=F(e);return n?n.endsWith(".hype")?n:`${n}.hype`:null}async function ht(t,e,n){let r=await S(t,n,x("name(bytes32)")+e.slice(2));return F(r)||null}async function Jt(t){let e=L(`${t.slice(2).toLowerCase()}.addr.reverse`),n=await S(U,ct,x("resolver(bytes32)")+e.slice(2));if(!n)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:ht(U,e,r)}async function qt(t){let e=L(t.slice(2).toLowerCase()+Wt);return ht(jt,e,zt)}var Kt=[{source:"hl",fn:Gt},{source:"hype",fn:Yt},{source:"ens",fn:Jt},{source:"basename",fn:qt}];async function Xt(t){let e=L(t),n=await S(D,at,x("ownerOf(uint256)")+e.slice(2));if(!n||n.length<66)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:r}async function Zt(t,e,n){let r=L(e),s=await S(t,n,x("resolver(bytes32)")+r.slice(2));if(!s)return null;let i="0x"+s.slice(-40);if(/^0x0+$/.test(i))return null;let a=await S(t,i,x("addr(bytes32)")+r.slice(2));if(!a)return null;let c="0x"+a.slice(-40);return/^0x0+$/.test(c)?null:c}async function pt(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let n=await Xt(e);return n?{address:n,source:"hl",name:e}:null}if(e.endsWith(".eth")){let n=await Zt(U,e,ct);return n?{address:n,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var me=Kt.map(t=>t.source);var C={1:"ethereum",8453:"base",42161:"arbitrum"},Qt=Object.fromEntries(Object.entries(C).map(([t,e])=>[e,Number(t)])),mt=`oracle follow <name-or-address> [--chain <name>] [--blocks <n>] [--json]
|
|
3
|
+
|
|
4
|
+
oracle follow vitalik.eth
|
|
5
|
+
oracle follow demi.hl --chain base
|
|
6
|
+
oracle follow 0x1111111111111111111111111111111111111111 --blocks 20000 --json
|
|
7
|
+
|
|
8
|
+
Reads ERC20 transfer activity for a wallet. Read-only: this calls
|
|
9
|
+
eth_getLogs and eth_blockNumber and nothing else, so it can never move funds.
|
|
10
|
+
|
|
11
|
+
Chains: ${Object.values(C).join(", ")}. Default: ethereum.
|
|
12
|
+
Lookback defaults to 40000 blocks. Endpoints are keyless.
|
|
13
|
+
|
|
14
|
+
Note publicnode-class RPCs are deliberately excluded: they retain only ~128
|
|
15
|
+
blocks, so they return an empty result instead of an error.`;function ft(t,e){let n=t.indexOf(e);return n>=0?t[n+1]:void 0}function te(t){let e=String(t??"");return e.length>22?`${e.slice(0,19)}...`:e}async function ee(t=[]){let e=t.includes("--json"),n=[];for(let o=0;o<t.length;o+=1){let l=t[o];if(l!=="--json"){if(l==="--chain"||l==="--blocks"){o+=1;continue}n.push(l)}}let r=(n[0]||"").trim();if(!r||r==="--help"||r==="-h")return process.stdout.write(`${mt}
|
|
16
|
+
`),r?0:1;let s=(ft(t,"--chain")||"ethereum").toLowerCase(),i=Qt[s]??Number(s);if(!H[i])return process.stderr.write(`follow: unsupported chain "${s}". Supported: ${Object.values(C).join(", ")}
|
|
17
|
+
`),1;let a=ft(t,"--blocks"),c=a?Number(a):4e4;if(!Number.isFinite(c)||c<=0)return process.stderr.write(`follow: --blocks must be a positive number, got "${a}"
|
|
18
|
+
`),1;try{let o=r,l=null;if(!it.test(r)){let d=await pt(r);if(!d?.address)return process.stderr.write(`follow: could not resolve "${r}" to an address
|
|
19
|
+
`),1;o=d.address,l=r}let f=await K(o,{chains:[i],lookback:c,onWarn:e?void 0:d=>process.stderr.write(` warn: ${d}
|
|
20
|
+
`)}),u=f.events||[];if(e)return process.stdout.write(`${JSON.stringify({address:o,resolvedFrom:l,chain:C[i]||String(i),lookbackBlocks:c,count:u.length,errors:f.errors||[],events:u})}
|
|
21
|
+
`),0;let m=l?`${l} ${o}`:o;process.stdout.write(`${m}
|
|
22
|
+
`),process.stdout.write(` ${C[i]||i} \xB7 last ${c} blocks \xB7 ${u.length} transfer${u.length===1?"":"s"}
|
|
23
|
+
`),u.length||process.stdout.write(` no ERC20 transfers in this window
|
|
24
|
+
`);for(let d of u.slice(0,25)){let p=d.to?.toLowerCase()===o.toLowerCase()?"in ":"out";process.stdout.write(` ${p} blk ${d.blockNumber} token ${d.token} ${te(d.value)}
|
|
25
|
+
`)}u.length>25&&process.stdout.write(` ... ${u.length-25} more (use --json for all)
|
|
26
|
+
`);for(let d of f.errors||[])process.stderr.write(` error: ${d.stage||"rpc"}: ${d.error}
|
|
27
|
+
`);return 0}catch(o){return process.stderr.write(`follow failed: ${o?.message||o}
|
|
28
|
+
`),1}}var ge={name:"follow",summary:"read a wallet's recent ERC20 transfer activity",group:"read",usage:mt,async run(t){return ee(t.argv||[])}};export{ge as default};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import l from"node:fs";import i from"node:path";var E=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"}}),h=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});var u=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function d(n){for(let t of(process.env.PATH||"").split(i.delimiter)){let e=i.join(t,n);try{if(l.existsSync(e))return e}catch{}}return null}function c(){let n=[];for(let t of u){if(t.name==="oracle"){n.push({...t,path:process.argv[1]||"oracle"});continue}let e=d(t.bin);e&&n.push({...t,path:e})}return n}function s(){return["oracle harness \u2014 detect installed agent harnesses",""," oracle harness detect scan PATH for Agent Plugins-compatible clients","","Oracle runs natively. If you prefer a different harness,","set ORACLE_CHAT_BACKEND=<name>.","","Detected: opencode, claude, codex, cursor, windsurf, aider, continue, hermes"].join(`
|
|
2
|
+
`)}var b={name:"harness",summary:"detect installed agent harnesses",usage:s,async run(n,t){let e=n[0];if(e==="help"||e==="--help"||e==="-h")return process.stdout.write(s()+`
|
|
3
|
+
`),0;if(e&&e!=="detect"&&e!=="list")return process.stderr.write(`oracle harness: unknown subcommand '${e}'
|
|
4
|
+
`),process.stderr.write(s()+`
|
|
5
|
+
`),1;let o=c();if(o.length===0)return process.stderr.write(`No agent harnesses detected on PATH.
|
|
6
|
+
`),process.stderr.write(`Oracle runs natively \u2014 no external agent required.
|
|
7
|
+
`),0;let p=o.find(r=>r.kind==="oracle"),a=o.filter(r=>r.kind!=="oracle");process.stdout.write(`
|
|
8
|
+
Oracle native chat: default
|
|
9
|
+
|
|
10
|
+
`),process.stdout.write(`Installed harnesses:
|
|
11
|
+
`);for(let r of a)process.stdout.write(` ${r.label.padEnd(22)} ${r.path}
|
|
12
|
+
`);return a.length===0&&process.stdout.write(` (none \u2014 Oracle runs standalone)
|
|
13
|
+
`),process.stdout.write(`
|
|
14
|
+
Set ORACLE_CHAT_BACKEND=<name> to use a different harness.
|
|
15
|
+
`),0}};export{b as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={name:"help",summary:"show command help",group:"meta",usage:"oracle help [noun]",async run(){return 0}};export{e as default};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{spawnSync as i}from"node:child_process";var n=["oracle data serve # loopback read/prepare plane on 127.0.0.1:8787","oracle doctor # verify","oracle chat # premium oracle chat surface","oracle chain list # pick hyperliquid/base/solana/...","oracle setup # telegram/discord/slack messaging","oracle mcp install claude-code","# optional, explicit second step \u2014 signing stays a separate local package:","npm i -g @oracle-agent/operator","oracle sign init"];function o(){return["","Next:",...n.map(t=>" "+t),""].join(`
|
|
2
|
+
`)}var d={name:"init",summary:"install agent lanes + read plane (dry-run by default)",group:"read",usage:"oracle init [--apply --force --only <lane> --json --yes]",async run(t){let r=[...t.argv];r.includes("--yes")&&!r.includes("--apply")&&r.push("--apply");let s=t.bin("oracle-init.mjs"),e=i(process.execPath,[s,...r],{encoding:"utf8",env:process.env});if(e.error)return process.stderr.write(`oracle: failed to spawn oracle-init: ${e.error.message}
|
|
3
|
+
`),1;e.stdout&&process.stdout.write(e.stdout),e.stderr&&process.stderr.write(e.stderr);let a=typeof e.status=="number"?e.status:1;return a===0&&r.includes("--apply")&&!r.includes("--json")&&process.stdout.write(o()),a}};export{d as default};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import{parseArgs as me}from"node:util";import M from"node:path";import{fileURLToPath as W}from"node:url";var z=M.dirname(W(import.meta.url)),he=M.resolve(z,"../.."),be=Object.freeze(["oracle-vault","oracle-credential","oracle-signer","oracle-runner","oracle-agentic-init","oracle-agentic-doctor","oracle-control-mcp","oracle-operator-caps"]),Se=Object.freeze(["vault","credential","signer","runner","sign"]),I=`oracle: signing is unavailable in the public package.
|
|
2
|
+
|
|
3
|
+
The public 'oracle' package is prepare-only and never handles keys.
|
|
4
|
+
Owner-operated signing is private infrastructure and has no public npm install.
|
|
5
|
+
Review and sign prepared artifacts in your own wallet instead.
|
|
6
|
+
|
|
7
|
+
Nothing about your read/research/prepare setup is affected.
|
|
8
|
+
`;function y(e=process.stderr){e.write(I),I.endsWith(`
|
|
9
|
+
`)||e.write(`
|
|
10
|
+
`)}import{spawnSync as D}from"node:child_process";import H from"node:path";import k from"node:fs";import v from"node:path";import Z from"node:os";import Y from"node:fs";import j from"node:path";import{fileURLToPath as Q}from"node:url";var X=j.dirname(Q(import.meta.url)),h=j.resolve(X,"../..");function $(e){let r=[j.join(h,"bin",e),j.join(h,"dist","bin",e),j.join(h,"..","bin",e)];return r.find(t=>Y.existsSync(t))||r[0]}function d(){return process.env.ORACLE_FAKE_HOME||Z.homedir()}function m({oracleRoot:e=h,operator:r=null,withControl:t=!1}={}){let s={"oracle-data":{command:"node",args:[e===h?$("oracle-data-mcp.mjs"):[v.join(e,"bin","oracle-data-mcp.mjs"),v.join(e,"dist","bin","oracle-data-mcp.mjs")].find(a=>k.existsSync(a))||v.join(e,"bin","oracle-data-mcp.mjs")]}};if(t){if(!r||!r.ok)return{ok:!1,reason:"operator-missing"};let a=r.bins?.["oracle-control-mcp"]||r.controlMcp||null;if(!a)return{ok:!1,reason:"control-bin-missing"};s["oracle-control"]={command:"node",args:[a]}}return{ok:!0,specs:s}}function C(e){if(!k.existsSync(e))return null;let r=`${e}.bak-oracle-${Math.floor(Date.now()/1e3)}`;return k.copyFileSync(e,r),r}function ee(e,r={}){return k.existsSync(e)?JSON.parse(k.readFileSync(e,"utf8")):structuredClone(r)}function re(e,r){k.mkdirSync(v.dirname(e),{recursive:!0}),k.writeFileSync(e,JSON.stringify(r,null,2)+`
|
|
11
|
+
`)}function g(e,r){let t=ee(e,{});(!t.mcpServers||typeof t.mcpServers!="object")&&(t.mcpServers={});let i=!1;for(let[a,o]of Object.entries(r)){let p=t.mcpServers[a];p&&JSON.stringify(p)===JSON.stringify(o)||(t.mcpServers[a]=o,i=!0)}if(!i)return{status:"present",backup:null};let s=C(e);return re(e,t),{status:"written",backup:s}}function f(e,r={}){return{status:e,...r}}function te(){return H.join(d(),".claude.json")}function oe(e){return H.join(e||process.cwd(),".mcp.json")}function ne(e,r){let t=D("claude",["--version"],{encoding:"utf8",timeout:1e4});if(t.error||t.status!==0)return null;let i=D("claude",["mcp","add-json",e,JSON.stringify(r),"--scope","user"],{encoding:"utf8",timeout:3e4});return i.status!==0?{ok:!1,stderr:i.stderr||i.stdout||"failed"}:{ok:!0}}async function L({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)return{ok:!0,print:{mcpServers:o.specs}};if(i){let l=oe(a),u=g(l,o.specs);return{ok:!0,...f(u.status,{path:l,backup:u.backup})}}let p=!1;for(let[l,u]of Object.entries(o.specs)){let S=ne(l,u);if(S&&S.ok){p=!0;continue}break}if(p)return{ok:!0,...f("written",{method:"claude-cli"})};let c=te(),n=g(c,o.specs);return{ok:!0,...f(n.status,{path:c,backup:n.backup})}}import se from"node:fs";import E from"node:path";function ie(){return process.platform==="darwin"?E.join(d(),"Library","Application Support","Claude","claude_desktop_config.json"):E.join(d(),".config","Claude","claude_desktop_config.json")}async function P({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let s=m({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};let a=ie(),o={mcpServers:s.specs};if(i)return{ok:!0,print:o};let p=E.dirname(a);if(!se.existsSync(p))return{ok:!0,status:"printed (Claude Desktop not detected)",path:a,print:o};let c=g(a,s.specs);return{ok:!0,...f(c.status,{path:a,backup:c.backup})}}import w from"node:fs";import F from"node:path";var G="# oracle-mcp-install begin",U="# oracle-mcp-install end";function ce(){return F.join(d(),".codex","config.toml")}function ae(e){let r=[G];for(let[t,i]of Object.entries(e))r.push(`[mcp_servers.${t}]`),r.push(`command = ${JSON.stringify(i.command)}`),r.push(`args = [${i.args.map(s=>JSON.stringify(s)).join(", ")}]`),r.push("");return r.push(U),r.join(`
|
|
12
|
+
`)+`
|
|
13
|
+
`}function pe(e){return e.replace(new RegExp(`${G}[\\s\\S]*?${U}\\n?`,"g"),"")}async function A({oracleRoot:e,operator:r,withControl:t=!1,printOnly:i=!1}){let s=m({oracleRoot:e,operator:r,withControl:t});if(!s.ok)return{ok:!1,code:3,reason:s.reason};let a=ae(s.specs),o=ce();if(i)return{ok:!0,printText:a,path:o};w.mkdirSync(F.dirname(o),{recursive:!0});let p=w.existsSync(o)?w.readFileSync(o,"utf8"):"";if(p.includes(a.trim()))return{ok:!0,...f("present",{path:o,backup:null})};let n=(pe(p).trimEnd()+`
|
|
14
|
+
|
|
15
|
+
`+a).replace(/^\n+/,"");if(p.trim()===n.trim())return{ok:!0,...f("present",{path:o,backup:null})};let l=p?C(o):null;return w.writeFileSync(o,n.endsWith(`
|
|
16
|
+
`)?n:n+`
|
|
17
|
+
`),{ok:!0,...f("written",{path:o,backup:l})}}import B from"node:fs";import q from"node:path";var N="ChatGPT is hosted and can NEVER sign or reach your keys. This connector is read/prepare only; anything it prepares is unsigned until you sign it locally.";function ue(){return{openapi:"3.1.0",info:{title:"Oracle Public (read/prepare)",version:"1.0.0",description:"Secret-free public surface for hosted clients. "+N},servers:[{url:"https://REPLACE-WITH-YOUR-TUNNEL"}],paths:{"/public/health":{get:{operationId:"publicHealth",summary:"Health check",responses:{200:{description:"ok"}}}},"/public/config":{get:{operationId:"publicConfig",summary:"Public config",responses:{200:{description:"ok"}}}},"/public/connect/request":{post:{operationId:"connectRequest",summary:"Build a connect request (unsigned)",responses:{200:{description:"unsigned request artifact"}}}},"/public/connect/assemble":{post:{operationId:"connectAssemble",summary:"Assemble an unsigned grant artifact",responses:{200:{description:"unsigned grant artifact"}}}},"/public/grants/active":{post:{operationId:"grantsActive",summary:"List active grants (read)",responses:{200:{description:"ok"}}}},"/public/grants/get":{post:{operationId:"grantsGet",summary:"Get a grant by id (read)",responses:{200:{description:"ok"}}}}}}}async function R({printOnly:e=!1}={}){let r=ue(),t=q.join(d(),".config","oracle","connectors","chatgpt-openapi.json"),i=JSON.stringify(r,null,2)+`
|
|
18
|
+
`;e||(B.mkdirSync(q.dirname(t),{recursive:!0}),B.writeFileSync(t,i));let s=[N,"","Next steps:"," 1. oracle public serve"," 2. Expose 127.0.0.1:8799 through YOUR HTTPS tunnel (cloudflared, tailscale funnel, etc.)."," Oracle will not create tunnels for you."," 3. Paste the OpenAPI spec into a GPT Action, or add the tunnel URL as a developer-mode MCP connector.",e?"":` Spec written to: ${t}`].filter(Boolean).join(`
|
|
19
|
+
`);return{ok:!0,...f(e?"printed":"written",{path:t,print:r,instructions:s,cannotSign:N})}}import _ from"node:path";import K from"node:os";function le(){return process.platform==="darwin"?_.join(K.homedir(),"Library","Application Support","Cursor","User","globalStorage","mcp.json"):process.platform==="win32"?_.join(K.homedir(),"AppData","Roaming","Cursor","User","globalStorage","mcp.json"):_.join(d(),".config","cursor","mcp.json")}async function T({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)return{ok:!0,printText:['Add this to your Cursor MCP config (Cmd+Shift+P \u2192 "MCP: Open Configuration"):',JSON.stringify({mcpServers:o.specs},null,2)].join(`
|
|
20
|
+
|
|
21
|
+
`)};let p=le(),c=g(p,o.specs);return{ok:!0,...f(c.status,{path:p,backup:c.backup})}}import O from"node:path";import V from"node:os";function fe(){return process.platform==="darwin"?O.join(V.homedir(),"Library","Application Support","Code","User","globalStorage","mcp.json"):process.platform==="win32"?O.join(V.homedir(),"AppData","Roaming","Code","User","globalStorage","mcp.json"):O.join(d(),".config","Code","User","globalStorage","mcp.json")}function de(e){return O.join(e||process.cwd(),".vscode","mcp.json")}async function J({oracleRoot:e,operator:r,withControl:t=!1,project:i=!1,printOnly:s=!1,cwd:a=process.cwd()}){let o=m({oracleRoot:e,operator:r,withControl:t});if(!o.ok)return{ok:!1,code:3,reason:o.reason};if(s)return{ok:!0,printText:["Add this to your VS Code MCP config (.vscode/mcp.json):",JSON.stringify({mcpServers:o.specs},null,2),"","Alternatively, add to VS Code settings.json:",`"mcp.servers": ${JSON.stringify(o.specs,null,2)}`].join(`
|
|
22
|
+
`)};let p=i?de(a):fe(),c=g(p,o.specs);return{ok:!0,...f(c.status,{path:p,backup:c.backup})}}function x(){process.stderr.write(`usage: oracle mcp <install|print> [target] [flags]
|
|
23
|
+
targets: claude-code | claude-desktop | codex | copilot | chatgpt | cursor | vscode | generic
|
|
24
|
+
flags: --with-control --project --print --json
|
|
25
|
+
`)}function b(e,{json:r=!1}={}){if(e.print&&!e.instructions?process.stdout.write(JSON.stringify(e.print,null,2)+`
|
|
26
|
+
`):e.printText&&process.stdout.write(e.printText),e.instructions&&(process.stdout.write(e.instructions+`
|
|
27
|
+
`),e.print&&r&&process.stdout.write(JSON.stringify(e.print,null,2)+`
|
|
28
|
+
`)),!e.print&&!e.printText&&!e.instructions){let t={status:e.status,path:e.path||null,backup:e.backup||null,method:e.method||null};process.stdout.write((r?JSON.stringify(t,null,2):`${t.status}${t.path?" "+t.path:""}`)+`
|
|
29
|
+
`)}}var fr={name:"mcp",summary:"wire Oracle into AI clients",group:"read",usage:"oracle mcp install <target> | oracle mcp print [--target <t>]",async run(e){let r=e.argv[0];if(!r||r==="--help"||r==="-h")return x(),r?0:1;let t,i;try{({values:t,positionals:i}=me({args:e.argv.slice(1),options:{"with-control":{type:"boolean",default:!1},project:{type:"boolean",default:!1},print:{type:"boolean",default:!1},json:{type:"boolean",default:!1},target:{type:"string"}},allowPositionals:!0,strict:!1}))}catch(n){return process.stderr.write(`oracle mcp: ${n.message}
|
|
30
|
+
`),x(),1}let s=!!t["with-control"],a=!!t.project,o=!!t.json,p=e.resolveOperator?e.resolveOperator():{ok:!1};if(s&&(!p||!p.ok))return y(process.stderr),3;let c={oracleRoot:e.root,operator:p,withControl:s,project:a,cwd:process.cwd()};if(r==="print"){let n=t.target||i[0]||"claude-code";if(n==="generic"||n==="claude-code"){let l=m(c);return l.ok?(process.stdout.write(JSON.stringify({mcpServers:l.specs},null,2)+`
|
|
31
|
+
`),0):(y(process.stderr),3)}if(n==="chatgpt"){let l=await R({printOnly:!0});return b(l,{json:o}),0}return n==="codex"||n==="copilot"?(b(await A({...c,printOnly:!0}),{json:o}),0):n==="claude-desktop"?(b(await P({...c,printOnly:!0}),{json:o}),0):n==="cursor"?(b(await T({...c,printOnly:!0}),{json:o}),0):n==="vscode"||n==="vs-code"?(b(await J({...c,printOnly:!0}),{json:o}),0):(process.stderr.write(`oracle mcp: unknown target '${n}'
|
|
32
|
+
`),1)}if(r==="install"){let n=i[0]||t.target;if(!n)return x(),1;let l=!!t.print,u;if(n==="claude-code")u=await L({...c,printOnly:l});else if(n==="claude-desktop")u=await P({...c,printOnly:l});else if(n==="codex"||n==="copilot")u=await A({...c,printOnly:l});else if(n==="chatgpt")u=await R({printOnly:l});else if(n==="cursor")u=await T({...c,printOnly:l});else if(n==="vscode"||n==="vs-code")u=await J({...c,printOnly:l});else if(n==="generic"){let S=m(c);return S.ok?(process.stdout.write(JSON.stringify({mcpServers:S.specs},null,2)+`
|
|
33
|
+
`),0):(y(process.stderr),3)}else return process.stderr.write(`oracle mcp: unknown target '${n}'
|
|
34
|
+
`),1;return u.ok?(b(u,{json:o}),u.status&&String(u.status).startsWith("printed")&&u.print&&process.stdout.write(JSON.stringify(u.print,null,2)+`
|
|
35
|
+
`),0):(u.code===3?y(process.stderr):process.stderr.write(`oracle mcp: ${u.reason||"failed"}
|
|
36
|
+
`),u.code||1)}return x(),1}};export{fr as default};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var Bn=Object.defineProperty;var xt=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(r){throw n=[r],r}};var Kn=(e,t)=>{for(var n in t)Bn(e,n,{get:t[n],enumerable:!0})};import zn from"node:fs";import Yn from"node:os";import Q from"node:path";import{fileURLToPath as Wn}from"node:url";function ae(){return process.env.ORACLE_FAKE_HOME||Yn.homedir()}function Jn(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function Y(){return Jn()?process.env.ORACLE_CONFIG_DIR||Q.join(ae(),".config","oracle"):Q.join(ae(),".config","oracle")}function U(){return process.env.HERMES_HOME?Q.resolve(process.env.HERMES_HOME):Q.join(ae(),".hermes")}function R(e){return zn.mkdirSync(e,{recursive:!0}),e}var Gn,F,G=xt(()=>{Gn=Q.dirname(Wn(import.meta.url)),F=Q.resolve(Gn,"../..")});var An={};Kn(An,{createOAuthStore:()=>ut,default:()=>Ao,getOAuthStore:()=>ie,hasOAuthCredentials:()=>kn,loginOAuth:()=>vn,oauthProviderConfig:()=>at,oauthProviderId:()=>H,oauthRuntimeConfig:()=>En,refreshOAuthCredentials:()=>lt,resolveOAuthCredentials:()=>Sn});import{createHash as po,randomBytes as st,timingSafeEqual as mo}from"node:crypto";import M from"node:fs";import re from"node:path";import ho from"node:readline/promises";import{spawn as xo,spawnSync as yo}from"node:child_process";function ct(e={}){return typeof e.now=="function"?Number(e.now()):Date.now()}function H(e){let t=String(e||"").trim().toLowerCase();for(let[n,r]of Object.entries(oe))if(r.aliases.includes(t))return n;throw new Error(`unsupported OAuth provider: ${e||"(empty)"}`)}function at(e){let t=H(e);return{id:t,...oe[t]}}function N(e,t={}){if(!M.existsSync(e))return t;try{let n=JSON.parse(M.readFileSync(e,"utf8"));if(!n||typeof n!="object"||Array.isArray(n))throw new Error("invalid object");return n}catch{throw new Error(`credential store is unreadable or corrupt: ${re.basename(e)}`)}}function wn(e){R(e),process.platform!=="win32"&&M.chmodSync(e,448)}function W(e,t){wn(re.dirname(e));let n=`${e}.${process.pid}.${st(4).toString("hex")}.tmp`;M.writeFileSync(n,`${JSON.stringify(t,null,2)}
|
|
2
|
+
`,{mode:384}),M.renameSync(n,e),process.platform!=="win32"&&M.chmodSync(e,384)}function go(e){if(process.platform!=="linux")return!1;let t=e("secret-tool",["--version"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return!t.error&&t.status===0}function ot(e){let t=String(e||"").trim().toLowerCase();if(!/^[a-z0-9][a-z0-9._-]*$/.test(t))throw new Error(`invalid API-key provider: ${e||"(empty)"}`);return t}function me(e={}){let t=String(e.accessToken||e.access_token||"").trim(),n=String(e.refreshToken||e.refresh_token||"").trim(),r=Number(e.expiresAt||e.expires_at||0);if(!t)throw new Error("OAuth credential is missing access token");return{accessToken:t,refreshToken:n,expiresAt:Number.isFinite(r)?r:0,tokenType:String(e.tokenType||e.token_type||"Bearer"),source:String(e.source||"oracle"),...e.discovery?{discovery:e.discovery}:{},...e.scope?{scope:e.scope}:{},...e.idToken||e.id_token?{idToken:String(e.idToken||e.id_token)}:{}}}function ut(e={}){let t=e.file||re.join(Y(),"oauth.json"),n=e.metadataFile||re.join(re.dirname(t),"oauth-meta.json"),r=e.spawnFn||yo,o=e.keychain!==!1&&process.env.ORACLE_AUTH_FILE_STORE!=="1"&&go(r),i=o?"linux-secret-service":"private-file",c=`${t}.lock`;async function a(b){wn(re.dirname(c));let m;for(let h=0;h<400;h+=1)try{m=M.openSync(c,"wx",384);break}catch(l){if(l?.code!=="EEXIST")throw l;try{Date.now()-M.statSync(c).mtimeMs>3e5&&M.unlinkSync(c)}catch{}await new Promise(d=>setTimeout(d,25))}if(m===void 0)throw new Error("timed out waiting for OAuth credential lock");try{return await b()}finally{try{M.closeSync(m)}catch{}try{M.unlinkSync(c)}catch{}}}function u(b,m="oauth"){return["application","oracle","kind",m,"provider",b]}function s(b){let m=H(b);if(o){let d=r("secret-tool",["lookup",...u(m)],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(d.error||d.status!==0||!String(d.stdout||"").trim())return null;try{return me(JSON.parse(String(d.stdout).trim()))}catch{return null}}let l=N(t,{providers:{}}).providers?.[m];if(!l)return null;try{return me(l)}catch{return null}}function f(b,m){let h=H(b),l=me(m);if(o){let w=r("secret-tool",["store",`--label=Oracle ${h} OAuth`,...u(h)],{input:JSON.stringify(l),encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(w.error||w.status!==0)throw new Error("OS credential store rejected OAuth credential");let O=N(n,{providers:{}});return O.providers||={},O.providers[h]={expiresAt:l.expiresAt,source:l.source},W(n,O),l}let d=N(t,{providers:{}});return d.providers||={},d.providers[h]=l,W(t,d),l}function p(b){let m=H(b);if(o){let d=r("secret-tool",["clear",...u(m)],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),w=N(n,{providers:{}});return w.providers&&delete w.providers[m],W(n,w),!d.error&&d.status===0}let h=N(t,{providers:{}}),l=!!h.providers?.[m];return h.providers&&delete h.providers[m],W(t,h),l}function y(b){let m=ot(b);if(o){let h=r("secret-tool",["lookup",...u(m,"api-key")],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return h.error||h.status!==0?"":String(h.stdout||"").trim()}return String(N(t,{apiKeys:{}}).apiKeys?.[m]||"").trim()}function x(b,m){let h=ot(b),l=String(m||"").trim();if(!l)throw new Error("API key is empty");if(o){let w=r("secret-tool",["store",`--label=Oracle ${h} API key`,...u(h,"api-key")],{input:l,encoding:"utf8",stdio:["pipe","ignore","pipe"]});if(w.error||w.status!==0)throw new Error("OS credential store rejected API key");let O=N(n,{providers:{},apiKeys:{}});return O.apiKeys||={},O.apiKeys[h]={configured:!0},W(n,O),!0}let d=N(t,{providers:{},apiKeys:{}});return d.apiKeys||={},d.apiKeys[h]=l,W(t,d),!0}function _(b){let m=ot(b);if(o){let d=r("secret-tool",["clear",...u(m,"api-key")],{encoding:"utf8",stdio:["ignore","ignore","pipe"]}),w=N(n,{providers:{},apiKeys:{}});return w.apiKeys&&delete w.apiKeys[m],W(n,w),!d.error&&d.status===0}let h=N(t,{providers:{},apiKeys:{}}),l=!!h.apiKeys?.[m];return h.apiKeys&&delete h.apiKeys[m],W(t,h),l}function v(){let b={},m={};if(o){let h=N(n,{providers:{},apiKeys:{}});for(let[l,d]of Object.entries(h.providers||{}))b[l]={loggedIn:!!s(l),expiresAt:Number(d.expiresAt||0),source:String(d.source||"oracle"),storage:i};for(let l of Object.keys(h.apiKeys||{}))m[l]={configured:!!y(l),storage:i}}else{let h=N(t,{providers:{},apiKeys:{}});for(let[l,d]of Object.entries(h.providers||{}))b[l]={loggedIn:!!d?.accessToken,expiresAt:Number(d?.expiresAt||0),source:String(d?.source||"oracle"),storage:i};for(let[l,d]of Object.entries(h.apiKeys||{}))m[l]={configured:!!d,storage:i}}return{storage:i,providers:b,apiKeys:m}}return Object.freeze({file:t,storage:i,get:s,set:f,remove:p,getApiKey:y,setApiKey:x,removeApiKey:_,status:v,withLock:a})}function ie(){return _n||=ut(),_n}function it(e){return Buffer.from(e).toString("base64url")}function bo(){let e=it(st(32));return{verifier:e,challenge:it(po("sha256").update(e).digest()),state:it(st(24))}}function _o(e,t){let n=Buffer.from(String(e||"")),r=Buffer.from(String(t||""));return n.length===r.length&&mo(n,r)}function wo(e){let t=String(e),n=process.platform==="darwin"?["open",[t]]:process.platform==="win32"?["cmd.exe",["/d","/s","/c","start","",t]]:["xdg-open",[t]];try{return xo(n[0],n[1],{detached:!0,stdio:"ignore"}).unref(),!0}catch{return!1}}function Ce(e){return new URLSearchParams(e).toString()}async function q(e,t){if(!e?.ok){let r="";try{r=String((await e.json())?.error||"")}catch{}throw new Error(`${t} failed (HTTP ${e?.status||"unknown"}${r?`, ${r}`:""})`)}let n=await e.json();if(!n||typeof n!="object")throw new Error(`${t} returned invalid JSON`);return n}async function vo(e){if(e)return String(await e()).trim();let t=ho.createInterface({input:process.stdin,output:process.stdout});try{return String(await t.question("Authorization code: ")).trim()}finally{t.close()}}function Ie(e,t={}){let n=String(e.access_token||"").trim(),r=String(e.refresh_token||t.refreshToken||"").trim();if(!n)throw new Error("OAuth token response is missing access token");let o=Number(e.expires_in||3600);return me({accessToken:n,refreshToken:r,expiresAt:ct(t)+Math.max(1,o)*1e3,tokenType:e.token_type||"Bearer",idToken:e.id_token,source:"oracle",...t.discovery?{discovery:t.discovery}:{},...e.scope?{scope:e.scope}:{}})}async function So(e){let t=oe["anthropic-oauth"],n=e.pkce||bo(),r=new URLSearchParams({code:"true",client_id:t.clientId,response_type:"code",redirect_uri:t.redirectUri,scope:t.scope,code_challenge:n.challenge,code_challenge_method:"S256",state:n.state}),o=`${t.authorizeUrl}?${r}`;e.output(`Open: ${o}`),e.openFn(o);let i=await vo(e.inputFn),[c,a]=i.split("#",2);if(!c||!_o(a,n.state))throw new Error("Claude OAuth state mismatch");let u=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/json","user-agent":"axios/1.7.9"},body:JSON.stringify({grant_type:"authorization_code",client_id:t.clientId,code:c,state:a,redirect_uri:t.redirectUri,code_verifier:n.verifier})});return Ie(await q(u,"Claude OAuth token exchange"),e)}async function ko(e){let t=oe["openai-codex"],n=await q(await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:t.clientId})}),"Codex device authorization");if(!n.user_code||!n.device_auth_id)throw new Error("Codex device authorization returned incomplete data");let r=`${t.issuer}/codex/device`;e.output(`Open: ${r}`),e.output(`Code: ${n.user_code}`),e.openFn(r);let o=Math.max(3,Number(n.interval||5)),i;for(let a=0;a<Math.ceil(900/o);a+=1){await e.sleepFn(o*1e3);let u=await e.fetchFn(`${t.issuer}/api/accounts/deviceauth/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({device_auth_id:n.device_auth_id,user_code:n.user_code})});if(u.ok){i=await q(u,"Codex device authorization");break}if(![403,404].includes(u.status))throw new Error(`Codex device authorization failed (HTTP ${u.status})`)}if(!i)throw new Error("Codex device authorization timed out");let c=await e.fetchFn(t.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:Ce({grant_type:"authorization_code",code:i.authorization_code,redirect_uri:`${t.issuer}/deviceauth/callback`,client_id:t.clientId,code_verifier:i.code_verifier})});return Ie(await q(c,"Codex OAuth token exchange"),e)}function J(e){let t=new URL(String(e)),n=t.hostname.toLowerCase();if(t.protocol!=="https:"||n!=="x.ai"&&!n.endsWith(".x.ai"))throw new Error("xAI OAuth discovery returned an untrusted endpoint");return t.toString()}async function Eo(e){let t=oe["xai-oauth"],n=await q(await e.fetchFn(t.discoveryUrl,{headers:{accept:"application/json"}}),"xAI OAuth discovery");J(n.authorization_endpoint);let r=J(n.token_endpoint),o=await q(await e.fetchFn(t.deviceUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:Ce({client_id:t.clientId,scope:t.scope})}),"xAI device authorization");if(!o.device_code||!o.user_code||!o.verification_uri)throw new Error("xAI device authorization returned incomplete data");let i=J(o.verification_uri_complete||o.verification_uri);e.output(`Open: ${i}`),e.output(`Code: ${o.user_code}`),e.openFn(i);let c=Math.max(1,Number(o.interval||5)),a=Math.ceil(Math.max(1,Number(o.expires_in||600))/c);for(let u=0;u<a;u+=1){let s=await e.fetchFn(r,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json"},body:Ce({grant_type:"urn:ietf:params:oauth:grant-type:device_code",client_id:t.clientId,device_code:o.device_code})});if(s.ok){let p=await q(s,"xAI OAuth token exchange");return Ie(p,{...e,discovery:{authorization_endpoint:J(n.authorization_endpoint),token_endpoint:r}})}let f="";try{f=String((await s.json())?.error||"")}catch{}if(f==="slow_down")await e.sleepFn((c+1)*1e3);else if(f==="authorization_pending")await e.sleepFn(c*1e3);else throw new Error(`xAI OAuth token exchange failed (HTTP ${s.status}${f?`, ${f}`:""})`)}throw new Error("xAI device authorization timed out")}async function vn(e,t={}){let n=H(e),r={fetchFn:t.fetchFn||globalThis.fetch,inputFn:t.inputFn,sleepFn:t.sleepFn||(o=>new Promise(i=>setTimeout(i,o))),openFn:t.openFn||wo,output:t.output||(o=>process.stdout.write(`${o}
|
|
3
|
+
`)),now:t.now,pkce:t.pkce};return n==="anthropic-oauth"?So(r):n==="openai-codex"?ko(r):Eo(r)}async function lt(e,t,n={}){let r=H(e),o=oe[r],i=me(t);if(!i.refreshToken)throw new Error(`${r} OAuth credential cannot refresh; run oracle auth login`);let c=i.discovery,a,u=n.fetchFn||globalThis.fetch;if(r==="xai-oauth"){if(!c?.token_endpoint){let p=await u(o.discoveryUrl),y=await q(p,"xAI OAuth discovery");c={...y.authorization_endpoint?{authorization_endpoint:J(y.authorization_endpoint)}:{},token_endpoint:J(y.token_endpoint)}}a=J(c.token_endpoint)}else a=o.tokenUrl;let s=await u(a,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json",...r==="anthropic-oauth"?{"user-agent":"axios/1.7.9"}:{}},body:Ce({grant_type:"refresh_token",refresh_token:i.refreshToken,client_id:o.clientId})}),f=await q(s,`${r} OAuth refresh`);return Ie(f,{...n,refreshToken:i.refreshToken,discovery:c})}async function Sn(e,t={}){let n=H(e),r=t.store||ie(),o=r.get(n);if(!o)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let i=ct(t);if(!o.expiresAt||o.expiresAt>i+bn)return o;let c=async()=>{let a=r.get(n);if(!a)throw new Error(`${n} OAuth is not logged in; run oracle auth login ${e}`);let u=ct(t);if(!a.expiresAt||a.expiresAt>u+bn)return a;let s=await lt(n,a,t);return r.set(n,s),s};return typeof r.withLock=="function"?r.withLock(c):c()}function kn(e,t={}){try{return!!(t.store||ie()).get(e)?.accessToken}catch{return!1}}function En(e){let t=at(e);return{kind:"standalone",provider:t.id,model:t.model,baseUrl:t.baseUrl,authType:"oauth",protocol:t.protocol}}var oe,bn,_n,Ao,ft=xt(()=>{G();oe=Object.freeze({"anthropic-oauth":{aliases:["anthropic-oauth","anthropic","claude","claude-oauth"],clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",authorizeUrl:"https://claude.ai/oauth/authorize",tokenUrl:"https://platform.claude.com/v1/oauth/token",redirectUri:"https://console.anthropic.com/oauth/code/callback",scope:"org:create_api_key user:profile user:inference",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-6",protocol:"anthropic-messages"},"openai-codex":{aliases:["openai-codex","openai-oauth","codex","codex-oauth"],clientId:"app_EMoamEEZ73f0CkXaXp7hrann",issuer:"https://auth.openai.com",tokenUrl:"https://auth.openai.com/oauth/token",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.6-sol",protocol:"responses"},"xai-oauth":{aliases:["xai-oauth","xai","grok","grok-oauth"],clientId:"b1a00492-073a-47ea-816f-4c329264a828",issuer:"https://auth.x.ai",discoveryUrl:"https://auth.x.ai/.well-known/openid-configuration",deviceUrl:"https://auth.x.ai/oauth2/device/code",scope:"openid profile email offline_access grok-cli:access api:access",baseUrl:"https://api.x.ai/v1",model:"grok-4.5",protocol:"responses"}}),bn=12e4;Ao={createOAuthStore:ut,getOAuthStore:ie,hasOAuthCredentials:kn,loginOAuth:vn,oauthProviderConfig:at,oauthProviderId:H,oauthRuntimeConfig:En,refreshOAuthCredentials:lt,resolveOAuthCredentials:Sn}});import{spawn as Hn}from"node:child_process";var qn=["SIGINT","SIGTERM","SIGHUP"];function X(e,t=[],n={},r=e){return new Promise(o=>{let i=Hn(e,t,n),c=!1,a=null,u=new Map(qn.map(f=>[f,()=>{a||=f,i.exitCode===null&&i.signalCode===null&&i.kill(f)}]));for(let[f,p]of u)process.on(f,p);let s=()=>{for(let[f,p]of u)process.off(f,p)};i.once("error",f=>{c||(c=!0,s(),process.stderr.write(`oracle: could not start ${r}: ${f.message}
|
|
4
|
+
`),o(1))}),i.once("exit",(f,p)=>{if(c)return;c=!0,s();let y=a||p;if(y){process.kill(process.pid,y);return}o(f??1)})})}import gt from"node:fs";import Z from"node:path";G();var Vn="0.19.0",Oi=`hermes-agent==${Vn}`;var yt="0.12.1",Ci=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${yt}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${yt}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function Xn(){return Z.join(Y(),"runtime")}function Qn(){return Z.join(Xn(),"venv")}function Zn(e){let t=process.platform==="win32"?"Scripts":"bin",n=process.platform==="win32"?`${e}.exe`:e;return Z.join(Qn(),t,n)}function er(){return Zn("hermes")}function tr(e){let t=process.platform==="win32"&&!Z.extname(e)?["",".exe",".cmd",".bat"]:[""];for(let n of(process.env.PATH||"").split(Z.delimiter))if(n)for(let r of t){let o=Z.join(n,`${e}${r}`);try{if(gt.existsSync(o))return o}catch{}}return null}function ue(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let e=tr("hermes");if(e)return{ok:!0,bin:e,source:"path"};let t=er();return gt.existsSync(t)?{ok:!0,bin:t,source:"managed"}:{ok:!1,bin:null,source:null}}G();import ee from"node:fs";import Te from"node:path";var nr=new Set(["auto","standalone","hermes","remote","arch"]),rr=new Set(["openrouter","openai","xai","deepseek","gemini","custom","anthropic-oauth","openai-codex","xai-oauth"]);function bt(){return Te.join(Y(),"model.json")}function D(e){return String(e||"").trim()||void 0}function _t(e={}){let t=D(e.backend)?.toLowerCase()||"auto",n=D(e.provider)?.toLowerCase(),r=D(e.model),o=D(e.baseUrl)?.replace(/\/+$/,""),i=D(e.apiKeyEnv),c=Number.parseInt(String(e.contextLength||""),10),a=D(e.reasoningEffort),u=D(e.computeHost||e.remoteHost),s=D(e.computeUser||e.remoteUser),f=D(e.computePath||e.remotePath);if(!nr.has(t))throw new Error(`unsupported backend: ${t}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(t))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!rr.has(n))throw new Error(`unsupported provider: ${n}`);if(o&&n!=="custom")throw new Error("baseUrl is only supported for the custom provider");if(i&&!/^[A-Z][A-Z0-9_]*$/.test(i))throw new Error("api key env must be an uppercase environment variable name");if(n==="custom"&&!o)throw new Error("custom provider requires baseUrl");if(t==="standalone"&&!r)throw new Error("standalone backend requires a model");if(t==="remote"&&!u)throw new Error("remote backend requires computeHost");return{backend:t,...n?{provider:n}:{},...r?{model:r}:{},...o?{baseUrl:o}:{},...i?{apiKeyEnv:i}:{},...Number.isFinite(c)&&c>0?{contextLength:c}:{},...a?{reasoningEffort:a}:{},...u?{computeHost:u}:{},...s?{computeUser:s}:{},...f?{computePath:f}:{}}}function le(){let e=bt();if(!ee.existsSync(e))return null;try{return _t(JSON.parse(ee.readFileSync(e,"utf8")))}catch{return null}}function wt(e){let t=_t(e),n=bt();R(Te.dirname(n)),process.platform!=="win32"&&ee.chmodSync(Te.dirname(n),448);let r=`${n}.${process.pid}.tmp`;return ee.writeFileSync(r,`${JSON.stringify(t,null,2)}
|
|
5
|
+
`,{mode:384}),ee.renameSync(r,n),process.platform!=="win32"&&ee.chmodSync(n,384),t}G();import A from"node:fs";import S from"node:path";import{spawnSync as Qo}from"node:child_process";import St from"node:fs";import ir from"node:path";var or=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function Re(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function vt(e){let t=Re(e);if(!t)return null;for(let n of or)if(n.key===t||String(n.chainId).toLowerCase()===t||(n.aliases||[]).map(Re).includes(t)||Re(n.name)===t)return n;return null}G();function sr(){return ir.join(Y(),"active-chain.json")}function cr(){let e=sr();if(!St.existsSync(e))return null;try{let t=JSON.parse(St.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let n=vt(t.key);return n?{key:n.key,chainId:n.chainId,name:n.name,agent:n.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function ge(e={}){let t=cr(),n={...process.env,...e};return t&&(n.ORACLE_ACTIVE_CHAIN=t.key,n.ORACLE_ACTIVE_CHAIN_ID=String(t.chainId),n.ORACLE_ACTIVE_AGENT=t.agent||"oracle"),n}import{EventEmitter as Dr}from"node:events";import{spawn as ar}from"node:child_process";import{EventEmitter as ur}from"node:events";import{createInterface as kt}from"node:readline";var lr=15e3,fr=12e4;function dr(e){let t=typeof e=="string"?e:e?.message||"Gateway request failed",n=new Error(t);return n.error=e,n}function pr(e){let t=Buffer.from(e);if(t.length<=4096)return e;let n=t.length-4096;return`${t.subarray(0,4096).toString("utf8")} ... [truncated ${n} bytes]`}function Et({python:e,pythonArgs:t=[],cwd:n,env:r,spawnFn:o=ar,startupTimeoutMs:i=lr,requestTimeoutMs:c=fr}={}){let a=new ur,u=new Map,s=null,f=1,p=null,y=null,x=!1;function _(d){a.listenerCount("error")>0&&a.emit("error",d)}function v(d){for(let w of u.values())clearTimeout(w.timer),w.reject(d);u.clear()}function b(d){if(!("id"in d)){a.emit("event",d);return}let w=u.get(d.id);w&&(u.delete(d.id),clearTimeout(w.timer),"error"in d?w.reject(dr(d.error)):w.resolve(d.result))}function m(){return p||(p=new Promise((d,w)=>{let O=!1,k,g=C=>{O||(O=!0,clearTimeout(k),C?w(C):d())};try{s=o(e,[...t,"-m","tui_gateway.entry"],{cwd:n,env:r})}catch(C){g(C),_(C);return}let I=kt({input:s.stdout}),z=kt({input:s.stderr});I.on("line",C=>{let j;try{j=JSON.parse(C)}catch{a.emit("log",C);return}g(),b(j)}),z.on("line",C=>a.emit("log",pr(C))),s.once("error",C=>{g(C),v(C),_(C)}),s.once("exit",(C,j)=>{x=!0;let se=new Error(`Gateway exited with code ${C} and signal ${j}`);g(se),v(se),a.emit("exit",{code:C,signal:j})}),k=setTimeout(()=>{g(new Error(`Gateway startup timed out after ${i} ms`))},i)}),p)}function h(d,w){if(!s||x)return Promise.reject(new Error("Gateway is not running"));let O=f++;return new Promise((k,g)=>{let I=setTimeout(()=>{u.delete(O),g(new Error(`Gateway request ${O} timed out after ${c} ms`))},c);u.set(O,{resolve:k,reject:g,timer:I});try{s.stdin.write(`${JSON.stringify({id:O,method:d,params:w})}
|
|
6
|
+
`)}catch(z){clearTimeout(I),u.delete(O),g(z)}})}function l(){if(y)return y;if(!s||x)return Promise.resolve();let d=new Error("Gateway stopped while requests were pending");return v(d),y=new Promise(w=>{s.once("exit",w);try{s.kill()}catch{w()}}),y}return{start:m,request:h,stop:l,on(d,w){return a.on(d,w),this},off(d,w){return a.off(d,w),this}}}var fe=Buffer.alloc(0),mr=new Set(["return","backspace","tab","escape","up","down","left","right","home","end","delete","insert","pageup","pagedown","unknown"]),hr={A:"up",B:"down",C:"right",D:"left",H:"home",F:"end",P:"f1",Q:"f2",R:"f3",S:"f4"},xr={1:"home",2:"insert",3:"delete",4:"end",5:"pageup",6:"pagedown",7:"home",8:"end"};function P({name:e=null,ctrl:t=!1,meta:n=!1,shift:r=!1,sequence:o=""}){return{name:e,ctrl:t,meta:n,shift:r,sequence:o}}function It(e){return e<128?1:e>=240?4:e>=224?3:e>=192?2:1}function yr(e){return e>=64&&e<=126}function At(e){let t=e.toLowerCase();return P({name:t,shift:e!==t,sequence:e})}function gr(e){return e===13?P({name:"return",sequence:"\r"}):e===10?P({name:"return",sequence:`
|
|
7
|
+
`}):e===9?P({name:"tab",sequence:" "}):e===127?P({name:"backspace",sequence:"\x7F"}):e===8?P({name:"backspace",sequence:"\b"}):e>=1&&e<=26?P({name:String.fromCharCode(e+96),ctrl:!0,sequence:String.fromCharCode(e)}):P({name:"unknown",sequence:String.fromCharCode(e)})}function br(e){let t=/^\u001b[\[O](\d*)(?:;(\d+))?(.)$/s.exec(e);if(!t)return P({name:"unknown",sequence:e});let n=t[1]===""?null:Number(t[1]),r=t[2]===void 0?null:Number(t[2]),o=t[3],i=null,c=r;if(o==="~"?i=xr[n]??null:(i=hr[o]??null,c===null&&n!==null&&n>1&&(c=n)),!i)return P({name:"unknown",sequence:e});let a=c===null?0:Math.max(0,c-1);return P({name:i,shift:(a&1)!==0,meta:(a&2)!==0,ctrl:(a&4)!==0,sequence:e})}function _r(e,t,n,r){let o=()=>(n.push(P({name:"escape",sequence:"\x1B"})),1);if(t+1>=e.length)return r?o():0;let i=e[t+1];if(i===91||i===79){let s=t+2;for(;s<e.length&&!yr(e[s]);)s+=1;return s>=e.length?r?o():0:(n.push(br(e.toString("utf8",t,s+1))),s+1-t)}if(i===27)return o();let c=It(i);if(t+1+c>e.length)return r?o():0;let a=e.toString("utf8",t+1,t+1+c),u=a.toLowerCase();return n.push(P({name:u,meta:!0,shift:a!==u,sequence:`\x1B${a}`})),1+c}function Ot(e,t){let n=[],r=0;for(;r<e.length;){let o=e[r];if(o===27){let c=_r(e,r,n,t);if(c===0)return{keys:n,rest:Buffer.from(e.subarray(r))};r+=c;continue}if(o<32||o===127){n.push(gr(o)),r+=1;continue}let i=It(o);if(r+i>e.length)return t?(n.push(At(e.toString("utf8",r))),{keys:n,rest:fe}):{keys:n,rest:Buffer.from(e.subarray(r))};n.push(At(e.toString("utf8",r,r+i))),r+=i}return{keys:n,rest:fe}}function Ct(e){return Buffer.isBuffer(e)?e:e==null?fe:typeof e=="string"?Buffer.from(e,"utf8"):Buffer.from(e)}function wr(){let e=fe;return{push(t){let n=e.length===0?Ct(t):Buffer.concat([e,Ct(t)]),{keys:r,rest:o}=Ot(n,!1);return e=o,r},flush(){if(e.length===0)return[];let{keys:t}=Ot(e,!0);return e=fe,t},get pending(){return e.length}}}function vr({history:e=[]}={}){let t=[...e];return{buffer:"",cursor:0,history:t,historyIndex:t.length,draft:""}}function Pe(e,t){if(t<=0)return 0;let n=t-1,r=e.charCodeAt(n);if(r>=56320&&r<=57343&&n>0){let o=e.charCodeAt(n-1);if(o>=55296&&o<=56319)return n-1}return n}function Ne(e,t){if(t>=e.length)return e.length;let n=e.charCodeAt(t);return n>=55296&&n<=56319&&t+1<e.length?t+2:t+1}function E(e,t){return{...e,...t}}function Lt(e,t){return E(e,{...t,historyIndex:e.history.length,draft:""})}function Sr(e){if(e.ctrl||e.meta||!e.sequence||mr.has(e.name))return!1;for(let t of e.sequence){let n=t.codePointAt(0);if(n<32||n===127)return!1}return!0}function kr(e,t){let n=t;for(;n>0&&/\s/.test(e[n-1]);)n-=1;for(;n>0&&!/\s/.test(e[n-1]);)n-=1;return n}function Er(e){if(e.historyIndex<=0)return{state:E(e,{}),action:null};let t=e.historyIndex>=e.history.length,n=e.historyIndex-1,r=e.history[n]??"";return{state:E(e,{buffer:r,cursor:r.length,historyIndex:n,draft:t?e.buffer:e.draft}),action:null}}function Ar(e){if(e.historyIndex>=e.history.length)return{state:E(e,{}),action:null};let t=e.historyIndex+1,n=t>=e.history.length,r=n?e.draft:e.history[t]??"";return{state:E(e,{buffer:r,cursor:r.length,historyIndex:t,draft:n?"":e.draft}),action:null}}function Or(e){let t=e.buffer.trim();if(t==="")return{state:Lt(e,{buffer:"",cursor:0}),action:null};let n=e.history[e.history.length-1]===t?[...e.history]:[...e.history,t];return{state:E(e,{buffer:"",cursor:0,history:n,historyIndex:n.length,draft:""}),action:{type:"submit",value:t}}}function Cr(e,t){if(!t)return{state:E(e,{}),action:null};let{buffer:n,cursor:r}=e;if(t.ctrl&&!t.meta)switch(t.name){case"c":return{state:Lt(e,{buffer:"",cursor:0}),action:{type:"cancel"}};case"d":return n===""?{state:E(e,{}),action:{type:"eof"}}:{state:E(e,{}),action:null};case"l":return{state:E(e,{}),action:{type:"clear"}};case"a":return{state:E(e,{cursor:0}),action:null};case"e":return{state:E(e,{cursor:n.length}),action:null};case"u":return{state:E(e,{buffer:n.slice(r),cursor:0}),action:null};case"k":return{state:E(e,{buffer:n.slice(0,r)}),action:null};case"w":{let o=kr(n,r);return{state:E(e,{buffer:n.slice(0,o)+n.slice(r),cursor:o}),action:null}}case"b":return{state:E(e,{cursor:Pe(n,r)}),action:null};case"f":return{state:E(e,{cursor:Ne(n,r)}),action:null};default:return{state:E(e,{}),action:null}}switch(t.name){case"return":return Or(e);case"left":return{state:E(e,{cursor:Pe(n,r)}),action:null};case"right":return{state:E(e,{cursor:Ne(n,r)}),action:null};case"home":return{state:E(e,{cursor:0}),action:null};case"end":return{state:E(e,{cursor:n.length}),action:null};case"up":return Er(e);case"down":return Ar(e);case"backspace":{if(r===0)return{state:E(e,{}),action:null};let o=Pe(n,r);return{state:E(e,{buffer:n.slice(0,o)+n.slice(r),cursor:o}),action:null}}case"delete":{if(r>=n.length)return{state:E(e,{}),action:null};let o=Ne(n,r);return{state:E(e,{buffer:n.slice(0,r)+n.slice(o)}),action:null}}default:break}if(Sr(t)){let o=t.sequence;return{state:E(e,{buffer:n.slice(0,r)+o+n.slice(r),cursor:r+o.length}),action:null}}return{state:E(e,{}),action:null}}function $t(e={}){let{stdin:t,stdout:n,history:r=[],onSubmit:o,onCancel:i,onEof:c,onClear:a,onRender:u}=e,s=t??process.stdin,f=n??process.stdout,p=wr(),y={submit:o,cancel:i,eof:c,clear:a},x=vr({history:r}),_=!1,v=!1,b=!1,m=l=>{if(!l)return;let d=y[l.type];typeof d=="function"&&d(l.value,x)},h=l=>{for(let d of p.push(l)){let w=Cr(x,d);x=w.state,m(w.action),typeof u=="function"&&u(x)}};return{start(){_||(_=!0,s.isTTY&&typeof s.setRawMode=="function"&&(b=s.isRaw===!0,s.setRawMode(!0),v=!0),typeof s.resume=="function"&&s.resume(),s.on("data",h),typeof u=="function"&&u(x))},stop(){_&&(_=!1,typeof s.off=="function"?s.off("data",h):typeof s.removeListener=="function"&&s.removeListener("data",h),v&&typeof s.setRawMode=="function"&&(s.setRawMode(b),v=!1),typeof s.pause=="function"&&s.pause())},getState(){return x},setState(l){return x=l,x},write(l){f&&typeof f.write=="function"&&f.write(l)},get isRunning(){return _}}}var je="\x1B[?25l",be="\x1B[?25h",Tt="\x1B[2K",_e="\x1B[0J";var Ir="\x1B\\[[0-9;?]*[a-zA-Z]";function Nt(){return new RegExp(Ir,"g")}function Lr(e){return String(e??"").replace(Nt(),"")}function Rt(e,t){return t.some(([n,r])=>e>=n&&e<=r)}function jt(e){return e===0||e<32||e>=127&&e<160||Rt(e,[[768,879],[1155,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1552,1562],[1611,1631],[1648,1648],[1750,1757],[1759,1764],[1767,1768],[1770,1773],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2070,2073],[2075,2083],[2085,2087],[2089,2093],[2137,2139],[2259,2273],[2275,2307],[2362,2364],[2369,2376],[2381,2381],[2385,2391],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2641,2641],[2672,2673],[2677,2677],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2884],[2893,2893],[2902,2902],[2914,2915],[2946,2946],[3008,3008],[3021,3021],[3072,3072],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3170,3171],[3201,3201],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3329,3329],[3393,3396],[3405,3405],[3426,3427],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3981,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4151],[4153,4154],[4157,4158],[4184,4185],[4190,4192],[4209,4212],[4226,4226],[4229,4230],[4237,4237],[4253,4253],[4957,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6277,6278],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6683,6683],[6742,6742],[6744,6750],[6752,6752],[6754,6754],[6757,6764],[6771,6780],[6783,6783],[6832,6911],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7040,7041],[7074,7077],[7080,7081],[7083,7085],[7142,7142],[7144,7145],[7149,7149],[7151,7153],[7212,7219],[7222,7223],[7376,7378],[7380,7392],[7394,7400],[7405,7405],[7412,7412],[7416,7417],[7616,7679],[8203,8207],[8234,8238],[8288,8292],[8294,8303],[8400,8447],[65024,65039],[65056,65071],[917760,917999]])?0:Rt(e,[[4352,4447],[8986,8987],[9001,9002],[9193,9196],[9200,9200],[9203,9203],[9725,9726],[9748,9749],[9800,9811],[9855,9855],[9875,9875],[9889,9889],[9898,9899],[9917,9918],[9924,9925],[9934,9934],[9940,9940],[9962,9962],[9970,9971],[9973,9973],[9978,9978],[9981,9981],[9989,9989],[9994,9995],[10024,10024],[10060,10060],[10062,10062],[10067,10069],[10071,10071],[10133,10135],[10160,10160],[10175,10175],[11035,11036],[11088,11088],[11093,11093],[11904,12350],[12352,42191],[44032,55203],[63744,64255],[65040,65049],[65072,65135],[65280,65376],[65504,65510],[127744,128591],[129280,129535],[131072,262141]])?2:1}function $r(e){let t=0;for(let n of Array.from(e))t+=jt(n.codePointAt(0));return t}function Tr(e){return $r(Lr(e))}function Rr(e){return/^\u001b\[0*m$/.test(e)}function Pt(e,t){let n="",r=0;for(let o of Array.from(e)){let i=jt(o.codePointAt(0));if(r+i>t)break;n+=o,r+=i}return{text:n,width:r}}function Pr(e,t){let n=String(e??"");if(t<=0)return"";if(Tr(n)<=t)return n;let r=Nt(),o="",i=0,c=!1,a=0,u=r.exec(n);for(;u!==null;){let f=Pt(n.slice(a,u.index),t-i);if(o+=f.text,i+=f.width,i>=t)return c?`${o}\x1B[0m`:o;o+=u[0],u[0].endsWith("m")&&(c=!Rr(u[0])),a=u.index+u[0].length,u=r.exec(n)}let s=Pt(n.slice(a),t-i);return o+=s.text,c?`${o}\x1B[0m`:o}function Nr(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}function Mt({stdout:e,rows:t,columns:n}={}){if(!e||typeof e.write!="function")throw new TypeError("createRenderer requires a stdout with a write(string) method");let r=Number.isFinite(t)?Math.trunc(t):null,o=Number.isFinite(n)?Math.trunc(n):null,i=r??(Number.isFinite(e.rows)?Math.trunc(e.rows):24),c=o??(Number.isFinite(e.columns)?Math.trunc(e.columns):80),a=[],u=0,s=null,f=!1,p=!1,y=()=>{r===null&&(i=Number.isFinite(e.rows)?Math.trunc(e.rows):24),o===null&&(c=Number.isFinite(e.columns)?Math.trunc(e.columns):80),f=!0},x=typeof e.on=="function";x&&e.on("resize",y);function _(m){let h=m-u;return u=m,h===0?"":h<0?`\x1B[${-h}A`:`\x1B[${h}B`}function v(m){let l=(Array.isArray(m)?m:[]).map(d=>Pr(String(d??""),c));if(s!==null)for(l.length>s&&(l=l.slice(0,s));l.length<s;)l.push("");return l}function b(m){if(!f&&Nr(a,m))return;let h=[je];f&&a.length>0&&(h.push(_(0),"\r",_e),a=[],u=0),f=!1;let l=Math.min(a.length,m.length);for(let d=0;d<l;d+=1)a[d]!==m[d]&&h.push(_(d),"\r",Tt,m[d]);if(m.length>a.length){a.length>0&&h.push(_(a.length-1));for(let d=a.length;d<m.length;d+=1)d>0&&h.push(`
|
|
8
|
+
`),h.push("\r",Tt,m[d]),u=d}else m.length<a.length&&h.push(_(m.length),"\r",_e);m.length>0&&h.push(_(m.length-1)),h.push(be),a=m,e.write(h.join(""))}return{render(m){p||b(v(m))},writeAbove(m){if(p)return;let h=String(m??""),l=je;a.length>0&&(l+=`${_(0)}\r${_e}`),l+=h.endsWith(`
|
|
9
|
+
`)||h===""?h:`${h}
|
|
10
|
+
`,e.write(l);let d=a;a=[],u=0,d.length>0?b(d):e.write(be)},clear(){if(p)return;let m=je;a.length>0&&(m+=`${_(0)}\r${_e}`),m+=be,e.write(m),a=[],u=0,f=!1},setLines(m){s=Number.isFinite(m)&&m>=0?Math.trunc(m):null},getLines(){return a.slice()},getSize(){return{rows:i,columns:c}},dispose(){if(!p){if(p=!0,x){let m=typeof e.off=="function"?e.off:e.removeListener;typeof m=="function"&&m.call(e,"resize",y)}e.write(be)}}}}var L=Object.freeze({accent:"#B8F0FF",prompt:"#B8F0FF",banner_title:"#B8F0FF",banner_accent:"#91C2D7",ui_label:"#A5D9EB",banner_text:"#EAF2F8",status_bar_strong:"#EAF2F8",banner_border:"#455867",input_rule:"#455867",session_border:"#455867",banner_dim:"#60717F",status_bar_dim:"#60717F",status_bar_bg:"#11161B",status_bar_text:"#91A2B1",ok:"#7EE7B5",error:"#FF7B7B",warn:"#F0C674",bad:"#FF9B71",selection_bg:"#23313B"});function jr(e){if(typeof e!="string")return null;let t=e.startsWith("#")?e.slice(1):e;if(!/^(?:[\da-f]{3}|[\da-f]{6})$/i.test(t))return null;let n=t.length===3?[...t].map(r=>r.repeat(2)).join(""):t;return{r:Number.parseInt(n.slice(0,2),16),g:Number.parseInt(n.slice(2,4),16),b:Number.parseInt(n.slice(4,6),16)}}function Ft(e,t,n){let r=jr(t);return r?`\x1B[${e};2;${r.r};${r.g};${r.b}m${String(n)}\x1B[0m`:String(n)}function Me({color:e=!0}={}){return e&&!Object.hasOwn(process.env,"NO_COLOR")?Object.freeze({fg:(n,r)=>Ft(38,n,r),bg:(n,r)=>Ft(48,n,r),bold:n=>`\x1B[1m${String(n)}\x1B[0m`,dim:n=>`\x1B[2m${String(n)}\x1B[0m`}):Object.freeze({fg:(n,r)=>String(r),bg:(n,r)=>String(r),bold:n=>String(n),dim:n=>String(n)})}var Yi=Me();function Ut(e){return String(e).replace(/\u001B\[[0-9;]*m/g,"")}var Dt=Object.freeze([["#B8F0FF"," \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 "],["#B8F0FF"," \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 "],["#ACDEEF"," \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588 "],["#A5D9EB"," \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591 "],["#9FCBDD"," \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 "],["#B8F0FF"," \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 "]]),Fe="THE FUTURE IS AGENTIC / by DEMI",Ue=/\u001B\[[0-9;]*m/g;function Kt(e){if(new RegExp("\\p{Mark}","u").test(e))return 0;let t=e.codePointAt(0);return t===8205||t===65039?0:t>=4352&&(t<=4447||t===9001||t===9002||t>=11904&&t<=42191&&t!==12351||t>=44032&&t<=55203||t>=63744&&t<=64255||t>=65040&&t<=65049||t>=65072&&t<=65135||t>=65280&&t<=65376||t>=65504&&t<=65510||t>=127744&&t<=129791||t>=131072&&t<=262141)?2:t<32||t>=127&&t<160?0:1}function B(e){return[...Ut(e)].reduce((t,n)=>t+Kt(n),0)}function Be(e,t){if(t<=0)return"";let n=String(e).split(/(\u001B\[[0-9;]*m)/g),r="",o=0,i=!1;for(let c of n)if(c){if(Ue.test(c)){Ue.lastIndex=0,r+=c,i=c!=="\x1B[0m";continue}Ue.lastIndex=0;for(let a of c){let u=Kt(a);if(o+u>t)return i?`${r}\x1B[0m`:r;r+=a,o+=u}}return r}function te(e,t,n="left"){let r=Math.max(0,Math.floor(Number(t)||0)),o=Be(String(e),r),i=Math.max(0,r-B(o));if(n==="right")return`${" ".repeat(i)}${o}`;if(n==="center"){let c=Math.floor(i/2);return`${" ".repeat(c)}${o}${" ".repeat(i-c)}`}return`${o}${" ".repeat(i)}`}function Ke(e,t){let n=Math.max(1,Math.floor(Number(t)||1)),r=[];for(let o of String(e??"").split(`
|
|
11
|
+
`)){if(o===""){r.push("");continue}let i="",c=0;for(let a of o.split(" ")){let u=B(a);if(c>0&&c+1+u>n&&(r.push(i),i="",c=0),u>n){c>0&&(r.push(i),i="",c=0);let s=a;for(;B(s)>n;){let f=Be(s,n);r.push(f),s=s.slice(f.length)}i=s,c=B(s);continue}i=c===0?a:`${i} ${a}`,c=c===0?u:c+1+u}r.push(i)}return r}function Mr(e){let t=Math.max(0,Math.floor(Number(e)||0)),n=Math.max(36,Math.min(t-4,76)),r=Math.max(0,Math.floor((t-n)/2)),o=r+3,i=Math.max(0,n-6);return{target:t,panelWidth:n,panelLeft:r,contentLeft:o,inner:i}}function Fr(e){let t=1/0,n=-1;for(let r of e)for(let o=0;o<r.length;o+=1)r[o]!==" "&&(o<t&&(t=o),o>n&&(n=o));return n<0?{offset:0,width:0}:{offset:t,width:n-t+1}}function Bt(e,t,n=0){let{target:r,contentLeft:o,inner:i}=e,a=Math.round((r-t)/2)-n-o,u=Math.max(0,i-t-n);return Math.max(0,Math.min(u,a))}function He({width:e,palette:t}){let n=Mr(e),{target:r,panelWidth:o,panelLeft:i,inner:c}=n;if(r<72||c<=0)return[te(t.bold(t.fg(L.accent,"oracle")),r,"center"),te(t.fg(L.banner_text,Fe),r,"center")];let a=Dt.map(([,l])=>l),{offset:u,width:s}=Fr(a),f=" ".repeat(Bt(n,s,u)),p=" ".repeat(Bt(n,B(Fe))),y=[];for(let[l,d]of Dt)y.push(t.bold(t.fg(l,`${f}${d.replace(/\s+$/,"")}`)));y.push(""),y.push(t.bold(t.fg(L.banner_text,`${p}${Fe}`)));let x=l=>t.fg(L.banner_border,l),_=" ".repeat(i),v="\u2500".repeat(Math.max(0,o-2)),b=l=>te(`${_}${l}`,r),m=[b(`${x("\u256D")}${x(v)}${x("\u256E")}`)],h=b(`${x("\u2502")}${" ".repeat(Math.max(0,o-2))}${x("\u2502")}`);m.push(h);for(let l of y)m.push(b(`${x("\u2502")} ${te(l,c)} ${x("\u2502")}`));return m.push(h),m.push(b(`${x("\u2570")}${x(v)}${x("\u256F")}`)),m}function Ht({lines:e,width:t,palette:n,title:r=""}){let o=Math.max(2,Math.floor(Number(t)||0)),i=Math.max(0,o-2),c=Be(String(r),Math.max(0,i-2)),a=c?` ${c} `:"",u=`${a}${"\u2500".repeat(Math.max(0,i-B(a)))}`,s=f=>n.fg(L.banner_border,f);return[`${s("\u256D")}${s(u)}${s("\u256E")}`,...e.map(f=>`${s("\u2502")}${te(f,i)}${s("\u2502")}`),`${s("\u2570")}${s("\u2500".repeat(i))}${s("\u256F")}`]}function De(e){let t=Number(e);return Number.isFinite(t)?t>=1e6?`${(t/1e6).toFixed(1).replace(/\.0$/,"")}M`:t>=1e3?`${(t/1e3).toFixed(0)}K`:String(Math.round(t)):"0"}function Ur(e,t){let n=Math.max(0,Math.floor(Number(t)||0)),r=Number(e),o=Number.isFinite(r)?Math.min(100,Math.max(0,r)):0,i=Math.round(n*o/100);return`${"\u2588".repeat(i)}${"\u2591".repeat(n-i)}`}function we(e){let t=Number(e);if(!Number.isFinite(t)||t<0)return"0s";let n=Math.floor(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),o=n%60;return r<60?`${r}m${String(o).padStart(2,"0")}s`:`${Math.floor(r/60)}h${String(r%60).padStart(2,"0")}m`}function qt({model:e,contextTokens:t,contextLength:n,percent:r,effort:o,thinking:i,chain:c,width:a,palette:u}){let s=Math.max(0,Math.floor(Number(a)||0)),f=u.fg(L.status_bar_dim," / "),p=s>=120?12:s>=60?8:4,y=Number(n)>0?`${De(t)}/${De(n)}`:De(t),x=Number.isFinite(Number(r))?`${Math.round(Number(r))}%`:"0%",_=[{text:String(e??""),strong:!0}];Number(n)>0&&_.push({text:`ctx ${Ur(r,p)} ${y} ${x}`}),o&&_.push({text:String(o)}),i&&_.push({text:String(i)}),typeof c=="string"&&c.length>0&&_.push({text:c});let v=_,b=h=>h.reduce((l,d,w)=>l+B(d.text)+(w>0?3:0),0);for(;v.length>1&&b(v)>s;)v=v.slice(0,-1);let m=v.map(h=>h.strong?u.fg(L.status_bar_strong,h.text):u.fg(L.status_bar_text,h.text)).join(f);return u.bg(L.status_bar_bg,te(m,s))}var Br=6;function Kr(e=[]){let t={pass:[],query:null,model:null,provider:null,quiet:!1,cont:!1};for(let n=0;n<e.length;n+=1){let r=e[n];if((r==="-q"||r==="--query")&&e[n+1]){t.query=e[++n],t.pass.push("-q",t.query);continue}if((r==="--model"||r==="-m")&&e[n+1]){t.model=e[++n],t.pass.push("--model",t.model);continue}if(r==="--provider"&&e[n+1]){t.provider=e[++n],t.pass.push("--provider",t.provider);continue}if(r==="--quiet"||r==="-Q"){t.quiet=!0,t.pass.push(r);continue}if(r==="--continue"||r==="-c"){t.cont=!0,t.pass.push("--continue");continue}t.pass.push(r)}return t}function qe(e,t){if(!t||typeof t!="object")return;let n=Number(t.context_used??t.context_tokens??t.input??t.prompt),r=Number(t.context_max??t.context_length);Number.isFinite(n)&&n>0&&(e.contextTokens=n),Number.isFinite(r)&&r>0&&(e.contextLength=r);let o=Number(t.context_percent);Number.isFinite(o)?e.contextPercent=o:e.contextLength>0&&(e.contextPercent=Math.round(e.contextTokens/e.contextLength*100))}function Hr(e){let t=e.width,n=`${e.promptLabel} `,r=Math.max(1,t-2-B(n)),o=e.buffer||"",i=Math.max(0,Math.min(e.cursor??o.length,o.length)),c=0;i>r&&(c=i-r);let a=o.slice(c,c+r),u=i-c,s=a.slice(0,u),f=a.slice(u,u+1)||" ",p=a.slice(u+1),y=e.palette;return[`${y.fg(L.accent,n)}${s}${y.bg(L.selection_bg,f)}${p}`]}function qr(e){let t=e.width,n=[];if(e.liveLines.length>0){for(let r of e.liveLines.slice(-Br))n.push(r);n.push("")}return n.push(...Ht({lines:Hr(e),width:t,palette:e.palette,title:"Ask Oracle \u203A"})),n.push(qt({model:e.model,contextTokens:e.contextTokens,contextLength:e.contextLength,percent:e.contextPercent,effort:e.effort,thinking:e.thinking,chain:e.chain,width:t,palette:e.palette})),n}function zr(e){let t=e?.params||e||{};return{type:t.type||e?.type||"",sessionId:t.session_id||e?.session_id||"",payload:t.payload||e?.payload||{}}}function ve(e={}){return typeof e.text=="string"?e.text:typeof e.rendered=="string"?e.rendered:typeof e.message=="string"?e.message:""}function Yr(e={}){let t=e.stdout||process.stdout,n=e.stdin||process.stdin,r=Math.max(20,Number(t.columns||e.columns||80)),o=e.palette||Me({color:t.isTTY!==!1}),i=e.renderer||Mt({stdout:t,rows:t.rows,columns:r}),c=e.client||Et({python:e.python,pythonArgs:e.pythonArgs||[],cwd:e.cwd||process.cwd(),env:e.env||process.env,spawnFn:e.spawnFn,startupTimeoutMs:e.startupTimeoutMs,requestTimeoutMs:e.requestTimeoutMs}),a=new Dr,u=e.now||(()=>Date.now()),s={palette:o,width:r,promptLabel:"oracle \u203A",buffer:"",cursor:0,model:e.model||"model",contextTokens:0,contextLength:0,contextPercent:0,effort:e.effort||"",thinking:"0s",chain:(e.env||process.env).ORACLE_ACTIVE_CHAIN||"",busy:!1,cancelled:!1,sessionId:null,assistantBuffer:"",flushedLines:0,liveLines:[],startedAt:0},f=null,p=null,y={renderer:i,state:s};function x(){i.render(qr(s))}function _(k){i.writeAbove(`${k}
|
|
12
|
+
`)}function v(){let k=s.assistantBuffer.split(`
|
|
13
|
+
`),g=k[k.length-1]||"";s.liveLines=g?Ke(g,s.width):[]}function b({final:k=!1}={}){let g=s.assistantBuffer.split(`
|
|
14
|
+
`),I=k?g.length:g.length-1,z=!1;for(;s.flushedLines<I;){let C=g[s.flushedLines];for(let j of Ke(C,s.width))_(j);s.flushedLines+=1,z=!0}return k?s.liveLines=[]:v(),z}function m(){p||(p=setInterval(()=>{s.busy&&(s.thinking=we(u()-s.startedAt),x())},250),typeof p.unref=="function"&&p.unref())}function h(){p&&(clearInterval(p),p=null)}async function l(k){let g=String(k||"").trim();if(g){if(g==="/exit"||g==="/quit"){await O();return}if(g==="/clear"){i.clear();for(let I of He({width:s.width,palette:o}))_(I);x();return}s.busy=!0,s.assistantBuffer="",s.flushedLines=0,s.liveLines=[],s.startedAt=u(),s.thinking="0s",_(`${o.bold(o.fg(L.prompt,"you"))} ${g}`),_(""),m(),x(),await c.request("prompt.submit",{session_id:s.sessionId,text:g})}}function d(k){let g=zr(k);if(g.type!=="gateway.ready"){if(g.type==="session.info"&&g.payload){g.payload.model&&(s.model=g.payload.model),g.payload.reasoning_effort&&(s.effort=g.payload.reasoning_effort),qe(s,g.payload.usage),x();return}if(g.type==="message.start"){s.busy=!0,s.cancelled=!1,s.assistantBuffer="",s.flushedLines=0,s.liveLines=[],_(o.bold(o.fg(L.accent,"oracle"))),x();return}if(g.type==="thinking.delta"||g.type==="reasoning.delta"){if(s.cancelled)return;ve(g.payload).trim()&&(s.thinking=`${we(u()-s.startedAt)}`),x();return}if(g.type==="message.delta"){if(s.cancelled)return;s.assistantBuffer+=ve(g.payload),b(),x();return}if(g.type==="message.complete"){if(s.cancelled){s.cancelled=!1;return}let I=ve(g.payload);I&&I.length>=s.assistantBuffer.length&&(s.assistantBuffer=I),b({final:!0}),_(""),s.busy=!1,h(),qe(s,g.payload?.usage||g.payload?.context),s.thinking=we(u()-s.startedAt),x();return}g.type==="error"&&(s.busy=!1,h(),_(o.fg(L.error,`error: ${ve(g.payload)||"unknown"}`)),x())}}async function w(){await c.start(),c.on("event",d),c.on("log",g=>a.emit("log",g)),c.on("error",g=>a.emit("error",g));let k=await c.request("session.create",{cols:s.width,cwd:e.cwd||process.cwd(),source:"cli",profile:e.profile||"oracle",close_on_disconnect:!0,...e.model?{model:e.model}:{},...e.provider?{provider:e.provider}:{}});s.sessionId=k.session_id,s.model=k.info?.model||s.model,k.info?.reasoning_effort&&(s.effort=k.info.reasoning_effort),qe(s,k.info?.usage);for(let g of He({width:s.width,palette:o}))_(g);_(""),x(),f=$t({stdin:n,stdout:t,onSubmit:g=>{l(g).catch(I=>a.emit("error",I))},onCancel:()=>{s.busy&&(s.busy=!1,s.cancelled=!0,h(),b({final:!0}),_(o.fg(L.warn,"interrupted")),_(""),x(),c.request("session.interrupt",{session_id:s.sessionId}).catch(g=>a.emit("error",g)))},onEof:()=>{O().catch(g=>a.emit("error",g))},onClear:()=>{i.clear(),x()},onRender:g=>{s.buffer=g.buffer||"",s.cursor=g.cursor??s.buffer.length,x()}}),f.start()}async function O(){h(),f&&f.stop(),i.dispose(),await c.stop(),a.emit("stop")}return Object.freeze({start:w,stop:O,on:a.on.bind(a),off:a.off.bind(a),state:s,handleEvent:d,submit:l})}async function ze({hermesPython:e,client:t,tuiFactory:n=Yr,args:r=[],env:o=process.env,cwd:i=process.cwd(),stdout:c=process.stdout,stdin:a=process.stdin}={}){let u=Kr(r);if(u.query)return{native:!1,pass:u.pass};if(!a.isTTY||!c.isTTY)return{native:!1,pass:u.pass};if(o.ORACLE_NATIVE_TUI==="0")return{native:!1,pass:u.pass};let s=e;if(!t&&!s)return{native:!1,pass:u.pass};let f=ge({...o,ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:"oracle",ORACLE_NODE_BIN:process.execPath}),p=n({...t?{client:t}:{},...s?{python:s.command,pythonArgs:s.prefix||[]}:{},cwd:i,env:f,stdin:a,stdout:c,model:u.model,provider:u.provider,profile:"oracle"});return p.on("log",y=>{o.ORACLE_CLI_DEBUG&&process.stderr.write(`${y}
|
|
15
|
+
`)}),p.on("error",y=>{process.stderr.write(`oracle chat: ${y.message}
|
|
16
|
+
`)}),await p.start(),new Promise(y=>{let x=!1,_=async()=>{x||(x=!0,await p.stop(),y({native:!0,code:0}))};p.on("stop",()=>{x||(x=!0,y({native:!0,code:0}))}),process.once("SIGINT",_),process.once("SIGTERM",_)})}import Wr from"node:fs";import zt from"node:path";var Yt=Object.freeze({openrouter:{key:"OPENROUTER_API_KEY",baseUrl:"https://openrouter.ai/api/v1",model:"openrouter/auto"},openai:{key:"OPENAI_API_KEY",baseUrl:"https://api.openai.com/v1",model:"gpt-4.1-mini"},xai:{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest"},deepseek:{key:"DEEPSEEK_API_KEY",baseUrl:"https://api.deepseek.com/v1",model:"deepseek-chat"},gemini:{key:"GEMINI_API_KEY",alternateKey:"GOOGLE_API_KEY",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",model:"gemini-2.5-flash"}}),Gr=Object.freeze({"anthropic-oauth":{key:"ANTHROPIC_API_KEY",baseUrl:"https://api.anthropic.com/v1",model:"claude-sonnet-4-20250514",protocol:"anthropic-messages"},"openai-codex":{key:"OPENAI_API_KEY",baseUrl:"https://chatgpt.com/backend-api/codex",model:"gpt-5.4",protocol:"responses"},"xai-oauth":{key:"XAI_API_KEY",baseUrl:"https://api.x.ai/v1",model:"grok-4-latest",protocol:"responses"}});function Jr(e,t){let n=Number(e);return Number.isSafeInteger(n)&&n>0?n:t}function Vr(e,t){let n=String(e.ORACLE_PROVIDER||t.provider||"").trim().toLowerCase();if(n)return n;if(e.ORACLE_BASE_URL||t.baseUrl)return"custom";for(let[r,o]of Object.entries(Yt))if(e[o.key]||o.alternateKey&&e[o.alternateKey])return r;return null}function Xr(e=process.env,t={},n=()=>!1,r=()=>""){let o=Vr(e,t);if(!o)return null;let i=Gr[o],c=Yt[o]||i,a=String(e.ORACLE_API_KEY_ENV||t.apiKeyEnv||""),u=String(e.ORACLE_API_KEY||a&&e[a]||c&&(e[c.key]||c.alternateKey&&e[c.alternateKey])||r(o)||""),s=String(i?i.baseUrl:o==="custom"?e.ORACLE_BASE_URL||t.baseUrl||"":c?.baseUrl||"").replace(/\/+$/,""),f=String(e.ORACLE_MODEL||t.model||c?.model||"");if(!s||!f)return null;let p=!!(i&&n(o));return i&&!p||!i&&o!=="custom"&&!u?null:{kind:"standalone",provider:o,model:f,baseUrl:s,...p?{authType:"oauth",protocol:i.protocol}:{apiKey:u},contextLength:Jr(e.ORACLE_CONTEXT_LENGTH||t.contextLength,128e3),reasoningEffort:String(e.ORACLE_REASONING_EFFORT||t.reasoningEffort||"high")}}function ne(e=""){return["Oracle runs its own native chat \u2014 no Hermes or external agent required.","Set OPENROUTER_API_KEY, run `oracle auth login claude|codex|grok`, or configure a custom OpenAI-compatible endpoint.","`oracle harness detect` finds any Agent Plugins-compatible clients installed on this machine.",e].filter(Boolean).join(`
|
|
17
|
+
`)}function Qr(e=process.env,t={}){if(e.ORACLE_PUBLIC_DESKTOP==="1"||e.ORACLE_REMOTE_COMPUTE_DISABLE==="1")return null;let n=String(e.ORACLE_CHAT_BACKEND||t.backend||"auto").trim().toLowerCase(),r=String(e.ORACLE_COMPUTE_HOST||t.computeHost||"").trim();if(!["remote","arch"].includes(n)&&!e.ORACLE_COMPUTE_HOST||!r)return null;let o=String(e.ORACLE_COMPUTE_USER||t.computeUser||"").trim(),i=String(e.ORACLE_COMPUTE_PATH||t.computePath||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin").trim();return{kind:"remote",host:r,user:o,path:i}}var Zr=Object.freeze([{name:"oracle",bin:"oracle",label:"Oracle Native (default)",kind:"oracle"},{name:"hermes",bin:"hermes",label:"Hermes Agent",kind:"hermes"},{name:"opencode",bin:"opencode",label:"OpenCode",kind:"mcp"},{name:"claude",bin:"claude",label:"Claude Code",kind:"mcp"},{name:"codex",bin:"codex",label:"OpenAI Codex CLI",kind:"mcp"},{name:"cursor",bin:"cursor",label:"Cursor IDE",kind:"mcp"},{name:"windsurf",bin:"windsurf",label:"Windsurf",kind:"mcp"},{name:"aider",bin:"aider",label:"Aider",kind:"mcp"},{name:"continue",bin:"continue",label:"Continue",kind:"mcp"}]);function eo(e){for(let t of(process.env.PATH||"").split(zt.delimiter)){let n=zt.join(t,e);try{if(Wr.existsSync(n))return n}catch{}}return null}function Wt({env:e=process.env,hermes:t={ok:!1},storedConfig:n=null,oauthAvailable:r=()=>!1,apiKeyResolver:o=()=>""}={}){let i=String(e.ORACLE_CHAT_BACKEND||n?.backend||"auto").trim().toLowerCase(),c=Qr(e,n||{});if(i==="remote"||i==="arch")return c?{kind:"remote",config:c}:{kind:"unconfigured",reason:ne(`${i} compute backend was requested, but no compute host is configured.`)};let a=Xr(e,n||{},r,o);if(i==="standalone")return a?{kind:"standalone",config:a}:{kind:"unconfigured",reason:ne("ORACLE_CHAT_BACKEND=standalone was requested, but no standalone model is configured.")};if(i==="hermes")return t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:ne("ORACLE_CHAT_BACKEND=hermes was requested, but Hermes was not found.")};if(i!=="auto"){for(let u of Zr)if(u.name===i){let s=eo(u.bin);return s?{kind:"harness",harness:{...u,path:s}}:{kind:"unconfigured",reason:ne(`ORACLE_CHAT_BACKEND=${i} was requested, but ${u.bin} was not found on PATH.`)}}return{kind:"unconfigured",reason:ne(`Unknown ORACLE_CHAT_BACKEND value: ${i}`)}}return c?{kind:"remote",config:c}:a?{kind:"standalone",config:a}:t?.ok?{kind:"hermes",bin:t.bin}:{kind:"unconfigured",reason:ne()}}G();import Oo from"node:fs";import Ln from"node:path";import{randomUUID as On}from"node:crypto";import{EventEmitter as Co}from"node:events";import{spawnSync as Io}from"node:child_process";import Se from"node:fs";import Gt from"node:path";import{homedir as to}from"node:os";var We=process.env.ORACLE_CONFIG_DIR||Gt.join(to(),".config","oracle"),Jt=Gt.join(We,"memory.json"),Ye=2200;function Vt(e){Se.existsSync(e)||Se.mkdirSync(e,{recursive:!0})}function Ge(){Vt(We);try{let e=Se.readFileSync(Jt,"utf8");return JSON.parse(e)}catch{return{version:1,updatedAt:new Date().toISOString(),entries:[]}}}function Xt(e){Vt(We),e.updatedAt=new Date().toISOString(),Se.writeFileSync(Jt,JSON.stringify(e,null,2),{mode:384})}function Qt(e,t){let n=Ge(),r=n.entries.findIndex(o=>o.key===e);for(r>=0?n.entries[r]={key:e,content:t,addedAt:new Date().toISOString()}:n.entries.push({key:e,content:t,addedAt:new Date().toISOString()});JSON.stringify(n.entries).length>Ye&&n.entries.length>1;)n.entries.shift();Xt(n)}function Zt(e){let t=Ge(),n=t.entries.length;return t.entries=t.entries.filter(r=>r.key!==e),t.entries.length<n?(Xt(t),{ok:!0}):{ok:!1}}function en(){let e=Ge();if(e.entries.length===0)return"";let t=JSON.stringify(e.entries).length,n=Math.round(t/Ye*100),r=e.entries.map(o=>`${o.key}: ${o.content}`);return["\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",`MEMORY [${n}% \u2014 ${t}/${Ye} chars]`,"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550",...r].join(`
|
|
18
|
+
`)}var tn=[{type:"function",function:{name:"memory_add",description:"Save a durable fact to memory for future sessions.",parameters:{type:"object",properties:{key:{type:"string",description:"Short unique key"},content:{type:"string",description:"The fact to remember"}},required:["key","content"],additionalProperties:!1}}},{type:"function",function:{name:"memory_remove",description:"Remove a memory entry by key.",parameters:{type:"object",properties:{key:{type:"string",description:"The key to remove"}},required:["key"],additionalProperties:!1}}}];import K from"node:fs";import ke from"node:path";import{homedir as no}from"node:os";var ro=process.env.ORACLE_CONFIG_DIR||ke.join(no(),".config","oracle"),de=ke.join(ro,"skills"),oo=/^[a-z0-9][a-z0-9_-]{0,63}$/;function nn(e){K.existsSync(e)||K.mkdirSync(e,{recursive:!0})}function rn(e){let t=String(e??"").trim();if(!oo.test(t))throw new Error("invalid skill name");return ke.join(de,`${t}.md`)}function Je(){nn(de);let e=[];try{for(let t of K.readdirSync(de,{withFileTypes:!0})){if(!t.isFile()||!t.name.endsWith(".md"))continue;let n=ke.join(de,t.name),r=K.readFileSync(n,"utf8"),o=t.name.replace(/\.md$/,""),i="",c=r.match(/^description:\s*(.+)$/m);c?i=c[1].trim():i=r.split(`
|
|
19
|
+
`)[0].replace(/^#+\s*/,"").trim()||o,e.push({name:o,description:i,path:n,size:r.length})}}catch{}return e}function Ve(e){try{let t=rn(e);return K.lstatSync(t).isFile()?K.readFileSync(t,"utf8"):null}catch{return null}}function on(e){let t=Je();if(t.length===0)return`## Skills
|
|
20
|
+
No skills installed. Use skill_create to save a successful workflow.
|
|
21
|
+
`;let n=t;if(e){let o=e.toLowerCase();n=[...t].sort((i,c)=>{let a=(i.name.toLowerCase().includes(o)?2:0)+(i.description.toLowerCase().includes(o)?1:0);return(c.name.toLowerCase().includes(o)?2:0)+(c.description.toLowerCase().includes(o)?1:0)-a})}return["## Skills","Available (use skill_load <name>):",...n.map(o=>`- **${o.name}**: ${o.description}`)].join(`
|
|
22
|
+
`)}function sn(e,t){nn(de);let n=rn(e);if(K.existsSync(n)&&!K.lstatSync(n).isFile())throw new Error("skill path must be a regular file");K.writeFileSync(n,t,{mode:384})}var cn=[{type:"function",function:{name:"skill_load",description:"Load full content of a skill by name.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Skill name using lowercase letters, digits, hyphens, or underscores"}},required:["name"],additionalProperties:!1}}},{type:"function",function:{name:"skill_create",description:"Save a new skill from a workflow or pattern.",parameters:{type:"object",properties:{name:{type:"string",pattern:"^[a-z0-9][a-z0-9_-]{0,63}$",description:"Lowercase letters, digits, hyphens, or underscores"},content:{type:"string",description:"Full SKILL.md content"}},required:["name","content"],additionalProperties:!1}}},{type:"function",function:{name:"skill_list",description:"List all installed skills.",parameters:{type:"object",properties:{},additionalProperties:!1}}}];import Ee from"node:fs";import un from"node:path";import{homedir as io}from"node:os";import{EventEmitter as so}from"node:events";var Xe=process.env.ORACLE_CONFIG_DIR||un.join(io(),".config","oracle"),ln=un.join(Xe,"cron.json");function fn(e){Ee.existsSync(e)||Ee.mkdirSync(e,{recursive:!0})}function pe(){fn(Xe);try{return JSON.parse(Ee.readFileSync(ln,"utf8"))}catch{return{version:1,jobs:[]}}}function Qe(e){fn(Xe),Ee.writeFileSync(ln,JSON.stringify(e,null,2),{mode:384})}function Ae(e){let t=String(e||"").toLowerCase().trim(),n=t.match(/^every\s+(\d+)\s*m/i);if(n)return parseInt(n[1])*6e4;let r=t.match(/^every\s+(\d+)\s*h/i);return r?parseInt(r[1])*36e5:t.includes("daily")?864e5:t.includes("hourly")?36e5:t.split(/\s+/).length===5?6e4:null}function Ze(){return pe().jobs}function et(e){let t=pe(),n=`cron_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,6)}`,r=Ae(e.schedule)||36e5,o={...e,id:n,createdAt:new Date().toISOString(),nextRunAt:new Date(Date.now()+r).toISOString()};return t.jobs.push(o),Qe(t),o}function tt(e){let t=pe(),n=t.jobs.length;return t.jobs=t.jobs.filter(r=>r.id!==e),t.jobs.length<n?(Qe(t),!0):!1}function an(e){let t=pe(),n=t.jobs.find(i=>i.id===e);if(!n)return;n.lastRunAt=new Date().toISOString();let r=Ae(n.schedule)||36e5,o=n.lastRunAt?new Date(n.lastRunAt).getTime():Date.now();n.nextRunAt=new Date(o+r).toISOString(),Qe(t)}function dn(e){let t=new so,n=new Map;function r(){let i=pe();for(let c of i.jobs){if(!c.enabled)continue;let a=Ae(c.schedule);if(!a)continue;let u=setInterval(async()=>{try{t.emit("run",{id:c.id,name:c.name}),await e(c.prompt,c.skills),an(c.id),t.emit("complete",{id:c.id,name:c.name})}catch(s){t.emit("error",{id:c.id,name:c.name,error:s})}},a);n.set(c.id,u)}t.emit("started",{count:n.size})}function o(){for(let[i,c]of n)clearInterval(c),n.delete(i);t.emit("stopped")}return{on:t.on.bind(t),off:t.off.bind(t),once:t.once.bind(t),emit:t.emit.bind(t),start:r,stop:o,add:i=>{let c=et(i);if(c.enabled){let a=Ae(c.schedule);if(a){let u=setInterval(async()=>{try{t.emit("run",{id:c.id,name:c.name}),await e(c.prompt,c.skills),an(c.id),t.emit("complete",{id:c.id,name:c.name})}catch(s){t.emit("error",{id:c.id,name:c.name,error:s})}},a);n.set(c.id,u)}}return c},remove:i=>{let c=n.get(i);return c&&(clearInterval(c),n.delete(i)),tt(i)},list:Ze}}var pn=[{type:"function",function:{name:"cron_add",description:"Schedule a recurring agent job.",parameters:{type:"object",properties:{name:{type:"string",description:"Human-readable name"},schedule:{type:"string",description:"'every 30m', 'daily', 'every 6h'"},prompt:{type:"string",description:"Agent prompt to run on schedule"},skills:{type:"array",items:{type:"string"},description:"Optional skill names"}},required:["name","schedule","prompt"],additionalProperties:!1}}},{type:"function",function:{name:"cron_list",description:"List all scheduled cron jobs.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"cron_remove",description:"Remove a cron job by id.",parameters:{type:"object",properties:{id:{type:"string",description:"Job id from cron_list"}},required:["id"],additionalProperties:!1}}}];var Oe=[],co=5,ao=1;function mn(e){Oe.push(e),Oe.length>20&&Oe.shift()}function hn(){let e=Oe.slice(-3);if(e.length<1)return null;let t=e[e.length-1];return t.toolCalls>=co&&t.errors===0?{shouldCreate:!0,suggestion:`You completed a ${t.toolCalls}-step workflow. Save it as a skill with skill_create.`}:e.filter(r=>r.errors>0&&r.recovered).length>=ao&&t.toolCalls>=3?{shouldCreate:!0,suggestion:"You recovered from errors. Save the corrected approach as a skill."}:{shouldCreate:!1,suggestion:"No skill suggestions yet."}}var xn=[{type:"function",function:{name:"meta_analyze",description:"Analyze recent interactions and suggest skills to create.",parameters:{type:"object",properties:{},additionalProperties:!1}}}];import{homedir as nt}from"node:os";import{join as rt}from"node:path";var yn=process.env.ORACLE_PUBLIC_DESKTOP==="1",uo=yn?process.env.ORACLE_CONFIG_DIR||rt(nt(),".config","oracle"):rt(nt(),".config","oracle"),As=yn?uo:rt(nt(),".config","mad-desk");function lo(e,t,n=""){let r=process.env[e];if(r!=null&&String(r).trim()!=="")return r;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:n}var fo=["0","false","off","no"];function gn(e,t,n=!0){let r=String(lo(e,t,"")).trim().toLowerCase();return r===""?n:!fo.includes(r)}var Lo=new Set(["chain","data","scan","route","prepare"]),$o=new Set(["list","show"]),To=new Set(["call","catalog","health"]),Ro=new Set(["swap","bridge","prepare","prepare-bridge"]),Po=Object.freeze({"anthropic-oauth":"https://api.anthropic.com/v1","openai-codex":"https://chatgpt.com/backend-api/codex","xai-oauth":"https://api.x.ai/v1"}),dt=2e4,Cn=6,No=Object.freeze({type:"function",function:{name:"oracle_cli",description:"Run a bounded read or prepare-only Oracle CLI command. It cannot sign or broadcast transactions.",parameters:{type:"object",properties:{argv:{type:"array",items:{type:"string"},minItems:1,maxItems:24,description:'Arguments after the oracle executable, for example ["scan","chains"] or ["data","health"].'}},required:["argv"],additionalProperties:!1}}}),mt=Object.freeze([No,...tn,...cn,...pn,...xn]);function In(e){let t=String(e||"");return t.length<=dt?t:`${t.slice(0,dt)}
|
|
23
|
+
[truncated ${t.length-dt} chars]`}async function jo(e,t,n){switch(e){case"oracle_cli":return n(t.argv);case"memory_add":return Qt(t.key,t.content),{ok:!0,stored:t.key};case"memory_remove":return Zt(t.key);case"skill_load":{let r=Ve(t.name);return r?{ok:!0,name:t.name,content:r}:{ok:!1,error:`skill not found: ${t.name}`}}case"skill_create":return sn(t.name,t.content),{ok:!0,created:t.name};case"skill_list":return{ok:!0,skills:Je().map(o=>({name:o.name,description:o.description}))};case"cron_add":return{ok:!0,job:et({name:t.name,schedule:t.schedule,prompt:t.prompt,skills:t.skills||[],enabled:!0})};case"cron_list":return{ok:!0,jobs:Ze()};case"cron_remove":return{ok:tt(t.id),removed:t.id};case"meta_analyze":return{ok:!0,...hn()||{shouldCreate:!1,suggestion:"No skill suggestions yet."}};default:return{ok:!1,error:`unknown tool: ${e}`}}}function Mo(e){if(!Array.isArray(e)||e.length===0||e.length>24)return"argv must contain 1 to 24 arguments";if(e.some(n=>typeof n!="string"||n.length>1e3))return"every argument must be a string no longer than 1000 characters";let t=e[0];return Lo.has(t)?t==="chain"&&!$o.has(e[1]||"list")?`command not allowed: chain${e[1]?` ${e[1]}`:""}`:t==="data"&&!To.has(e[1]||"")?`command not allowed: data${e[1]?` ${e[1]}`:""}`:t==="route"&&!Ro.has(e[1]||"")?`command not allowed: route${e[1]?` ${e[1]}`:""}`:null:`command not allowed: ${t}`}async function Fo(e,t={}){let n=Mo(e);if(n)return{ok:!1,error:n};let r=t.spawnFn||Io,o=t.packageRoot||F,i=r(process.execPath,[Ln.join(o,"bin","oracle.mjs"),...e],{encoding:"utf8",timeout:t.timeoutMs||45e3,maxBuffer:1024*1024,env:{...process.env,ORACLE_CHAT_TOOL:"1"}});return i.error?{ok:!1,error:i.error.message}:{ok:i.status===0,status:typeof i.status=="number"?i.status:1,stdout:In(i.stdout),stderr:In(i.stderr)}}function Uo(){let e=Ln.join(F,"profiles","oracle","SOUL.md"),t=Oo.readFileSync(e,"utf8"),n=en(),r=on(),o=[t.trim()];return n&&o.push(n),o.push(r),o.push("You have tools for Oracle CLI commands, durable memory, skills, cron scheduling, and meta-learning.","Use memory_add to persist facts. Use skill_create to save successful workflows. Use cron_add to schedule recurring tasks."),o.join(`
|
|
24
|
+
|
|
25
|
+
`)}function Do(e,t,n={}){return{method:"event",params:{type:e,session_id:t,payload:n}}}async function Bo(e){return new Error(`model request failed (HTTP ${e?.status||"unknown"})`)}async function*ht(e){if(!e?.ok)throw await Bo(e);if(!e.body)throw new Error("model response had no body");let t=e.body.getReader(),n=new TextDecoder,r="";for(;;){let{value:i,done:c}=await t.read();r+=n.decode(i||new Uint8Array,{stream:!c});let a=r.split(/\r?\n\r?\n/);r=a.pop()||"";for(let u of a){let s=u.split(/\r?\n/).filter(f=>f.startsWith("data:")).map(f=>f.slice(5).trimStart()).join(`
|
|
26
|
+
`);!s||s==="[DONE]"||(yield JSON.parse(s))}if(c)break}let o=r.trim();if(o.startsWith("data:")){let i=o.slice(5).trim();i&&i!=="[DONE]"&&(yield JSON.parse(i))}}function Ko(e,t){let n=Number(t.index||0),r=e.get(n)||{id:"",type:"function",function:{name:"",arguments:""}};t.id&&(r.id+=t.id),t.type&&(r.type=t.type),t.function?.name&&(r.function.name+=t.function.name),t.function?.arguments&&(r.function.arguments+=t.function.arguments),e.set(n,r)}function Ho(e,t){let n=Number(e?.prompt_tokens||e?.input_tokens||0),r=Number(e?.completion_tokens||e?.output_tokens||0);return{context_used:n,context_max:t,context_percent:t>0?Math.round(n/t*100):0,input:n,output:r}}function qo(){return mt.map(e=>({type:"function",name:e.function.name,description:e.function.description,parameters:e.function.parameters,strict:!1}))}function zo(){return mt.map(e=>({name:e.function.name,description:e.function.description,input_schema:e.function.parameters}))}function pt(e,t,n){let r=Array.isArray(n)?n:[{type:"text",text:String(n||"")}],o=e.at(-1);o?.role===t?o.content.push(...r):e.push({role:t,content:r})}function Yo(e){let t=[];for(let n of e)if(n.role!=="system"){if(n.role==="user"){pt(t,"user",[{type:"text",text:String(n.content||"")}]);continue}if(n.role==="assistant"){let r=[];n.content&&r.push({type:"text",text:String(n.content)});for(let o of n.tool_calls||[]){let i={};try{i=JSON.parse(o.function?.arguments||"{}")}catch{}r.push({type:"tool_use",id:o.id,name:o.function?.name,input:i})}r.length&&pt(t,"assistant",r);continue}n.role==="tool"&&pt(t,"user",[{type:"tool_result",tool_use_id:n.tool_call_id,content:String(n.content||"")}])}return t}function Wo(e){let t=[];for(let n of e)if(n.role!=="system"){if(n.role==="user"){t.push({role:"user",content:[{type:"input_text",text:String(n.content||"")}]});continue}if(n.role==="assistant"){n.content&&t.push({role:"assistant",status:"completed",content:[{type:"output_text",text:String(n.content)}]});for(let r of n.tool_calls||[])t.push({type:"function_call",id:r.response_item_id||void 0,call_id:r.id,name:r.function?.name,arguments:r.function?.arguments||"{}"});continue}n.role==="tool"&&t.push({type:"function_call_output",call_id:n.tool_call_id,output:String(n.content||"")})}return t.map(n=>Object.fromEntries(Object.entries(n).filter(([,r])=>r!==void 0)))}function Go(e){try{let t=JSON.parse(Buffer.from(String(e).split(".")[1],"base64url").toString("utf8"));return String(t?.["https://api.openai.com/auth"]?.chatgpt_account_id||"")}catch{return""}}async function Jo({config:e,messages:t,fetchFn:n,signal:r,onText:o}){let i=await n(`${e.baseUrl}/chat/completions`,{method:"POST",headers:{"content-type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.provider==="openrouter"?{"HTTP-Referer":"https://oracle-agent.dev","X-Title":"Oracle CLI"}:{}},body:JSON.stringify({model:e.model,messages:t,tools:mt,tool_choice:"auto",stream:!0,stream_options:{include_usage:!0}}),signal:r}),c=new Map,a="",u=null;for await(let s of ht(i)){s.usage&&(u=s.usage);let f=s.choices?.[0]?.delta||{};typeof f.content=="string"&&f.content&&(a+=f.content,o(f.content));for(let p of f.tool_calls||[])Ko(c,p)}return{text:a,usage:u,toolCalls:[...c.entries()].sort(([s],[f])=>s-f).map(([,s])=>s)}}async function Vo({config:e,messages:t,persona:n,credential:r,fetchFn:o,signal:i,onText:c}){let a=await o(`${e.baseUrl}/messages`,{method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream",Authorization:`Bearer ${r.accessToken}`,"anthropic-version":"2023-06-01","anthropic-beta":"interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,claude-code-20250219,oauth-2025-04-20","user-agent":`claude-code/${process.env.ORACLE_CLAUDE_CODE_VERSION||"2.1.220"} (external, cli)`,"x-app":"cli"},body:JSON.stringify({model:e.model,max_tokens:Number(e.maxOutputTokens||8192),system:[{type:"text",text:"You are Claude Code, Anthropic's official CLI for Claude."},{type:"text",text:n}],messages:Yo(t),tools:zo(),tool_choice:{type:"auto"},stream:!0}),signal:i}),u=new Map,s="",f=null;for await(let p of ht(a)){if(p.type==="message_start"&&(f={...f||{},...p.message?.usage||{}}),p.type==="message_delta"&&(f={...f||{},...p.usage||{}}),p.type==="content_block_start"&&p.content_block?.type==="tool_use"){let y=p.content_block;u.set(Number(p.index||0),{id:y.id,type:"function",function:{name:y.name,arguments:y.input&&Object.keys(y.input).length?JSON.stringify(y.input):""}})}if(p.type==="content_block_delta"&&p.delta?.type==="text_delta"&&(s+=p.delta.text||"",p.delta.text&&c(p.delta.text)),p.type==="content_block_delta"&&p.delta?.type==="input_json_delta"){let y=Number(p.index||0),x=u.get(y);x&&(x.function.arguments+=p.delta.partial_json||"")}if(p.type==="error")throw new Error(p.error?.message||"Claude stream failed")}return{text:s,usage:f,toolCalls:[...u.entries()].sort(([p],[y])=>p-y).map(([,p])=>(p.function.arguments||(p.function.arguments="{}"),p))}}async function Xo({config:e,messages:t,persona:n,sessionId:r,credential:o,fetchFn:i,signal:c,onText:a}){let u=e.provider==="openai-codex",s=u?Go(o.accessToken):"",f={"content-type":"application/json",accept:"text/event-stream",Authorization:`Bearer ${o.accessToken}`,...u?{"user-agent":"codex_cli_rs/0.0.0 (Oracle CLI)",originator:"codex_cli_rs",...s?{"ChatGPT-Account-ID":s}:{},session_id:r,"x-client-request-id":r}:{"x-grok-conv-id":r}},p={model:e.model,instructions:n,input:Wo(t),tools:qo(),tool_choice:"auto",parallel_tool_calls:!0,store:!1,stream:!0,...u?{reasoning:{effort:e.reasoningEffort||"high",summary:"auto"}}:{}},y=await i(`${e.baseUrl}/responses`,{method:"POST",headers:f,body:JSON.stringify(p),signal:c}),x=new Map,_="",v=null;for await(let b of ht(y)){b.type==="response.output_text.delta"&&typeof b.delta=="string"&&(_+=b.delta,a(b.delta));let m=b.item;if((b.type==="response.output_item.added"||b.type==="response.output_item.done")&&m?.type==="function_call"){let h=String(m.call_id||m.id||b.output_index||x.size);x.set(h,{id:m.call_id||m.id,response_item_id:m.id,type:"function",function:{name:m.name,arguments:m.arguments||"{}"}})}if(b.type==="response.function_call_arguments.delta"){let h=String(b.call_id||b.item_id||b.output_index||""),l=x.get(h);l&&(l.function.arguments+=b.delta||"")}if(b.type==="response.completed"&&(v=b.response?.usage||v),b.type==="response.failed"||b.type==="error")throw new Error(b.response?.error?.message||b.error?.message||"Responses stream failed")}return{text:_,usage:v,toolCalls:[...x.values()]}}function $n(e={}){let t=e.config;if(!t?.baseUrl||!t?.model)throw new Error("standalone model configuration is incomplete");if(t.authType==="oauth"){let l=Po[t.provider],d=String(t.baseUrl).replace(/\/+$/,"");if(!l||d!==l)throw new Error(`${t.provider||"unknown"} OAuth endpoint is not trusted`)}let n=new Co,r=e.fetchFn||globalThis.fetch,o=e.toolRunner||(l=>Fo(l,e)),i=e.credentialProvider||(async l=>{let{resolveOAuthCredentials:d}=await Promise.resolve().then(()=>(ft(),An));return d(l)}),c=e.persona||Uo(),a=e.sessionId||`oracle-${On()}`,u=[],s=null,f=!1,p=!1,y=dn(async(l,d)=>{if(f)return;let w=(d||[]).map(k=>{let g=Ve(k);return g?`## Skill: ${k}
|
|
27
|
+
${g}`:null}).filter(Boolean),O=w.length>0?`
|
|
28
|
+
|
|
29
|
+
${w.join(`
|
|
30
|
+
|
|
31
|
+
`)}`:"";await v(`${l}${O}`)});gn("ORACLE_CRON_ENABLED","MAD_CRON_ENABLED",!0)&&(y.on("run",l=>x("cron.run",l)),y.on("complete",l=>x("cron.complete",l)),y.on("error",l=>x("cron.error",l)),y.start());function x(l,d={}){n.emit("event",Do(l,a,d))}function _(l){x("error",{message:l?.message||String(l)}),n.listenerCount("error")>0&&n.emit("error",l)}async function v(l){p=!0,s=new AbortController;let d=[{role:"system",content:c},...u,{role:"user",content:l}],w="",O=null,k=!1;try{for(let g=0;g<Cn;g+=1){let I=t.authType==="oauth"?await i(t.provider):null,z=V=>{k||(x("message.start",{}),k=!0),w+=V,x("message.delta",{text:V})},C={config:t,messages:d,persona:c,sessionId:a,credential:I,fetchFn:r,signal:s.signal,onText:z},j=t.protocol==="anthropic-messages"?await Vo(C):t.protocol==="responses"?await Xo(C):await Jo(C),se=j.text,ce=j.toolCalls;if(O=j.usage||O,ce.length===0){d.push({role:"assistant",content:se}),u=d.slice(1),k||x("message.start",{}),x("message.complete",{text:w,usage:Ho(O,t.contextLength)});return}d.push({role:"assistant",content:se||null,tool_calls:ce});let Dn=ce.length,xe=0;for(let V of ce){let ye;try{let $e=JSON.parse(V.function.arguments||"{}");ye=await jo(V.function.name,$e,o)}catch($e){ye={ok:!1,error:`invalid tool arguments: ${$e.message}`},xe++}ye.ok||xe++,d.push({role:"tool",tool_call_id:V.id||`call_${On()}`,content:JSON.stringify(ye)})}mn({userMessage:l,toolCalls:Dn,errors:xe,recovered:xe>0?!!ce.length:!1,durationMs:0})}throw new Error(`agent exceeded ${Cn} tool steps`)}catch(g){g?.name!=="AbortError"&&_(g)}finally{p=!1,s=null}}async function b(){if(f)throw new Error("standalone client is stopped")}async function m(l,d={}){if(f)throw new Error("standalone client is stopped");if(l==="session.create")return x("session.info",{model:d.model||t.model,reasoning_effort:t.reasoningEffort,usage:{context_max:t.contextLength},backend:"standalone"}),{session_id:a,info:{model:d.model||t.model,reasoning_effort:t.reasoningEffort,usage:{context_max:t.contextLength},backend:"standalone"}};if(l==="prompt.submit"){if(p)throw new Error("a turn is already active");let w=String(d.text||"").trim();if(!w)throw new Error("prompt text is required");return queueMicrotask(()=>{v(w).catch(_)}),{accepted:!0}}if(l==="session.interrupt"){let w=!!(s&&p);return s?.abort(),{interrupted:w}}if(l==="session.usage")return{calls:0,input:0,output:0,total:0};throw new Error(`unsupported standalone method: ${l}`)}async function h(){f||(f=!0,s?.abort(),y.stop())}return Object.freeze({start:b,request:m,stop:h,on:n.on.bind(n),off:n.off.bind(n)})}async function Tn({client:e,text:t,stdout:n=process.stdout,stderr:r=process.stderr}={}){if(!e)throw new Error("standalone client is required");await e.start();let o=await e.request("session.create",{source:"cli"}),i="",c=!1;try{return await new Promise((a,u)=>{let s=f=>{let p=f?.params?.type,y=f?.params?.payload||{};if(p==="message.delta"&&typeof y.text=="string"){i+=y.text,n.write(y.text);return}if(p==="message.complete"){!i&&y.text&&n.write(String(y.text)),n.write(`
|
|
32
|
+
`),c=!0,a(0);return}if(p==="error"){let x=y.message||y.text||"standalone chat failed";r.write(`oracle chat: ${x}
|
|
33
|
+
`),c=!0,u(new Error(x))}};e.on("event",s),e.request("prompt.submit",{session_id:o.session_id,text:t}).catch(f=>{c||(c=!0,u(f))})})}finally{await e.stop()}}ft();var $="oracle",he="oracle";function Fn(e){if(e==="hermes"){let t=ue();return t.ok?t.bin:null}for(let t of(process.env.PATH||"").split(S.delimiter)){let n=S.join(t,e);try{if(A.existsSync(n))return n}catch{}}return null}function Rn(e){try{let t=A.readFileSync(e,"utf8").split(/\r?\n/,1)[0];if(!t.startsWith("#!"))return null;let n=t.slice(2).trim().split(/\s+/);if(n[0]?.endsWith("/env")&&n[1]?.startsWith("python"))return{command:n[0],prefix:[n[1]]};if(S.basename(n[0]||"").startsWith("python"))return{command:n[0],prefix:n.slice(1)}}catch{}return null}function Un(e){let t=Rn(e);if(t)return t;try{let r=A.readFileSync(e,"utf8").match(/["']([^"'\r\n]+\/bin\/hermes)["']/);if(r)return Rn(r[1])}catch{}return null}function Zo(){return S.join(F,"src","cli","oracle-harness.py")}function Le(e,t){let n=Zo(),r=process.env.ORACLE_PLAIN_HARNESS==="0"?null:Un(e);return r&&A.existsSync(n)?{command:r.command,args:[...r.prefix,n,...t]}:{command:e,args:t}}function ei(){return S.join(F,"skins","oracle.yaml")}function ti(e=$){let t=S.join(F,"profiles","oracle","SOUL.md");if(!A.existsSync(t))return{ok:!1,reason:"oracle persona missing from package"};let n=S.join(U(),"profiles",e,"SOUL.md");return A.existsSync(n)&&!A.readFileSync(n,"utf8").startsWith("You are Hermes Agent, an intelligent AI assistant created by Nous Research.")?{ok:!0,reused:!0}:(R(S.dirname(n)),A.copyFileSync(t,n),{ok:!0,reused:!1})}function ni(e=$){let t=ei();if(!A.existsSync(t))return{ok:!1,reason:"skin missing from package"};let n=S.join(U(),"skins"),r=S.join(U(),"profiles",e,"skins");R(n),R(r);let o=A.readFileSync(t,"utf8");return A.writeFileSync(S.join(n,`${he}.yaml`),o),A.writeFileSync(S.join(r,`${he}.yaml`),o),{ok:!0,skin:he}}function ri(e=$){let t=S.join(U(),"profiles",e,"config.yaml");if(!A.existsSync(t))return{ok:!1,reason:"profile config missing"};let n=Fn("oracle")||S.join(F,"bin","oracle.mjs"),r=S.join(U(),"profiles",e,"oracle");R(r);let o={profile:e,skin:he,oracleBin:n,commands:{chain:[n,"chain"],setup:[n,"setup"]},updatedAt:new Date().toISOString()};return A.writeFileSync(S.join(r,"chat-surface.json"),JSON.stringify(o,null,2)+`
|
|
34
|
+
`,{mode:384}),{ok:!0,marker:o}}function oi(e=$){let t=S.join(F,"skills","oracle-chat");if(!A.existsSync(t))return{ok:!1,reason:"oracle-chat skill missing"};let n=S.join(U(),"profiles",e,"skills","oracle-chat");R(n);for(let r of A.readdirSync(t)){let o=S.join(t,r),i=S.join(n,r);A.statSync(o).isFile()&&A.copyFileSync(o,i)}for(let r of["chain","setup"]){let o=S.join(U(),"profiles",e,"skills",r);R(o);let i=S.join(t,`${r}.SKILL.md`),c=S.join(t,"SKILL.md"),a=A.existsSync(i)?A.readFileSync(i,"utf8"):A.readFileSync(c,"utf8");A.writeFileSync(S.join(o,"SKILL.md"),a)}return{ok:!0}}function ii(e=$){let t=Fn("hermes");if(!t)return{ok:!1,reason:"hermes missing"};let n=Qo(t,["-p",e,"config","set","display.skin",he],{encoding:"utf8",timeout:3e4});return n.status!==0?{ok:!1,reason:(n.stderr||n.stdout||"config set failed").trim()}:{ok:!0}}function Pn(e){if(!A.existsSync(e))return!1;let t=A.readFileSync(e,"utf8");if(/^model:\s*\S+/m.test(t))return!0;let n=t.match(/^model:\s*\n((?:[ \t]+.*(?:\n|$))*)/m)?.[1]||"";return/^\s+(?:default|provider):\s*\S+/m.test(n)}function si(e=$){let t=U();if(A.existsSync(S.join(t,"auth.json"))||A.existsSync(S.join(t,"profiles",e,"auth.json")))return!0;let n=["OPENROUTER_API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","XAI_API_KEY","GOOGLE_API_KEY","GEMINI_API_KEY","DEEPSEEK_API_KEY","HF_TOKEN","GLM_API_KEY","KIMI_API_KEY","MINIMAX_API_KEY"];if(n.some(r=>process.env[r]))return!0;for(let r of[S.join(t,".env"),S.join(t,"profiles",e,".env")]){if(!A.existsSync(r))continue;let o=A.readFileSync(r,"utf8");if(n.some(i=>new RegExp(`^${i}=.+`,"m").test(o)))return!0}return!1}function Nn(e=$){let t=U();return Pn(S.join(t,"config.yaml"))||Pn(S.join(t,"profiles",e,"config.yaml"))||si(e)}function jn(){return["oracle chat, filled lowercase oracle chat",""," oracle chat open interactive oracle chat",' oracle chat -q "..." one-shot query'," oracle chat --model <m> use a model for this session"," oracle chat --print-banner show filled oracle banner only","","inside chat:"," /chain list/select chains"," /setup messaging setup menu"," /model switch models (still one oracle persona)","","brand: filled lowercase oracle / classic boxed layout"].join(`
|
|
35
|
+
`)}function ci(){let e=Number(process.stdout?.columns||process.env.COLUMNS||80);return Number.isFinite(e)&&e>0?Math.floor(e):80}function ai(e){return Array.from(String(e)).length}function ui(e,t){let n=e.map(c=>c.trimEnd()),r=Math.max(0,...n.map(c=>ai(c))),o=Math.max(0,Math.floor((t-r)/2)),i=" ".repeat(o);return n.map(c=>c?`${i}${c}`:"")}function Mn(e){return`'${String(e).replace(/'/g,"'\\''")}'`}function li(e){return e.user?`${e.user}@${e.host}`:e.host}function fi(e,t){let n=e.path||"$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin",r=["oracle","chat",...t].map(Mn).join(" ");return[/^[A-Za-z0-9_:$/.~+-]+$/.test(n)?`export PATH=${n}`:`export PATH=${Mn(n)}`,"export ORACLE_REMOTE_COMPUTE_DISABLE=1","export ORACLE_CHAT_BACKEND=auto",r].join("; ")}function di(){let e=[""," \u2588\u2588\u2588\u2588"," \u2591\u2591\u2588\u2588\u2588"," \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588"," \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588","\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588","\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591","\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588"," \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591",""];process.stdout.write(ui(e,ci()).join(`
|
|
36
|
+
`)+`
|
|
37
|
+
`)}function pi(e){let t={pass:[],query:null,model:null,provider:null};for(let n=0;n<e.length;n+=1){let r=e[n];if((r==="--model"||r==="-m")&&e[n+1]){t.model=e[++n],t.pass.push("--model",t.model);continue}if(r==="--provider"&&e[n+1]){t.provider=e[++n],t.pass.push("--provider",t.provider);continue}if((r==="-q"||r==="--query")&&e[n+1]){t.query=e[++n],t.pass.push("-q",t.query);continue}if(r==="--quiet"||r==="-Q"){t.pass.push("--quiet");continue}if(r==="--continue"||r==="-c"){t.pass.push("--continue");continue}t.pass.push(r)}return t}var oc={name:"chat",summary:"open the one oracle chat surface (telegram-like, multi-model)",group:"read",usage:jn(),async run(e){let t=[...e.argv];if(t.includes("-h")||t.includes("--help"))return process.stdout.write(jn()+`
|
|
38
|
+
`),0;if(t.includes("--print-banner"))return di(),0;let n=pi(t),r={...process.env,...n.model?{ORACLE_MODEL:n.model}:{},...n.provider?{ORACLE_PROVIDER:n.provider}:{}},o=ie(),i=Wt({env:r,hermes:ue(),storedConfig:le(),oauthAvailable:_=>!!o.get(_),apiKeyResolver:_=>o.getApiKey(_)});if(i.kind==="unconfigured")return process.stderr.write(`${i.reason}
|
|
39
|
+
`),1;if(i.kind==="remote")return X("ssh",["-o","BatchMode=yes","-o","ConnectTimeout=12",li(i.config),fi(i.config,n.pass)],{stdio:"inherit",env:process.env},"oracle-remote-compute");let c=ge({ORACLE_CHAT_SURFACE:"1",ORACLE_PROFILE:$,ORACLE_NODE_BIN:process.execPath,ORACLE_CLI_ENTRY:S.join(F,"bin","oracle.mjs")});if(i.kind==="standalone"){let _=$n({config:{...i.config,...n.model?{model:n.model}:{}}});if(n.query)try{return await Tn({client:_,text:n.query,stdout:process.stdout,stderr:process.stderr})}catch{return 1}let v=await ze({client:_,args:t,env:c,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});return v.native?v.code:(process.stderr.write(process.env.ORACLE_NATIVE_TUI==="0"?`oracle standalone chat requires the native TUI; remove ORACLE_NATIVE_TUI=0
|
|
40
|
+
`:`oracle standalone chat requires an interactive TTY or -q <query>
|
|
41
|
+
`),1)}let a=i.bin;ti($),ni($),oi($);let u=ii($);ri($),!u.ok&&process.env.ORACLE_CLI_DEBUG&&process.stderr.write(`oracle chat: skin note: ${u.reason}
|
|
42
|
+
`);let s=!!(n.model||n.provider);if(!Nn($)&&!s){if(!process.stdin.isTTY||!process.stdout.isTTY)return process.stderr.write(`oracle chat needs a configured model
|
|
43
|
+
run: oracle model
|
|
44
|
+
`),1;process.stdout.write(`choose oracle's model before first chat
|
|
45
|
+
|
|
46
|
+
`);let _=Le(a,["-p",$,"model"]),v=await X(_.command,_.args,{stdio:"inherit",env:process.env},"oracle-model");if(v!==0||!Nn($))return v||1}let f=["-p",$,"chat"],p=Un(a),y=await ze({hermesPython:p,args:t,env:c,cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});if(y.native)return y.code;let x=Le(a,[...f,...n.pass]);return X(x.command,x.args,{stdio:"inherit",env:c},"oracle-chat")}};function T(e,t){let n=e.indexOf(t);return n>=0&&e[n+1]?e[n+1]:null}function mi(e){let t=T(e,"--backend"),n=T(e,"--provider"),r=T(e,"--model")||T(e,"-m"),o=T(e,"--base-url"),i=T(e,"--api-key-env"),c=T(e,"--context-length"),a=T(e,"--reasoning-effort"),u=T(e,"--compute-host")||T(e,"--remote-host"),s=T(e,"--compute-user")||T(e,"--remote-user"),f=T(e,"--compute-path")||T(e,"--remote-path");if(!t&&!!!(n||r||o||i||c||a||u||s||f))return null;let y={...le()||{}};return n&&(delete y.apiKeyEnv,(n!=="custom"||n!==y.provider)&&delete y.baseUrl),{...y,backend:t||"standalone",...n?{provider:n}:{},...r?{model:r}:{},...o?{baseUrl:o}:{},...i?{apiKeyEnv:i}:{},...c?{contextLength:c}:{},...a?{reasoningEffort:a}:{},...u?{computeHost:u}:{},...s?{computeUser:s}:{},...f?{computePath:f}:{}}}function hi(){return["oracle model, choose standalone model settings or open Hermes' picker",""," oracle model"," oracle model --show"," oracle model --backend standalone --provider openrouter --model openrouter/auto"," oracle model --backend remote --compute-host <host>"," oracle model --backend auto","","standalone keys stay in environment variables, never model.json:"," OPENROUTER_API_KEY, OPENAI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY"].join(`
|
|
47
|
+
`)}var lc={name:"model",summary:"choose Oracle's standalone model or existing Hermes provider",group:"read",usage:hi(),async run(e){let t=[...e.argv];if(t.includes("--show"))return process.stdout.write(`${JSON.stringify(le()||{backend:"auto"},null,2)}
|
|
48
|
+
`),0;let n=mi(t);if(n)try{let i=wt(n);return process.stdout.write(`oracle model: ${i.backend}`),i.provider&&process.stdout.write(` / ${i.provider}`),i.model&&process.stdout.write(` / ${i.model}`),process.stdout.write(`
|
|
49
|
+
`),i.backend==="standalone"&&i.apiKeyEnv&&process.stdout.write(`key source: ${i.apiKeyEnv}
|
|
50
|
+
`),0}catch(i){return process.stderr.write(`oracle model: ${i.message}
|
|
51
|
+
`),1}let r=ue();if(!r.ok)return process.stderr.write(`Oracle standalone chat does not require Hermes.
|
|
52
|
+
Configure a provider with: oracle model --backend standalone --provider openrouter --model openrouter/auto
|
|
53
|
+
Then set OPENROUTER_API_KEY.
|
|
54
|
+
`),1;let o=Le(r.bin,["-p","oracle","model",...t]);return X(o.command,o.args,{stdio:"inherit",env:process.env},"oracle-model")}};export{lc as default};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import l from"node:fs";import c from"node:path";import{spawnSync as D}from"node:child_process";import j from"node:os";import g from"node:path";import{fileURLToPath as k}from"node:url";var x=g.dirname(k(import.meta.url)),H=g.resolve(x,"../..");function y(){return process.env.ORACLE_FAKE_HOME||j.homedir()}function b(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function $(){return b()?process.env.ORACLE_CONFIG_DIR||g.join(y(),".config","oracle"):g.join(y(),".config","oracle")}import a from"node:fs";import p from"node:path";var f="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",E=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function P(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==f&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${f})`):t.push("$schema is required \u2014 must be "+f)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):E.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let s=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let n of Object.keys(e))s.has(n)||r.push(`unknown field "${n}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function A(e){let t=p.join(e,"skills"),r=[];if(!a.existsSync(t)||!a.statSync(t).isDirectory())return r;function s(n,i=""){for(let o of a.readdirSync(n,{withFileTypes:!0})){let u=p.join(n,o.name);if(o.isDirectory())s(u,i?`${i}/${o.name}`:o.name);else if(o.name.endsWith(".md")){let d=i?`${i}/${o.name.replace(/\.md$/,"")}`:o.name.replace(/\.md$/,"");r.push({name:d,path:u,relativePath:p.relative(t,u)})}}}return s(t),r}function C(e){let t=p.join(e,"mcp"),r=[];if(!a.existsSync(t)||!a.statSync(t).isDirectory())return r;for(let s of a.readdirSync(t,{withFileTypes:!0})){if(!s.isFile()||!s.name.endsWith(".json"))continue;let n=p.join(t,s.name);try{let i=JSON.parse(a.readFileSync(n,"utf8"));r.push({name:s.name.replace(/\.json$/,""),path:n,config:i})}catch(i){r.push({name:s.name.replace(/\.json$/,""),path:n,error:`invalid JSON: ${i.message}`})}}return r}function m(e){let t=p.resolve(e);if(!a.existsSync(t)||!a.statSync(t).isDirectory())return{ok:!1,error:`plugin directory not found: ${t}`};let r=p.join(t,"plugin.json");if(!a.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let s;try{s=JSON.parse(a.readFileSync(r,"utf8"))}catch(u){return{ok:!1,error:`invalid plugin.json: ${u.message}`}}let n=P(s);if(!n.valid)return{ok:!1,error:"manifest validation failed",errors:n.errors};let i=A(t),o=C(t);return{ok:!0,plugin:{name:s.name,version:s.version||"0.0.0",description:s.description||"",author:s.author||{},license:s.license||"UNLICENSED",root:t,manifest:s,skills:i,mcpServers:o,warnings:[...n.warnings]}}}function S(e){let t=[];if(!a.existsSync(e))return t;for(let r of a.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let s=p.join(e,r.name),n=m(s);n.ok&&t.push(n.plugin)}return t}var _=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/;function h(){let e=c.join($(),"plugins");return l.existsSync(e)||l.mkdirSync(e,{recursive:!0}),e}function v(){return["oracle plugins \u2014 manage Agent Plugins (https://agent-plugins.org/)",""," oracle plugins install <path> install from a local directory"," oracle plugins install <git-url> clone a repo and install"," oracle plugins list show installed plugins"," oracle plugins remove <name> uninstall a plugin"," oracle plugins scan <path> validate without installing"," oracle plugins setup interactive setup wizard","","plugins are installed to ~/.config/oracle/plugins/<name>/",`schema: ${f}`].join(`
|
|
2
|
+
`)}function w(e,{name:t}={}){let r=c.resolve(e);if(!l.existsSync(r)||!l.statSync(r).isDirectory())return process.stderr.write(`error: ${e} is not a directory
|
|
3
|
+
`),1;let s=m(r);if(!s.ok){if(process.stderr.write(`error: invalid plugin at ${r}
|
|
4
|
+
`),s.errors)for(let u of s.errors)process.stderr.write(` - ${u}
|
|
5
|
+
`);return 1}let n=s.plugin,i=t||n.name.replace(/\//g,"-"),o=c.join(h(),i);if(l.existsSync(o))return process.stderr.write(`plugin "${i}" already installed. use oracle plugins remove first.
|
|
6
|
+
`),1;if(l.cpSync(r,o,{recursive:!0}),process.stdout.write(`installed ${n.name} (v${n.version}) to ${o}
|
|
7
|
+
`),process.stdout.write(` ${n.skills.length} skills, ${n.mcpServers.length} MCP servers
|
|
8
|
+
`),n.warnings.length)for(let u of n.warnings)process.stdout.write(` warning: ${u}
|
|
9
|
+
`);return 0}function R(e){let t=c.join(h(),".tmp-"+Date.now());try{let r=D("git",["clone","--depth","1",e,t],{stdio:"pipe",timeout:6e4});return r.status!==0?(process.stderr.write(`error: git clone failed: ${String(r.stderr).slice(0,200)}
|
|
10
|
+
`),1):w(t)}finally{try{l.rmSync(t,{recursive:!0,force:!0})}catch{}}}function O(){let e=S(h());if(!e.length)return process.stdout.write(`no plugins installed
|
|
11
|
+
`),process.stdout.write(`install with: oracle plugins install <path|url>
|
|
12
|
+
`),0;process.stdout.write(`${e.length} plugin(s) installed
|
|
13
|
+
|
|
14
|
+
`);for(let t of e){let r=c.basename(t.root);process.stdout.write(` ${t.name} (v${t.version})
|
|
15
|
+
`),process.stdout.write(` path: ${t.root}
|
|
16
|
+
`),t.description&&process.stdout.write(` desc: ${t.description}
|
|
17
|
+
`),process.stdout.write(` ${t.skills.length} skills, ${t.mcpServers.length} MCP servers
|
|
18
|
+
`),t.license!=="UNLICENSED"&&process.stdout.write(` license: ${t.license}
|
|
19
|
+
`),process.stdout.write(`
|
|
20
|
+
`)}return 0}function M(e){if(!e)return process.stderr.write(`usage: oracle plugins remove <name>
|
|
21
|
+
`),1;if(!_.test(e)||c.basename(e)!==e||c.isAbsolute(e))return process.stderr.write(`invalid plugin name "${e}"
|
|
22
|
+
`),1;let t=h(),r=l.lstatSync(t);if(r.isSymbolicLink()||!r.isDirectory())return process.stderr.write(`refusing to remove plugin: plugin root is not a regular directory
|
|
23
|
+
`),1;let s=c.resolve(t,e),n=c.relative(t,s);if(!n||n===".."||n.startsWith(`..${c.sep}`)||c.isAbsolute(n))return process.stderr.write(`invalid plugin name "${e}"
|
|
24
|
+
`),1;if(!l.existsSync(s))return process.stderr.write(`plugin "${e}" not found
|
|
25
|
+
`),1;let i=l.lstatSync(s);if(i.isSymbolicLink()||!i.isDirectory())return process.stderr.write(`refusing to remove plugin "${e}": path is not a regular plugin directory
|
|
26
|
+
`),1;let o=l.realpathSync(t),u=l.realpathSync(s),d=c.relative(o,u);return!d||d===".."||d.startsWith(`..${c.sep}`)||c.isAbsolute(d)?(process.stderr.write(`refusing to remove plugin "${e}": path escapes the plugin directory
|
|
27
|
+
`),1):(l.rmSync(s,{recursive:!0,force:!0}),process.stdout.write(`removed plugin "${e}"
|
|
28
|
+
`),0)}function N(e){let t=c.resolve(e),r=m(t);if(!r.ok){if(process.stderr.write(`invalid plugin: ${r.error}
|
|
29
|
+
`),r.errors)for(let n of r.errors)process.stderr.write(` error: ${n}
|
|
30
|
+
`);return 1}let s=r.plugin;process.stdout.write(`valid plugin: ${s.name} (v${s.version})
|
|
31
|
+
`),process.stdout.write(` schema: ${s.manifest.$schema}
|
|
32
|
+
`),process.stdout.write(` skills: ${s.skills.length} found
|
|
33
|
+
`);for(let n of s.skills)process.stdout.write(` - ${n.name} (${n.relativePath})
|
|
34
|
+
`);process.stdout.write(` mcp servers: ${s.mcpServers.length} found
|
|
35
|
+
`);for(let n of s.mcpServers){let i=n.error?`ERROR: ${n.error}`:"ok";process.stdout.write(` - ${n.name}: ${i}
|
|
36
|
+
`)}if(s.warnings.length){process.stdout.write(` warnings:
|
|
37
|
+
`);for(let n of s.warnings)process.stdout.write(` - ${n}
|
|
38
|
+
`)}return 0}function L(){return process.stdout.write(["oracle plugins setup","","Agent Plugins (https://agent-plugins.org/) is an open standard for","portable AI agent tooling. Plugins ship skills and MCP servers in a","standard package format that works across compatible clients.","","To create a plugin:"," 1. Create a directory with a plugin.json manifest"," 2. Add skills as .md files in skills/"," 3. Add MCP server configs as .json files in mcp/"," 4. Validate: oracle plugins scan <dir>"," 5. Install: oracle plugins install <dir>","","To install an existing plugin:"," oracle plugins install <path> local directory"," oracle plugins install <git-url> git repository","",`schema: ${f}`,""].join(`
|
|
39
|
+
`)),0}var Q={name:"plugins",summary:"manage Agent Plugins (open-standard portable agent tooling)",group:"read",usage:v(),async run(e){let t=[...e.argv],r=(t[0]||"help").toLowerCase(),s=t.slice(1);if(r==="-h"||r==="--help"||r==="help")return process.stdout.write(v()+`
|
|
40
|
+
`),0;if(r==="list"||r==="ls")return O();if(r==="install"||r==="add"){let n=s[0];return n?n.startsWith("http://")||n.startsWith("https://")||n.startsWith("git@")?R(n):w(n):(process.stderr.write(`usage: oracle plugins install <path|url>
|
|
41
|
+
`),1)}return r==="remove"||r==="rm"||r==="uninstall"?M(s[0]):r==="scan"||r==="validate"?N(s[0]||"."):r==="setup"?L():(process.stderr.write(`oracle plugins: unknown verb '${r}'
|
|
42
|
+
${v()}
|
|
43
|
+
`),1)}};export{Q as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{spawnSync as t}from"node:child_process";var s={name:"prepare",summary:"build an unsigned swap (alias of route prepare)",group:"read",usage:"oracle prepare <chain> <tokenIn> <tokenOut> <taker> [amt]",async run(e){let a=e.bin("oracle-route.mjs"),r=t(process.execPath,[a,"prepare",...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}
|
|
2
|
+
`),1):typeof r.status=="number"?r.status:1}};export{s as default};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{parseArgs as v}from"node:util";import{spawn as g}from"node:child_process";var m=["SIGINT","SIGTERM","SIGHUP"];function d(s,c=[],o={},n=s){return new Promise(l=>{let e=g(s,c,o),i=!1,a=null,p=new Map(m.map(r=>[r,()=>{a||=r,e.exitCode===null&&e.signalCode===null&&e.kill(r)}]));for(let[r,t]of p)process.on(r,t);let u=()=>{for(let[r,t]of p)process.off(r,t)};e.once("error",r=>{i||(i=!0,u(),process.stderr.write(`oracle: could not start ${n}: ${r.message}
|
|
2
|
+
`),l(1))}),e.once("exit",(r,t)=>{if(i)return;i=!0,u();let f=a||t;if(f){process.kill(process.pid,f);return}l(r??1)})})}var S={name:"public",summary:"secret-free public HTTP surface",group:"read",usage:"oracle public serve [--port N]",async run(s){if((s.argv[0]||"serve")!=="serve")return process.stderr.write(`usage: oracle public serve [--port N]
|
|
3
|
+
`),1;let o=null;try{let{values:e}=v({args:s.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});o=e.port||null}catch{}let n={...process.env};o&&(n.ORACLE_PUBLIC_PORT=String(o));let l=s.bin("oracle-public-server.mjs");return d(process.execPath,[l],{stdio:"inherit",env:n},"oracle-public-server")}};export{S as default};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import{keccak_256 as S}from"@noble/hashes/sha3.js";import{createHash as q}from"node:crypto";var X=new Set([408,425,429,500,502,503,504]),v=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),K=2,C=4e3,T=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Z=new Set([301,302,303,307,308]),I=3;function Q(t){let e=String(t||"").toLowerCase();return T.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function ee(t){let e={};for(let[n,r]of Object.entries(t||{}))Q(n)||(e[n]=r);return e}function te(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let n=new URL(String(t),String(e));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${n.protocol}`);return n.toString()}function ne(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var R=new Map;function re(t,e,n){let r={};for(let[c,b]of Object.entries(n||{}))r[c.toLowerCase()]=b;let o=Object.keys(r).filter(c=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(c)),a=[...new Set([...T,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
|
|
2
|
+
`),i=q("sha256").update(a).digest("hex").slice(0,32);return`${t} ${e} ${i}`}function oe(t,e){let n=Number(e);return Number.isFinite(n)&&n>0?Math.min(n*1e3,C):Math.min(250*2**t,C)+Math.floor(Math.random()*100)}var se=t=>new Promise(e=>setTimeout(e,t));async function ce(t,{fetchImpl:e,method:n,headers:r,body:o,timeoutMs:s}){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=String(t),b={...r||{}};for(let h=0;h<=I;h+=1){let u=await e(c,{method:n,headers:b,body:o,signal:a.signal,redirect:"manual"}),p=await u.text(),f=null;if(p)try{f=JSON.parse(p)}catch{f=null}if(Z.has(u.status)){if(n!=="GET"&&n!=="HEAD"){let d=new Error(`HTTP ${u.status} ${n} ${c} redirected non-idempotent request`);throw d.status=u.status,d.body=f??p.slice(0,300),d}if(h===I)throw new Error(`HTTP redirect loop for ${t}`);let l=te(u.headers?.get?.("location"),c);ne(l,c)||(b=ee(b)),c=l;continue}if(!u.ok){let l=new Error(`HTTP ${u.status} ${n} ${c}`);throw l.status=u.status,l.retryAfter=u.headers?.get?.("retry-after")??null,l.body=f??p.slice(0,300),l}return f??p}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(i)}}async function N(t,e={}){let n=e.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),s={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",a=JSON.stringify(a));let i=Number.isInteger(e.retries)?Math.max(e.retries,0):K,c=async()=>{let f;for(let l=0;l<=i;l++)try{return await ce(t,{fetchImpl:n,method:o,headers:s,body:a,timeoutMs:r})}catch(d){f=d;let E=d?.status,G=d?.name==="AbortError",J=new Set([408,425,429]),W=E!=null?J.has(E)||X.has(E)&&v.has(o):!G&&v.has(o);if(l===i||!W)throw d;await se(oe(l,d?.retryAfter))}throw f};if(!(e.dedupe!==!1&&o==="GET"&&a==null))return c();let h=re(o,t,s),u=R.get(h);if(u)return u;let p=c().finally(()=>R.delete(h));return R.set(h,p),p}var k={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},ae=new Map(Object.values(k).map(t=>[t.chainId,t]));function L(t){return ae.get(Number(t))||null}function P(t,e=process.env){let n=L(t);if(!n)return null;for(let r of n.rpcEnv){let o=(e[r]||"").trim();if(o)return o}return null}import{Interface as ie,getAddress as ke}from"ethers";var Le=new ie(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ue={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function le(t,{rpcUrl:e,env:n=process.env}={}){if(e)return e;let r=P(t,n);return r||ue[Number(t)]||null}var de=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function pe(t){let e=String(t||""),n=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!de.test(n))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function $(t,e,n=[],r={}){let o=String(e||"");pe(o);let s=le(t,r);if(!s)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let i=await N(s,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(i?.error){let c=new Error(i.error.message||JSON.stringify(i.error));throw c.code=i.error.code,c}return i.result}var g=999,x=1,fe=8453,H="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",he="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",B="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",me="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",we=".80002105.reverse",_=/^0x[a-fA-F0-9]{40}$/,U=new TextEncoder,M=t=>"0x"+Buffer.from(t).toString("hex"),m=t=>M(S(U.encode(t))).slice(0,10),O=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function y(t){let e=new Uint8Array(32);if(t)for(let n of String(t).split(".").reverse()){let r=S(U.encode(n)),o=new Uint8Array(64);o.set(e,0),o.set(r,32),e=S(o)}return M(e)}function A(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),n=parseInt(e.slice(0,64),16)*2,r=parseInt(e.slice(n,n+64),16);if(!Number.isFinite(r)||r<=0)return"";let o=e.slice(n+64,n+64+r*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function w(t,e,n){try{return await $(t,"eth_call",[{to:e,data:n},"latest"])}catch{return null}}async function be(t){let e=await w(g,H,m("primaryName(address)")+O(t)),n=A(e);return n?n.endsWith(".hl")?n:`${n}.hl`:null}async function ye(t){let e=await w(g,he,m("getName(address)")+O(t)),n=A(e);return n?n.endsWith(".hype")?n:`${n}.hype`:null}async function D(t,e,n){let r=await w(t,n,m("name(bytes32)")+e.slice(2));return A(r)||null}async function Ee(t){let e=y(`${t.slice(2).toLowerCase()}.addr.reverse`),n=await w(x,B,m("resolver(bytes32)")+e.slice(2));if(!n)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:D(x,e,r)}async function Re(t){let e=y(t.slice(2).toLowerCase()+we);return D(fe,e,me)}var F=[{source:"hl",fn:be},{source:"hype",fn:ye},{source:"ens",fn:Ee},{source:"basename",fn:Re}];async function j(t){if(!_.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:n,fn:r}of F){let o=await r(e);if(o)return{name:o,source:n,address:e}}return null}async function Se(t){let e=y(t),n=await w(g,H,m("ownerOf(uint256)")+e.slice(2));if(!n||n.length<66)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:r}async function xe(t,e,n){let r=y(e),o=await w(t,n,m("resolver(bytes32)")+r.slice(2));if(!o)return null;let s="0x"+o.slice(-40);if(/^0x0+$/.test(s))return null;let a=await w(t,s,m("addr(bytes32)")+r.slice(2));if(!a)return null;let i="0x"+a.slice(-40);return/^0x0+$/.test(i)?null:i}async function V(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let n=await Se(e);return n?{address:n,source:"hl",name:e}:null}if(e.endsWith(".eth")){let n=await xe(x,e,B);return n?{address:n,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var z=F.map(t=>t.source);var Y=`oracle resolve <name-or-address> [--json]
|
|
3
|
+
|
|
4
|
+
oracle resolve demi.hl
|
|
5
|
+
oracle resolve vitalik.eth
|
|
6
|
+
oracle resolve 0x1111111111111111111111111111111111111111
|
|
7
|
+
|
|
8
|
+
Reads on-chain name records. No API key: HL Names publishes a paid REST API,
|
|
9
|
+
but the contract answers primaryName(address) for free.
|
|
10
|
+
|
|
11
|
+
Sources, in priority order: ${z.join(", ")}.`;async function ge(t=[]){let e=t.filter(o=>o!=="--json"),n=t.includes("--json"),r=(e[0]||"").trim();if(!r||r==="--help"||r==="-h")return process.stdout.write(Y+`
|
|
12
|
+
`),r?0:1;try{if(_.test(r)){let s=await j(r);return n?(process.stdout.write(JSON.stringify({address:r,name:s?.name??null,source:s?.source??null})+`
|
|
13
|
+
`),0):s?(process.stdout.write(`${r}
|
|
14
|
+
${s.name} [${s.source}]
|
|
15
|
+
`),0):(process.stdout.write(`${r}
|
|
16
|
+
no name record found
|
|
17
|
+
`),0)}let o=await V(r);return n?(process.stdout.write(JSON.stringify({name:r,address:o?.address??null,source:o?.source??null})+`
|
|
18
|
+
`),0):o?(process.stdout.write(`${r}
|
|
19
|
+
${o.address} [${o.source}]
|
|
20
|
+
`),0):(process.stdout.write(`${r}
|
|
21
|
+
unresolved (no owner record)
|
|
22
|
+
`),0)}catch(o){return process.stderr.write(`resolve failed: ${o?.message||o}
|
|
23
|
+
`),1}}var Me={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:Y,async run(t){return ge(t.argv||[])}};export{Me as default};
|