ldrouter 1.14.0 → 1.16.2
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/CHANGELOG.md +49 -0
- package/README.md +23 -1
- package/dist/server/app.js +10 -1
- package/dist/server/auth/api-key.js +2 -2
- package/dist/server/auth/middleware.js +37 -1
- package/dist/server/db/index.js +5 -0
- package/dist/server/db/migrate.js +38 -5
- package/dist/server/db/repositories/codex-accounts.js +187 -0
- package/dist/server/db/schema.js +44 -3
- package/dist/server/gateway/runner.js +75 -12
- package/dist/server/providers/codex-autostart.js +98 -0
- package/dist/server/providers/codex-import.js +156 -0
- package/dist/server/providers/codex-oauth.js +77 -0
- package/dist/server/providers/codex-refresh.js +165 -0
- package/dist/server/providers/codex-usage.js +192 -0
- package/dist/server/providers/codex.js +186 -0
- package/dist/server/providers/index.js +5 -0
- package/dist/server/routes/admin/auth.js +4 -1
- package/dist/server/routes/admin/codex.js +331 -0
- package/dist/server/routes/admin/models.js +20 -3
- package/dist/server/routes/admin/providers.js +63 -20
- package/dist/server/routes/admin/requests.js +1 -0
- package/dist/server/routes/admin.js +12 -0
- package/dist/server/routing/capabilities.js +3 -3
- package/dist/server/routing/combo.js +20 -14
- package/dist/server/upstream/client.js +54 -38
- package/dist/web/assets/index-Coy-u6h8.css +1 -0
- package/dist/web/assets/index-qDG5c6aL.js +386 -0
- package/dist/web/index.html +2 -2
- package/migrations/0005_codex_accounts.sql +105 -0
- package/migrations/0006_codex_usage.sql +9 -0
- package/package.json +5 -1
- package/dist/web/assets/index-CBMHkVXC.js +0 -330
- package/dist/web/assets/index-Dswaxg_c.css +0 -1
package/dist/web/index.html
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<meta name="color-scheme" content="light dark" />
|
|
8
8
|
<title>LateDev Router</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-qDG5c6aL.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Coy-u6h8.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
-- 0005_codex_accounts.sql
|
|
2
|
+
-- Rebuild the provider graph without retargeting child foreign keys to legacy tables.
|
|
3
|
+
-- SQLite rewrites REFERENCES providers to providers_legacy when providers is renamed;
|
|
4
|
+
-- rebuild the dependent graph in dependency order instead of disabling enforcement.
|
|
5
|
+
ALTER TABLE combo_members RENAME TO combo_members_legacy;
|
|
6
|
+
ALTER TABLE models RENAME TO models_legacy;
|
|
7
|
+
ALTER TABLE providers RENAME TO providers_legacy;
|
|
8
|
+
|
|
9
|
+
CREATE TABLE providers (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
name TEXT NOT NULL,
|
|
12
|
+
slug TEXT NOT NULL UNIQUE,
|
|
13
|
+
type TEXT NOT NULL CHECK (type IN ('openai','anthropic','codex')),
|
|
14
|
+
base_url TEXT NOT NULL,
|
|
15
|
+
encrypted_api_key TEXT,
|
|
16
|
+
api_key_nonce TEXT,
|
|
17
|
+
api_key_version INTEGER NOT NULL DEFAULT 1,
|
|
18
|
+
custom_headers_encrypted TEXT,
|
|
19
|
+
custom_headers_nonce TEXT,
|
|
20
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
21
|
+
connect_timeout_ms INTEGER NOT NULL DEFAULT 10000,
|
|
22
|
+
first_token_timeout_ms INTEGER NOT NULL DEFAULT 30000,
|
|
23
|
+
stream_idle_timeout_ms INTEGER NOT NULL DEFAULT 60000,
|
|
24
|
+
total_timeout_ms INTEGER NOT NULL DEFAULT 180000,
|
|
25
|
+
max_retries INTEGER NOT NULL DEFAULT 2,
|
|
26
|
+
retry_base_ms INTEGER NOT NULL DEFAULT 500,
|
|
27
|
+
retry_max_ms INTEGER NOT NULL DEFAULT 8000,
|
|
28
|
+
cb_failure_threshold INTEGER NOT NULL DEFAULT 5,
|
|
29
|
+
cb_cooldown_seconds INTEGER NOT NULL DEFAULT 60,
|
|
30
|
+
health_state TEXT NOT NULL DEFAULT 'unknown' CHECK (health_state IN ('healthy','degraded','down','circuit_open','unknown')),
|
|
31
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
|
32
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
|
|
33
|
+
);
|
|
34
|
+
INSERT INTO providers SELECT * FROM providers_legacy;
|
|
35
|
+
|
|
36
|
+
CREATE TABLE models (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE RESTRICT,
|
|
39
|
+
upstream_model_id TEXT NOT NULL,
|
|
40
|
+
public_model_id TEXT NOT NULL UNIQUE,
|
|
41
|
+
display_name TEXT NOT NULL,
|
|
42
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
43
|
+
upstream_available INTEGER NOT NULL DEFAULT 1,
|
|
44
|
+
capabilities_json TEXT NOT NULL DEFAULT '{}',
|
|
45
|
+
max_context_tokens INTEGER,
|
|
46
|
+
max_output_tokens INTEGER,
|
|
47
|
+
discovered_metadata_json TEXT,
|
|
48
|
+
cache_override_enabled INTEGER,
|
|
49
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
|
50
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
|
51
|
+
last_seen_upstream_at TEXT
|
|
52
|
+
);
|
|
53
|
+
INSERT INTO models SELECT * FROM models_legacy;
|
|
54
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uniq_model_public ON models(public_model_id);
|
|
55
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uniq_provider_upstream ON models(provider_id, upstream_model_id);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_model_enabled ON models(enabled);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE combo_members (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
combo_id TEXT NOT NULL REFERENCES combos(id) ON DELETE CASCADE,
|
|
61
|
+
model_id TEXT NOT NULL REFERENCES models(id) ON DELETE RESTRICT,
|
|
62
|
+
position INTEGER NOT NULL,
|
|
63
|
+
weight INTEGER NOT NULL DEFAULT 1,
|
|
64
|
+
enabled INTEGER NOT NULL DEFAULT 1
|
|
65
|
+
);
|
|
66
|
+
INSERT INTO combo_members SELECT * FROM combo_members_legacy;
|
|
67
|
+
CREATE UNIQUE INDEX IF NOT EXISTS uniq_combo_model ON combo_members(combo_id, model_id);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS idx_combo_pos ON combo_members(combo_id, position);
|
|
69
|
+
|
|
70
|
+
DROP TABLE combo_members_legacy;
|
|
71
|
+
DROP TABLE models_legacy;
|
|
72
|
+
DROP TABLE providers_legacy;
|
|
73
|
+
|
|
74
|
+
CREATE TABLE codex_accounts (
|
|
75
|
+
id TEXT PRIMARY KEY,
|
|
76
|
+
provider_id TEXT NOT NULL REFERENCES providers(id) ON DELETE RESTRICT,
|
|
77
|
+
email TEXT,
|
|
78
|
+
workspace_id TEXT,
|
|
79
|
+
chatgpt_account_id TEXT,
|
|
80
|
+
plan_type TEXT,
|
|
81
|
+
encrypted_access_token TEXT NOT NULL,
|
|
82
|
+
access_token_nonce TEXT NOT NULL,
|
|
83
|
+
access_token_version INTEGER NOT NULL DEFAULT 1,
|
|
84
|
+
encrypted_refresh_token TEXT NOT NULL,
|
|
85
|
+
refresh_token_nonce TEXT NOT NULL,
|
|
86
|
+
refresh_token_version INTEGER NOT NULL DEFAULT 1,
|
|
87
|
+
encrypted_id_token TEXT,
|
|
88
|
+
id_token_nonce TEXT,
|
|
89
|
+
id_token_version INTEGER NOT NULL DEFAULT 1,
|
|
90
|
+
token_expires_at TEXT NOT NULL,
|
|
91
|
+
last_refresh_at TEXT,
|
|
92
|
+
auth_method TEXT NOT NULL DEFAULT 'oauth' CHECK (auth_method IN ('oauth','access_token')),
|
|
93
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
94
|
+
health_state TEXT NOT NULL DEFAULT 'unknown' CHECK (health_state IN ('healthy','degraded','down','unknown')),
|
|
95
|
+
last_error TEXT,
|
|
96
|
+
consecutive_failures INTEGER NOT NULL DEFAULT 0,
|
|
97
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
98
|
+
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
|
99
|
+
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
|
|
100
|
+
);
|
|
101
|
+
CREATE INDEX idx_codex_account_provider_enabled_priority ON codex_accounts(provider_id, enabled, priority);
|
|
102
|
+
CREATE INDEX idx_codex_account_provider_email ON codex_accounts(provider_id, email);
|
|
103
|
+
CREATE INDEX idx_codex_account_provider_chatgpt ON codex_accounts(provider_id, chatgpt_account_id);
|
|
104
|
+
ALTER TABLE request_attempts ADD COLUMN codex_account_id TEXT REFERENCES codex_accounts(id) ON DELETE SET NULL;
|
|
105
|
+
CREATE INDEX idx_attempt_codex_account ON request_attempts(codex_account_id, started_at);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- 0006_codex_usage.sql
|
|
2
|
+
-- Codex per-account usage snapshots and 5-hour window auto-start state.
|
|
3
|
+
ALTER TABLE codex_accounts ADD COLUMN codex_usage_json TEXT;
|
|
4
|
+
ALTER TABLE codex_accounts ADD COLUMN codex_usage_updated_at TEXT;
|
|
5
|
+
ALTER TABLE codex_accounts ADD COLUMN codex_usage_error TEXT;
|
|
6
|
+
ALTER TABLE codex_accounts ADD COLUMN codex_autostart_enabled INTEGER NOT NULL DEFAULT 0;
|
|
7
|
+
ALTER TABLE codex_accounts ADD COLUMN last_pinged_reset_at TEXT;
|
|
8
|
+
ALTER TABLE codex_accounts ADD COLUMN last_pinged_reset_key TEXT;
|
|
9
|
+
ALTER TABLE codex_accounts ADD COLUMN last_ping_at TEXT;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ldrouter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.2",
|
|
4
4
|
"description": "LateDev Router — lightweight self-hosted LLM gateway with admin UI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"main": "dist/server/app.js",
|
|
16
16
|
"bin": {
|
|
17
|
+
"latedev-router": "dist/cli.js",
|
|
17
18
|
"ldrouter": "dist/cli.js"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
@@ -50,6 +51,9 @@
|
|
|
50
51
|
"release:major": "pnpm verify && npm version major -m \"release: v%s\""
|
|
51
52
|
},
|
|
52
53
|
"dependencies": {
|
|
54
|
+
"@dnd-kit/core": "^6.3.1",
|
|
55
|
+
"@dnd-kit/modifiers": "^9.0.0",
|
|
56
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
53
57
|
"@fastify/cookie": "^11.0.2",
|
|
54
58
|
"@fastify/cors": "^10.0.2",
|
|
55
59
|
"@fastify/helmet": "^13.0.1",
|