Commit Graph

790 Commits

Author SHA1 Message Date
Buff Pesos 56f1afc834 feat(dashboard-auth): extend RFC 8252 native sign-in to password providers (system-browser autofill) (#75808)
* feat(dashboard-auth): extend RFC 8252 native sign-in to password providers

The desktop app runs password sign-in for gated gateways in an embedded
Electron BrowserWindow, where OS password managers (macOS Passwords /
iCloud Keychain autofill) cannot reach the form — Chromium-in-Electron
has no bridge to them, so users retype credentials by hand even though
the /login form already carries the right autocomplete attributes.

The existing RFC 8252 native flow (system browser + loopback + PKCE)
solves exactly this for OAuth providers, but was explicitly disabled for
password providers on the grounds that they have "no IDP round trip to
broker". The brokering is still worth having: it moves the credential
form into the system browser, where password-manager autofill just works.

Gateway-only change; the desktop needs no changes (runNativeLogin is
already page-agnostic), and older desktop builds pick the capability up
automatically once the gateway advertises it:

* /auth/native/authorize now accepts a supports_password provider:
  register the pending broker authorization as usual, then 302 the
  system browser to the interactive /login form with the opaque
  broker_state in the gateway's PKCE cookie (the same server-controlled
  channel the OAuth branch uses) instead of an IDP redirect.
* /auth/password-login: when the server-set PKCE cookie carries a
  broker handle, a successful credential check completes the pending
  authorization exactly like the /auth/callback native branch — mint
  the one-time loopback code, return the loopback redirect (validated
  loopback-only at authorize time) as `next`, clear the PKCE cookie,
  and set NO session cookies. A lapsed broker is a clean 400 telling
  the user to restart sign-in; a failed credential attempt leaves the
  pending entry intact so the user can retype.
* /api/status now advertises "native_pkce" whenever any interactive
  session provider is registered (previously only for non-password
  providers), so the desktop selects the system-browser strategy for
  password-only gateways.

Security posture is unchanged from the existing flow: loopback-literal
redirect_uri enforcement, PKCE S256 binding, single-use short-TTL codes,
constant-time comparison, and the same rate limiter on password attempts.

Tests: full authorize → /login → password-login → loopback → token →
bearer round trip, wrong-password keeps the pending entry, lapsed broker
→ 400, no-broker browser login keeps minting cookies, and the /api/status
advertisement for password-only gateways.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(dashboard-auth): bind native password completion to the authorize-time provider

Review follow-ups for #75808:

* /auth/password-login now enforces that body.provider matches the
  provider recorded in the server-set PKCE cookie by
  /auth/native/authorize before completing a pending native
  authorization. /login renders a form for every session provider, so
  without this a native flow started for provider A could be completed
  with provider B's credentials, binding B's session into A's pending
  entry. The mismatch is rejected BEFORE credential verification (no
  session minted, no oracle) and preserves both the pending entry and
  the cookie, so the user can still submit the correct provider's form.
  Covered by a two-password-provider E2E regression test.

* Update the two docs spots that still said password-only providers do
  not advertise native_pkce (website desktop-native-signin guide and the
  auth_flows type comment in web/src/lib/api.ts).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore: map contributor email for #75808 (buffpesos)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Brooklyn Nicholson <brooklyn.bb.nicholson@gmail.com>
