@oracle-agent/oracle 0.33.0 → 0.35.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.
@@ -34,8 +34,28 @@ ORACLE = {
34
34
  "chip_ink": "#061018",
35
35
  }
36
36
 
37
- # Assets ship with the package, next to this module. ORACLE_CARD_ASSETS overrides.
38
- _ASSETS = Path(os.environ.get("ORACLE_CARD_ASSETS") or (Path(__file__).resolve().parent / "assets"))
37
+ # Assets ship with the package. Search env, next to this file, then the
38
+ # published npm graphics tree so a copied renderer still finds lockups.
39
+ def _resolve_assets() -> Path:
40
+ env = os.environ.get("ORACLE_CARD_ASSETS")
41
+ if env:
42
+ p = Path(env)
43
+ if p.is_dir():
44
+ return p
45
+ here = Path(__file__).resolve().parent
46
+ candidates = [
47
+ here / "assets",
48
+ Path.home() / ".local/share/oracle-assets",
49
+ here.parent / "assets" / "graphics" / "assets",
50
+ here.parent / "graphics" / "assets",
51
+ ]
52
+ for cand in candidates:
53
+ if (cand / "robinhood-lockup.png").is_file() or (cand / "oracle-globe.png").is_file():
54
+ return cand
55
+ return here / "assets"
56
+
57
+
58
+ _ASSETS = _resolve_assets()
39
59
  _WM = _ASSETS
40
60
  ORACLE_MARK = _ASSETS / "oracle-globe.png"
