Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
18aba9b
fix(streaming): #1211 greedy strip omniModel tags to prevent literal …
diegosouzapw Apr 14, 2026
a1ffbc4
fix: 3 bugs found during issue triage (#1175, #1187/#1218, #1202)
diegosouzapw Apr 14, 2026
b6e8597
fix(providers): update Xiaomi MiMo token-plan endpoints (#1238)
hijak Apr 14, 2026
ff183f8
fix(cc-compatible): trim beta flags and preserve cache passthrough (#…
rdself Apr 14, 2026
711812a
feat(memory+skills): full-featured memory & skills systems with tests…
oyi77 Apr 14, 2026
5acb40c
fix: forward client x-initiator header to GitHub Copilot upstream (#1…
cedrugs Apr 14, 2026
2a84d79
feat(bailian-quota): add Alibaba Coding Plan quota monitoring (#1235)
diegosouzapw Apr 14, 2026
a26b3ee
fix: resolve v3.6.6 backlog bugs (#1206, #1211, #1220, #1231)
diegosouzapw Apr 14, 2026
9949fad
fix(tests): resolve memory migration and skills route pagination bugs…
diegosouzapw Apr 14, 2026
d675c8f
docs: Update CHANGELOG.md with v3.6.6 features (#1182, #1165, #1177)
diegosouzapw Apr 14, 2026
de050be
chore(release): bump version to 3.6.6
diegosouzapw Apr 14, 2026
07b2810
feat(core): harden outbound provider calls and add cooldown retries
diegosouzapw Apr 14, 2026
9952a6c
feat(models): add glmt preset and hybrid token counting
diegosouzapw Apr 14, 2026
cc27bdd
feat(api): add sync tokens and v1 websocket bridge
diegosouzapw Apr 15, 2026
935c36f
docs: Update all documentation for v3.6.6
diegosouzapw Apr 15, 2026
7fc758c
fix: use api64 for proxy test (#1255)
mgarmash Apr 15, 2026
08a2a15
fix(page): update custom models section to include all providers #120…
hartmark Apr 15, 2026
00a4b45
fix: provide default client_id fallbacks to prevent broken OAuth requ…
Gi99lin Apr 15, 2026
678298f
fix: translate max_tokens/max_completion_tokens → max_output_tokens i…
Gi99lin Apr 15, 2026
da9af4a
feat(oauth): support cursor-agent CLI as Cursor credential source (#1…
payne0420 Apr 15, 2026
a17b723
fix(cc-compatible): restore upstream SSE and correct stream/combo tim…
rdself Apr 15, 2026
d89e38e
fix(cli-tools): resolve API key resolution and model mapping bugs in …
benzntech Apr 15, 2026
bc0ad6a
feat(cli-tools): add Qwen Code CLI integration (#1266)
benzntech Apr 15, 2026
ca21f51
fix(i18n): add missing zh-CN translations and fix logger imports (#1269)
clousky2020 Apr 15, 2026
69e46ca
fix(i18n): add Chinese i18n support to dashboard components (#1274)
clousky2020 Apr 15, 2026
2a175ec
feat: update Pollinations to require API key, remove free tier flag (…
diegosouzapw Apr 15, 2026
e860df1
feat: friendly error messages for crypto/encryption failures (#1165)
diegosouzapw Apr 15, 2026
915341a
feat: add TPS (tokens per second) metric column to request logs (#1182)
diegosouzapw Apr 15, 2026
efeafce
feat: merge custom/imported models into filter list for all providers…
diegosouzapw Apr 15, 2026
18604ac
feat(fallback): Fix provider-profile-driven lockouts (#1267)
diegosouzapw Apr 15, 2026
fdb8c10
fix(claude): proper Anthropic SDK integration (#1271)
diegosouzapw Apr 15, 2026
bd1a06d
fix(healthcheck): use correct proxy wrapper format for getAccessToken…
diegosouzapw Apr 15, 2026
699d746
chore(release): v3.6.6 — skills registry stability fix + final integr…
diegosouzapw Apr 15, 2026
de44f3b
fix(auth): harden bootstrap auth and memory dashboard behavior
diegosouzapw Apr 15, 2026
a158014
fix(codex): remove max_output_tokens from body for compatibility
diegosouzapw Apr 15, 2026
18fec5d
chore(release): v3.6.6 — include PR 1274 fixes in changelog
diegosouzapw Apr 15, 2026
0c0e530
chore: exclude additional build artifacts and internal directories fr…
diegosouzapw Apr 15, 2026
001310e
fix: update Gemini OAuth test to match registry defaults + codex UI i…
diegosouzapw Apr 15, 2026
288c35c
fix: restore .mjs refs for scripts/ in test imports after ts migration
diegosouzapw Apr 15, 2026
4e924db
fix: restore next.config.mjs ref in dev-origins test
diegosouzapw Apr 15, 2026
5bbe645
fix: implement db migration safety checks and codex config format
diegosouzapw Apr 15, 2026
419f4c6
fix: disable mass-migration abort during unit tests based on auto-bac…
diegosouzapw Apr 15, 2026
8f86907
fix: update script regex in auto-update tests to use .mjs
diegosouzapw Apr 15, 2026
66ace45
feat: Add Perplexity Web (Session) provider (#1289)
RaviTharuma Apr 15, 2026
497014d
fix(cli): resolve codex routing config parsing, standardize select mo…
diegosouzapw Apr 15, 2026
e1b19c0
docs(changelog): record recent cli, provider, and test updates
diegosouzapw Apr 15, 2026
058422c
chore(release): merge #1286 minor improvements manually to avoid test…
diegosouzapw Apr 15, 2026
33c6c43
chore(test): rename perplexity-web.test.mjs to .ts to maintain 100% T…
diegosouzapw Apr 15, 2026
77e4ce1
chore(docs): update CHANGELOG.md for perplexity-web provider
diegosouzapw Apr 15, 2026
5768e76
fix(security): resolve CodeQL incomplete URL substring sanitization v…
diegosouzapw Apr 15, 2026
b73d235
fix: integrate compressContext() into chatCore.ts request pipeline
oyi77 Apr 15, 2026
5791904
fix(tests): align reasoning expectations with GLM thinking structure
diegosouzapw Apr 15, 2026
9ae1a80
fix: prevent orphaned tool_result messages in purifyHistory()
oyi77 Apr 15, 2026
8b21c7b
Merge release/v3.6.6 into branch
diegosouzapw Apr 15, 2026
16e6fd8
Merge branch 'release/v3.6.6' into fix/compress-context-integration-1290
diegosouzapw Apr 15, 2026
0437592
fix(tests): supply tool_use in mock so it is not dropped
diegosouzapw Apr 15, 2026
327b06e
chore: convert remaining test to TypeScript
diegosouzapw Apr 15, 2026
674eada
fix(tests): restore compatibility with compressContext threshold test…
diegosouzapw Apr 15, 2026
6e1e927
docs: finalize v3.6.6 release documentation
diegosouzapw Apr 15, 2026
25d58dd
fix(core): finalize provider removal, type issues, and codex API key …
diegosouzapw Apr 15, 2026
89201f8
Merge remote-tracking branch 'origin/main' into release/v3.6.6
diegosouzapw Apr 15, 2026
b20fde8
fix(dashboard): render Web/Cookie, Search, Audio provider sections an…
diegosouzapw Apr 15, 2026
0fa025a
fix: increase MCP web_search timeout to 60s (#1278)
diegosouzapw Apr 15, 2026
0e4f9e3
fix: route combo testing properly for embedding models (#1260)
diegosouzapw Apr 15, 2026
3c239dd
fix: accumulate excluded accounts in combo fallback loop (#1233)
diegosouzapw Apr 15, 2026
93ae772
fix: strip leading whitespace and newlines from first streaming chunk…
diegosouzapw Apr 15, 2026
7bb0ce4
docs: clarify VPS and Docker settings for OAuth credentials (#1204)
diegosouzapw Apr 15, 2026
f239ae9
fix: return real retry-after for pipeline gates (#1301)
rdself Apr 16, 2026
578004c
feat: streaming semantic cache, Cursor auto-version detection, and ca…
Hdsje Apr 16, 2026
d166362
feat(api): support more OpenAI types (image, embeddings, audio-transc…
hartmark Apr 16, 2026
cc867aa
deps: bump hono from 4.12.12 to 4.12.14 (#1302)
dependabot[bot] Apr 16, 2026
72502e4
deps: bump hono from 4.12.12 to 4.12.14 (#1306)
dependabot[bot] Apr 16, 2026
4ebe313
chore: stabilization fixes for v3.6.6 (#1298, #1254, #59, CI)
diegosouzapw Apr 16, 2026
ae5ffdd
fix(providers): match correct endpoint for Xiaomi MiMo, strip routing…
diegosouzapw Apr 16, 2026
8cc478f
feat(storage): add database backup cleanup controls
xiaoge1688 Apr 15, 2026
e5508ab
Merge pull request #1304 from xiaoge1688/fix/db-backup-retention-cont…
diegosouzapw Apr 16, 2026
ed96ee7
chore(release): v3.6.6 — Final Stabilization Push
diegosouzapw Apr 16, 2026
37126fa
Backport call log storage refactor to release/v3.6.6 (#1307)
rdself Apr 16, 2026
732ce86
deps: update dompurify to 3.4.0 to resolve CVE-XYZ (#60)
diegosouzapw Apr 16, 2026
3d61788
test: disable sqlite auto backup in CI to resolve E2E timeout (#24481…
diegosouzapw Apr 16, 2026
103a781
chore(docs): sync CHANGELOG for v3.6.6 with missing features and fixes
diegosouzapw Apr 16, 2026
7d0da96
chore(release): prep v3.6.6 infrastructure and type safety fixes
diegosouzapw Apr 16, 2026
2266281
chore: fix TS build errors and e2e timeouts in CI
diegosouzapw Apr 16, 2026
7b18e75
chore(release): sync package version 3.6.6 across workspaces
diegosouzapw Apr 16, 2026
c13969e
test(e2e): universally increase UI component visibility timeouts from…
diegosouzapw Apr 16, 2026
e5c16fb
chore(build): inject baseUrl, paths, and types:node into MITM tsconfi…
diegosouzapw Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 10 additions & 7 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true
# CLI_CLINE_BIN=cline
# CLI_CONTINUE_BIN=cn
# CLI_QODER_BIN=qoder
# CLI_QWEN_BIN=qwen


# ═══════════════════════════════════════════════════════════════════════════════
Expand Down Expand Up @@ -354,6 +355,7 @@ QODER_OAUTH_CLIENT_SECRET=4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW
# QODER_OAUTH_TOKEN_URL=
# QODER_OAUTH_USERINFO_URL=
# QODER_OAUTH_CLIENT_ID=
# QODER_OAUTH_CLIENT_SECRET=

# ── Qoder Personal Access Token (direct API key fallback) ──
# Used by: open-sse/executors/qoder.ts — bypasses OAuth when set.
Expand All @@ -362,14 +364,15 @@ QODER_OAUTH_CLIENT_SECRET=4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW
# OMNIROUTE_QODER_WORKSPACE=

# ─────────────────────────────────────────────────────────────────────────────
# ⚠️ GOOGLE OAUTH (Antigravity, Gemini CLI) — IMPORTANT FOR REMOTE SERVERS
# ⚠️ GOOGLE OAUTH (Antigravity, Gemini CLI) & OTHER PROVIDERS — REMOTE SERVERS
# ─────────────────────────────────────────────────────────────────────────────
# The credentials above ONLY work when OmniRoute runs on localhost.
# For remote hosting:
# 1. Go to https://console.cloud.google.com/apis/credentials
# 2. Create an OAuth 2.0 Client ID (type: "Web application")
# 3. Add your server URL as Authorized redirect URI
# 4. Replace the values above with your credentials.
# The default Client IDs above ONLY work when OmniRoute runs on localhost.
# For remote/VPS hosting (including Docker containers on remote servers):
# 1. By default, the browser will attempt OAuth redirects back to localhost, which will fail.
# 2. Set NEXT_PUBLIC_BASE_URL=https://your-domain.com to fix the redirect URI.
# 3. You MUST create your own OAuth App in each provider's developer console (Google Cloud, etc.)
# and set the Authorized redirect URI to your domain (e.g., https://your-domain.com/callback).
# 4. Replace the _OAUTH_CLIENT_ID and _SECRET values above with your own credentials.
# ─────────────────────────────────────────────────────────────────────────────

# ── OAuth sidecar/CLI bridge (internal) ──
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ body:
description: "Which commands or tests should prove this bug is fixed?"
placeholder: |
Example:
- node --import tsx/esm --test tests/unit/my-file.test.mjs
- node --import tsx/esm --test tests/unit/my-file.test.ts
- npm run test:coverage
validations:
required: false
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/test_coverage_task.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ body:
Example:
- open-sse/handlers/chatCore.ts
- open-sse/services/combo.ts
- tests/integration/chat-pipeline.test.mjs
- tests/integration/chat-pipeline.test.ts
validations:
required: true

Expand Down Expand Up @@ -59,7 +59,7 @@ body:
description: "List the commands that must pass before this issue can be closed."
placeholder: |
Example:
- node --import tsx/esm --test tests/unit/my-suite.test.mjs
- node --import tsx/esm --test tests/unit/my-suite.test.ts
- npm run test:coverage
validations:
required: true
Expand Down
57 changes: 46 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ concurrency:
permissions:
contents: read

env:
CI_NODE_VERSION: "22.22.2"

jobs:
lint:
name: Lint
Expand All @@ -22,9 +25,10 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run lint
- run: npm run check:cycles
- run: npm run check:route-validation:t06
Expand Down Expand Up @@ -82,7 +86,7 @@ jobs:
fetch-depth: 0
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
- name: Fetch base branch
run: git fetch --no-tags origin "${GITHUB_BASE_REF}" --depth=1
- name: Validate source changes include tests
Expand Down Expand Up @@ -112,16 +116,17 @@ jobs:

- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm

- run: npm ci
- run: npm run check:node-runtime

- name: Dependency audit
run: npm audit --audit-level=high --omit=dev || true
run: npm audit --audit-level=high --omit=dev

- name: Check for known vulnerabilities
run: npx is-my-node-vulnerable || true
run: npx is-my-node-vulnerable

- name: Run Snyk Vulnerability checks
if: github.actor != 'dependabot[bot]'
Expand All @@ -138,11 +143,29 @@ jobs:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run build

package-artifact:
name: Package Artifact
runs-on: ubuntu-latest
needs: build
env:
JWT_SECRET: ci-build-secret-with-sufficient-length-for-validation
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run build:cli
- run: npm run check:pack-artifact

test-unit:
name: Unit Tests
runs-on: ubuntu-latest
Expand All @@ -151,13 +174,15 @@ jobs:
env:
JWT_SECRET: ci-test-secret-with-sufficient-length-for-validation
API_KEY_SECRET: ci-test-api-key-secret-long
DISABLE_SQLITE_AUTO_BACKUP: "true"
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run test:unit

test-coverage:
Expand All @@ -168,13 +193,15 @@ jobs:
env:
JWT_SECRET: ci-test-secret-with-sufficient-length-for-validation
API_KEY_SECRET: ci-test-api-key-secret-long
DISABLE_SQLITE_AUTO_BACKUP: "true"
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- name: Run coverage gate
run: npm run test:coverage
- name: Build coverage summary
Expand Down Expand Up @@ -322,13 +349,15 @@ jobs:
env:
JWT_SECRET: ci-test-secret-with-sufficient-length-for-validation
API_KEY_SECRET: ci-test-api-key-secret-long
DISABLE_SQLITE_AUTO_BACKUP: "true"
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npx playwright install --with-deps chromium
- run: npm run build
- run: npx playwright test tests/e2e/*.spec.ts --shard=${{ matrix.shard }}/4
Expand All @@ -343,13 +372,15 @@ jobs:
API_KEY_SECRET: ci-test-api-key-secret-long
INITIAL_PASSWORD: ci-test-password-for-integration
DATA_DIR: /tmp/omniroute-ci
DISABLE_SQLITE_AUTO_BACKUP: "true"
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run test:integration

test-security:
Expand All @@ -359,13 +390,15 @@ jobs:
env:
JWT_SECRET: ci-test-secret-with-sufficient-length-for-validation
API_KEY_SECRET: ci-test-api-key-secret-long
DISABLE_SQLITE_AUTO_BACKUP: "true"
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.CI_NODE_VERSION }}
cache: npm
- run: npm ci
- run: npm run check:node-runtime
- run: npm run test:security

ci-summary:
Expand All @@ -378,6 +411,7 @@ jobs:
- pr-test-policy
- advanced-security
- build
- package-artifact
- test-unit
- test-coverage
- sonarqube
Expand Down Expand Up @@ -424,6 +458,7 @@ jobs:
echo "| Job | Status |" >> "$GITHUB_STEP_SUMMARY"
echo "|-----|--------|" >> "$GITHUB_STEP_SUMMARY"
echo "| Build Matrix | $(status '${{ needs.build.result }}') |" >> "$GITHUB_STEP_SUMMARY"
echo "| Package Artifact | $(status '${{ needs.package-artifact.result }}') |" >> "$GITHUB_STEP_SUMMARY"

echo "" >> "$GITHUB_STEP_SUMMARY"
echo "## 🧪 Tests" >> "$GITHUB_STEP_SUMMARY"
Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/npm-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ permissions:
id-token: write
packages: write

env:
NPM_PUBLISH_NODE_VERSION: "22.22.2"

jobs:
publish:
runs-on: ubuntu-latest
Expand All @@ -48,7 +51,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
node-version: ${{ env.NPM_PUBLISH_NODE_VERSION }}
registry-url: https://registry.npmjs.org

- name: Install dependencies (skip scripts to avoid heavy build)
Expand Down Expand Up @@ -88,7 +91,10 @@ jobs:
- name: Build CLI bundle (standalone app)
env:
JWT_SECRET: ci-build-secret-with-sufficient-length-for-validation
run: node scripts/prepublish.mjs
run: npm run build:cli

- name: Validate npm package artifact
run: npm run check:pack-artifact

- name: Publish to npm
run: |
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,4 @@ docs/superpowers/

# GitNexus local index
.gitnexus
.worktrees
4 changes: 4 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,7 @@ vscode-extension/

# Root-level underscore-prefixed directories (private/draft — never publish)
/_*/
app/_*/
app/coverage/
app/logs/
app/tests/
10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ with **MCP Server** (25 tools), **A2A v0.3 Protocol**, and **Electron desktop ap
npm run test:all

# Single test file (Node.js native test runner — most tests use this)
node --import tsx/esm --test tests/unit/your-file.test.mjs
node --import tsx/esm --test tests/unit/plan3-p0.test.mjs
node --import tsx/esm --test tests/unit/fixes-p1.test.mjs
node --import tsx/esm --test tests/unit/security-fase01.test.mjs
node --import tsx/esm --test tests/unit/your-file.test.ts
node --import tsx/esm --test tests/unit/plan3-p0.test.ts
node --import tsx/esm --test tests/unit/fixes-p1.test.ts
node --import tsx/esm --test tests/unit/security-fase01.test.ts

# Integration tests
node --import tsx/esm --test tests/integration/*.test.mjs
node --import tsx/esm --test tests/integration/*.test.ts

# Vitest (MCP server, autoCombo)
npm run test:vitest
Expand Down
Loading
Loading