feat(providers): add Conol (conol.ai) web session provider - #8974
Merged
diegosouzapw merged 3 commits intoAug 11, 2026
Merged
Conversation
artickc
marked this pull request as ready for review
July 30, 2026 10:01
artickc
force-pushed
the
feat/conol-web-provider
branch
from
July 30, 2026 11:18
7c1331f to
a7ba045
Compare
Conol ignores agentModel/agentEffort on POST /api/sessions, so every
session silently ran on the downgraded account default (the create
response reports modelDowngraded: true / effectiveModel).
Sessions are now created empty and configured out-of-band against
POST /api/sessions/{id}/model before the first turn is submitted, in the
order the web client uses: modelPreset, then agentModel, then agentEffort.
The ordering is load-bearing because the model call resets agentEffort to
null server-side.
Effort now defaults to xhigh when the caller does not pin one via the
-<effort> model suffix, and is clamped onto the ladder each model actually
advertises, so xhigh degrades to high on claude-sonnet-5 and is skipped
entirely for models without an effort ladder such as openrouter/fusion.
Model and effort are also dropped from the session binding key so switching
models re-pins the existing session instead of stranding it and losing the
conversation history. Re-pinning only happens on an actual change, so
steady-state follow-ups cost no extra round trips.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
diegosouzapw
force-pushed
the
feat/conol-web-provider
branch
from
August 11, 2026 00:59
19377c8 to
32af60a
Compare
diegosouzapw
merged commit Aug 11, 2026
f5ce51a
into
diegosouzapw:release/v3.8.50
4 of 5 checks passed
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 11, 2026
…ase-red) Three independent, unrelated defects on release/v3.8.50 currently blocking typecheck:core and any test that transitively imports the apikey provider registry (i.e. most of the suite): 1. gateways.ts: the "regolo" entry (diegosouzapw#9468) never closed its object literal before the next "naga-ac" key started, a TS1005 parse error that breaks every downstream import of this file. 2. gateways.ts: "chatanywhere" was defined twice as a top-level key (two different contributors adding the same gateway independently) — TS1117. JS object-literal semantics mean the second definition already silently wins at runtime, so removing the first (dead, shadowed) definition is a pure no-op for actual behavior. 3. conol-web/index.ts (diegosouzapw#8974): imported conolModels.ts with one `../` too few, resolving to the nonexistent open-sse/config/services/conolModels.ts instead of open-sse/services/conolModels.ts (compare every sibling registry entry's own services/ import, e.g. hyperagent/index.ts, notion-web/index.ts, promptql/index.ts — all use the same 4-level path).⚠️ base-red inherited: diegosouzapw#9985 Confirmed pre-existing on the pristine release/v3.8.50 tip (byte-identical diff before this fix); not introduced by this branch.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 11, 2026
…ve while booting omniroute-dev Found while restarting omniroute-dev after rebasing 6 unrelated PRs onto this branch — each one breaks the dev server (Turbopack) or the affected route entirely. All confirmed pre-existing on pristine release/v3.8.50. 1. open-sse/handlers/videoGeneration.ts: handleFalVideoGeneration was imported from two different modules (videoGeneration/falHandler.ts and the newer mediaGeneration/fal.ts, landed via diegosouzapw#9982) — an ES module duplicate-binding error that breaks the Turbopack build entirely via the instrumentation import chain. Kept the newer, more complete mediaGeneration/fal.ts import (also covers Fal music generation). 2. open-sse/executors/tinycmsSigner.ts: initTinyCmsWasm() always calls __wbg_init() with a decoded WASM_BASE64 buffer, so the `new URL('wasm_signer_bg.wasm', import.meta.url)` fallback (only reachable with no module/buffer passed) is dead code in practice — confirmed via provider-tinycms-web.test.ts's initTinyCmsWasm idempotency test, unaffected by this change. Turbopack doesn't know it's dead: it statically bundles any `new URL('literal', import.meta.url)` regardless of reachability, and no wasm_signer_bg.wasm file was ever checked in alongside tinycmsSigner.ts (diegosouzapw#8736) — breaks the entire app. Fixed by building the same URL from a computed (non-literal) string, which no longer matches Turbopack's static-asset-resolution pattern. 3. conolDiscovery.ts (diegosouzapw#8974): imported getProviderOutboundGuard from @/shared/network/outboundUrlGuard, which never exported it — every other caller (route.ts, normalizers.ts, imageValidation.ts, searchProviders.ts, remoteImageFetch.ts) correctly imports from @/shared/network/outboundUrlGuardPolicy. Broke /api/providers/[id]/models and /api/providers/[id]/sync-models (500), and poisoned the dev server's error state for unrelated requests until a working route recompiled.⚠️ base-red inherited: diegosouzapw#9985 Test plan: - npx tsc --noEmit -p tsconfig.typecheck-core.json — the 3 errors from these files are gone - tests/unit/provider-tinycms-web.test.ts — 15/15 passed, including the initTinyCmsWasm idempotency test (confirms fix #2 is behavior-preserving) - Live-verified: omniroute-dev booted clean and stayed healthy across multiple health-check rechecks only after all 6 fixes in this PR (the original 3 + these 3) were applied together
HouMinXi
added a commit
to HouMinXi/OmniRoute
that referenced
this pull request
Aug 11, 2026
diegosouzapw#8974 added conol-web with a three-level `../` where the sibling registry entries (promptql, hyperagent, notion-web) use four; the same typo hit deepai's `../shared` which must be `../../shared.ts`. Both resolved to a missing module, breaking the Next.js production build.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 11, 2026
…ase-red) Three independent, unrelated defects on release/v3.8.50 currently blocking typecheck:core and any test that transitively imports the apikey provider registry (i.e. most of the suite): 1. gateways.ts: the "regolo" entry (diegosouzapw#9468) never closed its object literal before the next "naga-ac" key started, a TS1005 parse error that breaks every downstream import of this file. 2. gateways.ts: "chatanywhere" was defined twice as a top-level key (two different contributors adding the same gateway independently) — TS1117. JS object-literal semantics mean the second definition already silently wins at runtime, so removing the first (dead, shadowed) definition is a pure no-op for actual behavior. 3. conol-web/index.ts (diegosouzapw#8974): imported conolModels.ts with one `../` too few, resolving to the nonexistent open-sse/config/services/conolModels.ts instead of open-sse/services/conolModels.ts (compare every sibling registry entry's own services/ import, e.g. hyperagent/index.ts, notion-web/index.ts, promptql/index.ts — all use the same 4-level path).⚠️ base-red inherited: diegosouzapw#9985 Confirmed pre-existing on the pristine release/v3.8.50 tip (byte-identical diff before this fix); not introduced by this branch.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 11, 2026
…ve while booting omniroute-dev Found while restarting omniroute-dev after rebasing 6 unrelated PRs onto this branch — each one breaks the dev server (Turbopack) or the affected route entirely. All confirmed pre-existing on pristine release/v3.8.50. 1. open-sse/handlers/videoGeneration.ts: handleFalVideoGeneration was imported from two different modules (videoGeneration/falHandler.ts and the newer mediaGeneration/fal.ts, landed via diegosouzapw#9982) — an ES module duplicate-binding error that breaks the Turbopack build entirely via the instrumentation import chain. Kept the newer, more complete mediaGeneration/fal.ts import (also covers Fal music generation). 2. open-sse/executors/tinycmsSigner.ts: initTinyCmsWasm() always calls __wbg_init() with a decoded WASM_BASE64 buffer, so the `new URL('wasm_signer_bg.wasm', import.meta.url)` fallback (only reachable with no module/buffer passed) is dead code in practice — confirmed via provider-tinycms-web.test.ts's initTinyCmsWasm idempotency test, unaffected by this change. Turbopack doesn't know it's dead: it statically bundles any `new URL('literal', import.meta.url)` regardless of reachability, and no wasm_signer_bg.wasm file was ever checked in alongside tinycmsSigner.ts (diegosouzapw#8736) — breaks the entire app. Fixed by building the same URL from a computed (non-literal) string, which no longer matches Turbopack's static-asset-resolution pattern. 3. conolDiscovery.ts (diegosouzapw#8974): imported getProviderOutboundGuard from @/shared/network/outboundUrlGuard, which never exported it — every other caller (route.ts, normalizers.ts, imageValidation.ts, searchProviders.ts, remoteImageFetch.ts) correctly imports from @/shared/network/outboundUrlGuardPolicy. Broke /api/providers/[id]/models and /api/providers/[id]/sync-models (500), and poisoned the dev server's error state for unrelated requests until a working route recompiled.⚠️ base-red inherited: diegosouzapw#9985 Test plan: - npx tsc --noEmit -p tsconfig.typecheck-core.json — the 3 errors from these files are gone - tests/unit/provider-tinycms-web.test.ts — 15/15 passed, including the initTinyCmsWasm idempotency test (confirms fix #2 is behavior-preserving) - Live-verified: omniroute-dev booted clean and stayed healthy across multiple health-check rechecks only after all 6 fixes in this PR (the original 3 + these 3) were applied together
adevwithpurpose
pushed a commit
to adevwithpurpose/OmniRoute
that referenced
this pull request
Aug 12, 2026
diegosouzapw#8974 added conol-web with a three-level `../` where the sibling registry entries (promptql, hyperagent, notion-web) use four; the same typo hit deepai's `../shared` which must be `../../shared.ts`. Both resolved to a missing module, breaking the Next.js production build.
This was referenced Aug 12, 2026
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 12, 2026
…ase-red) Three independent, unrelated defects on release/v3.8.50 currently blocking typecheck:core and any test that transitively imports the apikey provider registry (i.e. most of the suite): 1. gateways.ts: the "regolo" entry (diegosouzapw#9468) never closed its object literal before the next "naga-ac" key started, a TS1005 parse error that breaks every downstream import of this file. 2. gateways.ts: "chatanywhere" was defined twice as a top-level key (two different contributors adding the same gateway independently) — TS1117. JS object-literal semantics mean the second definition already silently wins at runtime, so removing the first (dead, shadowed) definition is a pure no-op for actual behavior. 3. conol-web/index.ts (diegosouzapw#8974): imported conolModels.ts with one `../` too few, resolving to the nonexistent open-sse/config/services/conolModels.ts instead of open-sse/services/conolModels.ts (compare every sibling registry entry's own services/ import, e.g. hyperagent/index.ts, notion-web/index.ts, promptql/index.ts — all use the same 4-level path).⚠️ base-red inherited: diegosouzapw#9985 Confirmed pre-existing on the pristine release/v3.8.50 tip (byte-identical diff before this fix); not introduced by this branch.
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 12, 2026
…ve while booting omniroute-dev Found while restarting omniroute-dev after rebasing 6 unrelated PRs onto this branch — each one breaks the dev server (Turbopack) or the affected route entirely. All confirmed pre-existing on pristine release/v3.8.50. 1. open-sse/handlers/videoGeneration.ts: handleFalVideoGeneration was imported from two different modules (videoGeneration/falHandler.ts and the newer mediaGeneration/fal.ts, landed via diegosouzapw#9982) — an ES module duplicate-binding error that breaks the Turbopack build entirely via the instrumentation import chain. Kept the newer, more complete mediaGeneration/fal.ts import (also covers Fal music generation). 2. open-sse/executors/tinycmsSigner.ts: initTinyCmsWasm() always calls __wbg_init() with a decoded WASM_BASE64 buffer, so the `new URL('wasm_signer_bg.wasm', import.meta.url)` fallback (only reachable with no module/buffer passed) is dead code in practice — confirmed via provider-tinycms-web.test.ts's initTinyCmsWasm idempotency test, unaffected by this change. Turbopack doesn't know it's dead: it statically bundles any `new URL('literal', import.meta.url)` regardless of reachability, and no wasm_signer_bg.wasm file was ever checked in alongside tinycmsSigner.ts (diegosouzapw#8736) — breaks the entire app. Fixed by building the same URL from a computed (non-literal) string, which no longer matches Turbopack's static-asset-resolution pattern. 3. conolDiscovery.ts (diegosouzapw#8974): imported getProviderOutboundGuard from @/shared/network/outboundUrlGuard, which never exported it — every other caller (route.ts, normalizers.ts, imageValidation.ts, searchProviders.ts, remoteImageFetch.ts) correctly imports from @/shared/network/outboundUrlGuardPolicy. Broke /api/providers/[id]/models and /api/providers/[id]/sync-models (500), and poisoned the dev server's error state for unrelated requests until a working route recompiled.⚠️ base-red inherited: diegosouzapw#9985 Test plan: - npx tsc --noEmit -p tsconfig.typecheck-core.json — the 3 errors from these files are gone - tests/unit/provider-tinycms-web.test.ts — 15/15 passed, including the initTinyCmsWasm idempotency test (confirms fix #2 is behavior-preserving) - Live-verified: omniroute-dev booted clean and stayed healthy across multiple health-check rechecks only after all 6 fixes in this PR (the original 3 + these 3) were applied together
diegosouzapw
added a commit
that referenced
this pull request
Aug 12, 2026
…sh (#10198) The Build CI job is advisory, so eight module-level defects from eight different PRs accumulated on release/v3.8.50 until `npm run build` failed with 7 Turbopack errors and `npm run lint` with 14. Build (link-time): - modelSelectModalHelpers.ts: a lost `}` swallowed PROVIDER_TEST_CHUNK_SIZE into isProviderModelHidden's body (#9011). - videoGeneration.ts: handleFalVideoGeneration imported twice; the standalone falHandler.ts is superseded by the provider-neutral mediaGeneration/fal.ts and is removed here (#9982 over #9969). - catalog.ts: re-exported and called the injectable SWR policy that #9199 deliberately replaced with a fixed 30s bound. Fixed on the consumer side — restoring the accessor would resurrect the unbounded window #9199 removed after measuring a 41s catalog build in production. - tinycmsSigner.ts: generated wasm-bindgen glue kept a sidecar `new URL('wasm_signer_bg.wasm', import.meta.url)` that no file backs; Turbopack resolves it statically. The module ships inlined as WASM_BASE64 and the only caller always passes it explicitly (#8736/#10087). - conolDiscovery.ts: imported getProviderOutboundGuard from outboundUrlGuard, which does not export it. Fixed on the consumer side: outboundUrlGuard.ts is loaded by the packaged CLI without a tsconfig, so it must stay free of `@/`-aliased imports (#7682). Runtime (the build never caught this one): - catalogCache.ts::scheduleBackgroundRefresh had two dangling statements referencing undeclared `inFlight`/`promise`, so EVERY stale-while-revalidate read threw a ReferenceError. Surfaced by realigning the #8728 suite, which #9199 left asserting a removed contract. Lint: - driverFactory.test.ts: a case inserted between the preceding test's `finally` and its `});` left the file unparseable, so the SQLite driver-cascade suite (26 tests) had not run since 2026-08-11 (#9173). - providerModelsConfig.ts: imported an executor directly, crossing the G14 boundary; routed through a new open-sse/services/zaiWebCredentials.ts (#8451). - image-combo.test.ts: 11 `any` violations, now typed (#9499). Validation: npm run build exit 0, npm run lint clean, typecheck:core clean, 41/41 tests green across the affected suites. Refs #9011 #9982 #9199 #8728 #8736 #10087 #8974 #9173 #8451 #9499 Co-authored-by: backryun <bakryun0718@proton.me>
hartmark
added a commit
to hartmark/OmniRoute
that referenced
this pull request
Aug 12, 2026
…ase-red) Three independent, unrelated defects on release/v3.8.50 currently blocking typecheck:core and any test that transitively imports the apikey provider registry (i.e. most of the suite): 1. gateways.ts: the "regolo" entry (diegosouzapw#9468) never closed its object literal before the next "naga-ac" key started, a TS1005 parse error that breaks every downstream import of this file. 2. gateways.ts: "chatanywhere" was defined twice as a top-level key (two different contributors adding the same gateway independently) — TS1117. JS object-literal semantics mean the second definition already silently wins at runtime, so removing the first (dead, shadowed) definition is a pure no-op for actual behavior. 3. conol-web/index.ts (diegosouzapw#8974): imported conolModels.ts with one `../` too few, resolving to the nonexistent open-sse/config/services/conolModels.ts instead of open-sse/services/conolModels.ts (compare every sibling registry entry's own services/ import, e.g. hyperagent/index.ts, notion-web/index.ts, promptql/index.ts — all use the same 4-level path).⚠️ base-red inherited: diegosouzapw#9985 Confirmed pre-existing on the pristine release/v3.8.50 tip (byte-identical diff before this fix); not introduced by this branch.
diegosouzapw
pushed a commit
that referenced
this pull request
Aug 13, 2026
…sibling sweep Real production defects fixed (all red on the pure tip, each with its origin): - routeGuard.ts: #8949 accidentally DELETED the /api/providers/[id]/login local-only pattern — the route spawns a browser, so the loopback gate for a process-spawning route was gone (Hard Rules #15/#17); restored (314 guard tests green) - agentSkills generator: #9058's category dispatch gave the config category an empty body, wiping skills/config-codex-cli/SKILL.md at the #10131 sync; fixed + SKILL.md regenerated via the official generator - imageRegistry: #9982 broke same-provider bare aliasing (antigravity preview id sent upstream unresolved); new resolveSameProviderBareAlias() keeps the fal cross-provider fix intact - imageRegistry: #9982's prefix strip handed the bare nano-banana ids to fal-ai, violating the pinned 2026-07-31 operator decision (adobe-firefly owns them); fal entries made prefix-only (dispatch already re-prefixes) - mediaGeneration/fal.ts: the missing-credential 401 guard was lost when #10198 deleted the superseded falHandler — tests were hitting the live network - bottleneckPatch/rateLimitManager: #9041's merge clobbered #9604, resurrecting the Bottleneck v2.19.5 heartbeat bug (reservoir never refills); patched the library defect at the root and re-aligned chat-rate-limit-body-lock to the working reservoir contract - processSupervisor.mjs: #9761 regressed the Node spawn to bare "node" (the #9156 launchd bug) and dropped #9209's ipv4first args; both restored - openai-responses/pureHelpers: #9423's Agent null-sentinel was unreachable on the schemaless JSON-string path; gate extended - i18n en.json: #8222's regen reverted the #9976 unclosed-tag fix and #8559's combo-cooldown copy; #9038 shipped 40 t() calls with no messages (runtime MISSING_MESSAGE); all restored/added + official sync-ui stamps, and vi's zero-marker policy re-established via the sanctioned translation backend Stale sibling tests aligned (movers cited inline): chat-helpers (#9447), executor-antigravity (#9351), video-fal-grok (#9982), visionBridge (#9759), web-session-credentials (#8974), production-build-module-integrity (positive anchor added), agentSkills-generator/skillManifestsLint/skills-injection/ agentSkillTools-mcp/listCapabilities-a2a (#9058), memory-settings (#10010), model-catalog-policy-invalidation (#8906), model-alias-seed (#9485), reactive-context-compaction (#8949), combo-provider-wildcard (broken upsert helper), oauth-google-loopback (43-locale resurrected-key removal) Validation: 501/501 across the 47 touched test files; typecheck:core, lint, file-size, docs-sync all green. Refs #9985
diegosouzapw
added a commit
that referenced
this pull request
Aug 13, 2026
* fix(ci): clear base-reds on release/v3.8.50 (round 3) - CHANGELOG.md: restore the top [Unreleased] section dropped by the #10189 reconcile (docs-sync gate: first section must be Unreleased) - env-doc-sync: document CONDUCTOR_ORCHESTRATOR_TOKEN + CONDUCTOR_SPOKESPERSON_URL in .env.example/ENVIRONMENT.md; allowlist the CI-only GITHUB_STEP_SUMMARY and TS7_BASE_REF (ts7 ratchet signals); drop a stray merge artifact line - providers: restore the audited chatanywhere metadata entry that base-reds round 2 dropped together with its duplicate — the provider was half-wired (registry+endpoint without APIKEY metadata), which is what the wave3 test catches; re-pin providers-constants-split at the measured 228 - docs counts: 338 -> 339 (today's +2 void-ai/helixmind, -1 Puter) via gen:provider-reference + README/AGENTS/llm.txt/package.json/diagrams/i18n mirrors - file-size ratchet: annotated rebaseline for the two pre-existing drifts (ModelSelectModal 1138, gateways 1250) following the 2026-08-11 precedent Refs #9985 * fix(ci): base-reds round 3b — stale sibling tests + mode-pack weight contract - check-docs-counts-sync.test.ts: drop the imports/subtests of the four helpers #10196 removed from the gate script (readMcpFactsFromSource, listLocalizedDocs, makeRequiredCountsValidator, checkFreeTierInventory) — the new-API tests that #10196 added stay; the file now loads again under the node runner - quota-connection-recovery.test.ts: convert from vitest APIs to node:test — the file lives in tests/unit/*.test.ts (node-runner glob) and the vitest runtime crashes when imported outside vitest, killing the whole shard entry - modePacks.ts: re-normalize all six mode packs to sum 1.0 — #8940 added sessionAvailability: 0.05 to every pack without rebalancing (1.05 total); ratios preserved exactly (÷1.05), so post-normalizeScoringWeights behavior is unchanged; restores the declared sum-to-1.0 contract the 4235 test pins Refs #9985 * fix(ci): base-reds round 3c — vitest siblings, weights default, secrets FP, mutation tap - DistributeProxiesButton.test.tsx: wrap renders in NextIntlClientProvider — #9245 localized the component (useTranslations) and left the test without the intl context, failing all 14 cases - scoring.ts: re-normalize DEFAULT_WEIGHTS to sum 1.0 (same #8940 class as the mode packs — sessionAvailability added without rebalancing; ratios preserved) - .gitleaks.toml: generalize the kimi sponsor-banner localStorage-key allowlist to -v\d+ — #10200 bumped v1→v2 and the stale regex regressed the secrets ratchet with a false positive - stryker.conf.json: register 6 covering unit tests in tap.testFiles (4 modules) so their mutant kills count — unblocks check:mutation-test-coverage --strict Refs #9985 * fix(ci): base-reds round 3d — inspector factor gap, stale registry/gap tests, i18n key sync - comboScoringInspector: add cacheAffinity/sessionAvailability/connectionDensity to FACTOR_KEYS + the factor-key type — calculateScore() weighs them but the breakdown omitted them, so the explained contributions never summed to the reported score (inspector bug, red on the pure tip) - combo-scoring-inspector.test: make the explicit-weights override sum-neutral (±0.05 shift) so it stays valid for any DEFAULT_WEIGHTS values — the hardcoded override only summed to 1.0 against the pre-#8940 defaults, which is also why explicit weights silently fell back to 'default' on the tip - unorouter-registry.test: align to the canonical .com host (api.unorouter.ai 301-redirects there, verified live) and to wave4's live model discovery (passthrough, no static seed) — the .ai/auto-model expectations were stale - check-migration-numbering.test: 147 left KNOWN_GAPS when 147_api_keys_model_access_mode.sql landed — assert absent (same as 143) - i18n: sync-ui pass — 35,914 missing UI keys stamped as __MISSING__ placeholders across 42 locales (mechanical; greens the pt-BR key-presence integrity test; coverage pct unchanged by design — translation is a separate workstream) Refs #9985 * fix(ci): base-reds round 3e — 2 real defects + 14 stale sibling tests (waves A-E) Real defects fixed: - src/lib/db/apiKeys.ts: #9313's empty-allowlist early return bypassed the group permission check, silently disabling group deny rules (#8817) for every key without a per-key allowlist; fall-through restored, restricted+[] deny-all kept - open-sse/utils/proxyFetch.ts: #10032 re-appended the raw transport error to the propagated message, reintroducing the proxy user:password leak #9837 closed; new redactProxyDetailsInMessage() keeps the reason, redacts URL/credentials - .github/workflows/quality.yml: #10134 added the TS7 ratchet as a separate blocking step AFTER the aggregated gates — the exact #8542 masking mechanism; folded into the non-fail-fast loop (still blocking, still PR-only)⚠️ CI edit, gate-strengthening — explicit owner sign-off requested on the PR - src/i18n/messages/ko.json: 3 machine-mistranslation regressions caught by the #8244 glossary checker (장애인→비활성화됨, 양말5://→socks5://, 비클로드→Claude가 아닌) Stale sibling tests aligned to deliberately-moved contracts (each cites its mover): request-log-detail-layout + -stream (#9245 intl provider), repro-8542 pin update, quality-rail-gate-membership (#10134 shape), agentSkills-routes 45→46 (#9058), cloudflare-ai-catalog-8717 (#8804 supersedes #8808), executor-xai (#9994), vision-bridge-claude-wire (#9463 minimax→openai), sse-auth forced-pin (#8893), tls-proxy-context (strengthened leak guards), rate-limit-local-error-classification (#9164/#9342), minimax-thinking-signature (#9463), codebuddy-cn (#9723 +1 test), github-copilot-custom-model (#9050), providers-g4f-batch3 (#9584), synced-capability-warmup (#9199, stricter), sidebar-tools-group (#8221), oauth-modal-grok-cli-paste (#9245); agentSkills/catalog.ts comment 45→46; file-size rebaseline for proxyFetch (+19, annotated) Refs #9985 * fix(ci): base-reds round 3f — waves F-J: 9 more real defects + stale sibling sweep Real production defects fixed (all red on the pure tip, each with its origin): - routeGuard.ts: #8949 accidentally DELETED the /api/providers/[id]/login local-only pattern — the route spawns a browser, so the loopback gate for a process-spawning route was gone (Hard Rules #15/#17); restored (314 guard tests green) - agentSkills generator: #9058's category dispatch gave the config category an empty body, wiping skills/config-codex-cli/SKILL.md at the #10131 sync; fixed + SKILL.md regenerated via the official generator - imageRegistry: #9982 broke same-provider bare aliasing (antigravity preview id sent upstream unresolved); new resolveSameProviderBareAlias() keeps the fal cross-provider fix intact - imageRegistry: #9982's prefix strip handed the bare nano-banana ids to fal-ai, violating the pinned 2026-07-31 operator decision (adobe-firefly owns them); fal entries made prefix-only (dispatch already re-prefixes) - mediaGeneration/fal.ts: the missing-credential 401 guard was lost when #10198 deleted the superseded falHandler — tests were hitting the live network - bottleneckPatch/rateLimitManager: #9041's merge clobbered #9604, resurrecting the Bottleneck v2.19.5 heartbeat bug (reservoir never refills); patched the library defect at the root and re-aligned chat-rate-limit-body-lock to the working reservoir contract - processSupervisor.mjs: #9761 regressed the Node spawn to bare "node" (the #9156 launchd bug) and dropped #9209's ipv4first args; both restored - openai-responses/pureHelpers: #9423's Agent null-sentinel was unreachable on the schemaless JSON-string path; gate extended - i18n en.json: #8222's regen reverted the #9976 unclosed-tag fix and #8559's combo-cooldown copy; #9038 shipped 40 t() calls with no messages (runtime MISSING_MESSAGE); all restored/added + official sync-ui stamps, and vi's zero-marker policy re-established via the sanctioned translation backend Stale sibling tests aligned (movers cited inline): chat-helpers (#9447), executor-antigravity (#9351), video-fal-grok (#9982), visionBridge (#9759), web-session-credentials (#8974), production-build-module-integrity (positive anchor added), agentSkills-generator/skillManifestsLint/skills-injection/ agentSkillTools-mcp/listCapabilities-a2a (#9058), memory-settings (#10010), model-catalog-policy-invalidation (#8906), model-alias-seed (#9485), reactive-context-compaction (#8949), combo-provider-wildcard (broken upsert helper), oauth-google-loopback (43-locale resurrected-key removal) Validation: 501/501 across the 47 touched test files; typecheck:core, lint, file-size, docs-sync all green. Refs #9985 * fix(ci): base-reds round 3g — wave K/L: 4 more real defects + stale alignments Real defects: - base/reasoningEffort.ts: the stale duplicate cherry-pick #9612 re-added the codex minimal→low rewrite that #9883 had deliberately removed (OMP minimal passthrough); block removed again - cursorImages.ts: #9840 wired prepareCursorImageForWire (sharp re-encode, fail-closed) into the SHARED resolveCursorImages, breaking zai-web and conol-web image uploads (HTTP 400 'undecodable'); new prepareForWire opt-out, Cursor default path unchanged (8 cursor suites green) - modelCapabilities/snapshot: catalog prepare still issued 323 per-model reads of model_context_overrides + max_input_tokens overrides, violating #9199's bulk-load contract; both now resolve from the snapshot single pass - v1-models-discovery-conformance: re-pinned to the bounded 30s SWR window (#9199/#10198) — the old 'stale-first regardless of age' contract is gone Stale tests aligned (movers cited inline): codex-tools-strict-default (#9828 redundant-oneOf strip), devin-providers (#9245 i18n), db-migrationrunner- constants-split (147→151 renumber #8228), gitlab-duo-oauth-setup (#9245), chatcore-extracted-modules (#9161 outbound-protocol keying) compression-api CI failures were cascade artifacts of codex-tools-strict-default failing in the same force-exit shard process — no own defect (171/171 local). Refs #9985 * fix(test): compression-api — register both describes before the runner starts The DATA_DIR setup + route/db top-level awaits sat BETWEEN the two describes; under --test-force-exit (the CI unit-runner flag) the process exits once the already-registered tests finish, so on slow CI machines the whole second describe died as 'Promise resolution is still pending' — the recurring CI-only shard-2 failure that never reproduced locally without the flag. Moved to the top of the file; 10/10 under --test-force-exit locally. Refs #9985 * fix(quality): freeze modelCapabilities.ts at 1006 (annotated) — snapshot routing growth Refs #9985 * fix(quality): move the modelCapabilities freeze into the frozen map (nested schema) Refs #9985 * fix(i18n): translate all 39,718 pending UI keys across 42 locales (owner-approved) Mass-translated every __MISSING__ placeholder via the official i18n:sync-ui --translate-markers pipeline (operator backend), restoring i18nUiCoverage to the 100 baseline (was 89.9 after the merge-storm UI landings + the 42 keys #9038 never shipped). Post-pass repairs, all caught by the existing gates: - glossary: retired renderings the machine reintroduced normalized again (提供商→提供者 zh-CN/zh-TW, 鏈接→連結, 文檔→文件, 調用→呼叫, 供應商→提供者, 響應→回應, 不活躍→未啟用 zh-TW; 클로드→Claude, 옴니루트→OmniRoute ko); DATA_DIR forbidden rendering avoided via 数据文件夹 rephrase - ICU integrity: 120 values with renamed/dropped {params} repaired (39 positional renames, 81 reset to the en source — functional over fluent) Validation: glossary/pt-BR/vi/deno-relay/settings-keys/value-drift/google- loopback suites 76/76; placeholder diff en×42 locales = 0; worst-locale coverage = 100.0%. Refs #9985 --------- Co-authored-by: backryun <bakryun0718@proton.me>
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…apw#8974) * feat(providers): add Conol web support * fix(conol): preserve sessions and image turns * fix(conol): pin session model and effort via /model endpoint Conol ignores agentModel/agentEffort on POST /api/sessions, so every session silently ran on the downgraded account default (the create response reports modelDowngraded: true / effectiveModel). Sessions are now created empty and configured out-of-band against POST /api/sessions/{id}/model before the first turn is submitted, in the order the web client uses: modelPreset, then agentModel, then agentEffort. The ordering is load-bearing because the model call resets agentEffort to null server-side. Effort now defaults to xhigh when the caller does not pin one via the -<effort> model suffix, and is clamped onto the ladder each model actually advertises, so xhigh degrades to high on claude-sonnet-5 and is skipped entirely for models without an effort ladder such as openrouter/fusion. Model and effort are also dropped from the session binding key so switching models re-pins the existing session instead of stranding it and losing the conversation history. Re-pinning only happens on an actual change, so steady-state follow-ups cost no extra round trips. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…sh (diegosouzapw#10198) The Build CI job is advisory, so eight module-level defects from eight different PRs accumulated on release/v3.8.50 until `npm run build` failed with 7 Turbopack errors and `npm run lint` with 14. Build (link-time): - modelSelectModalHelpers.ts: a lost `}` swallowed PROVIDER_TEST_CHUNK_SIZE into isProviderModelHidden's body (diegosouzapw#9011). - videoGeneration.ts: handleFalVideoGeneration imported twice; the standalone falHandler.ts is superseded by the provider-neutral mediaGeneration/fal.ts and is removed here (diegosouzapw#9982 over diegosouzapw#9969). - catalog.ts: re-exported and called the injectable SWR policy that diegosouzapw#9199 deliberately replaced with a fixed 30s bound. Fixed on the consumer side — restoring the accessor would resurrect the unbounded window diegosouzapw#9199 removed after measuring a 41s catalog build in production. - tinycmsSigner.ts: generated wasm-bindgen glue kept a sidecar `new URL('wasm_signer_bg.wasm', import.meta.url)` that no file backs; Turbopack resolves it statically. The module ships inlined as WASM_BASE64 and the only caller always passes it explicitly (diegosouzapw#8736/diegosouzapw#10087). - conolDiscovery.ts: imported getProviderOutboundGuard from outboundUrlGuard, which does not export it. Fixed on the consumer side: outboundUrlGuard.ts is loaded by the packaged CLI without a tsconfig, so it must stay free of `@/`-aliased imports (diegosouzapw#7682). Runtime (the build never caught this one): - catalogCache.ts::scheduleBackgroundRefresh had two dangling statements referencing undeclared `inFlight`/`promise`, so EVERY stale-while-revalidate read threw a ReferenceError. Surfaced by realigning the diegosouzapw#8728 suite, which diegosouzapw#9199 left asserting a removed contract. Lint: - driverFactory.test.ts: a case inserted between the preceding test's `finally` and its `});` left the file unparseable, so the SQLite driver-cascade suite (26 tests) had not run since 2026-08-11 (diegosouzapw#9173). - providerModelsConfig.ts: imported an executor directly, crossing the G14 boundary; routed through a new open-sse/services/zaiWebCredentials.ts (diegosouzapw#8451). - image-combo.test.ts: 11 `any` violations, now typed (diegosouzapw#9499). Validation: npm run build exit 0, npm run lint clean, typecheck:core clean, 41/41 tests green across the affected suites. Refs diegosouzapw#9011 diegosouzapw#9982 diegosouzapw#9199 diegosouzapw#8728 diegosouzapw#8736 diegosouzapw#10087 diegosouzapw#8974 diegosouzapw#9173 diegosouzapw#8451 diegosouzapw#9499 Co-authored-by: backryun <bakryun0718@proton.me>
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…0213) * fix(ci): clear base-reds on release/v3.8.50 (round 3) - CHANGELOG.md: restore the top [Unreleased] section dropped by the diegosouzapw#10189 reconcile (docs-sync gate: first section must be Unreleased) - env-doc-sync: document CONDUCTOR_ORCHESTRATOR_TOKEN + CONDUCTOR_SPOKESPERSON_URL in .env.example/ENVIRONMENT.md; allowlist the CI-only GITHUB_STEP_SUMMARY and TS7_BASE_REF (ts7 ratchet signals); drop a stray merge artifact line - providers: restore the audited chatanywhere metadata entry that base-reds round 2 dropped together with its duplicate — the provider was half-wired (registry+endpoint without APIKEY metadata), which is what the wave3 test catches; re-pin providers-constants-split at the measured 228 - docs counts: 338 -> 339 (today's +2 void-ai/helixmind, -1 Puter) via gen:provider-reference + README/AGENTS/llm.txt/package.json/diagrams/i18n mirrors - file-size ratchet: annotated rebaseline for the two pre-existing drifts (ModelSelectModal 1138, gateways 1250) following the 2026-08-11 precedent Refs diegosouzapw#9985 * fix(ci): base-reds round 3b — stale sibling tests + mode-pack weight contract - check-docs-counts-sync.test.ts: drop the imports/subtests of the four helpers diegosouzapw#10196 removed from the gate script (readMcpFactsFromSource, listLocalizedDocs, makeRequiredCountsValidator, checkFreeTierInventory) — the new-API tests that diegosouzapw#10196 added stay; the file now loads again under the node runner - quota-connection-recovery.test.ts: convert from vitest APIs to node:test — the file lives in tests/unit/*.test.ts (node-runner glob) and the vitest runtime crashes when imported outside vitest, killing the whole shard entry - modePacks.ts: re-normalize all six mode packs to sum 1.0 — diegosouzapw#8940 added sessionAvailability: 0.05 to every pack without rebalancing (1.05 total); ratios preserved exactly (÷1.05), so post-normalizeScoringWeights behavior is unchanged; restores the declared sum-to-1.0 contract the 4235 test pins Refs diegosouzapw#9985 * fix(ci): base-reds round 3c — vitest siblings, weights default, secrets FP, mutation tap - DistributeProxiesButton.test.tsx: wrap renders in NextIntlClientProvider — diegosouzapw#9245 localized the component (useTranslations) and left the test without the intl context, failing all 14 cases - scoring.ts: re-normalize DEFAULT_WEIGHTS to sum 1.0 (same diegosouzapw#8940 class as the mode packs — sessionAvailability added without rebalancing; ratios preserved) - .gitleaks.toml: generalize the kimi sponsor-banner localStorage-key allowlist to -v\d+ — diegosouzapw#10200 bumped v1→v2 and the stale regex regressed the secrets ratchet with a false positive - stryker.conf.json: register 6 covering unit tests in tap.testFiles (4 modules) so their mutant kills count — unblocks check:mutation-test-coverage --strict Refs diegosouzapw#9985 * fix(ci): base-reds round 3d — inspector factor gap, stale registry/gap tests, i18n key sync - comboScoringInspector: add cacheAffinity/sessionAvailability/connectionDensity to FACTOR_KEYS + the factor-key type — calculateScore() weighs them but the breakdown omitted them, so the explained contributions never summed to the reported score (inspector bug, red on the pure tip) - combo-scoring-inspector.test: make the explicit-weights override sum-neutral (±0.05 shift) so it stays valid for any DEFAULT_WEIGHTS values — the hardcoded override only summed to 1.0 against the pre-diegosouzapw#8940 defaults, which is also why explicit weights silently fell back to 'default' on the tip - unorouter-registry.test: align to the canonical .com host (api.unorouter.ai 301-redirects there, verified live) and to wave4's live model discovery (passthrough, no static seed) — the .ai/auto-model expectations were stale - check-migration-numbering.test: 147 left KNOWN_GAPS when 147_api_keys_model_access_mode.sql landed — assert absent (same as 143) - i18n: sync-ui pass — 35,914 missing UI keys stamped as __MISSING__ placeholders across 42 locales (mechanical; greens the pt-BR key-presence integrity test; coverage pct unchanged by design — translation is a separate workstream) Refs diegosouzapw#9985 * fix(ci): base-reds round 3e — 2 real defects + 14 stale sibling tests (waves A-E) Real defects fixed: - src/lib/db/apiKeys.ts: diegosouzapw#9313's empty-allowlist early return bypassed the group permission check, silently disabling group deny rules (diegosouzapw#8817) for every key without a per-key allowlist; fall-through restored, restricted+[] deny-all kept - open-sse/utils/proxyFetch.ts: diegosouzapw#10032 re-appended the raw transport error to the propagated message, reintroducing the proxy user:password leak diegosouzapw#9837 closed; new redactProxyDetailsInMessage() keeps the reason, redacts URL/credentials - .github/workflows/quality.yml: diegosouzapw#10134 added the TS7 ratchet as a separate blocking step AFTER the aggregated gates — the exact diegosouzapw#8542 masking mechanism; folded into the non-fail-fast loop (still blocking, still PR-only)⚠️ CI edit, gate-strengthening — explicit owner sign-off requested on the PR - src/i18n/messages/ko.json: 3 machine-mistranslation regressions caught by the diegosouzapw#8244 glossary checker (장애인→비활성화됨, 양말5://→socks5://, 비클로드→Claude가 아닌) Stale sibling tests aligned to deliberately-moved contracts (each cites its mover): request-log-detail-layout + -stream (diegosouzapw#9245 intl provider), repro-8542 pin update, quality-rail-gate-membership (diegosouzapw#10134 shape), agentSkills-routes 45→46 (diegosouzapw#9058), cloudflare-ai-catalog-8717 (diegosouzapw#8804 supersedes diegosouzapw#8808), executor-xai (diegosouzapw#9994), vision-bridge-claude-wire (diegosouzapw#9463 minimax→openai), sse-auth forced-pin (diegosouzapw#8893), tls-proxy-context (strengthened leak guards), rate-limit-local-error-classification (diegosouzapw#9164/diegosouzapw#9342), minimax-thinking-signature (diegosouzapw#9463), codebuddy-cn (diegosouzapw#9723 +1 test), github-copilot-custom-model (diegosouzapw#9050), providers-g4f-batch3 (diegosouzapw#9584), synced-capability-warmup (diegosouzapw#9199, stricter), sidebar-tools-group (diegosouzapw#8221), oauth-modal-grok-cli-paste (diegosouzapw#9245); agentSkills/catalog.ts comment 45→46; file-size rebaseline for proxyFetch (+19, annotated) Refs diegosouzapw#9985 * fix(ci): base-reds round 3f — waves F-J: 9 more real defects + stale sibling sweep Real production defects fixed (all red on the pure tip, each with its origin): - routeGuard.ts: diegosouzapw#8949 accidentally DELETED the /api/providers/[id]/login local-only pattern — the route spawns a browser, so the loopback gate for a process-spawning route was gone (Hard Rules diegosouzapw#15/diegosouzapw#17); restored (314 guard tests green) - agentSkills generator: diegosouzapw#9058's category dispatch gave the config category an empty body, wiping skills/config-codex-cli/SKILL.md at the diegosouzapw#10131 sync; fixed + SKILL.md regenerated via the official generator - imageRegistry: diegosouzapw#9982 broke same-provider bare aliasing (antigravity preview id sent upstream unresolved); new resolveSameProviderBareAlias() keeps the fal cross-provider fix intact - imageRegistry: diegosouzapw#9982's prefix strip handed the bare nano-banana ids to fal-ai, violating the pinned 2026-07-31 operator decision (adobe-firefly owns them); fal entries made prefix-only (dispatch already re-prefixes) - mediaGeneration/fal.ts: the missing-credential 401 guard was lost when diegosouzapw#10198 deleted the superseded falHandler — tests were hitting the live network - bottleneckPatch/rateLimitManager: diegosouzapw#9041's merge clobbered diegosouzapw#9604, resurrecting the Bottleneck v2.19.5 heartbeat bug (reservoir never refills); patched the library defect at the root and re-aligned chat-rate-limit-body-lock to the working reservoir contract - processSupervisor.mjs: diegosouzapw#9761 regressed the Node spawn to bare "node" (the diegosouzapw#9156 launchd bug) and dropped diegosouzapw#9209's ipv4first args; both restored - openai-responses/pureHelpers: diegosouzapw#9423's Agent null-sentinel was unreachable on the schemaless JSON-string path; gate extended - i18n en.json: diegosouzapw#8222's regen reverted the diegosouzapw#9976 unclosed-tag fix and diegosouzapw#8559's combo-cooldown copy; diegosouzapw#9038 shipped 40 t() calls with no messages (runtime MISSING_MESSAGE); all restored/added + official sync-ui stamps, and vi's zero-marker policy re-established via the sanctioned translation backend Stale sibling tests aligned (movers cited inline): chat-helpers (diegosouzapw#9447), executor-antigravity (diegosouzapw#9351), video-fal-grok (diegosouzapw#9982), visionBridge (diegosouzapw#9759), web-session-credentials (diegosouzapw#8974), production-build-module-integrity (positive anchor added), agentSkills-generator/skillManifestsLint/skills-injection/ agentSkillTools-mcp/listCapabilities-a2a (diegosouzapw#9058), memory-settings (diegosouzapw#10010), model-catalog-policy-invalidation (diegosouzapw#8906), model-alias-seed (diegosouzapw#9485), reactive-context-compaction (diegosouzapw#8949), combo-provider-wildcard (broken upsert helper), oauth-google-loopback (43-locale resurrected-key removal) Validation: 501/501 across the 47 touched test files; typecheck:core, lint, file-size, docs-sync all green. Refs diegosouzapw#9985 * fix(ci): base-reds round 3g — wave K/L: 4 more real defects + stale alignments Real defects: - base/reasoningEffort.ts: the stale duplicate cherry-pick diegosouzapw#9612 re-added the codex minimal→low rewrite that diegosouzapw#9883 had deliberately removed (OMP minimal passthrough); block removed again - cursorImages.ts: diegosouzapw#9840 wired prepareCursorImageForWire (sharp re-encode, fail-closed) into the SHARED resolveCursorImages, breaking zai-web and conol-web image uploads (HTTP 400 'undecodable'); new prepareForWire opt-out, Cursor default path unchanged (8 cursor suites green) - modelCapabilities/snapshot: catalog prepare still issued 323 per-model reads of model_context_overrides + max_input_tokens overrides, violating diegosouzapw#9199's bulk-load contract; both now resolve from the snapshot single pass - v1-models-discovery-conformance: re-pinned to the bounded 30s SWR window (diegosouzapw#9199/diegosouzapw#10198) — the old 'stale-first regardless of age' contract is gone Stale tests aligned (movers cited inline): codex-tools-strict-default (diegosouzapw#9828 redundant-oneOf strip), devin-providers (diegosouzapw#9245 i18n), db-migrationrunner- constants-split (147→151 renumber diegosouzapw#8228), gitlab-duo-oauth-setup (diegosouzapw#9245), chatcore-extracted-modules (diegosouzapw#9161 outbound-protocol keying) compression-api CI failures were cascade artifacts of codex-tools-strict-default failing in the same force-exit shard process — no own defect (171/171 local). Refs diegosouzapw#9985 * fix(test): compression-api — register both describes before the runner starts The DATA_DIR setup + route/db top-level awaits sat BETWEEN the two describes; under --test-force-exit (the CI unit-runner flag) the process exits once the already-registered tests finish, so on slow CI machines the whole second describe died as 'Promise resolution is still pending' — the recurring CI-only shard-2 failure that never reproduced locally without the flag. Moved to the top of the file; 10/10 under --test-force-exit locally. Refs diegosouzapw#9985 * fix(quality): freeze modelCapabilities.ts at 1006 (annotated) — snapshot routing growth Refs diegosouzapw#9985 * fix(quality): move the modelCapabilities freeze into the frozen map (nested schema) Refs diegosouzapw#9985 * fix(i18n): translate all 39,718 pending UI keys across 42 locales (owner-approved) Mass-translated every __MISSING__ placeholder via the official i18n:sync-ui --translate-markers pipeline (operator backend), restoring i18nUiCoverage to the 100 baseline (was 89.9 after the merge-storm UI landings + the 42 keys diegosouzapw#9038 never shipped). Post-pass repairs, all caught by the existing gates: - glossary: retired renderings the machine reintroduced normalized again (提供商→提供者 zh-CN/zh-TW, 鏈接→連結, 文檔→文件, 調用→呼叫, 供應商→提供者, 響應→回應, 不活躍→未啟用 zh-TW; 클로드→Claude, 옴니루트→OmniRoute ko); DATA_DIR forbidden rendering avoided via 数据文件夹 rephrase - ICU integrity: 120 values with renamed/dropped {params} repaired (39 positional renames, 81 reset to the en source — functional over fluent) Validation: glossary/pt-BR/vi/deno-relay/settings-keys/value-drift/google- loopback suites 76/76; placeholder diff en×42 locales = 0; worst-locale coverage = 100.0%. Refs diegosouzapw#9985 --------- Co-authored-by: backryun <bakryun0718@proton.me>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add Conol (conol.ai) as a new web-session provider
Adds
conol-web(aliascnl) as an unofficial/experimental browser-session provider, following the same pattern as the other web-session providers in the registry.What this adds
open-sse/executors/conol-web.ts, registered inproviderRegistry.tsandexecutors/index.ts.__Secure-better-auth.session_token, accepted as a raw token, a fullCookie:header, a JSON blob, or provider-specific data. Browser sign-in is supported viaconolBrowserLogin.tsplus the/api/providers/[id]/loginroute.GET /api/agent-servers, with a 30-model seed catalog as fallback. UpstreamapiKeyvalues are stripped from the parsed payload.inputModalitiesdrivesupportsVision, so multimodal models bypass the vision bridge and text-only models still use it.GET /api/billing/balancesurfaced throughconolUsage.tsandproviderLimits.ts.POST /api/assets, referenced as/api/assets/{id}message parts.Protocol notes
Conol keeps the HTTP stream open after emitting its terminal
doneevent, so the reader is cancelled ondonerather than waiting for the request timeout.Critically,
POST /api/sessionsignoresagentModel/agentEffort— a new session always starts on the account default and reportsmodelDowngraded: truewith aneffectiveModel. Model selection therefore happens out-of-band againstPOST /api/sessions/{id}/model, which takes three payload shapes:{"modelPreset":"pro","hasImageHistory":false}{"agentModel":"claude-fable-5","agentEffort":null}{"agentEffort":"xhigh"}Sessions are created empty and configured before the first turn is submitted, in
preset → model → effortorder. The ordering is load-bearing: the model call resetsagentEfforttonullserver-side, so applying effort first would silently drop it.Effort handling
xhighwhen the caller does not pin one via the-<effort>model suffix.xhighdegrades tohighonclaude-sonnet-5, and a weak request climbs tohighondeepseek-v4-pro.openrouter/fusion).Session binding
Model and effort are deliberately excluded from the session binding key, so switching models re-pins the existing session rather than stranding it and losing the conversation history. Re-pinning only fires on an actual change, so steady-state follow-ups cost no extra round trips.
hasImageHistoryis sticky once a session has carried an image.Failures on the
/modelcalls are logged but non-fatal — the turn still runs rather than hard-failing the request.Testing
21 unit tests in
tests/unit/conol-web.test.tscover credential normalization, turn building, catalog/preset parsing, effort clamping, thepreset → model → effortordering and its precedence over the message turn, session reuse, model-switch re-pinning, session isolation, image uploads, and SSE output. Tests assert that neither the session cookie nor system/tool content leaks into upstream payloads.Verified locally:
tsc --noEmitclean, ESLint clean on all changed files, and the full unit suite shows no new failures (the 67 pre-existing failures are byte-identical with and without this branch's changes).