2026-08-14 21:39:01 +00:00
kshitij 8134aadc18 chore: add SeashoreShi to contributor email map
Needed for PR #83207 salvage (fix: gateway platforms list crash).
2026-08-15 02:44:23 +05:30
kshitij 24a9203008 chore: map contributor email devops@sycamore.group → sycamoregroupltd 2026-08-15 02:23:56 +05:30
Teknium 4fe5090964 chore: contributor email mappings for salvaged PRs 2026-08-14 13:51:26 -07:00
Brooklyn Nicholson 6f49bc7d52 chore: map contributor email for the salvaged Windows updater commit 2026-08-14 15:48:31 -05:00
Teknium cc9358e525 chore: map contributor emails for salvaged commits 2026-08-14 13:09:44 -07:00
Teknium c2bf1ac70a chore: contributor email mappings for salvaged PRs 2026-08-14 13:09:37 -07:00
Austin Pickett 29d0cc2602 fix(dashboard): treat Ctrl+C serve shutdown as a clean exit (supersedes #52970) (#85711)
* fix(dashboard): suppress Ctrl+C shutdown traceback

* fix(dashboard): extend clean Ctrl+C exit to the Windows serve branch

The Windows loop-factory branch (and its pre-0.36 asyncio.run fallback)
runs under the same uvicorn capture_signals() re-raise as the POSIX
path, so console Ctrl+C leaked the identical KeyboardInterrupt
traceback there. Guard both serve calls with the same clean-exit
contract, keeping the import-resolution try/except comment accurate
(genuine serve-time errors still propagate).

Also ports the reworded POSIX-test docstring (the serve path is no
longer 'byte-for-byte unchanged'), wraps the POSIX KI test in
pytest.fail so a regression reports red instead of aborting the pytest
session, and adds the windows_only sibling test.

Extends #52970 to the whole bug class.

* chore: map contributor email for @wangs1203

* test(dashboard): actually exercise the pre-0.36 Windows fallback KI contract

Copilot review caught that patching uvicorn._compat.asyncio_run with
raising=False makes the import succeed, so _runner is non-None and the
extra asyncio.run patch never covered the fallback. Split it out: a
dedicated windows_only test halts the _compat import (None in
sys.modules) so the fallback branch is genuinely selected, then asserts
the same clean-KI contract on bare asyncio.run.

---------

Co-authored-by: Emiya·Leon <wangs.coder@gmail.com>
2026-08-14 12:02:05 -04:00
kshitij 1f8fdc7bd8 chore: map contributor email for @infocentr 2026-08-14 16:53:40 +05:30
Teknium 1e18f68148 chore: map contributor email for @dpersek 2026-08-14 01:31:26 -07:00
Teknium b9e7bead13 fix(gateway): coalesce same-tick async-delegation completions into one turn (#70300)
The async-delegation watcher drained the completion queue as a batch but
then delivered each event as its own synthetic turn, flooding the session
when a fan-out of background subagents finished together. Builds on the
per-process completion batching salvaged from PR #71898 (thanks
@yuzilongleif-collab) which coalesces concurrent _run_process_watcher
completions behind a short per-route fan-in window.

This commit adds the async-delegation half: group the drained batch by
full routing key (session_key + parent_session_id + platform/chat/thread/
user) and inject ONE consolidated turn per group. Durable-ack handling
stays honest: sibling rows are claimed up front via claim_event_delivery;
rows another consumer owns are excluded from the consolidated text (no
double-delivery); sibling claims are acknowledged only after adapter
acceptance and released (still pending) on failure. Events for different
sessions never coalesce, and a single-event group rides the existing
per-event path unchanged (latency and text identical).

Tests: 3 same-tick events -> exactly one adapter.handle_message carrying
all 3 results with all 3 durable rows delivered; 2 sessions -> 2 turns;
single-event path unchanged; failed batch releases claims and retries;
foreign-claimed sibling excluded and left pending.
2026-08-14 01:08:25 -07:00
Teknium 1292a31851 chore: map salvage contributor emails 2026-08-14 01:08:13 -07:00
kshitij 285eaaddc0 chore: add contributor email mapping for seze@andrew.cmu.edu
Maps to GitHub user Shedrackeze002 (PR #85616).
2026-08-14 13:15:56 +05:30
Teknium e8debfbdc3 chore: map contributor email for attribution audit 2026-08-13 23:43:54 -07:00
teknium1 5970ac73ab chore(skills/box): Hermes-compliance polish + docs registration
- author field to 'Chris Kim (iskysun96), Hermes Agent' convention
- 'Use this skill for' -> 'When to Use' section heading
- related_skills: google-workspace
- register auto-gen docs page, catalog row, sidebar entry
- contributors/emails mapping for iskysun96
2026-08-13 22:09:44 -07:00
Teknium d4b0039940 chore: map contributor email for @silence-de 2026-08-13 22:09:37 -07:00
Teknium bfff32ae8c chore: map contributor email for @sjungwon03 (PR #79787 salvage) 2026-08-13 12:31:02 -07:00
Teknium 4ef7ee9971 chore(contributors): map xaviersudre email for PR #75040 salvage 2026-08-13 11:56:43 -07:00
Teknium 991e2efdf4 chore: map contributor emails for cherry-picked commits 2026-08-13 11:49:24 -07:00
Teknium e70b187d51 chore: map salvage contributor emails 2026-08-13 11:49:14 -07:00
Teknium 3fc320c7c1 chore: map contributor email for cherry-picked commit (#72056) 2026-08-13 11:20:27 -07:00
Victor Kyriazakos d6d4338a01 chore: map contributor email for cherry-picked commit 2026-08-13 11:20:27 -07:00
kshitij a569d5bb1b chore: map contributor emails for adopted commits 2026-08-13 23:43:15 +05:30
Teknium 56f8655bc6 chore: map simonvanlaak contributor email 2026-08-13 11:12:19 -07:00
Teknium 35720fbc44 chore: map contributor email 2026-08-13 11:12:05 -07:00
Teknium 0818086c50 fix(kanban): backfill legacy gateway notify subs to notify+wake on first migration
Before delivery_mode existed the notifier woke unconditionally when the task
carried a session_id — pre-existing gateway subscriptions had de facto active
wake. The column's 'notify' default alone would silently disable that on
upgrade. Backfill gateway rows to notify+wake on first-add only (tui stays
notify); explicit user downgrades are never overwritten by re-migration.
Sabotage-verified regression tests included.
2026-08-13 10:47:40 -07:00
kshitij 4498daf00f chore: map contributor email hustwkr@users.noreply.github.com
Bare noreply form (no +<id> prefix) needs an explicit mapping file
for check-attribution CI.
2026-08-13 22:44:23 +05:30
uperLu 4901564694 chore: map contributor email 2026-08-13 22:07:32 +05:30
Teknium f84ecd3607 chore: map zhjay@stu.xjtu.edu.cn -> ZHJay for contributor attribution
(cherry picked from commit 06899b54437f7bb36b126d96a1e740afeb34d855)
2026-08-12 22:38:17 -07:00
Teknium 7d0b5a332c chore: AUTHOR_MAP for zhouou6@users.noreply.github.com → shali10 2026-08-12 19:43:41 -07:00
Teknium ea6f4e33c3 chore(contributors): map ernst-bablick email for PR #69609 salvage 2026-08-12 19:43:29 -07:00
Hermes Agent 12a7a46578 chore: map hermes-agent@nousresearch.com contributor email 2026-08-12 19:43:22 -07:00
Teknium c89ca9c4bf chore(attribution): map dnethusahan.h05@gmail.com -> deaneeth (PR #64317 salvage) 2026-08-12 18:38:25 -07:00
Teknium e3215cfbdc chore: map hfsearcy@gmail.com -> hsearcy for contributor attribution 2026-08-12 17:07:51 -07:00
Teknium d48c5f29ee Merge pull request #84878 from NousResearch/salv/62319
fix(desktop): allow remote gateway token storage on keyring-less Linux (salvage #62319)
2026-08-12 16:50:44 -07:00
Teknium 9994bc9ec9 fix(gateway): enforce post-auth normalized reaction observer
Builds on Paolo Antinori's #68431 salvage for #64176. Move plugin dispatch behind the profile-scoped runner authorization boundary, fail closed on malformed reaction identities, preserve observer registration across Telegram app rebuilds, and document the deliberately observer-only contract.

Co-authored-by: Paolo Antinori <pantinor@redhat.com>
2026-08-12 16:42:28 -07:00
Teknium 33840149d0 chore: map voice contributor attribution 2026-08-12 16:42:07 -07:00
Teknium 98c3edbd8b chore: map github.commits@widow.cc -> Zeus-Deus for contributor attribution 2026-08-12 16:40:20 -07:00
Teknium d409f67485 feat(platforms): add typed plugin send paths
Route plugin target parsing, validation, and host-driven delivery through PlatformEntry across CLI and cron while preserving the host-only send_message policy.
2026-08-12 16:27:19 -07:00
Teknium 7a5062fbcd feat(plugins): add runtime-backed plugin Doctor
Validate plugin manifests, imports, hook signatures, and runtime registrations through the real plugin loader in an isolated temporary home.
2026-08-12 16:27:07 -07:00
Teknium 5265409012 docs(plugins): document config and state ownership 2026-08-12 16:26:43 -07:00
Teknium f6aaff4646 chore(contributors): map Magnus Hedemark 2026-08-12 16:25:20 -07:00
kshitij 1d3d021282 chore: map 1759158233@qq.com -> wanquanY for contributor attribution 2026-08-13 01:34:00 +05:30
rob-maron 7113a69248 fix(models_dev): map meta-ai provider to models.dev 'meta' id (salvage #81418) (#84679)
* fix(models_dev): map meta-ai provider to models.dev 'meta' id

Muse Spark models (muse-spark-1.1/1.2/-contributor) are served via the Meta
Model API and reverse-map from api.meta.ai to the Hermes provider id 'meta-ai'.
models.dev keys the same models under the provider id 'meta'.

lookup_models_dev_context() / _get_provider_models() resolve the models.dev id
strictly via PROVIDER_TO_MODELS_DEV.get(provider) (no raw-id fallback, unlike
get_model_info()), so an unmapped 'meta-ai' missed entirely and context fell
back to the generic 256K default instead of the true ~1M window. Add the
meta-ai->meta mapping (plus a defensive meta->meta) so context and pricing
resolve from models.dev: 1.1=1,000,000; 1.2 & -contributor=1,048,576.

* add contributor email

---------

Co-authored-by: Beto de Paola <betodepaola@meta.com>
2026-08-12 14:42:00 -04:00
kshitij a5170af4a8 chore: map hermes-agent@nous.local commit identity to @C-EXCITE-STUDIO
Salvaged PR #83678's commit is authored under a generic local agent
identity with no linked GitHub account; map it to the PR opener for
release attribution (same pattern as hermes-agent@users.noreply.local).
2026-08-12 13:58:26 +05:30
elisam0 17688f994e feat: add Nemotron Lightning to reasoning timeout (#83982) 2026-08-12 08:21:09 +00:00
kshitij a2fbe745b4 chore: map contributor email cmoiccool 2026-08-12 13:20:38 +05:30
kshitij 936dd7346f chore: add landaun to contributor email map for #83906 salvage 2026-08-11 20:37:06 +05:30
Teknium 2cdb30a474 chore: contributor email mapping for salvaged commit 2026-08-10 19:16:59 -07:00
Teknium 0d21eb82b5 chore: contributor email mapping for salvaged commit 2026-08-10 18:04:59 -07:00