41
61
  CHAINS = {
@@ -224,6 +244,16 @@ def chain_meta(venue: str) -> dict:
224
244
  return CHAINS.get(key, {"label": key.upper() or "UNKNOWN", "accent": ORACLE["blue"], "logo": None, "kind": "ohlc"})
225
245
 
226
246
 
247
+ def _logo_wh(lockup):
248
+ size = getattr(lockup, "size", None)
249
+ if isinstance(size, (tuple, list)) and len(size) >= 2:
250
+ return int(size[0] or 0), int(size[1] or 0)
251
+ shape = getattr(lockup, "shape", None)
252
+ if isinstance(shape, tuple) and len(shape) >= 2:
253
+ return int(shape[1] or 0), int(shape[0] or 0)
254
+ return 180, 28
255
+
256
+
227
257
  def _load_logo(path: Path | None):
228
258
  if not path or not Path(path).exists():
229
259
  return None
@@ -275,11 +305,12 @@ def _chrome(fig, *, venue: str, eyebrow: str, hero: str, hero_color: str, chip:
275
305
  drew_lockup = False
276
306
  if lockup is not None:
277
307
  try:
278
- w, h = getattr(lockup, "size", (180, 28))
308
+ w, h = _logo_wh(lockup)
279
309
  aspect = (w / max(h, 1)) if w and h else 6.0
280
- lh = 0.048
281
- lw = min(lh * aspect * (6.3 / 11.2), 0.24)
282
- lax = fig.add_axes([tag_x + 0.048, 0.922 - lh / 2, lw, lh], zorder=8)
310
+ lh = 0.062
311
+ lw = min(lh * aspect * (6.3 / 11.2), 0.30)
312
+ lax = fig.add_axes([tag_x + 0.052, 0.922 - lh / 2, lw, lh], zorder=8)
313
+ lax.set_facecolor("none")
283
314
  lax.imshow(lockup)
284
315
  lax.axis("off")
285
316
  drew_lockup = True
@@ -97,7 +97,7 @@ does not prove npm users receive it. A locally hosted model/data/policy loop doe
97
97
  a bundled signer. A merged feature is not public until the npm artifact containing it is
98
98
  published and inspected.
99
99
 
100
- **Candidate release in this source tree:** public package `@oracle-agent/oracle@0.33.0`
100
+ **Candidate release in this source tree:** public package `@oracle-agent/oracle@0.35.0`
101
101
  ships the encrypted local vault + short-lived loopback signer. Hosted/keyless
102
102
  Oracle cannot hold keys or move funds. Self-host after `oracle sign init|import` is **auto-armed**
103
103
  for user-initiated actions. Public still charges the disclosed fee card; Administrator
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oracle-agent/oracle",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "Oracle: standalone multichain agent control plane with an optional encrypted, loopback-only self-hosted signer.",
5
5
  "license": "BUSL-1.1",
6
6
  "type": "module",
@@ -96,12 +96,12 @@
96
96
  "@scure/base": "^2.2.0",
97
97
  "@scure/bip39": "^1.6.0",
98
98
  "@scure/btc-signer": "2.3.0",
99
- "@solana/addresses": "^7.0.0",
100
- "@solana/transaction-messages": "7.0.0",
99
+ "@solana/addresses": "^7.1.0",
100
+ "@solana/transaction-messages": "7.1.1",
101
101
  "ethers": "^6.16.0",
102
102
  "sharp": "^0.35.3",
103
- "sql.js": "^1.13.0",
104
- "undici": "7.29.0",
103
+ "sql.js": "^1.14.2",
104
+ "undici": "8.10.0",
105
105
  "viem": "^2.55.8"
106
106
  },
107
107
  "peerDependencies": {
@@ -4,6 +4,11 @@
4
4
  const PACKAGE = "@oracle-agent/oracle";
5
5
  const COMMAND = "npx";
6
6
  const ARGS = ["-y", "--package", PACKAGE, "oracle-data-mcp"];
7
+ // Artifact-card lane. Deepen and Refresh are read paths; Prepare emits an
8
+ // unsigned artifact and is OFF unless the operator sets
9
+ // ORACLE_TELEGRAM_CARD_GRANT=1 in their own environment. The page never
10
+ // emits that variable, so a copied config is read-only by default.
11
+ const CARD_ARGS = ["-y", "--package", PACKAGE, "oracle-telegram-mcp"];
7
12
  const INIT_COMMAND = "npx -y --package @oracle-agent/oracle oracle-init";
8
13
  const NATIVE_COMMAND = "curl -fsSL https://oracle.demi.la/install.sh | bash && oracle setup model && oracle chat";
9
14
 
@@ -27,8 +32,32 @@
27
32
  };
28
33
 
29
34
  const server = () => ({ command: COMMAND, args: [...ARGS], env: env() });
35
+ const cardServer = () => ({ command: COMMAND, args: [...CARD_ARGS] });
30
36
 
31
- const jsonMcp = () => ({ mcpServers: { oracle: server() } });
37
+ const jsonMcp = () => ({ mcpServers: { oracle: server(), "oracle-cards": cardServer() } });
38
+
39
+ const yamlBlock = (name, entry) => {
40
+ const lines = [` ${name}:`, ` command: ${JSON.stringify(entry.command)}`, " args:"];
41
+ entry.args.forEach((arg) => lines.push(` - ${JSON.stringify(arg)}`));
42
+ if (entry.env) {
43
+ lines.push(" env:");
44
+ Object.entries(entry.env).forEach(([key, value]) => lines.push(` ${key}: ${JSON.stringify(value)}`));
45
+ }
46
+ return lines;
47
+ };
48
+
49
+ const tomlBlock = (name, entry) => {
50
+ const lines = [
51
+ `[mcp_servers.${name}]`,
52
+ `command = ${JSON.stringify(entry.command)}`,
53
+ `args = [${entry.args.map((arg) => JSON.stringify(arg)).join(", ")}]`,
54
+ ];
55
+ if (entry.env) {
56
+ lines.push("", `[mcp_servers.${name}.env]`);
57
+ Object.entries(entry.env).forEach(([key, value]) => lines.push(`${key} = ${JSON.stringify(value)}`));
58
+ }
59
+ return lines;
60
+ };
32
61
 
33
62
  const configs = {
34
63
  oracle: () => [
@@ -38,32 +67,18 @@
38
67
  "# Optional: still expose read MCP to other tools",
39
68
  JSON.stringify(jsonMcp(), null, 2),
40
69
  ].join("\n"),
41
- hermes: () => {
42
- const s = server();
43
- const values = env();
44
- return [
45
- "mcp_servers:",
46
- " oracle:",
47
- ` command: ${JSON.stringify(s.command)}`,
48
- " args:",
49
- ...s.args.map((a) => ` - ${JSON.stringify(a)}`),
50
- " env:",
51
- ...Object.entries(values).map(([k, v]) => ` ${k}: ${JSON.stringify(v)}`),
52
- "",
53
- ].join("\n");
54
- },
70
+ hermes: () => [
71
+ "mcp_servers:",
72
+ ...yamlBlock("oracle", server()),
73
+ ...yamlBlock("oracle-cards", cardServer()),
74
+ "",
75
+ ].join("\n"),
55
76
  claude: () => jsonMcp(),
56
- codex: () => {
57
- const values = env();
58
- return [
59
- "[mcp_servers.oracle]",
60
- `command = ${JSON.stringify(COMMAND)}`,
61
- `args = [${ARGS.map((arg) => JSON.stringify(arg)).join(", ")}]`,
62
- "",
63
- "[mcp_servers.oracle.env]",
64
- ...Object.entries(values).map(([key, value]) => `${key} = ${JSON.stringify(value)}`),
65
- ].join("\n");
66
- },
77
+ codex: () => [
78
+ ...tomlBlock("oracle", server()),
79
+ "",
80
+ ...tomlBlock("oracle-cards", cardServer()),
81
+ ].join("\n"),
67
82
  cursor: () => jsonMcp(),
68
83
  openclaw: () => jsonMcp(),
69
84
  perplexity: () => jsonMcp(),
@@ -14,6 +14,7 @@
14
14
  <p class="eyebrow">AGENT CONNECT</p>
15
15
  <h1>Give your agent market context.<br /><span>Keep custody local.</span></h1>
16
16
  <p class="lede">Use Oracle's native harness, or connect Oracle MCP into the agent you already run. Skills, quotes, swap cards, and prepare land in Claude or Codex. The model proposes actions; you review and authorize them through your local operator.</p>
17
+ <p class="lede">The config below wires two lanes: <code>oracle</code> for market reads, and <code>oracle-cards</code> for artifact cards your agent can deepen and refresh. Card Prepare emits an unsigned artifact only, is off unless you set <code>ORACLE_TELEGRAM_CARD_GRANT=1</code> yourself, and never broadcasts.</p>
17
18
  </header>
18
19
 
19
20
  <section class="card setup" aria-labelledby="connection-title">