@rynfar/meridian 1.71.1 → 1.73.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 +115 -162
- package/assets/desktop-dashboard.jpg +0 -0
- package/assets/trayTemplate.png +0 -0
- package/assets/trayTemplate@2x.png +0 -0
- package/assets/trayTemplate@3x.png +0 -0
- package/dist/cli-1jstkdj9.js +30 -0
- package/dist/{cli-9e5cxp89.js → cli-2h3w5n6g.js} +163 -65
- package/dist/cli-3zwfvexc.js +56 -0
- package/dist/{cli-hxxy0m1z.js → cli-82e2m44k.js} +2 -1
- package/dist/cli-8sw5wr9j.js +136 -0
- package/dist/{cli-khhjyk04.js → cli-chsp880k.js} +214 -21
- package/dist/cli-dh0a1bw4.js +619 -0
- package/dist/cli-eehk3052.js +57 -0
- package/dist/cli-grfp0s1j.js +330 -0
- package/dist/{cli-ryt69ryf.js → cli-p5zbk952.js} +2185 -358
- package/dist/{cli-8yp89fan.js → cli-p9ca4p13.js} +17 -2
- package/dist/cli-qpfky8wy.js +133 -0
- package/dist/cli.js +47 -12
- package/dist/cliDashboard-c0dvkj4y.js +325 -0
- package/dist/configDir.d.ts +30 -0
- package/dist/configDir.d.ts.map +1 -0
- package/dist/organizationName-90f0atkn.js +29 -0
- package/dist/{pluginPage-n3gdtbmj.js → pluginPage-3kxsrdpj.js} +1 -1
- package/dist/{profileCli-1eecbmgk.js → profileCli-1bfgc05h.js} +13 -3
- package/dist/{profilePage-vfj2dbhn.js → profilePage-etxqg3vn.js} +252 -60
- package/dist/profileRename-4a4km6g8.js +22 -0
- package/dist/{profiles-wch9h234.js → profiles-0mp32ek9.js} +16 -3
- package/dist/proxy/adapterInstances.d.ts +1 -1
- package/dist/proxy/adapterInstances.d.ts.map +1 -1
- package/dist/proxy/adapters/claudecode.d.ts.map +1 -1
- package/dist/proxy/adapters/droid.d.ts.map +1 -1
- package/dist/proxy/authDiscovery.d.ts +52 -0
- package/dist/proxy/authDiscovery.d.ts.map +1 -0
- package/dist/proxy/credentialsMode.d.ts +77 -0
- package/dist/proxy/credentialsMode.d.ts.map +1 -0
- package/dist/proxy/design.d.ts.map +1 -1
- package/dist/proxy/errors.d.ts.map +1 -1
- package/dist/proxy/followActive.d.ts +262 -0
- package/dist/proxy/followActive.d.ts.map +1 -0
- package/dist/proxy/limitDetection.d.ts +110 -0
- package/dist/proxy/limitDetection.d.ts.map +1 -0
- package/dist/proxy/models.d.ts.map +1 -1
- package/dist/proxy/oauthPlan.d.ts +63 -0
- package/dist/proxy/oauthPlan.d.ts.map +1 -0
- package/dist/proxy/oauthUsage.d.ts +65 -2
- package/dist/proxy/oauthUsage.d.ts.map +1 -1
- package/dist/proxy/openai.d.ts +4 -2
- package/dist/proxy/openai.d.ts.map +1 -1
- package/dist/proxy/organizationName.d.ts +71 -0
- package/dist/proxy/organizationName.d.ts.map +1 -0
- package/dist/proxy/passthroughEarlyStop.d.ts +10 -0
- package/dist/proxy/passthroughEarlyStop.d.ts.map +1 -1
- package/dist/proxy/planAllowance.d.ts +75 -0
- package/dist/proxy/planAllowance.d.ts.map +1 -0
- package/dist/proxy/probes.d.ts +85 -0
- package/dist/proxy/probes.d.ts.map +1 -0
- package/dist/proxy/profileCli.d.ts +53 -1
- package/dist/proxy/profileCli.d.ts.map +1 -1
- package/dist/proxy/profileHealth.d.ts +127 -0
- package/dist/proxy/profileHealth.d.ts.map +1 -0
- package/dist/proxy/profileRename.d.ts +83 -0
- package/dist/proxy/profileRename.d.ts.map +1 -0
- package/dist/proxy/profiles.d.ts +72 -6
- package/dist/proxy/profiles.d.ts.map +1 -1
- package/dist/proxy/query.d.ts +7 -0
- package/dist/proxy/query.d.ts.map +1 -1
- package/dist/proxy/routing.d.ts +59 -1
- package/dist/proxy/routing.d.ts.map +1 -1
- package/dist/proxy/sdkFeatures.d.ts +1 -1
- package/dist/proxy/sdkFeatures.d.ts.map +1 -1
- package/dist/proxy/server.d.ts.map +1 -1
- package/dist/proxy/session/fingerprint.d.ts +5 -0
- package/dist/proxy/session/fingerprint.d.ts.map +1 -1
- package/dist/proxy/session/lineage.d.ts.map +1 -1
- package/dist/proxy/session/processIncarnation.d.ts +7 -0
- package/dist/proxy/session/processIncarnation.d.ts.map +1 -1
- package/dist/proxy/sessionLifecycle.d.ts +8 -1
- package/dist/proxy/sessionLifecycle.d.ts.map +1 -1
- package/dist/proxy/sessionStore.d.ts.map +1 -1
- package/dist/proxy/setup.d.ts.map +1 -1
- package/dist/proxy/supervision.d.ts +41 -0
- package/dist/proxy/supervision.d.ts.map +1 -0
- package/dist/proxy/tokenRefresh.d.ts +38 -4
- package/dist/proxy/tokenRefresh.d.ts.map +1 -1
- package/dist/server.js +11 -7
- package/dist/settings.d.ts +83 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/{setup-ndmjpy23.js → setup-7fr49z92.js} +1 -1
- package/dist/statusProbe-9x9q261e.js +151 -0
- package/dist/telemetry/dashboard.d.ts.map +1 -1
- package/dist/telemetry/index.d.ts +20 -2
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/landing.d.ts +1 -1
- package/dist/telemetry/landing.d.ts.map +1 -1
- package/dist/telemetry/logStore.d.ts +11 -0
- package/dist/telemetry/logStore.d.ts.map +1 -1
- package/dist/telemetry/pricingStore.d.ts +2 -2
- package/dist/telemetry/pricingStore.d.ts.map +1 -1
- package/dist/telemetry/profileBar.d.ts +10 -2
- package/dist/telemetry/profileBar.d.ts.map +1 -1
- package/dist/telemetry/profileFacts.d.ts +17 -0
- package/dist/telemetry/profileFacts.d.ts.map +1 -0
- package/dist/telemetry/profileOrder.d.ts +68 -0
- package/dist/telemetry/profileOrder.d.ts.map +1 -0
- package/dist/telemetry/profilePage.d.ts.map +1 -1
- package/dist/telemetry/profileSort.d.ts +35 -0
- package/dist/telemetry/profileSort.d.ts.map +1 -0
- package/dist/telemetry/profileSpent.d.ts +68 -0
- package/dist/telemetry/profileSpent.d.ts.map +1 -0
- package/dist/telemetry/routeChain.d.ts +32 -0
- package/dist/telemetry/routeChain.d.ts.map +1 -0
- package/dist/telemetry/routes.d.ts.map +1 -1
- package/dist/telemetry/settingsPage.d.ts +1 -1
- package/dist/telemetry/settingsPage.d.ts.map +1 -1
- package/dist/telemetry/sqlite.d.ts.map +1 -1
- package/dist/telemetry/store.d.ts +6 -1
- package/dist/telemetry/store.d.ts.map +1 -1
- package/dist/telemetry/types.d.ts +132 -2
- package/dist/telemetry/types.d.ts.map +1 -1
- package/dist/{tokenRefresh-kzz08kea.js → tokenRefresh-eg9h83wd.js} +6 -1
- package/package.json +2 -1
- package/dist/cli-5jxyma6z.js +0 -277
- package/dist/cli-vj9cv18n.js +0 -38
- package/dist/proxy/settings.d.ts +0 -30
- package/dist/proxy/settings.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,197 +1,150 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="assets/banner.svg" alt="Meridian" width="800"/>
|
|
2
|
+
<img src="assets/banner.svg" alt="Meridian — Harness Claude, your way." width="800" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<
|
|
7
|
-
<a href="https://www.npmjs.com/package/@rynfar/meridian"><img src="https://img.shields.io/npm/v/@rynfar/meridian?style=flat-square&color=bc8cff&label=npm" alt="npm"></a>
|
|
8
|
-
<a href="#"><img src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20Windows-58a6ff?style=flat-square" alt="Platform"></a>
|
|
9
|
-
<a href="#"><img src="https://img.shields.io/badge/license-MIT-bc8cff?style=flat-square" alt="License"></a>
|
|
10
|
-
<a href="https://discord.gg/jP2a2Z92NZ"><img src="https://img.shields.io/badge/discord-join-5865F2?style=flat-square&logo=discord&logoColor=white" alt="Discord"></a>
|
|
6
|
+
<strong>Your tools. Your sessions. One place to see what’s happening.</strong>
|
|
11
7
|
</p>
|
|
12
8
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
>
|
|
18
|
-
>
|
|
19
|
-
>
|
|
20
|
-
> Meridian is built entirely on the [Claude Agent SDK](https://code.claude.com/docs/en/agent-sdk). Every request flows through `query()` — the same documented function Anthropic provides for programmatic access. No OAuth tokens are extracted, no binaries are patched, nothing is reverse-engineered.
|
|
21
|
-
>
|
|
22
|
-
> Because we use the SDK, Anthropic remains in full control of prompt caching, context window management, compaction, rate limiting, and authentication. Meridian doesn't bypass these mechanisms — it depends on them. Max subscription tokens flow through the correct channel, governed by the same guardrails Anthropic built into Claude Code.
|
|
23
|
-
>
|
|
24
|
-
> What Meridian adds is a **presentation and interoperability layer**. We translate Claude Code's output into the standard Anthropic API format so developers can connect the editors, terminals, and workflows they prefer. The SDK does the work; Meridian formats the result.
|
|
25
|
-
>
|
|
26
|
-
> **Our philosophy is simple: work within the SDK's constraints, not around them.** The generous limits on Claude Max exist because Anthropic can optimize and manage usage through Claude Code. Meridian respects that by building only on the tools Anthropic provides — no shortcuts, no workarounds that create friction. We believe this is how developers keep the freedom to choose their own frontends while keeping the platform sustainable for everyone.
|
|
27
|
-
|
|
28
|
-
## Quick Start
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# 1. Install
|
|
32
|
-
npm install -g @rynfar/meridian
|
|
33
|
-
|
|
34
|
-
# 2. Authenticate (one time)
|
|
35
|
-
claude login
|
|
36
|
-
|
|
37
|
-
# 3. Configure OpenCode plugin (one time — OpenCode users only)
|
|
38
|
-
meridian setup # OpenCode V1
|
|
39
|
-
# meridian setup --v2 --opencode-bin ~/.local/bin/opencode2 # pinned V2 beta
|
|
40
|
-
|
|
41
|
-
# 4. Start
|
|
42
|
-
meridian
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Meridian runs on `http://127.0.0.1:3456`. Point any Anthropic-compatible tool at it:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
ANTHROPIC_API_KEY=x ANTHROPIC_BASE_URL=http://127.0.0.1:3456 opencode
|
|
49
|
-
```
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://github.com/rynfar/meridian/releases">Releases</a> ·
|
|
11
|
+
<a href="#get-started">Get started</a> ·
|
|
12
|
+
<a href="docs/agents.md">Connect your agent</a> ·
|
|
13
|
+
<a href="https://discord.gg/jP2a2Z92NZ">Discord</a>
|
|
14
|
+
</p>
|
|
50
15
|
|
|
51
|
-
|
|
16
|
+
<p align="center">
|
|
17
|
+
<a href="https://www.npmjs.com/package/@rynfar/meridian"><img src="https://img.shields.io/npm/v/@rynfar/meridian?style=flat-square&color=58a6ff" alt="npm version" /></a>
|
|
18
|
+
<img src="https://img.shields.io/badge/desktop-macOS_preview-bc8cff?style=flat-square" alt="Desktop: macOS preview" />
|
|
19
|
+
<img src="https://img.shields.io/badge/headless-macOS_·_Linux_·_Windows-58a6ff?style=flat-square" alt="Headless: macOS, Linux and Windows" />
|
|
20
|
+
<a href="https://opensource.org/license/mit"><img src="https://img.shields.io/badge/license-MIT-bc8cff?style=flat-square" alt="MIT license" /></a>
|
|
21
|
+
</p>
|
|
52
22
|
|
|
53
|
-
|
|
23
|
+
Meridian connects Anthropic- and OpenAI-compatible clients to Claude through the
|
|
24
|
+
Claude Agent SDK. Keep the editor or terminal you like, with streaming, persistent
|
|
25
|
+
sessions, account routing and visibility into usage and prompt caching.
|
|
54
26
|
|
|
55
|
-
|
|
27
|
+
**Now with an optional Mac app.** Manage Meridian versions, install plugins, find
|
|
28
|
+
failed requests and see your usage limits without keeping a terminal open.
|
|
29
|
+
Headless Meridian remains fully supported—npm, Docker, Nix and your existing
|
|
30
|
+
service manager all remain valid ways to run it.
|
|
56
31
|
|
|
57
|
-
|
|
32
|
+
## Meet Meridian Desktop
|
|
58
33
|
|
|
59
34
|
<p align="center">
|
|
60
|
-
<img src="assets/
|
|
35
|
+
<img src="assets/desktop-dashboard.jpg" alt="Meridian Desktop overview showing usage limits, cache activity and recent requests. Sample data." width="1000" />
|
|
61
36
|
</p>
|
|
62
37
|
|
|
63
|
-
|
|
38
|
+
<p align="center"><sub>macOS dashboard preview · Sample data</sub></p>
|
|
64
39
|
|
|
65
|
-
|
|
|
66
|
-
|
|
67
|
-
|
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
| [Deployment](docs/deployment.md) | NixOS / Nix flake, Home Manager service, Docker |
|
|
71
|
-
| [Plugins](docs/plugins.md) | Plugin system and the official scrub plugins |
|
|
72
|
-
| [Development](docs/development.md) | Architecture overview, testing, programmatic API |
|
|
73
|
-
| [`MONITORING.md`](MONITORING.md) | Telemetry, token usage, and prompt cache health |
|
|
74
|
-
| [`ARCHITECTURE.md`](ARCHITECTURE.md) | Module map and dependency rules |
|
|
75
|
-
|
|
76
|
-
## Features
|
|
77
|
-
|
|
78
|
-
- **Standard Anthropic API** — drop-in compatible with any tool that supports a custom `base_url`
|
|
79
|
-
- **OpenAI-compatible API** — `/v1/chat/completions` and `/v1/models` for tools that only speak the OpenAI protocol (Open WebUI, Continue, etc.) — no LiteLLM needed, including `image_url` support for data URLs
|
|
80
|
-
- **Session management** — conversations persist across requests, survive compaction and undo, resume after proxy restarts
|
|
81
|
-
- **Streaming** — full SSE streaming with MCP tool filtering
|
|
82
|
-
- **Concurrent sessions** — run parent and subagent requests in parallel
|
|
83
|
-
- **Subagent model selection** — primary agents get 1M context; subagents get 200k, preserving rate-limit budget
|
|
84
|
-
- **Auto token refresh** — expired OAuth tokens are refreshed automatically; requests continue without interruption
|
|
85
|
-
- **Passthrough mode** — forward tool calls to the client instead of executing internally
|
|
86
|
-
- **Multimodal** — images, documents, file attachments, and multimodal tool results pass through to Claude
|
|
87
|
-
- **Multi-profile** — switch between Claude accounts instantly, no restart needed; opt-in [sticky session routing](docs/profiles.md#sticky-session-routing) distributes sessions across accounts while keeping per-account prompt caches warm
|
|
88
|
-
- **Adapter instances** — run several configurations of the same adapter side by side (per-instance thinking, system prompt, passthrough) selected by header or match rules — see [Adapter instances](docs/agents.md#adapter-instances)
|
|
89
|
-
- **Telemetry dashboard** — real-time performance metrics at `/telemetry`, including token usage and prompt cache efficiency ([`MONITORING.md`](MONITORING.md))
|
|
90
|
-
- **Cost estimation** — estimated API-equivalent value of your traffic, per model and per profile, using current list prices with configurable overrides (`~/.config/meridian/model-pricing.json`, editable at `/settings`)
|
|
91
|
-
- **Envelope integrity auditing** — Meridian validates its own wire output on every response (no dangling blocks, no undelivered or empty tool calls) and surfaces violations on the dashboard
|
|
92
|
-
- **Telemetry persistence** — opt-in SQLite storage for telemetry data that survives proxy restarts, with configurable retention
|
|
93
|
-
- **Prometheus metrics** — `GET /metrics` endpoint for scraping request counters and duration histograms
|
|
94
|
-
- **SDK feature toggles** *(experimental)* — unlock Claude Code features (memory, dreaming, CLAUDE.md) for any connected agent
|
|
95
|
-
|
|
96
|
-
## Tested Agents
|
|
97
|
-
|
|
98
|
-
| Agent | Status | Notes |
|
|
99
|
-
|-------|--------|-------|
|
|
100
|
-
| [OpenCode](https://github.com/anomalyco/opencode) | ✅ Verified | V1 and pinned V2 beta support; requires the matching `meridian setup` mode ([setup](docs/agents.md#opencode)) — tools, durable resume, restart, undo, compaction, parallel subagents |
|
|
101
|
-
| [ForgeCode](https://forgecode.dev) | ✅ Verified | Provider config (see [Agent Setup](docs/agents.md)) — passthrough tool execution, session resume, streaming |
|
|
102
|
-
| [Droid (Factory AI)](https://factory.ai/product/ide) | ✅ Verified | BYOK config (see [Agent Setup](docs/agents.md)) — full tool support, session resume, streaming |
|
|
103
|
-
| [Crush](https://github.com/charmbracelet/crush) | ✅ Verified | Provider config (see [Agent Setup](docs/agents.md)) — full tool support, session resume, headless `crush run` |
|
|
104
|
-
| [Cline](https://github.com/cline/cline) | ✅ Verified | Config (see [Agent Setup](docs/agents.md)) — full tool support, file read/write/edit, bash, session resume |
|
|
105
|
-
| [Aider](https://github.com/paul-gauthier/aider) | ✅ Verified | Env vars — file editing, streaming; `--no-stream` broken (litellm bug) |
|
|
106
|
-
| [Open WebUI](https://github.com/open-webui/open-webui) | ✅ Verified | OpenAI-compatible endpoints — set base URL to `http://127.0.0.1:3456` |
|
|
107
|
-
| [Pi](https://github.com/mariozechner/pi-coding-agent) | ✅ Verified | models.json config (see [Agent Setup](docs/agents.md)) — full tool support via passthrough; detected via `x-meridian-agent: pi` header |
|
|
108
|
-
| [Prime Agent](https://www.npmjs.com/package/prime-agent) | ⚠️ Single-agent verified | Extension config (see [Agent Setup](docs/agents.md)) — reliable with one active agent. Concurrent RLM subagents receive distinct session keys, but are not yet production-safe; see [Prime Agent subagents](#prime-agent-subagents). The extension's `metadata.user_id` stamp is **required**, not optional. |
|
|
109
|
-
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | ✅ Verified | `ANTHROPIC_BASE_URL` — remote clients share a Max subscription over the network; client CWD preserved in system prompt |
|
|
110
|
-
| [Cherry Studio](https://github.com/CherryHQ/cherry-studio) | ✅ Verified | `cherry` adapter (see [Agent Setup](docs/agents.md)) — chat client with Claude's built-in web search via internal mode |
|
|
111
|
-
| [Polytoken](https://polytoken.dev/) | ✅ Verified | Provider config (see [Agent Setup](docs/agents.md#Polytoken)) — `X-Polytoken-Session` identity, mandatory client-owned tools (passthrough cannot be disabled), signed-thinking passthrough |
|
|
112
|
-
| Jcode | ✅ Verified | `/v1/chat/completions` + `x-jcode-session` header — dedicated `jcode` adapter keeps append-only history intact, so retained sessions resume on one SDK session (90.9% cache hit on turn 2 of a two-turn Opus session) |
|
|
113
|
-
| [Codex CLI](https://github.com/openai/codex) | ✅ Verified | `/v1/responses` (see [Agent Setup](docs/agents.md)) — Responses-API provider, passthrough tool execution; verified on 0.144 (plain + tool-driving turns) |
|
|
114
|
-
| [Continue](https://github.com/continuedev/continue) | 🔲 Untested | OpenAI-compatible endpoints should work — set `apiBase` to `http://127.0.0.1:3456` |
|
|
115
|
-
|
|
116
|
-
### Prime Agent subagents
|
|
117
|
-
|
|
118
|
-
Prime Agent is reliable through Meridian with one active agent. RLM children have
|
|
119
|
-
separate session identities and can execute successfully, but concurrent subagent
|
|
120
|
-
orchestration is not yet production-safe. Observed failure modes include overload
|
|
121
|
-
amplification, expensive cache churn after fresh-session replay, loss of child-task
|
|
122
|
-
context during recovery, and undelivered tool envelopes. Use a single active Prime
|
|
123
|
-
Agent for unattended or usage-sensitive work until coordinated fixes land in Prime
|
|
124
|
-
Agent and Meridian.
|
|
125
|
-
|
|
126
|
-
Parent-to-child cancellation is handled on the Meridian side: when the extension
|
|
127
|
-
stamps `parent_session_id` alongside the child's session id, aborting a parent's
|
|
128
|
-
in-flight request aborts every live request in the subtree below it and evicts
|
|
129
|
-
each one's session mapping. See
|
|
130
|
-
[Subagent cancellation](docs/agents.md#prime-agent).
|
|
131
|
-
|
|
132
|
-
Prime Agent can keep Opus on the root session while selecting Sol for an individual
|
|
133
|
-
child. A child inherits its parent's model unless the `rlm` call supplies an exact
|
|
134
|
-
`provider/model` selector returned by `rlm.find_models()`:
|
|
135
|
-
|
|
136
|
-
```python
|
|
137
|
-
sol_models = await rlm.find_models("sol")
|
|
138
|
-
print(sol_models) # choose an available exact selector for your authenticated providers
|
|
139
|
-
|
|
140
|
-
child = await rlm(
|
|
141
|
-
"Review this change and report your findings to the parent.",
|
|
142
|
-
name="sol-reviewer",
|
|
143
|
-
model="openai-codex/gpt-5.6-sol",
|
|
144
|
-
)
|
|
145
|
-
```
|
|
40
|
+
| See what matters | Keep it under control |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| **Usage & limits** — account quota windows, reset times and token activity. | **Versions** — install published Meridian releases, switch versions and roll back. |
|
|
43
|
+
| **Requests & cache** — timing, failures, cache history and request details. | **Service** — start, stop, restart and recover an app-managed installation. |
|
|
44
|
+
| **Logs & alerts** — searchable diagnostics and opt-in failure, cache and quota notifications. | **Plugins** — install and update the Pi, OpenCode, Hermes and OpenClaw scrub plugins. |
|
|
146
45
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
46
|
+
Native macOS chrome, menu bar controls and Liquid Glass on supported Macs through
|
|
47
|
+
[electron-liquid-glass](https://github.com/Meridius-Labs/electron-liquid-glass).
|
|
48
|
+
The desktop preview targets **macOS on Apple Silicon**. Linux and Windows desktop
|
|
49
|
+
apps are planned; their runtime support is not ready yet.
|
|
151
50
|
|
|
152
|
-
|
|
51
|
+
## Get started
|
|
153
52
|
|
|
154
|
-
|
|
53
|
+
### With the Mac app
|
|
155
54
|
|
|
156
|
-
|
|
157
|
-
|
|
55
|
+
The first downloadable desktop release is being prepared. Until it is published,
|
|
56
|
+
use the [desktop preview instructions](apps/desktop/README.md#run-locally).
|
|
57
|
+
Signed, notarized `.dmg` and `.zip` downloads will appear under
|
|
58
|
+
[GitHub Releases](https://github.com/rynfar/meridian/releases).
|
|
158
59
|
|
|
159
|
-
|
|
160
|
-
|
|
60
|
+
1. Connect to an existing local Meridian service, or install Meridian from **Versions**.
|
|
61
|
+
2. For a new installation, choose app management in **Service** and start it.
|
|
62
|
+
3. Sign in to a Claude account, then follow your [agent’s setup guide](docs/agents.md).
|
|
161
63
|
|
|
162
|
-
|
|
163
|
-
|
|
64
|
+
The app can monitor Docker or Nix installations through a published local HTTP
|
|
65
|
+
port. Their package manager retains control of updates and lifecycle. Supported
|
|
66
|
+
macOS LaunchAgents can be handed to the app and returned to headless operation.
|
|
67
|
+
[How service ownership works →](apps/desktop/README.md#connect-to-an-existing-installation)
|
|
164
68
|
|
|
165
|
-
|
|
69
|
+
### Headless, as always
|
|
166
70
|
|
|
167
|
-
|
|
168
|
-
# CLI — works whether the proxy is running or not
|
|
169
|
-
meridian refresh-token
|
|
71
|
+
Requires Node.js 22 or newer and a Claude account configured for the SDK.
|
|
170
72
|
|
|
171
|
-
|
|
172
|
-
|
|
73
|
+
```sh
|
|
74
|
+
npm install -g @rynfar/meridian
|
|
75
|
+
claude login
|
|
76
|
+
meridian
|
|
173
77
|
```
|
|
174
78
|
|
|
175
|
-
|
|
176
|
-
|
|
79
|
+
Meridian listens at `http://127.0.0.1:3456`. For OpenCode V1, run
|
|
80
|
+
`meridian setup` once and restart OpenCode. Other clients—including OpenCode V2—have
|
|
81
|
+
[specific setup instructions](docs/agents.md).
|
|
177
82
|
|
|
178
|
-
|
|
179
|
-
|
|
83
|
+
```sh
|
|
84
|
+
# Example for a POSIX shell, with Meridian API-key protection disabled:
|
|
85
|
+
ANTHROPIC_API_KEY=x ANTHROPIC_BASE_URL=http://127.0.0.1:3456 opencode
|
|
86
|
+
```
|
|
180
87
|
|
|
181
|
-
|
|
88
|
+
`x` is a client-required placeholder. If you configure Meridian’s API-key
|
|
89
|
+
protection, use that key instead. Claude authentication comes from the configured
|
|
90
|
+
Claude account. See [configuration](docs/configuration.md) for authentication,
|
|
91
|
+
ports and Windows setup, or [deployment](docs/deployment.md) for Docker and Nix.
|
|
92
|
+
|
|
93
|
+
**No desktop dependency.** Installing the headless package does not install
|
|
94
|
+
Electron. You can run Meridian entirely without the app, including its browser
|
|
95
|
+
[telemetry dashboard](MONITORING.md).
|
|
96
|
+
|
|
97
|
+
## Built for ongoing work
|
|
98
|
+
|
|
99
|
+
- **Keep conversations going.** Sessions resume across requests and proxy restarts,
|
|
100
|
+
with handling for client compaction, undo and branching.
|
|
101
|
+
- **Use the protocol your client speaks.** Anthropic Messages, OpenAI Chat
|
|
102
|
+
Completions and Responses endpoints, including streaming and tool forwarding.
|
|
103
|
+
- **Keep accounts organized.** Multiple Claude profiles, explicit account selection
|
|
104
|
+
and opt-in sticky session routing.
|
|
105
|
+
- **Understand cache behavior.** Request history, prompt-cache metrics, diagnostic
|
|
106
|
+
events and optional persistent telemetry. API-equivalent cost estimates are
|
|
107
|
+
estimates, not your subscription bill.
|
|
108
|
+
- **Keep your deployment.** CLI, containers, declarative Nix services or the
|
|
109
|
+
optional desktop manager share the same Meridian server.
|
|
182
110
|
|
|
183
|
-
|
|
184
|
-
|
|
111
|
+
<p align="center">
|
|
112
|
+
<img src="assets/how-it-works.svg" alt="Your client connects to Meridian, which sends requests through the Claude Agent SDK." width="920" />
|
|
113
|
+
</p>
|
|
185
114
|
|
|
186
|
-
|
|
115
|
+
Meridian uses the SDK’s authentication and request execution. Account access,
|
|
116
|
+
model availability and usage limits still depend on your provider account.
|
|
187
117
|
|
|
188
|
-
|
|
189
|
-
You haven't run `meridian setup`. Without the plugin, OpenCode requests won't have session tracking or subagent model selection. Run `meridian setup` and restart OpenCode.
|
|
118
|
+
## Bring your agent
|
|
190
119
|
|
|
191
|
-
|
|
120
|
+
Setup guides cover **OpenCode, Pi, Claude Code, Codex CLI, Cline, Aider, Crush,
|
|
121
|
+
ForgeCode, Droid, Open WebUI, Cherry Studio, Polytoken, Jcode and Prime Agent**.
|
|
122
|
+
Compatibility varies by client and version; see the
|
|
123
|
+
[tested-agent matrix](docs/agents.md#compatibility-at-a-glance) for evidence and
|
|
124
|
+
limitations. Prime Agent concurrent subagents remain unsuitable for unattended
|
|
125
|
+
or usage-sensitive work. Continue is unverified.
|
|
192
126
|
|
|
193
|
-
|
|
127
|
+
The desktop **Plugins** page installs the four official scrub plugins. Client
|
|
128
|
+
connection setup is still separate; installing a scrub plugin does not configure
|
|
129
|
+
its corresponding client. [Plugin guide →](docs/plugins.md)
|
|
194
130
|
|
|
195
|
-
##
|
|
131
|
+
## Documentation
|
|
196
132
|
|
|
197
|
-
|
|
133
|
+
| Start here | What you’ll find |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| [Desktop guide](apps/desktop/README.md) | Setup, service ownership, updates, plugins and platform status |
|
|
136
|
+
| [Agent setup](docs/agents.md) | Client configuration and compatibility notes |
|
|
137
|
+
| [Configuration](docs/configuration.md) | CLI, environment variables, endpoints and API-key protection |
|
|
138
|
+
| [Accounts & profiles](docs/profiles.md) | Sign-in, multiple accounts and session routing |
|
|
139
|
+
| [Deployment](docs/deployment.md) | Docker, Nix and headless services |
|
|
140
|
+
| [Plugins](docs/plugins.md) | Official packages and plugin configuration |
|
|
141
|
+
| [Monitoring](MONITORING.md) | Usage, request diagnostics and prompt caching |
|
|
142
|
+
| [Development](docs/development.md) | Build, test and programmatic API |
|
|
143
|
+
| [Desktop releases](docs/desktop-releases.md) | Signing, notarization and download publication |
|
|
144
|
+
|
|
145
|
+
## Contribute
|
|
146
|
+
|
|
147
|
+
[Report a bug or suggest a feature](https://github.com/rynfar/meridian/issues),
|
|
148
|
+
open a PR, or join [Discord](https://discord.gg/jP2a2Z92NZ).
|
|
149
|
+
Read [AGENTS.md](AGENTS.md), [ARCHITECTURE.md](ARCHITECTURE.md) and
|
|
150
|
+
[E2E.md](E2E.md) before changing behavior. Meridian is [MIT licensed](https://opensource.org/license/mit).
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm
|
|
3
|
+
} from "./cli-p9swy5t3.js";
|
|
4
|
+
|
|
5
|
+
// src/env.ts
|
|
6
|
+
function env(suffix) {
|
|
7
|
+
return process.env[`MERIDIAN_${suffix}`] ?? process.env[`CLAUDE_PROXY_${suffix}`];
|
|
8
|
+
}
|
|
9
|
+
function envBool(suffix) {
|
|
10
|
+
const val = env(suffix);
|
|
11
|
+
return val === "1" || val === "true" || val === "yes";
|
|
12
|
+
}
|
|
13
|
+
function resolvePassthrough(defaultValue) {
|
|
14
|
+
const val = env("PASSTHROUGH");
|
|
15
|
+
if (val === "1" || val === "true" || val === "yes")
|
|
16
|
+
return true;
|
|
17
|
+
if (val === "0" || val === "false" || val === "no")
|
|
18
|
+
return false;
|
|
19
|
+
return defaultValue;
|
|
20
|
+
}
|
|
21
|
+
function envInt(suffix, defaultValue) {
|
|
22
|
+
const val = env(suffix);
|
|
23
|
+
if (!val)
|
|
24
|
+
return defaultValue;
|
|
25
|
+
const parsed = parseInt(val, 10);
|
|
26
|
+
return Number.isFinite(parsed) ? parsed : defaultValue;
|
|
27
|
+
}
|
|
28
|
+
var init_env = () => {};
|
|
29
|
+
|
|
30
|
+
export { env, envBool, resolvePassthrough, envInt, init_env };
|